K8S基础知识1---二进制安装
一、K8S集群安装方式:
kubeadm:自动化安装方式;特点:安装简单,所有节点宕机重启较慢(采用容器管理容器的模式,宿主机宕机重启后先启动容器进程,再启动容器,因此速度较慢),出现故障排查难度大,证书有效期1年故必须每年要升级或获取证书。在VMware中不要使用克隆机创建集群,否则使用过程中出行网卡冲突。
二进制安装:能清晰认识各组件及其配置,但各组件以进程方式运行,一旦退出则不能自动启动;特点:安装复杂,稳定性更高,重启快速(宿主机宕机重启后直接拉起进程,因此重启速度快),排查故障容易,自定义安装配置使得灵活可控且升级扩容更方便,可深入学习各组件通信;生产环境建议使用。
K8S生产环境安装注意事项:
1)networkManager建议关掉,否则需要修改其配置,不然会出问题。
2)linux内核必须升级至4.18以上,否则docker及K8S会出现各种问题,如:磁盘空间不足,网络突然不通等。升级内核时需要考虑服务器硬件是否支持。
3)docker安装完成后不能出现警告,K8S允许出现部分警告。
4)不要使用带中文的服务器及克隆的虚拟机。
5)K8S二进制安装时各组件版本与etcd版本需对应。
6)宿主机或服务器,K8S service,K8S pod的三个网段不能重复。
7)docker选用19.3版本,该版本经过K8S验证,稳定可靠。
8)新版本kubelet要求linux使用systemd,原因systemV有bug。
9)centOS8没有传入docker的containerD包,需要手动安装。centOS7有该包,无需安装。
##########router############# koolshare原理 koolshare设置nat模式通过宿主机网卡与外网通信,设置仅主机模式与K8S集群通信。 koolshare安装过程 1、创建win10系统虚拟机;必须设置BIOS(否则无法加载PE系统)、IDE模式(否则无法启动koolshare);网卡2张:仅主机模式+NAT模式; 2、安装前,可调整cpu+mem,以提高安装速度;修改虚拟机内存为4G,加载老毛桃pe系统,启动win10pe; 3、虚拟机挂载软路由koolshare文件:20190419_184043.iso; 4、win10pe读取iso文件,并以管理员身份利用“img写盘工具”将openwrt-koolshare-mod-v2.30-r10402-51ad900e2c-x86-64-combined-squashfs.img写入虚拟机20G空磁盘; 5、关闭虚拟机,调整cpu为1核,mem为1G;设置磁盘启动优先,并重启虚拟机;此时,无法访问koolshare服务; 6、koolshare默认IP为192.168.1.1,则VMware软件仅主机模式网段设置为192.168.1.0/24,静态IP模式;NAT模式设置DHCP模式,网段为192.168.248.0/24;宿主机vmnet1网卡设置IP为:192.168.1.10/24;由于K8S集群使用192.168.0.0/24网段,因此宿主机vmnet1网卡需增加1个IP:192.168.0.10/24; 7、宿主机浏览器登录192.168.1.1,默认密码:koolshare; 8、网络--->接口--->删除WAN6--->保存并应用; 9、网络--->接口--->LAN--->编辑--->物理设置--->查看接口中仅有1块lan接口--->关闭桥接模式,直接使用该仅主机模式的网卡--->保存并应用; 10、网络--->接口--->LAN--->编辑--->基本设置--->协议:静态地址;切换协议;设置网关IP地址为192.168.0.1/24--->保存并应用; 11、网络--->诊断--->ping www.baidu.com,网络畅通即可;表示可访问国内外网。 koolshare故障排查 问题1:LAN修改IP后,保存失败,无法使用? 问题描述:“在20秒内确认应用失败,等待回滚...”; 原因分析:强制写入IP后使得原IP失效,新IP生效, 解决方法:稍等几分钟,使用新IP直接登录koolshare即可。 问题2:软路由无法访问外网? 问题描述:ping: bad address 'www.baidu.com' 原因分析:NAT网卡未选择动态分配IP; 解决方法:设置wan的网段,并选择动态分配IP。 ##########router############# ##########K8S-master01############# K8S-master安装步骤 1、创建centos7虚拟机; 2、安装centos7系统; ×××master01××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××× 3、设置系统IP、网关、DNS等; BOOTPROTO=none IPADDR=192.168.0.107 PREFIX=24 GATEWAY=192.168.0.1 #设置为软路由koolshare的地址; DNS1=192.168.0.1 #设置为软路由koolshare的地址; ×××master02××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××× BOOTPROTO=none IPADDR=192.168.0.108 PREFIX=24 GATEWAY=192.168.0.1 #设置为软路由koolshare的地址; DNS1=192.168.0.1 #设置为软路由koolshare的地址; ×××master03××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××× BOOTPROTO=none IPADDR=192.168.0.109 PREFIX=24 GATEWAY=192.168.0.1 #设置为软路由koolshare的地址; DNS1=192.168.0.1 #设置为软路由koolshare的地址; ×××node01××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××× BOOTPROTO=none IPADDR=192.168.0.110 PREFIX=24 GATEWAY=192.168.0.1 #设置为软路由koolshare的地址; DNS1=192.168.0.1 #设置为软路由koolshare的地址; ×××node02××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××× BOOTPROTO=none IPADDR=192.168.0.111 PREFIX=24 GATEWAY=192.168.0.1 #设置为软路由koolshare的地址; DNS1=192.168.0.1 #设置为软路由koolshare的地址; ×××node02××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××× 4、xshell连接K8S各节点主机,进行集群部署。 ping baidu.com #测试K8S各节点是否能通过koolshare访问外网。 ×××master01××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××× hostnamectl set-hostname k8s-master01 #所有节点设置主机名 ×××master02××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××× hostnamectl set-hostname k8s-master02 ×××master03××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××× hostnamectl set-hostname k8s-master03 ×××node01××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××× hostnamectl set-hostname k8s-node01 ×××node02××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××× hostnamectl set-hostname k8s-node02 ×××node02××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××× ##所有节点配置hosts echo ' 192.168.0.107 k8s-master01 192.168.0.108 k8s-master02 192.168.0.109 k8s-master03 192.168.0.236 k8s-master-lb #如果不是高可用集群,则该IP为master01的IP; 192.168.0.110 k8s-node01 192.168.0.111 k8s-node02 192.168.0.100 hub.atguigu.com ' >>/etc/hosts hostname;cat /etc/hosts ##所有节点设置yum源,可指定为公司的yum源;本次采用阿里云的yum源; cd;mv /etc/yum.repos.d{,.bak.`date +%y%m%d`};mkdir /etc/yum.repos.d/ curl -o /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo curl -o /etc/yum.repos.d/centos7.repo http://mirrors.aliyun.com/repo/Centos-7.repo yum clean all;yum makecache fast;yum repolist all ##所有节点安装基础软件 yum -y install wget jq psmisc vim-enhanced net-tools telnet git yum-utils device-mapper-persistent-data lvm2 unzip #在新主机上首次安装Docker Engine-Community之前,需要设置Docker仓库。yum-utils 提供了yum-config-manager ,并且device mapper存储驱动程序需要device-mapper-persistent-data和lvm2。jq是Linux下面把文本字符串格式化成json格式的工具;psmisc包含进程管理命令; yum list wget jq psmisc vim-enhanced net-tools telnet git yum-utils device-mapper-persistent-data lvm2 unzip ##所有节点关闭并禁用防火墙,dnsmasq,NetworkManager(centos7需关闭该服务,centos8不需关闭该服务) systemctl disable --now firewalld;systemctl disable --now iptables;systemctl disable --now dnsmasq;systemctl disable --now NetworkManager systemctl status firewalld;systemctl status dnsmasq;systemctl status NetworkManager;systemctl status iptables ##所有节点关闭selinux setenforce 0 && sed -i 's/^SELINUX=.*/SELINUX=disabled' /etc/selinux/config getenforce;grep -Ev '^#|^$' /etc/selinux/config ##所有节点关闭虚拟内存,目的:使用kubeadm安装K8S集群时会检测swap是否关闭;如果虚拟内存开启,pod就可能会放在虚拟内存中运行,会大大降低工作效率;生产环境中,K8S集群也要求关闭虚拟内存。 swapoff -a sed -i '/swap/s/^\(.*\)$/#\1/g' /etc/fstab #/ swap /^\(.*\)$表示匹配到swap这行的首尾为任何字符的所有内容。#\1表示在该行的第一个1位置添加#; # sed -i '/^[^#]*swap/s@^@#@' /etc/fstab #表示匹配到swap该行若行首字符不为#时,则在行首添加#; ##所有节点设置系统时区 timedatectl set-timezone Asia/Shanghai timedatectl set-local-rtc 0 #将当前UTC时间写入硬件时钟; ##所有节点同步各节点时间,若时间不同步可能引起证书不可用的情况; yum -y install ntpdate #centos7.9及以后版本不再使用该工具; date;hwclock ntpdate ntp1.aliyun.com;hwclock --systohc #同步系统时钟及硬件时钟; cat <<eof>> /etc/crontab #若是非root账户,则手动crontab -e添加定期同步时钟任务; 0 10 * * * root /usr/sbin/ntpdate ntp1.aliyun.com #各节点每天早上10:00同步时钟; 10 10 * * * root hwclock --systohc #各节点每天早上10:10同步时钟; eof ##所有节点重启依赖时间的服务 systemctl restart rsyslog;systemctl restart crond systemctl status rsyslog;systemctl status crond ##所有节点安装wlnmp包,WLNMP是一个基于官方源码二次打包的项目,可以在CentOS/RadHat系统上通过yum源快速部署Nginx/Mysql/PHP等常用服务。 rpm -ivh https://mirrors.wlnmp.com/centos/wlnmp-release-centos.noarch.rpm rpm -qa |grep wlnmp ##所有节点设置资源限制; ulimit -SHn 65535 #临时生效,重启后失效;ulimit用于shell启动进程所占用的资源,可用于修改系统资源限制; ulimit cat <<eof>> /etc/security/limits.conf soft nofile 655360 hard nofile 131072 soft nproc 655350 hard nproc 655350 soft memlock unlimited hard memlock unlimited eof grep -Ev "^#|^$" /etc/security/limits.conf ##所有节点关闭系统不需要的服务 systemctl disable --now postfix systemctl status postfix ×××master01××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××× ##仅在master-01部署免密登录其他节点;若使用公有云,由于阿里云SLB不允许反向连接(腾讯云不存在该问题),则需要一台云主机专门部署免密钥登录其他nodes的服务; ssh-keygen -t rsa #使用ssh-keygen生成私钥和公钥;依次输入"要生成的文件名,输入密码,重复输入密码";此处不要设置密码,否则使用密钥登录其他node需要输入该密码; cd /root/.ssh/ for i in k8s-master01 k8s-master02 k8s-master03 k8s-node01 k8s-node02;do ssh-copy-id -i /root/.ssh/id_rsa.pub $i;done #将公钥发送至各node;依次输入"yes及各主机登录密码"; ×××master01××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××× ##所有节点升级系统内核及软件;K8S高版本要求linux内核必须升级4.18版本以上,否则会出现莫名奇妙的问题,如:pod自动重启,POD网络不通,宿主机宕机|夯死等; yum update -y --exclude=kernel && reboot #以yum方式升级非内核的所有包; wget https://mirror.rackspace.com/elrepo/kernel/el7/x86_64/RPMS/kernel-ml-5.13.0-1.el7.elrepo.x86_64.rpm #下载指定版本内核包; wget https://mirror.rackspace.com/elrepo/kernel/el7/x86_64/RPMS/kernel-ml-devel-5.13.0-1.el7.elrepo.x86_64.rpm #下载指定版本内核工具包; yum -y localinstall kernel-* #安装内核所有包;rpm -ivh kernel-ml-* #安装内核所有包; # yum remove -y kernel-3.10.0-957.el7.x86_64 #删除多余内核;当/boot剩余容量不足时,必须删除非运行的内核。 rpm -qa |grep kernel #查看安装的所有内核及其工具包; grubby --default-kernel #查看当前默认启动内核; uname -r #查看当前内核; awk -F \' '$1=="menuentry " {print i++ " : " $2}' /etc/grub2.cfg #查看内核启动清单及顺序; grub2-editenv list #查看清单中保存的启动内核名称; grub2-set-default 0 && grub2-mkconfig -o /etc/grub2.cfg #设置默认启动entry为0的内核,并将修改的配置写入grub2.cfg; # sed -i "/s/GRUB_DEFAULT=saved/GRUB_DEFAULT=0/g" /etc/default/grub;update-grub #设置默认启动内核的entry为0,并将修改的配置更新至grub2.cfg; grubby --args="user.namespace.enable=1" --update-kernel="$(grubby --default-kernel)" grubby --default-kernel #查看默认启动内核是否修改完成; reboot #重启后使内核生效; uname -r #查看内核是否生效;
####所有节点安装并配置ipvsadm yum -y install conntrack-tools ipvsadm ipset sysstat conntrack libseccomp #libseccomp用于内核调用;conntrack用于跟踪并且记录连接状态; yum list conntrack-tools ipvsadm ipset sysstat conntrack libseccomp ##加载ipvsadm模块 cat > /etc/sysconfig/modules/ipvs.modules <<eof #!/bin/bash modprobe -- ip_vs modprobe -- ip_vs_rr modprobe -- ip_vs_wrr modprobe -- ip_vs_sh # modprobe -- nf_conntrack_ipv4 #内核4.18以前使用该命令; modprobe -- nf_conntrack #内核4.19以前使用该命令; eof chmod 755 /etc/sysconfig/modules/ipvs.modules bash /etc/sysconfig/modules/ipvs.modules lsmod |grep -e ip_vs -e nf_conntrack ##开启ipvsadm内核功能;内核版本小于4.19时使用nf_conntrack_ipv4; cat <<eof> /etc/modules-load.d/ipvs.conf ip_vs ip_vs_lc ip_vs_wlc ip_vs_rr ip_vs_wrr ip_vs_lblc ip_vs_dh ip_vs_sh ip_vs_fo ip_vs_nq ip_vs_sed ip_vs_ftp ip_vs_sh nf_conntrack ip_tables ip_set xt_set ipt_set ipt_rpfilter ipt_REJECT ipip eof systemctl enable --now systemd-modules-load.service lsmod |grep -e ip_vs -e nf_conntrack #查看ipvs模块是否加载; ##所有节点调整内核参数,除前3条外其他为优化项。 cat <<eof> /etc/sysctl.d/kubernetes.conf net.bridge.bridge-nf-call-iptables=1 #前2条为开启网桥模式,必做,否则安装K8S会报错。 net.bridge.bridge-nf-call-ip6tables=1 #前2条为开启网桥模式,必做,否则安装K8S会报错。 net.ipv6.conf.all.disable_ipv6=1 #关闭IPv6,必做,否则安装K8S会报错。??? net.ipv4.ip_forward=1 net.ipv4.tcp_tw_recycle=0 #??? vm.swappiness=0 #禁止使用swap空间,只有当系统OOM时才允许使用它;??? vm.overcommit_memory=1 #不检查物理内存是否够用; vm.panic_on_oom=0 #开启OOM; fs.may_detach_mounts=1 fs.inotify.max_user_instances=8192 #??? fs.inotify.max_user_watches=1048576 fs.file-max=52706963 fs.nr_open=52706963 net.netfilter.nf_conntrack_max=2310720 net.ipv4.tcp_keepalive_time=600 net.ipv4.tcp_keepalive_probes=3 net.ipv4.tcp_keepalive_intvl=15 net.ipv4.tcp_max_tw_buckets=36000 net.ipv4.tcp_tw_reuse=1 net.ipv4.tcp_max_orphans=327680 net.ipv4.tcp_orphan_retries=3 net.ipv4.tcp_syncookies=1 net.ipv4.tcp_max_sync_backlog=16384 net.ipv4.ip_conntrack_max=65536 net.ipv4.tcp_max_sync_backlog=16384 net.ipv4.tcp_timestamps=0 net.core.somaxconn=16384 eof sysctl --system;ls /proc/sys/net/bridge #加载模块,使得/proc/sys/net/bridge/bridge-nf-call-iptables、/proc/sys/net/bridge/bridge-nf-call-ip6tables文件存在: reboot #重启系统,以便确认模块是否加载,确保模块一直被加载; lsmod |grep --color=auto -e ip_vs -e nf_conntrack
#所有节点安装docker软件 yum -y install yum-utils device-mapper-persistent-data lvm2 #添加docker的yum源必需组件; yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo #添加docker的yum源; yum list docker-ce* --showduplicates | sort -r #查看可安装版本; yum list containerd.io --showduplicates | sort -r #CentOS预装了containerd.io;yum升级是无法自动升级预装的containerd.io的,需要手动卸载旧版本后安装新版本。 yum -y remove docker* ;yum remove containerd.io #卸载旧版本docker所有包; yum -y install docker-ce-19.03.11-3.el7 docker-ce-cli-19.03.11-3.el7 containerd.io #安装指定版本dockers,19.03版本经过K8S验证后运行稳定,且K8S 1.23版本不再使用docker;docker-ce依赖于docker-ce-cli、docker-scan-plugin;建议指定docker-ce-cli的版本,以便统一版本。 mkdir /etc/docker ##native.cgroupdriver=systemd表示交由systemd进行cgroup执行隔离,如果使用systemV则存在bug;日志修改为json-file存储类型,大小为100M; cat <<eof> /etc/docker/daemon.json { "exec-opts":["native.cgroupdriver=systemd"], "log-driver":"json-file", "log-opts":{ "max-size":"100m" } } eof mkdir -p /etc/systemd/system/docker.service.d systemctl daemon-reload && systemctl enable --now docker;systemctl status docker docker version
######安装K8S组件 mkdir -p /opt/cni/bin/ ##所有节点创建目录,以便安装K8S插件 ##master01安装K8S组件 wget https://storage.googleapis.com/kubernetes-release/release/v1.20.0/kubernetes-server-linux-amd64.tar.gz #master01下载k8S-server; # wget https://storage.googleapis.com/kubernetes-release/release/v1.20.0/kubernetes-node-linux-amd64.tar.gz #master01下载k8S-node; # wget https://storage.googleapis.com/kubernetes-release/release/v1.20.0/kubernetes-client-linux-amd64.tar.gz #master01下载k8S-client; wget https://storage.googleapis.com/etcd/v3.4.13/etcd-v3.4.13-linux-amd64.tar.gz #master01下载etcd;必须与K8S版本对应; tar -xzvf kubernetes-server-linux-amd64.tar.gz --strip-components=3 -C /usr/local/bin/ kubernetes/server/bin/kube{let,ctl,-apiserver,-controller-manager,-scheduler,-proxy} #master01安装k8s各组件;go语言开放的K8S组件,只需解压程序包且将其放在linux对应的目录下后进行配置即可使用。因此go语言在以后会更加流行。 tar -xzvf etcd-v3.4.13-linux-amd64.tar.gz --strip-components=1 -C /usr/local/bin/ etcd-v3.4.13-linux-amd64/etcd{,ctl} #master01安装etcd; ##其他master安装K8S组件 MasterNodes="k8s-master02 k8s-master03";WorkNodes="k8s-node01 k8s-node02" #添加临时变量; ##添加永久变量 cat <<eof> /etc/profile #profile 是某个用户唯一的用来设置环境变量的地方, MasterNodes="k8s-master02 k8s-master03" WorkNodes="k8s-node01 k8s-node02" eof cat <<eof> /etc/bashrc #bashrc是专门用来给bash做初始化的,类似文件有shrc,zshrc; . /etc/profile eof ##其他节点安装K8S组件 for Node in ${MasterNodes};do echo ${Node};scp /usr/local/bin/kube{ctl,-apiserver,-controller-manager,-scheduler,let,-proxy} ${Node}:/usr/local/bin/;scp /usr/local/bin/etcd* ${Node}:/usr/local/bin/;done #其他master节点的K8S组件、etcd; for Node in ${WorkNodes};do echo ${Node};scp /usr/local/bin/kube{let,-proxy} ${Node}:/usr/local/bin/;done #其他work节点的K8S组件; ##检查K8S组件是否正常 kubelet --version;kubectl version;kube-apiserver --version;kube-controller-manager --version;kube-scheduler --version;kube-proxy --version;etcdctl version