K8S 源码探秘 之 kubeadm upgrade apply 执行流程分析

本文详细解析了Kubernetes1.12版本中kubeadm upgrade apply的执行流程,包括参数检查、健康状态验证、配置调整、镜像拉取及升级执行路径,适合想要深入了解Kubernetes升级机制的读者。

一、引言

       本文将基于 Kubernetes 1.12 版本,分析 kubeadm  upgrade apply 的执行流程,希望对读者理解 k8s 有帮助!

       关于 init  流程请参考: K8S 源码探秘 之 kubeadm init 执行流程分析

       关于 join 流程请参考: K8S 源码探秘 之 kubeadm join 执行流程分析

二、流程介绍

2.1  首先,上一张整体执行流程图(可以点击看大图!!!):

       像往常一样,kubeadm upgrade apply 首先会加载参数,并对参数配置进行相关的一些检查,以确保配置无误。

       紧接着,升级程序会读取 /etc/kubernetes/admin.conf 配置创建一个 client,连接 k8s Api Server,检查 server 是否健康,以及 master 是否为 ready 状态。检查全部通过后,再通过 client 拉取 InitConfiguration(实际就是读取一个 ConfigMap,该 ConfigMap 会在集群初始化的时候被创建),然后根据升级参数配置对该 InitConfiguration 进行相应的调整(比如更新 k8s 版本号等),为之后的升级做好准备。

       之后,升级工具会拉取升级对应版本的容器镜像,不过这次的镜像拉取与 init 过程不同,不是通过 cri 调用(不是直接通过调用 docker 服务)实现的,而是向 Api Server 发送请求,要求创建一些 DaemonSet,而这些 DaemonSet 依赖的镜像就是升级服务需要下载的镜像。这样等到 DaemonSet 运行起来的时候,相应的镜像必然就已经下载完毕了。通过阅读源码,这些 DaemonSet 运行的命令是 sleep 3600,没有实际意义,只是为了下载镜像而已。

       镜像下载好后,就开始真正执行升级了。根据运行模式的不同,升级路径有两条。如果是通过 Self-Hosted 模式运行的,则通过临时创建一个备份的 Control Plane(复制原来的 Control Plane),由备份的 Control Plane 临时接管集群,将旧 Control Plane 升级为新 Control Plane,再把控制权交给新的 Control Plane ,销毁临时的备份 Control Plane;如果是通过 Static Pod 模式运行的,则通过替换相关服务的 manifest 文件实现升级(需要首先升级 etcd 确保 etcd 正常)。

       升级完的配置与 init 过程类似,但不包含标记节点为 master 以及 token 创建过程。

       以上就是 kubeadm upgrade apply 的过程介绍了!

======

       经过深入探究,1.12 版本其实已经不再支持 self-hosted 模式部署了,只是代码还没有移除干净,可以忽略 self-hosted 流程

var selfHostingDeprecationMessage = "featureGates:SelfHosting has been removed in v1.12"

var storeCertsInSecretsDeprecationMessage = "featureGates:StoreCertsInSecrets has been removed in v1.12"

var highAvailabilityMessage = "featureGates:HighAvailability has been removed in v1.12\n" +
    "\tThis feature has been replaced by the kubeadm join --control-plane workflow."

### kubernetes 1.28 kubeadm 集群部署与管理指南 kubeadm 是 Kubernetes 官方提供的一个工具,用于快速部署和管理 Kubernetes 集群。它简化了集群的初始化、节点加入以及升级等操作。以下内容详细介绍了如何使用 kubeadm 部署和管理 Kubernetes 1.28 版本的集群。 #### 1. 环境准备 在开始部署之前,需要确保所有节点满足以下条件: - 操作系统:支持的 Linux 发行版(如 Ubuntu、CentOS)。 - 内核版本:建议使用较新的内核版本以获得更好的兼容性。 - Docker 或其他容器运行时已安装并配置完成。 - 关闭 swap 功能,因为 Kubernetes 不支持 swap 开启的情况下运行: ```bash swapoff -a ``` 如果需要永久关闭 swap,可以编辑 `/etc/fstab` 文件并注释掉 swap 相关的条目[^3]。 #### 2. 安装 kubeadm、kubelet 和 kubectl 在所有节点上安装 kubeadm、kubelet 和 kubectl,并指定版本为 1.28.2: ```bash apt update && apt install -y apt-transport-https curl curl -s https://packages.cloud.google.com/apt/doc/apt-key.gpg | sudo apt-key add - cat <<EOF | sudo tee /etc/apt/sources.list.d/kubernetes.list deb https://apt.kubernetes.io/ kubernetes-xenial main EOF apt update apt install -y kubelet=1.28.2-00 kubeadm=1.28.2-00 kubectl=1.28.2-00 ``` 上述命令将确保安装的组件版本为 1.28.2,并锁定版本以避免意外升级[^2]。 #### 3. 初始化主节点 在主节点上执行以下命令以初始化集群: ```bash kubeadm init --pod-network-cidr=10.244.0.0/16 --kubernetes-version=1.28.2 ``` 其中 `--pod-network-cidr` 参数指定了 Pod 网络的 CIDR 范围,需根据所选网络插件的要求进行设置。例如,Flannel 插件通常使用 `10.244.0.0/16`[^3]。 初始化完成后,按照输出的提示配置 kubeconfig 文件: ```bash mkdir -p $HOME/.kube sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config sudo chown $(id -u):$(id -g) $HOME/.kube/config ``` #### 4. 安装网络插件 Kubernetes 集群需要一个 CNI(Container Network Interface)插件来管理 Pod 网络。以下是安装 Flannel 的示例: ```bash kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml ``` 确保选择的网络插件与 `--pod-network-cidr` 参数一致。 #### 5. 加入工作节点 在每个工作节点上执行以下命令以加入集群: ```bash kubeadm join <控制平面IP>:<端口> --token <token> --discovery-token-ca-cert-hash sha256:<hash> ``` `kubeadm init` 输出中会提供具体的 `join` 命令。如果丢失了该命令,可以通过以下方式重新生成 token: ```bash kubeadm token create --print-join-command ``` #### 6. 验证集群状态 验证集群是否正常运行: ```bash kubectl get nodes kubectl get pods --all-namespaces ``` #### 7. 升级集群 当需要升级到更高版本时,可以使用以下步骤: 1. 在主节点上更新 kubeadm: ```bash apt update && apt install -y kubeadm=1.29.0-00 ``` 2. 执行升级命令: ```bash kubeadm upgrade plan kubeadm upgrade apply v1.29.0 ``` 3. 更新 kubelet 和 kubectl: ```bash apt update && apt install -y kubelet=1.29.0-00 kubectl=1.29.0-00 systemctl restart kubelet ``` 4. 在工作节点上重复类似的步骤。 #### 注意事项 - 确保防火墙规则允许必要的端口通信,例如 6443(API Server)、10250(Kubelet)等。 - 如果使用云环境,请确保实例的安全组或网络 ACL 允许相关流量。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值