赞
踩
1 K8S版本拉齐
1.1 概述
本文档适用于移动云K8S版本从v1.16.0、v1.18.5版本升级至v1.21.5,k8s集群配套组件calico、coredns、etcd、容器运行时、监控等,也将拉齐至EKI V1.0发布的版本。
1.2 k8s
1.2.1 版本
组件名称 现有版本 目标版本
K8S v1.16.0 v1.21.5
K8S v1.18.5 v1.21.5
1.3 calico
1.3.1 版本
组件名称 现有版本 目标版本
calico v3.8.4 v3.20.2
1.3.2 拉齐步骤
1.备份
$ cp -r /apps/conf/calico/conf /apps/conf/calico/conf-back
$ sudo /apps/bin/kubectl -n kube-system get cm calico-config -oyaml > calico-config.yaml
$ sudo /apps/bin/kubectl -n kube-system get deploy calico-kube-controllers -oyaml > calico-kube-controllers.yaml
$ sudo /apps/bin/kubectl -n kube-system get ds calico-node -oyaml > calico-node.yaml
若K8S集群节点内存在/apps/bin/calicoctl文件,则将其备份:
$ cp /apps/bin/calicoctl /apps/bin/calicoctl-3.8.4
2.准备工作
确认镜像上传
镜像:calico-cni:v3.20.2、calico-pod2daemon-flexvol:v3.20.2、calico-node:v3.20.2、calico-typha:v3.20.2、calico-kube-controllers:v3.20.2
确认以上镜像均已上传至该K8S环境使用的镜像仓库(根据实际镜像仓库地址添加仓库名/项目名)。
确认部署文件上传
确认部署文件calico-etcd-v4.yaml、calico-etcd-v6.yaml、calicoctl.cfg文件均已上传至某master节点。
确认calicoctl二进制文件上传
将calicoctl二进制文件上传至K8S集群内所有节点的/apps/bin目录,替换原有calicoctl文件。
3.部署calico
根据K8S为单栈环境,还是双栈环境,修改对应的yaml文件。
若为K8S单栈,修改calico-etcd-v4.yaml
① CALICO_IPV4POOL_CIDR:修改为原环境的值;
② IP_AUTODETECTION_METHOD,则将该值修改为原环境的值;
③ calico-etcd-secrets中etcd-ca、etcd-cert、etcd-key的值修改为环境中的值,cat 文件名| base64 -w 0
④ etcd_endpoints:修改为环境中etcd对外暴露的地址,以逗号分隔;
若为K8S双栈,修改calico-etcd-v6.yaml
① CALICO_IPV4POOL_CIDR:修改为原环境的值;
② CALICO_IPV6POOL_CIDR:修改为需要的值;
③ IP_AUTODETECTION_METHOD,则将该值修改为原环境的值;
④ IP6_AUTODETECTION_METHOD,修为与IP_AUTODETECTION_METHOD同一网卡IPv6的地址;
⑤ calico-etcd-secrets中etcd-ca、etcd-cert、etcd-key的值修改为环境中的值,cat 文件名| base64 -w 0
⑥ etcd_endpoints:修改为环境中etcd对外暴露的地址,以逗号分隔;
根据yaml文件执行部署:
$ sudo /apps/bin/kubectl apply -f calico-etcd-v4.yaml
$ sudo /apps/bin/kubectl apply -f calico-etcd-v6.yaml
4.部署calicoctl
修改文件calicoctl.cfg文件,根据实际环境的信息,修改参数etcdEndpoints。
将calicoctl.cfg文件存入目录 /etc/calico。
1.3.3 验证
检查calico pod状态:
$ sudo /apps/bin/kubectl -n kube-system get po | grep calico
检查calico node状态:
$ calicoctl node status
1.3.4 回滚
删除新部署calico:
$ sudo /apps/bin/kubectl delete -f calico-etcd-v4.yaml
$ sudo /apps/bin/kubectl delete -f calico-etcd-v6.yaml
部署原有calico
$ sudo /apps/bin/kubectl apply -f /apps/conf/calico/conf/*
恢复calicoctl
$ cp /apps/bin/calicoctl-3.8.4 /apps/bin/calicoctl
1.3.5 业务影响
calico版本升级期间不会对已有业务产生影响。
1.4 coredns
1.4.1 版本
组件名称 现有版本 目标版本
croedns 1.6.5 1.8.0
coredns 1.6.7 1.8.0
1.4.2 拉齐步骤
1.备份
$ sudo /apps/bin/kubectl -n kube-system get deploy coredns -oyaml > coredns.yaml
2.准备工作
确认镜像上传
镜像:coredns:1.8.0
确认以上镜像均已上传至该K8S环境使用的镜像仓库(根据实际镜像仓库地址添加仓库名/项目名)。
3.部署
修改coredns deployment的镜像tag
$ sudo /apps/bin/kubectl -n kube-system edit deploy coredns
1.4.3 验证
检查coredns pod的状态
$ sudo /apps/bin/kubectl -n kube-system get po| grep coredns
检查coredns是否正常工作
$ sudo /apps/bin/kubectl apply -f dnsutils.yaml
$ sudo /apps/bin/kubectl exec -ti dnsutils bash
$ nslookup kubernetes
$ exit
$ sudo /apps/bin/kubectl delete -f dnsutils.yaml
1.4.4 回滚
将coredns镜像的版本修改为原来的值:1.6.5或1.6.7
$ sudo /apps/bin/kubectl -n kube-system edit deploy coredns
1.4.5 业务影响
coredns版本升级,将会采取滚动更新的方式进行,不会对已有业务产生影响。
1.5 etcd
1.5.1 版本
组件名称 现有版本 目标版本
etcd 3.3.15 3.4.13
etcd 3.4.3 3.4.13
1.5.2 拉齐步骤
1.备份
备份etcd
$ etcdctl --cacert ca.crt --cert server.crt --key server.key --endpoints=https://192.168.0.1:2379,https://192.168.0.2:2379,https://192.168.0.3:2379 endpoints status -w table
$ etcdctl --cacert ca.crt --cert server.crt --key server.key --endpoints https://127.0.0.1:2379 snapshot save /apps/data/snapshot.db
$ cp -r /apps/data/etcd/ /apps/data/etcd-bak
备份etcd证书
$ cp -r /apps/conf/kubernetes/ssl/etcd /apps/conf/kubernetes/ssl/etcd-bak
备份yaml文件
$ cp -r /apps/conf/kubernetes/manifests/etcd.yaml /apps/conf/kubernetes/etcd.yaml-bak
$ cp -r /apps/conf/kubernetes/manifests/kube-apiserver.yaml /apps/conf/kubernetes/kube-apiserver.yaml-bak
2.准备工作
确认镜像上传
镜像:etcd:3.4.13-0
确认以上镜像均已上传至该K8S环境使用的镜像仓库(根据实际镜像仓库地址添加仓库名/项目名)。
确认3.4.13版本的etcdctl命令上传
将etcdctl二进制文件上传到目录/apps/bin下。
3.部署
版本更新
依次在3台master节点上执行如下步骤(该版本更新步骤,针对K8S初始版本为1.18.5)
$ mv /apps/conf/kubernetes/manifests/etcd.yaml /apps/conf/kubernetes/
$ vi /apps/conf/kubernetes/etcd.yaml
$ mv /apps/conf/kubernetes/etcd.yaml /apps/conf/kubernetes/manifests/
依次在3台master节点上执行如下步骤(该版本更新步骤,针对K8S初始版本为1.16.0)
$ systemctl stop etcd
$ systemctl disable etcd
$ cp /apps/conf/kubernetes/ssl/etcd/ca.pem /apps/conf/kubernetes/ssl/etcd/ca.crt
$ cp /apps/conf/kubernetes/ssl/etcd/ca-key.pem /apps/conf/kubernetes/ssl/etcd/ca.key
$ vi /apps/conf/kubernetes/kubeadm-config.yaml
$ kubeadm init phase certs etcd-healthcheck-client --config kubeadm-config.yaml
$ kubeadm init phase certs etcd-server --config kubeadm-config.yaml
$ kubeadm init phase certs etcd-peer --config kubeadm-config.yaml
$ kubeadm init phase etcd local --config /apps/conf/kubeadm-config.yaml
$ docker ps | grep etcd
$ vi etcd.yaml
–advertise-client-urls=https://{etcd2节点地址}:2379
–initial-advertise-peer-urls=https://{etcd2节点地址}:2380
–initial-cluster={etcd1节点名称}=https://{etcd1节点地址}:2380,{etcd2节点名称}=https://{etcd2节点地址}:2380
–listen-client-urls=https://{etcd2节点地址}:2379
–listen-peer-urls=https://{etcd2节点地址}:2380
–name={etcd2节点名称}
–initial-cluster-state=existing
$ systemctl stop etcd
$ systemctl disable etcd
$ mv etcd.yaml /apps/conf/kubernetes/manifests/
$ vi etcd.yaml
–advertise-client-urls=https://{etcd3节点地址}:2379
–initial-advertise-peer-urls=https://{etcd3节点地址}:2380
–initial-cluster={etcd1节点名称}=https://{etcd1节点地址}:2380,{etcd2节点名称}=https://{etcd2节点地址}:2380,{etcd3节点名称}=https://{etcd3节点地址}:2380
–listen-client-urls=https://{etcd3节点地址}:2379
–listen-peer-urls=https://{etcd3节点地址}:2380
–name={etcd3节点名称}
–initial-cluster-state=existing
$ systemctl stop etcd
$ systemctl disable etcd
$ mv etcd.yaml /apps/conf/kubernetes/manifests/
IPv6切换
① 新建etcd证书
$ vi /apps/conf/kubernetes/kubeadm-config-v6.yaml
$ cd /apps/conf/kubernetes/ssl/etcd
$ rm server.* peer.*
$ kubeadm init phase certs etcd-server --config kubeadm-config-v6.yaml
$ kubeadm init phase certs etcd-peer --config kubeadm-config-v6.yaml
$ scp server.* peer.* master1、2:/apps/conf/kubernetes/ssl/etcd/
② 修改etcd1,在master1节点执行
$ vi /apps/conf/kubernetes/etcd.yaml
$ mv /apps/conf/kubernetes/etcd.yaml /apps/conf/kubernetes/manifests/
$ etcdctl --cacert /apps/conf/kubernetes/ssl/etcd/ca.crt --cert /apps/conf/kubernetes/ssl/etcd/server.crt --key /apps/conf/kubernetes/ssl/etcd/server.key --endpoints=https://{master1节点IPv6地址} member list -w table
$ etcdctl --cacert /apps/conf/kubernetes/ssl/etcd/ca.crt --cert /apps/conf/kubernetes/ssl/etcd/server.crt --key /apps/conf/kubernetes/ssl/etcd/server.key --endpoints=https://{master1节点IPv6地址} member update {上一步获取的etcd1的ID} --peer-urls=https://{master1节点IPv6地址}:2380
③ 修改kube-apiserver,在master1节点执行
$ vi /apps/conf/kubernetes/kube-apiserver.yaml
$ mv /apps/conf/kubernetes/kube-apiserver.yaml /apps/conf/kubernetes/manifests/
④ 确认etcd2、etcd3的节点
⑤ 修改etcd2,在etcd2所在节点执行
$ vi /apps/conf/kubernetes/etcd.yaml
$ mv /apps/conf/kubernetes/etcd.yaml /apps/conf/kubernetes/manifests/
$ etcdctl --cacert /apps/conf/kubernetes/ssl/etcd/ca.crt --cert /apps/conf/kubernetes/ssl/etcd/server.crt --key /apps/conf/kubernetes/ssl/etcd/server.key --endpoints=https://{etcd2节点IPv6地址} member list -w table
$ etcdctl --cacert /apps/conf/kubernetes/ssl/etcd/ca.crt --cert /apps/conf/kubernetes/ssl/etcd/server.crt --key /apps/conf/kubernetes/ssl/etcd/server.key --endpoints=https://{etcd2节点IPv6地址} member update {上一步获取的etcd2的ID} --peer-urls=https://{etcd2节点IPv6地址}:2380
⑥ 修改kube-apiserver,在etcd2所在节点执行
$ vi /apps/conf/kubernetes/kube-apiserver.yaml
$ mv /apps/conf/kubernetes/kube-apiserver.yaml /apps/conf/kubernetes/manifests/
⑦ 修改etcd3,在etcd3所在节点执行
$ vi /apps/conf/kubernetes/etcd.yaml
$ mv /apps/conf/kubernetes/etcd.yaml /apps/conf/kubernetes/manifests/
$ etcdctl --cacert /apps/conf/kubernetes/ssl/etcd/ca.crt --cert /apps/conf/kubernetes/ssl/etcd/server.crt --key /apps/conf/kubernetes/ssl/etcd/server.key --endpoints=https://{etcd3节点IPv6地址} member list -w table
$ etcdctl --cacert /apps/conf/kubernetes/ssl/etcd/ca.crt --cert /apps/conf/kubernetes/ssl/etcd/server.crt --key /apps/conf/kubernetes/ssl/etcd/server.key --endpoints=https://{etcd3节点IPv6地址} member update {上一步获取的etcd3的ID} --peer-urls=https://{etcd3节点IPv6地址}:2380
⑧ 修改kube-apiserver,在etcd3所在节点执行
$ vi /apps/conf/kubernetes/kube-apiserver.yaml
$ mv /apps/conf/kubernetes/kube-apiserver.yaml /apps/conf/kubernetes/manifests/
1.5.3 验证
$ etcdctl --cacert ca.crt --cert server.crt --key server.key --endpoints=https://[master1节点IPv6地址]:2379,https://[master2节点IPv6地址]:2379,https://[master3节点IPv6地址]:2379 endpoints status -w table
1.5.4 回滚
① 依次在3台master节点恢复etcd及kube-apiserver,按照etcd1、etcd2、etcd3的顺序执行。
$ cp /apps/conf/kubernetes/etcd.yaml-bak /apps/conf/kubernetes/manifests/
$ cp /apps/conf/kubernetes/kube-apiserver.yaml-bak /apps/conf/kubernetes/manifests/
1.5.5 异常情况处理
若出现etcd启动异常,暂无法解决的情况,可通过重建etcd集群实现。
① 删除etcd集群,依次在3台master节点执行
$ mv /apps/conf/kubernetes/manifests/etcd.yaml /apps/conf/kubernetes/
$ rm -rf /apps/data/etcd
② 恢复etcd数据
etcdctl
–name {节点hostname}
–endpoints=“https://[节点IPv6地址]:2379”
–initial-advertise-peer-urls=https://[节点IPv6地址]:2380
–cert=/apps/conf/kubernetes/ssl/etcd/server.crt
–key=/apps/conf/kubernetes/ssl/etcd/server.key
–cacert=/apps/conf/kubernetes/ssl/etcd/ca.crt
–initial-cluster “{节点hostname}=https://[节点IPv6地址]:2380”
–initial-advertise-peer-urls https://[节点IPv6地址]:2380
–data-dir=/apps/data/etcd
snapshot restore /apps/data/snapshot.db
③ 创建etcd1,在master1节点执行
$ mv /apps/conf/kubernetes/etcd.yaml /apps/conf/kubernetes/manifests/
④ 创建etcd2
$ etcdctl --cacert ca.crt --cert server.crt --key server.key --endpoints=https://[master1节点IPv6地址]:2379 member add {etcd2节点hostname} --peer-urls=https://[etcd2节点IPv6地址]:2380
$ mv /apps/conf/kubernetes/etcd.yaml /apps/conf/kubernetes/manifests/
⑤ 创建etcd3
$ etcdctl --cacert ca.crt --cert server.crt --key server.key --endpoints=https://[master1节点IPv6地址]:2379 member add {etcd3节点hostname} --peer-urls=https://[etcd3节点IPv6地址]:2380
$ mv /apps/conf/kubernetes/etcd.yaml /apps/conf/kubernetes/manifests/
1.5.6 业务影响
etcd组件版本更新时,将采取滚动更新的方式,会对master节点的kube-apiserver依次中断1分钟,若存在连接apiserver的业务,则存在3秒的业务中断,3秒内会将业务切换至其它正常工作的apiserver实例。
若存在连接etcd集群的业务,则需在etcd改造过程中,配合修改连接的etcd地址。
1.6 容器运行时
1.6.1 版本
组件名称 现有版本 目标版本
docker 18.09.5 containerd 1.5.7
1.6.2 拉齐步骤
1.准备工作
上传containerd安装包及config.toml文件
将cri-containerd-cni-1.5.7-linux-amd64.tar.gz、config.toml文件上传到节点上。
节点维护
① 驱逐需要更换容器运行时的节点上的pod,并将pod设置为不可调度:若存在不能驱逐的pod,且该pod使用了hostPort,需将该pod的副本数设置为0.
$ sudo /apps/bin/kubectl drain {节点名称}
② 关闭docker、containerd、kubelet
$ systemctl stop kubelet
$ docker stop $(docker ps -a| awk ‘{print $1}’ | tail -n +2)
$ docker rm $(docker container ls -a -q)
$ systemctl stop docker
$ systemctl stop containerd
③ 检查kube-apiserver、etcd、scheduler、controller-manager进程
若以上进程仍存在,需手动将其kill掉。
$ kill -9 $(pidof kube-apiserver)
$ kill -9 $(pidof etcd)
$ kill -9 $(pidof kube-scheduler)
$ kill -9 $(pidof kube-controller-manager)
④ 检查libseccomp版本
由于新的containerd需使用2.4以上版本的libseccomp,所以需先删除原有libseccomp,并安装新版libseccomp。
$ rpm -e libseccomp-devel-2.3.1-4.el7.x86_64 --nodeps
$ rpm -e libseccomp-2.3.1-3.el7.x86_64 --nodeps
$ rpm -ivh libseccomp-2.4.1-0.el7.x86_64.rpm
$ rpm -ivh libseccomp-devel-2.4.1-0.el7.x86_64.rpm
2.containerd部署
① 解压安装包
$ tar --no-overwrite-dir -C / -xzf cri-containerd-cni-1.5.7-linux-amd64.tar.gz
② 拷贝config.yaml
$ cp config.toml /etc/containerd/config.toml
③ 启动containerd
$ systemctl daemon-reload
$ systemctl start containerd
$ systemctl enable containerd
3.kubelet修改
① 备份kubelet.env、kubelet.service文件
$ cp /apps/conf/kubernetes/kubelet.env /apps/conf/kubernetes/kubelet.env-bak
$ cp /etcd/systemd/system/kubelet.service /apps/conf/kubernetes/
② 修改kubelet.env参数
–container-runtime remote
–runtime-request-timeout=15m
–container-runtime-endpoint=unix:///run/containerd/containerd.sock \
–runtime-cgroups=/system.slice/containerd.service
–pod-infra-container-image=registry.paas/cmss/pause:3.4.1
③ 修改/etc/systemd/system/kubelet.service或/usr/lib/systemd/system/kubelet.service
After=containerd.service
Wants=containerd.service
④ 重启kubelet
$ systemctl daemon-reload
$ systemctl restart kubelet
4.节点恢复调度
$ sudo /apps/bin/kubectl uncordon {节点名称}
5.配置containerd日志转发
$ mkdir /apps/logs/containerd
$ touch /apps/logs/containerd/containerd.log
$ chown -R apps /apps/logs/containerd
$ cat < /etc/rsyslog.d/containerd.conf
if $programname == ‘containerd’ then /apps/logs/containerd/containerd.log
if $programname == ‘containerd’ then ~
EOF
$ systemctl restart rsyslog
配置containerd日志切割
cat </etc/logrotate.d/containerd
/apps/logs/containerd/*.log
{
daily
rotate 100
compress
missingok
copytruncate
delaycompress
maxsize 1G
minsize 1024k
notifempty
dateext
}
EOF
/usr/sbin/logrotate -vf /etc/logrotate.d/containerd
1.6.3 回滚
1.重启docker
$ systemctl restart docker
2.重启kubelet
$ cp /apps/conf/kubernetes/kubelet.env-bak /apps/conf/kubernetes/kubelet.env
$ cp /apps/conf/kubernetes/kubelet.service /etc/systemd/system/
$ systemctl restart kubelet
1.6.4 业务影响
容器运行时切换的过程中,会将该节点上的pod,预先进行驱逐,会导致该节点上的业务出现短暂的业务中断。
1.7 监控
1.7.1 版本
组件名称 现有版本 目标版本
metrics-server v0.3.1 v0.6.1
metrics-server v0.3.6 v0.6.1
kube-state-metrics v1.9.7 v2.1.1
1.7.2 拉齐步骤
1.准备工作
确认镜像上传
镜像:metrics-server:v0.6.1、kube-state-metrics:v2.1.1、kube-rbac-proxy:v0.11.0
确认以上镜像均已上传至该K8S环境使用的镜像仓库(根据实际镜像仓库地址添加仓库名/项目名)。
上传metrics-server部署文件
上传kube-state-metrics文件
2.备份
$ sudo /apps/bin/kubectl -n kube-system get deploy kube-state-metrics -oyaml > kube-state-metrics-deploy.yaml
$ sudo /apps/bin/kubectl -n kube-system get svc kube-state-metrics -oyaml > kube-state-metrics-svc.yaml
3.更新metrics-server
$ sudo /apps/bin/kubectl -n kube-system edit deploy metrics-server
4.删除kube-state-metrics
$ sudo /apps/bin/kubectl -n kube-system delete deploy kube-state-metrics
$ sudo /apps/bin/kubectl -n kube-system delete svc kube-state-metrics
5.部署kube-state-metrics
$ sudo /apps/bin/kubectl apply -f kube-state-metrics/*
1.7.3 回滚
1.回滚metrics-server
$ sudo /apps/bin/kubectl n kube-system edit deploy metrics-server
2.回滚kube-state-metrics
$ sudo /apps/bin/kubectl delete -f kube-state-metrics/*
$ sudo /apps/bin/kubectl apply -f kube-state-metrics-deploy.yaml
$ sudo /apps/bin/kubectl apply -f kube-state-metrics-svc.yaml
1.7.4 业务影响
监控组件版本升级期间,不会对已有业务产生影响。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。