【K8S专栏】Kubernetes集群管理(二)

简介: 【K8S专栏】Kubernetes集群管理

更新集群


集群的更新操作有很多,比如创建或删除应用、添加或者删除节点等,这里主要介绍几种常用的操作:

  • 升级集群
  • 更新集群证书
  • 添加或删除集群

升级集群

Kubernetes社区新版本的推出速度很快的,至少保持一年3个版本的迭代。在实际生产中,我们可能不会频繁的升级集群,因为这样的动作太大,可能导致其他生产问题。

但是,有时候会因为某些原因(比如软件版本兼容性、集群BUG等)不得不做升级集群的操作,所以,有必要掌握集群的升级方法以备不时之需。

升级前准备

  • 升级前,需要认真阅读每个版本的?CHANGELOG。
  • 务必备份所有重要组件,例如存储在数据库中应用层面的状态。kubeadm upgrade 不会影响你的工作负载,只会涉及 Kubernetes 内部的组件,但备份终究是好的。
  • 可以小版本升级,也可以跨一个大版本升级,不建议跨两个大版本升级

升级目标

现在集群的版本是1.24.0,预计升级的目标版本是1.24.2。

$ kubectl get nodes 
NAME        STATUS   ROLES           AGE     VERSION
kk-master   Ready    control-plane   7m20s   v1.24.0
kk-node01   Ready    <none>          6m40s   v1.24.0

备份集群

kubeadm upgrade 不会影响你的工作负载,只会涉及 Kubernetes 内部的组件,但备份终究是好的。这里主要是对集群的所有资源进行备份,我使用的是一个开源的脚本,项目地址是:?https://github.com/solomonxu/k8s-backup-restore

(1)下载脚本

$ mkdir -p /data
$ cd /data
$ git clone https://github.com/solomonxu/k8s-backup-restore.git

(2)执行备份

$ cd /data/k8s-backup-restore
$ ./bin/k8s_backup.sh

如果要恢复怎么办?只需要执行如下步骤。(1)创建恢复目录

$ mkdir -p /data/k8s-backup-restore/data/restore

(2)将需要恢复的YAML清单复制到该目录下

$ cp devops_deployments_gitlab.yaml ../../restore/

(3)执行恢复命令

$ cd /data/k8s-backup-restore
$ ./bin/k8s_restore.sh

升级控制节点

(1)确定要升级的版本包是否存在

$ yum list --showduplicates kubeadm --disableexcludes=kubernetes

(2)升级kubeadm到指定版本

$ yum install -y kubeadm-1.24.2-0 --disableexcludes=kubernetes

执行以下命令查看是否升级成功。

$ kubeadm version
kubeadm version: &version.Info{Major:"1", Minor:"24", GitVersion:"v1.24.2", GitCommit:"f66044f4361b9f1f96f0053dd46cb7dce5e990a8", GitTreeState:"clean", BuildDate:"2022-06-15T14:20:54Z", GoVersion:"go1.18.3", Compiler:"gc", Platform:"linux/amd64"}

(3)排空节点

$ kubectl cordon kk-master
$ kubectl drain kk-master

(4)运行升级计划,查看是否可以升级

$ kubeadm upgrade plan
[upgrade/config] Making sure the configuration is correct:
[upgrade/config] Reading configuration from the cluster...
[upgrade/config] FYI: You can look at this config file with 'kubectl -n kube-system get cm kubeadm-config -o yaml'
[preflight] Running pre-flight checks.
[upgrade] Running cluster health checks
[upgrade] Fetching available versions to upgrade to
[upgrade/versions] Cluster version: v1.24.0
[upgrade/versions] kubeadm version: v1.24.2
[upgrade/versions] Target version: v1.24.2
[upgrade/versions] Latest version in the v1.24 series: v1.24.2
Components that must be upgraded manually after you have upgraded the control plane with 'kubeadm upgrade apply':
COMPONENT   CURRENT       TARGET
kubelet     2 x v1.24.0   v1.24.2
Upgrade to the latest version in the v1.24 series:
COMPONENT                 CURRENT   TARGET
kube-apiserver            v1.24.0   v1.24.2
kube-controller-manager   v1.24.0   v1.24.2
kube-scheduler            v1.24.0   v1.24.2
kube-proxy                v1.24.0   v1.24.2
CoreDNS                   v1.8.6    v1.8.6
etcd                      3.5.3-0   3.5.3-0
You can now apply the upgrade by executing the following command:
        kubeadm upgrade apply v1.24.2
