有心人可能会发现后面的高可用计划部署实现后的节点截图:
Master 节点和 Node 节点的版本不统一,这也牵引出本文的目标,如何简略治理保护一套集群环境,首先当然包含:集群的降级和集群节点的伸缩。
集群版本升级
官网文档地址,不同版本间降级可能会存在差别,本文针对 1.19.x 降级至 1.20.x 版本。
降级流程
降级工作的根本流程如下:
- 降级主控制立体节点
- 降级其余管制立体节点
- 降级工作节点
注意事项
上面是官网对于集群降级的须知:
- 务必仔细认真浏览发行阐明。
- 集群应应用动态的管制立体和 etcd Pod 或者内部 etcd。
- 务必备份所有重要组件,例如存储在数据库中利用层面的状态。
kubeadm upgrade
不会影响你的工作负载,只会波及 Kubernetes 外部的组件,但备份究竟是好的。- 必须禁用替换分区
附加信息
- 在对 kubelet 作次版本升级时须要凌空节点。对于管制面节点,其上可能运行着 CoreDNS Pods 或者其它十分重要的负载。
- 降级后,因为容器规约的哈希值已更改,所有容器都会被重新启动。
Master 节点降级
依照降级流程,首先对主控 Master 节点降级,而后再对其余 Master 节点进行降级
kubeadm 降级
-
主控 Master 节点
# 用最新的补丁版本号替换 1.20.x-0 中的 x yum install -y kubeadm-1.20.4-0 --disableexcludes=kubernetes # 验证下载操作失常,并且 kubeadm 版本正确:kubeadm version # 验证降级打算:kubeadm upgrade plan # 抉择要降级到的指标版本,运行适合的命令。例如:# 将 x 替换为你为此次降级所抉择的补丁版本号 sudo kubeadm upgrade apply v1.20.4
-
其余 Master 节点
sudo kubeadm upgrade node
kubelet 和 kubectl 降级
此处须要依据官网阐明先做凌空节点操作。
-
凌空节点
通过将节点标记为不可调度并凌空节点为节点作降级筹备:
# 将 <node-to-drain> 替换为你要凌空的管制面节点名称,kubectl get nods 中的名称 kubectl drain <node-to-drain> --ignore-daemonsets
kubectl drain
命令能够用来标记某个节点行将进行服务。运行 kubectl drain
命令时,工具会尝试驱赶机器上的所有 Pod。kubectl
所提交的驱赶申请可能会临时被回绝,所以该工具会定时重试失败的申请,直到所有的 Pod 都被终止,或者达到配置的超时工夫。
-
降级 kubelet 和 kubectl
yum install -y kubelet-1.20.4-0 kubectl-1.20.4-0 --disableexcludes=kubernetes sudo systemctl daemon-reload sudo systemctl restart kubelet
-
解除节点的爱护
通过将节点标记为可调度,让其从新上线:
# 将 <node-to-drain> 替换为你的节点名称 kubectl uncordon <node-to-drain>
降级 node 节点
kubeadm 降级
# 用最新的补丁版本替换 1.20.x-00 中的 x
yum install -y kubeadm-1.20.x-0 --disableexcludes=kubernetes
执行 “kubeadm upgrade”
对于工作节点,上面的命令会降级本地的 kubelet 配置:
sudo kubeadm upgrade node
kubelet 和 kubectl 降级
-
凌空节点
将节点标记为不可调度并驱赶所有负载,筹备节点的保护:
# 将 <node-to-drain> 替换为你正在凌空的节点的名称 kubectl drain <node-to-drain> --ignore-daemonsets
-
降级 kubelet 和 kubectl
# 将 1.20.x-0 x 替换为最新的补丁版本 yum install -y kubelet-1.20.x-0 kubectl-1.20.x-0 --disableexcludes=kubernetes
-
重启 kubelet
sudo systemctl daemon-reload sudo systemctl restart kubelet
-
勾销对节点的爱护
通过将节点标记为可调度,让节点从新上线:
# 将 <node-to-drain> 替换为以后节点的名称 kubectl uncordon <node-to-drain>
验证集群
kubectl get nodes
能够看见以后所有节点都为 1.20.4 版本。
降级工作原理
这里援用官网的介绍:
kubeadm upgrade apply
做了以下工作:
查看你的集群是否处于可降级状态:
- API 服务器是可拜访的
- 所有节点处于
Ready
状态- 管制面是衰弱的
- 强制执行版本偏差策略。
- 确保管制面的镜像是可用的或可拉取到服务器上。
- 如果组件配置要求版本升级,则生成代替配置与 / 或应用用户提供的笼罩版本配置。
- 降级管制面组件或回滚(如果其中任何一个组件无奈启动)。
- 利用新的
kube-dns
和kube-proxy
清单,并强制创立所有必须的 RBAC 规定。- 如果旧文件在 180 天后过期,将创立 API 服务器的新证书和密钥文件并备份旧文件。
kubeadm upgrade node
在其余管制平节点上执行以下操作:
- 从集群中获取 kubeadm
ClusterConfiguration
。- (可选操作)备份 kube-apiserver 证书。
- 降级管制立体组件的动态 Pod 清单。
- 为本节点降级 kubelet 配置
kubeadm upgrade node
在工作节点上实现以下工作:
- 从集群取回 kubeadm
ClusterConfiguration
。- 为本节点降级 kubelet 配置。
集群增加和删除节点
移除
从集群中移除节点时,Master 和 Node 节点形式统一。
## 清空
kubectl drain <node-to-drain> --delete-local-data --force --ignore-daemonsets
kubeadm reset
kubectl delete node <node name>
- 首先驱赶节点
- 重置 kubeadm
- 删除节点
新增 Node 节点
在 kubeadm 初始化集群胜利后会返回 join 命令, 外面有 token,discovery-token-ca-cert-hash 等参数, 但他们是有过期工夫的. token 的过期工夫是 24 小时, certificate-key 过期工夫是 2 小时。通过以下命令能够查看 token 列表
kubeadm token list
当 token 生效后,新增新的 Node 节点时,须要从新创立新的 token:
# 创立新的 token
kubeadm token create --print-join-command
# 应用 join 命令退出集群,kubernetes-vip 是 vip 地址,若只有一个 master 节点,此处换成 master 的地址
kubeadm join kubernetes-vip:9443 --token bayqt8.eaafmfthasquy4yn --discovery-token-ca-cert-hash sha256:250115fad0a4b6852a919dbba4222ac65bc64843c660363ab119606ff8819d0a
新增 Master 节点
新增 Master 节点额定须要 certificate-key 参数,应用以下命令生成:
# 生成 certificate-key
kubeadm init phase upload-certs --upload-certs
# 应用 Node 节点的 join 命令并且拼上 --control-plane --certificate-key 参数
kubeadm join kubernetes-vip:9443 --token bayqt8.eaafmfthasquy4yn --discovery-token-ca-cert-hash sha256:250115fad0a4b6852a919dbba4222ac65bc64843c660363ab119606ff8819d0a --control-plane --certificate-key bfd5bc7ff4aa54e1cba9a5979210c06ae087ae6fb9979af8f851554638889d7b
证书生效治理
Kubernetes 集群的证书有效期默认为 1 年,过期后集群将不能失常拜访,然而证书会随着版本升级的过程主动续期,所以官网倡议常常做版本升级,否则只能手动的更新证书有效期。网上材料目前次要分 3 种:1. 手动更新证书 2. 通过 Kubernetes 证书 API 更新证书 3. 批改 kubeadm 源码证书时长,而后编译创立集群。(此种办法不倡议)
手动更新证书
# 查看证书时效
kubeadm certs check-expiration
接下来咱们来更新咱们的集群证书,上面的操作都是在 Master 节点上进行,首先备份原有证书:
$ mkdir /etc/kubernetes.bak
$ cp -r /etc/kubernetes/pki/ /etc/kubernetes.bak
$ cp /etc/kubernetes/*.conf /etc/kubernetes.bak
而后备份 etcd 数据目录:
$ cp -r /var/lib/etcd /var/lib/etcd.bak
更新证书命令:
kubeadm certs renew all --config=kubeadm.yaml
而后记得更新下 kubeconfig 文件:
$ kubeadm init phase kubeconfig all --config kubeadm.yaml
[kubeconfig] Using kubeconfig folder "/etc/kubernetes"
[kubeconfig] Using existing kubeconfig file: "/etc/kubernetes/admin.conf"
[kubeconfig] Using existing kubeconfig file: "/etc/kubernetes/kubelet.conf"
[kubeconfig] Using existing kubeconfig file: "/etc/kubernetes/controller-manager.conf"
[kubeconfig] Using existing kubeconfig file: "/etc/kubernetes/scheduler.conf"
将新生成的 admin 配置文件笼罩掉本来的 admin 文件:
$ mv $HOME/.kube/config $HOME/.kube/config.old
$ cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
$ chown $(id -u):$(id -g) $HOME/.kube/config
实现后重启 kube-apiserver、kube-controller、kube-scheduler、etcd 这 4 个容器即可,咱们能够查看 apiserver 的证书的有效期来验证是否更新胜利:
echo | openssl s_client -showcerts -connect 127.0.0.1:6443 -servername api 2>/dev/null | openssl x509 -noout -enddate
notAfter=Mar 16 06:41:24 2022 GMT
看到当初的有效期是一年过后的,证实曾经更新胜利了。
Kubernetes 证书 API 更新证书
对于线上环境咱们可能并不会去冒险常常更新集群或者去更新证书,这些毕竟是有危险的,所以咱们心愿生成的证书有效期足够长,尽管从安全性角度来说不举荐这样做,然而对于某些场景下一个足够长的证书有效期也是十分有必要的,Kubernetes 证书 API 的形式恰好能满足咱们的要求。
有趣味的依照英文文档来试验一下,中文文档还是有些中央滞后,很多命令执行时都提醒曾经作废。