乐趣区

关于kubernetes:Kubernetes高可用集群的管理

有心人可能会发现后面的高可用计划部署实现后的节点截图:

Master 节点和 Node 节点的版本不统一,这也牵引出本文的目标,如何简略治理保护一套集群环境,首先当然包含:集群的降级和集群节点的伸缩。

集群版本升级

官网文档地址,不同版本间降级可能会存在差别,本文针对 1.19.x 降级至 1.20.x 版本。

降级流程

降级工作的根本流程如下:

  1. 降级主控制立体节点
  2. 降级其余管制立体节点
  3. 降级工作节点

注意事项

上面是官网对于集群降级的须知:

  • 务必仔细认真浏览发行阐明。
  • 集群应应用动态的管制立体和 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-dnskube-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 的形式恰好能满足咱们的要求。

有趣味的依照英文文档来试验一下,中文文档还是有些中央滞后,很多命令执行时都提醒曾经作废。

退出移动版