_____________________________________________________________________
The table below shows the current state of component configs as understood by this version of kubeadm.
Configs that have a "yes" mark in the "MANUAL UPGRADE REQUIRED" column require manual config upgrade or
resetting to kubeadm defaults before a successful upgrade can be performed. The version to manually
upgrade to is denoted in the "PREFERRED VERSION" column.
API GROUP                 CURRENT VERSION   PREFERRED VERSION   MANUAL UPGRADE REQUIRED
kubeproxy.config.k8s.io   v1alpha1          v1alpha1            no
kubelet.config.k8s.io     v1beta1           v1beta1             no
_____________________________________________________________________

(5)升级集群

$ kubeadm upgrade apply v1.24.2 --config kubeadm.yaml

看到如下输出表示升级成功。

......
[upgrade/successful] SUCCESS! Your cluster was upgraded to "v1.24.2". Enjoy!
......

(6)取消节点调度保护

$ kubectl uncordon kk-master

(7)由于这里Master即是控制平面,也是节点,所以需要对其在进行一次升级

$ kubeadm upgrade node

(8)升级kubectl和kubelet

$ yum install -y kubelet-1.24.2-0 kubectl-1.24.2-0 --disableexcludes=kubernetes

(9)重启kubelet

$ systemctl daemon-reload
$ systemctl restart kubelet

升级节点

(1)升级kubeadm

$ yum install -y kubeadm-1.24.2-0 --disableexcludes=kubernetes

(2)设置节点不可调度且排空节点

$ kubectl cordon kk-node01
$ kubectl drain kk-node01

(3)升级节点

$ kubeadm upgrade node

(4)升级kubelet

$ yum install -y kubelet-1.24.2-0 --disableexcludes=kubernetes

(5)重启节点

$ systemctl daemon-reload
$ systemctl restart kubelet

(6)恢复节点可调度

$ kubectl uncordon kk-node01

验证集群

(1)查看集群状态信息是否正常

$ kubectl get no
NAME        STATUS   ROLES           AGE   VERSION
kk-master   Ready    control-plane   33m   v1.24.2
kk-node01   Ready    <none>          32m   v1.24.2

(2)查看集群Pod是否正常

$ kubectl get po -A
NAMESPACE     NAME                                       READY   STATUS    RESTARTS   AGE
kube-system   calico-kube-controllers-5d49fc6c56-pq57d   1/1     Running   0          31m
kube-system   calico-node-rjdqh                          1/1     Running   0          31m
kube-system   calico-node-s8475                          1/1     Running   0          31m
kube-system   coredns-7f74c56694-qpvmv                   1/1     Running   0          35m
kube-system   coredns-7f74c56694-ww8kb                   1/1     Running   0          35m
kube-system   etcd-kk-master                             1/1     Running   0          35m
kube-system   kube-apiserver-kk-master                   1/1     Running   0          11m
kube-system   kube-controller-manager-kk-master          1/1     Running   0          10m
kube-system   kube-proxy-5pf65                           1/1     Running   0          10m
kube-system   kube-proxy-mcxlq                           1/1     Running   0          10m
kube-system   kube-scheduler-kk-master                   1/1     Running   0          10m

其他

在升级过程中如果升级失败并且没有回滚,可以继续执行kubeadm upgrade。如果要从故障状态恢复,可以执行kubeadm upgrade --force

在升级期间,会在/etc/kubernetes/tmp目录下生成备份文件:

  • kubeadm-backup-etcd-
  • kubeadm-backup-manifests-

kubeadm-backup-etcd中包含本地etcd的数据备份,如果升级失败并且无法修复,可以将其数据复制到etcd数据目录进行手动修复。

kubeadm-backup-manifests中保存的是节点静态pod的YAML清单,如果升级失败并且无法修复,可以将其复制到/etc/kubernetes/manifests下进行手动修复。

升级证书

升级集群可能不会经常发送,但是升级证书应该是一个常态化操作。

使用kubeadm安装的证书默认有效期是一年,也就是说在证书过期之前必须对证书进行升级,不然就会导致整个集群异常。

可以使用如下命令查看集群的证书情况。

