本次采用二进制文件方式部署,本文过程写成了更详细的ansible部署方案 https://github.com/zhangguanzhang/Kubernetes-ansible
和之前的步骤差不多都是和kubeadm步骤一样,不过这次所有kubelet全部走bootstrap不会像之前master上的kubelet生成证书,另外证书换成openssl生成
不建议使用secureCRT这个ssh软件复制本篇博客内容的命令,因为它的部分版本对包含多条命令的处理结果并不完美,可能很多命令不是预期结果
本文命令里有些是输出,不要乱粘贴输入(虽然也没影响)
本文命令全部是在k8s-m1上执行
本文很多步骤是选择其一,别啥都不看一路往下复制粘贴
如果某些步骤理解不了可以上下内容一起看来理解
本文后面的几个svc用了externalIPs,上生产的话必须用VIP或者LB代替
本文的HA是vip,生产和云上可以用LB和SLB,不过阿里的SLB四层有问题(不支持回源),可以每个node上代理127.0.0.1的某个port分摊在所有apiserver的port上,aws的SLB正常
master节点一定要kube-proxy和calico或者flannel,kube-proxy是维持svc的ip到pod的ip的负载均衡,而你流量想到pod的ip需要calico或者flannel组件的overlay网络下才可以,后续学到APIService和CRD的时候,APIService如果选中了svc,kube-apiserver会把这个APISerivce的请求代理到选中的svc上,最后流量流到svc选中的pod,该pod要处理请求然后回应,这个时候就是kube-apiserver解析svc的名字得到svc的ip,然后kube-proxy定向到pod的ip,calico或者flannel把包发到目标机器上,这个时候如果kube-proxy和calico或者flannel没有那你创建的APISerivce就没用了。apiserver的路由聚合没试过不知道可行不可行,本文中的metrics-server就是这样的工作流程,所以建议master也跑pod,不然后续某些CRD用不了
本次安装的版本:
- Kubernetes v1.13.4
- CNI v0.7.4
- Etcd v3.3.12
- Flannel v0.11.0 或者 Calico v3.4
- Docker CE 18.06.03
在官方的支持版本里好像没说1.13.4支持18.09,保险起见我这里使用的是18.06.03
本次部署的网络信息:
- Cluster IP CIDR: 10.244.0.0/16
- Service Cluster IP CIDR: 10.96.0.0/12
- Service DNS IP: 10.96.0.10
- DNS DN: cluster.local
上面不建议改
- Kubernetes API VIP: 10.0.6.155
- Kubernetes Ingress VIP: 10.0.6.156
- 如果单台master的话Kubernetes API VIP写master的ip即可,单台就别搞啥HA了
- 单台master的话所有复制到其他mster的操作都忽略即可
节点信息
本教学将以下列节点数与规格来进行部署Kubernetes集群,系统可采用Ubuntu 16.x与CentOS 7.4+
IP | Hostname | CPU | Memory |
---|---|---|---|
10.0.6.166 | K8S-M1 | 4 | 8G |
10.0.6.167 | K8S-M2 | 4 | 8G |
10.0.6.168 | K8S-M3 | 4 | 8G |
10.0.6.169 | K8S-N1 | 2 | 4G |
10.0.6.170 | K8S-N2 | 2 | 4G |
另外VIP为10.0.6.155,由所有master节点的keepalived+haproxy来选择VIP的归属保持高可用
- 所有操作全部用root使用者进行
- 高可用一般建议大于等于3台的奇数台,我使用3台master来做高可用
事前准备
- 所有机器彼此网路互通,并且k8s-m1SSH登入其他节点为passwdless(如果不互信可以后面的操作)。
- 所有防火墙与SELinux 已关闭。如CentOS:
否则后续 K8S 挂载目录时可能报错 Permission denied
systemctl disable --now firewalld NetworkManager setenforce 0 sed -ri '/^[^#]*SELINUX=/s#=.+$#=disabled#' /etc/selinux/config
- 关闭 dnsmasq (可选)
- linux 系统开启了 dnsmasq 后(如 GUI 环境),将系统 DNS Server 设置为 127.0.0.1,这会导致 docker 容器无法解析域名,需要关闭它
systemctl disable --now dnsmasq
- Kubernetes v1.8+要求关闭系统Swap,若不关闭则需要修改kubelet设定参数( –fail-swap-on 设置为 false 来忽略 swap on),在所有机器使用以下指令关闭swap并注释掉/etc/fstab中swap的行
swapoff -a && sysctl -w vm.swappiness=0 sed -ri '/^[^#]*swap/s@^@#@' /etc/fstab
- 如果是centos的话不想升级后面的最新内核可以此时升级到保守内核去掉update的exclude即可
yum install epel-release -y yum install wget git jq psmisc socat -y yum update -y --exclude=kernel*
- 如果上面yum update没有加–exclude=kernel*就重启下加载保守内核
reboot
因为目前市面上包管理下内核版本会很低,安装docker后无论centos还是ubuntu会有如下bug,4.15的内核依然存在
kernel:unregister_netdevice: waiting for lo to become free. Usage count = 1
所以建议先升级内核
perl是内核的依赖包,如果没有就安装下
[ ! -f /usr/bin/perl ] && yum install perl -y
- 升级内核需要使用 elrepo 的yum 源,首先我们导入 elrepo 的 key并安装 elrepo 源
rpm --import https://www.elrepo.org/RPM-GPG-KEY-elrepo.org rpm -Uvh http://www.elrepo.org/elrepo-release-7.0-3.el7.elrepo.noarch.rpm
- 查看可用的内核
yum --disablerepo="*" --enablerepo="elrepo-kernel" list available --showduplicates
- 在yum的ELRepo源中,mainline 为最新版本的内核,安装kernel
ipvs依赖于nf_conntrack_ipv4内核模块,4.19包括之后内核里改名为nf_conntrack,1.13.1之前的kube-proxy的代码里没有加判断一直用的nf_conntrack_ipv4,好像是1.13.1后的kube-proxy代码里增加了判断,我测试了是会去load nf_conntrack使用ipvs正常
下面链接可以下载到其他归档版本的
- ubuntuhttp://kernel.ubuntu.com/~kernel-ppa/mainline/
- RHELhttp://mirror.rc.usf.edu/compute_lock/elrepo/kernel/el7/x86_64/RPMS/
下面是ml的内核和上面归档内核版本任选其一的安装方法
export Kernel_Version=4.18.9-1 wget http://mirror.rc.usf.edu/compute_lock/elrepo/kernel/el7/x86_64/RPMS/kernel-ml{,-devel}-${Kernel_Version}.el7.elrepo.x86_64.rpm yum localinstall -y kernel-ml*
yum --disablerepo="*" --enablerepo="elrepo-kernel" list available --showduplicates | grep -Po '^kernel-ml.x86_64\s+\K\S+(?=.el7)' yum --disablerepo="*" --enablerepo=elrepo-kernel install -y kernel-ml{,-devel}
- 修改内核启动顺序,默认启动的顺序应该为1,升级以后内核是往前面插入,为0(如果每次启动时需要手动选择哪个内核,该步骤可以省略)
grub2-set-default 0 && grub2-mkconfig -o /etc/grub2.cfg
使用下面命令看看确认下是否启动默认内核指向上面安装的内核
grubby --default-kernel
- docker官方的内核检查脚本建议(RHEL7/CentOS7: User namespaces disabled; add ‘user_namespace.enable=1’ to boot command line),使用下面命令开启
grubby --args="user_namespace.enable=1" --update-kernel="$(grubby --default-kernel)"
- 重启加载新内核
reboot
- 所有机器安装ipvs(ipvs性能甩iptables几条街并且排错更直观)
在每台机器上安装依赖包:
CentOS:
yum install ipvsadm ipset sysstat conntrack libseccomp -y
Ubuntu:
1 |
sudo apt-get install -y wget git conntrack ipvsadm ipset jq sysstat curl iptables libseccomp |
- 所有机器选择需要开机加载的内核模块,以下是 ipvs 模式需要加载的模块并设置开机自动加载
:> /etc/modules-load.d/ipvs.conf module=( ip_vs ip_vs_rr ip_vs_wrr ip_vs_sh nf_conntrack br_netfilter ) for kernel_module in ${module[@]};do /sbin/modinfo -F filename $kernel_module |& grep -qv ERROR && echo $kernel_module >> /etc/modules-load.d/ipvs.conf || : done systemctl enable --now systemd-modules-load.service
上面如果systemctl enable命令报错可以systemctl status -l systemd-modules-load.service看看哪个内核模块加载不了,在/etc/modules-load.d/ipvs.conf里注释掉它再enable试试
- 所有机器需要设定/etc/sysctl.d/k8s.conf的系统参数。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35
cat check-config.sh bash ./check-config.sh
- 所有机器需要安装Docker CE 版本的容器引擎,推荐使用年份命名版本的docker ce:
- 在官方查看K8s支持的docker版本 https://github.com/kubernetes/kubernetes 里进对应版本的changelog里搜The list of validated docker versions remain
- 这里利用docker的官方安装脚本来安装,可以使用yum list –showduplicates ‘docker-ce查询可用的docker版本,选择你要安装的k8s版本支持的docker版本即可,这里我使用的是18.06.03
1 2
export VERSION=18.06 curl -fsSL "https://get.docker.com/" | bash -s -- --mirror Aliyun
- 所有机器配置加速源并配置docker的启动参数使用systemd,使用systemd是官方的建议,详见 https://kubernetes.io/docs/setup/cri/
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
mkdir -p /etc/docker/
cat>/etc/docker/daemon.json