$ kubeadm certs check-expiration
[check-expiration] Reading configuration from the cluster...
[check-expiration] FYI: You can look at this config file with 'kubectl -n kube-system get cm kubeadm-config -o yaml'
CERTIFICATE                EXPIRES                  RESIDUAL TIME   CERTIFICATE AUTHORITY   EXTERNALLY MANAGED
admin.conf                 Jul 04, 2023 08:43 UTC   364d            ca                      no      
apiserver                  Jul 04, 2023 08:39 UTC   364d            ca                      no      
apiserver-etcd-client      Jul 04, 2023 08:39 UTC   364d            etcd-ca                 no      
apiserver-kubelet-client   Jul 04, 2023 08:39 UTC   364d            ca                      no      
controller-manager.conf    Jul 04, 2023 08:40 UTC   364d            ca                      no      
etcd-healthcheck-client    Jul 04, 2023 08:16 UTC   364d            etcd-ca                 no      
etcd-peer                  Jul 04, 2023 08:16 UTC   364d            etcd-ca                 no      
etcd-server                Jul 04, 2023 08:16 UTC   364d            etcd-ca                 no      
front-proxy-client         Jul 04, 2023 08:39 UTC   364d            front-proxy-ca          no      
scheduler.conf             Jul 04, 2023 08:40 UTC   364d            ca                      no      
CERTIFICATE AUTHORITY   EXPIRES                  RESIDUAL TIME   EXTERNALLY MANAGED
ca                      Jul 01, 2032 08:16 UTC   9y              no      
etcd-ca                 Jul 01, 2032 08:16 UTC   9y              no      
front-proxy-ca          Jul 01, 2032 08:16 UTC   9y              no

(1)使用kubeadm certs check-expiration检查证书是否过期

(2)备份证书

$ mkdir /etc/kubernetes.bak.20220704
$ cp -r /etc/kubernetes/* /etc/kubernetes.bak.20220704

(3)备份etcd数据库

# 备份数据目录
$ cp -r /var/lib/etcd /var/lib/etcd.bak
# 快照备份
$ export ETCDCTL_API=3
$ etcdctl --endpoints localhost:2379 snapshot save snapshot.db \
          --cacert=/etc/kubernetes/pki/etcd/ca.crt  \
          --cert=/etc/kubernetes/pki/etcd/server.crt \
          --key=/etc/kubernetes/pki/etcd/server.key
# 快照恢复命令
$ etcdctl snapshot restore snapshot.db --name m3 --data-dir=/home/etcd_data

(4)更新证书

$ kubeadm alpha certs renew all --config=kubeadm.yaml

(5)更新kubeconfig

$ kubeadm init phase kubeconfig all --config kubeadm.yaml

(6)覆盖控制节点的kubeconfig

$ 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

(7)完成后重启kubernetes控制面的组件

$ cd /etc/kubernetes/manifests
$ mv *.yaml ../
$ mv ../*.yaml .

containerd运行时没有重启容器的命令,所以这里采用是直接移出再拷贝进来的操作。如果底层安装有docker,可以使用docker命令进行重启。

(8)检查证书是否更新

$ echo | openssl s_client -showcerts -connect 127.0.0.1:6443 -servername api 2>/dev/null | openssl x509 -noout -enddate
$ kubeadm certs check-expiration
[check-expiration] Reading configuration from the cluster...
[check-expiration] FYI: You can look at this config file with 'kubectl -n kube-system get cm kubeadm-config -o yaml'
CERTIFICATE                EXPIRES                  RESIDUAL TIME   CERTIFICATE AUTHORITY   EXTERNALLY MANAGED
admin.conf                 Jul 04, 2023 09:21 UTC   364d            ca                      no      
apiserver                  Jul 04, 2023 09:21 UTC   364d            ca                      no      
apiserver-etcd-client      Jul 04, 2023 09:21 UTC   364d            etcd-ca                 no      
apiserver-kubelet-client   Jul 04, 2023 09:21 UTC   364d            ca                      no      
controller-manager.conf    Jul 04, 2023 09:21 UTC   364d            ca                      no      
etcd-healthcheck-client    Jul 04, 2023 09:21 UTC   364d            etcd-ca                 no      
etcd-peer                  Jul 04, 2023 09:21 UTC   364d            etcd-ca                 no      
etcd-server                Jul 04, 2023 09:21 UTC   364d            etcd-ca                 no      
front-proxy-client         Jul 04, 2023 09:21 UTC   364d            front-proxy-ca          no      
scheduler.conf             Jul 04, 2023 09:21 UTC   364d            ca                      no      
CERTIFICATE AUTHORITY   EXPIRES                  RESIDUAL TIME   EXTERNALLY MANAGED
ca                      Jul 01, 2032 08:16 UTC   9y              no      
etcd-ca                 Jul 01, 2032 08:16 UTC   9y              no      
front-proxy-ca          Jul 01, 2032 08:16 UTC   9y              no

(7)其他 默认情况下,kubeadm 使用 /etc/kubernetes/kubelet.conf 中指定的 /var/lib/kubelet/pki/kubelet-client-current.pem 符号链接 来配置 kubelet 自动轮换客户端证书。如果此轮换过程失败,你可能会在 kube-apiserver 日志中看到 诸如x509: certificate has expired or is not yet valid之类的错误。

要解决此问题,你必须执行以下步骤:

  1. 从故障节点备份和删除 /etc/kubernetes/kubelet.conf 和 /var/lib/kubelet/pki/kubelet-client*。
  2. 在集群中具有 /etc/kubernetes/pki/ca.key 的、正常工作的控制平面节点上 执行 kubeadm alpha kubeconfig user --org system:nodes --client-name system:node:$NODE > kubelet.conf。$NODE 必须设置为集群中现有故障节点的名称。手动修改生成的 kubelet.conf 以调整集群名称和服务器端点, 或传递 kubeconfig user --config(此命令接受 InitConfiguration)。如果你的集群没有 ca.key,你必须在外部对 kubelet.conf 中的嵌入式证书进行签名。
  3. 将得到的 kubelet.conf 文件复制到故障节点上,作为 /etc/kubernetes/kubelet.conf。
  4. 在故障节点上重启 kubelet(systemctl restart kubelet),等待 /var/lib/kubelet/pki/kubelet-client-current.pem 重新创建。
  5. 在故障节点上运行 kubeadm init phase kubelet-finalize all。这将使新的 kubelet.conf 文件使用 /var/lib/kubelet/pki/kubelet-client-current.pem 并将重新启动 kubelet。
  6. 确保节点状况变为 Ready。

PS:除了使用上面方式升级集群证书之外,还可以通过升级集群版本的方式升级证书。

添加/删除节点

当集群节点不足以支撑业务的时候,我们也许会对集群进行扩容,也就是添加节点以满足日常需求。当集群节点比较空闲的时候,也会对集群进行缩容,也就是删除节点以节约开支。

所以添加/删除节点在日常的工作中是比较常见的操作,而且整体操作也比较简单。

添加节点

添加节点的操作和初始化node节点一样,严格按照环境准备初始化Node节点操作即可。

有几点需要注意:

(1)所有主机hosts添加新的主机

$ cat >> /etc/hosts << EOF
192.168.205.128 kk-master
192.168.205.130 kk-node01
192.168.205.133 kk-node02
EOF

(2)查看集群token

$ kubeadm token list

(3)如果token不存在就自己创建

$ kubeadm token create

(4)获取ca证书sha256编码hash值

$ kubeadm join 192.168.205.128:6443 --token q0mjah.4k3oavynezdj8jf9 \
     --discovery-token-ca-cert-hash sha256:3d5c2e7d2532a4f085159d89de3ea2ea515e0784787b9c1adf0d3826c283733c \
     --node-name kk-node02

(5)然后可以看到集群添加成功

$ kubectl get no
NAME        STATUS   ROLES           AGE    VERSION
kk-master   Ready    control-plane   111m   v1.24.2
kk-node01   Ready    <none>          111m   v1.24.2
kk-node02   Ready    <none>          54s    v1.24.2

删除节点

删除节点的操作也非常简单,总结如下:

(1)设置节点不可调度

$ kubectl cordon kk-node02

(2)驱逐待删除节点上面的Pod

$  kubectl drain kk-node02 --ignore-daemonsets=true --delete-emptydir-data=true

(3)然后进行节点删除

$ kubectl delete nodes kk-node02

现在,节点已经从整个集群移除。

相关实践学习
深入解析Docker容器化技术
Docker是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux机器上,也可以实现虚拟化,容器是完全使用沙箱机制,相互之间不会有任何接口。Docker是世界领先的软件容器平台。开发人员利用Docker可以消除协作编码时“在我的机器上可正常工作”的问题。运维人员利用Docker可以在隔离容器中并行运行和管理应用,获得更好的计算密度。企业利用Docker可以构建敏捷的软件交付管道,以更快的速度、更高的安全性和可靠的信誉为Linux和Windows Server应用发布新功能。 在本套课程中,我们将全面的讲解Docker技术栈,从环境安装到容器、镜像操作以及生产环境如何部署开发的微服务应用。本课程由黑马程序员提供。 &nbsp; &nbsp; 相关的阿里云产品:容器服务 ACK 容器服务 Kubernetes 版(简称 ACK)提供高性能可伸缩的容器应用管理能力,支持企业级容器化应用的全生命周期管理。整合阿里云虚拟化、存储、网络和安全能力,打造云端最佳容器化应用运行环境。 了解产品详情: https://www.aliyun.com/product/kubernetes
相关文章
|
9月前
|
存储 Kubernetes 网络安全
关于阿里云 Kubernetes 容器服务(ACK)添加镜像仓库的快速说明
本文介绍了在中国大陆地区因网络限制无法正常拉取 Docker 镜像的解决方案。作者所在的阿里云 Kubernetes 集群使用的是较旧版本的 containerd(1.2x),且无法直接通过 SSH 修改节点配置,因此采用了一种无需更改 Kubernetes 配置文件的方法。通过为 `docker.io` 添加 containerd 的镜像源,并使用脚本自动修改 containerd 配置文件中的路径错误(将错误的 `cert.d` 改为 `certs.d`),最终实现了通过多个镜像站点拉取镜像。作者还提供了一个可重复运行的脚本,用于动态配置镜像源。虽然该方案能缓解镜像拉取问题,
983 3
|
存储 Kubernetes 监控
K8s集群实战:使用kubeadm和kuboard部署Kubernetes集群
总之,使用kubeadm和kuboard部署K8s集群就像回归童年一样,简单又有趣。不要忘记,技术是为人服务的,用K8s集群操控云端资源,我们不过是想在复杂的世界找寻简单。尽管部署过程可能遇到困难,但朝着简化复杂的目标,我们就能找到意义和乐趣。希望你也能利用这些工具,找到你的乐趣,满足你的需求。
1254 33
|
存储 人工智能 Kubernetes
ACK Gateway with AI Extension:面向Kubernetes大模型推理的智能路由实践
本文介绍了如何利用阿里云容器服务ACK推出的ACK Gateway with AI Extension组件,在Kubernetes环境中为大语言模型(LLM)推理服务提供智能路由和负载均衡能力。文章以部署和优化QwQ-32B模型为例,详细展示了从环境准备到性能测试的完整实践过程。
|
人工智能 运维 Kubernetes
2025 超详细!Lens Kubernetes IDE 多平台下载安装与集群管理教程
Lens 是一款企业级 Kubernetes 可视化操作平台,2025版实现了三大技术革新:AI智能运维(异常检测准确率98.7%)、多云联邦管理(支持50+集群)和实时3D拓扑展示。本文介绍其安装环境、配置流程、核心功能及高阶技巧,帮助用户快速上手并解决常见问题。适用于 Windows、macOS 和 Ubuntu 系统,需满足最低配置要求并前置依赖组件如 kubectl 和 Helm。通过 Global Cluster Hub 实现多集群管理,AI辅助故障诊断提升运维效率,自定义监控看板和插件生态扩展提供更多功能。
|
存储 运维 Kubernetes
容器数据保护:基于容器服务 Kubernetes 版(ACK)备份中心实现K8s存储卷一键备份与恢复
阿里云ACK备份中心提供一站式容器化业务灾备及迁移方案,减少数据丢失风险,确保业务稳定运行。
|
8月前
|
人工智能 算法 调度
阿里云ACK托管集群Pro版共享GPU调度操作指南
本文介绍在阿里云ACK托管集群Pro版中,如何通过共享GPU调度实现显存与算力的精细化分配,涵盖前提条件、使用限制、节点池配置及任务部署全流程,提升GPU资源利用率,适用于AI训练与推理场景。
696 1
|
8月前
|
弹性计算 监控 调度
ACK One 注册集群云端节点池升级:IDC 集群一键接入云端 GPU 算力,接入效率提升 80%
ACK One注册集群节点池实现“一键接入”,免去手动编写脚本与GPU驱动安装,支持自动扩缩容与多场景调度,大幅提升K8s集群管理效率。
500 89
|
资源调度 Kubernetes 调度
从单集群到多集群的快速无损转型:ACK One 多集群应用分发
本文介绍如何利用阿里云的分布式云容器平台ACK One的多集群应用分发功能,结合云效CD能力,快速将单集群CD系统升级为多集群CD系统。通过增加分发策略(PropagationPolicy)和差异化策略(OverridePolicy),并修改单集群kubeconfig为舰队kubeconfig,可实现无损改造。该方案具备多地域多集群智能资源调度、重调度及故障迁移等能力,帮助用户提升业务效率与可靠性。
|
资源调度 Kubernetes 调度
从单集群到多集群的快速无损转型:ACK One 多集群应用分发
ACK One 的多集群应用分发,可以最小成本地结合您已有的单集群 CD 系统,无需对原先应用资源 YAML 进行修改,即可快速构建成多集群的 CD 系统,并同时获得强大的多集群资源调度和分发的能力。
1011 9
|
Kubernetes 开发者 Docker
集群部署:使用Rancher部署Kubernetes集群。
以上就是使用 Rancher 部署 Kubernetes 集群的流程。使用 Rancher 和 Kubernetes,开发者可以受益于灵活性和可扩展性,允许他们在多种环境中运行多种应用,同时利用自动化工具使工作负载更加高效。
826 19

推荐镜像

更多