ARTICLE DETAIL

建站实战干货

来自一线的建站与推广经验沉淀,每一条都经过真实交付验证。

KubeSphere集群Master节点IP变更实战:证书与etcd配置全攻略

2026/9/20 21:39:38 拓冰建站 浏览量
KubeSphere集群Master节点IP变更实战:证书与etcd配置全攻略 简介面向Kubesphere/Kubernetes运维人员的实用工具包专门解决Master节点IP变更后集群无法正常通信的恢复难题。在企业网络重构、硬件迁移或机房调整等场景下Kubesphere集群的Master节点IP一旦变化所有节点与API Server的通信都会中断需要谨慎处理。资源基于此类实战需求整理出一套自动化操作流程涵盖变更前配置备份、apiserver等关键服务配置更新、集群节点通知与重启、健康状态验证以及网络策略和存储资源适配。压缩包共3个文件changeIp.sh为主脚本负责自动替换IP并刷新相关配置openssl.conf用于证书/服务参数设置README.md提供操作指引和回滚注意事项。整个包仅2KB轻量易用适合中级运维工程师快速上手。目前已有119人学习。借助该脚本可大幅减少人工逐台修改Kubelet、apiserver配置的重复劳动降低因IP变更引发的集群不可用风险同时内置的回滚思路与监控建议帮助运维团队规范变更流程保障企业业务连续性。 接手过KubeSphere平台的运维之后我一直以为最头疼的是高可用集群的证书轮转直到最近现实给我上了一课master节点IP变更。IP变更这几个字看起来就是改一个字段的事真正操作起来才明白Kubernetes这颗大树下面apiserver证书、etcd配置、kubelet、kube-proxy甚至KubeSphere自己的ks-installer全都跟旧IP纠缠在一起牵一发动全身。这篇文章就来拆解整个变更流程把操作细节和排错经验全部公开给要做同样事情的兄弟一份可以直接抄的作业。1. 为什么master节点换IP这么折腾先把底层通信逻辑摊开看1.1 证书里写死了IP这是第一个坑绝大多数第一次做IP变更的运维第一反应都是“把/etc/hosts改一下再把apiserver的地址改掉不就行了”说实话我第一次也这么想的结果被TLS握手失败狠狠打脸。Kubernetes的组件通信全部走TLS而这里面最关键的是kube-apiserver的证书。apiserver作为整个集群的“交通枢纽”它给客户端展示的证书里面通过IP SAN字段写死了允许访问的地址。你可以用下面这个命令看看自家apiserver证书里的IP清单openssl x509 -in /etc/kubernetes/pki/apiserver.crt -noout -text | grep -A 3 Alternative Name输出里面会列出这台master所有的旧IP还有Service的ClusterIP一般是10.96.0.1。这个机制可以类比成你访问银行网站时浏览器会校验证书上的域名和地址栏是否一致K8s里也一样kubelet、kube-proxy、kubectl去访问apiserver时会对证书里的IP做匹配一旦发现访问地址是新的证书里写的还是旧IP直接拒绝握手报错信息非常经典certificate is valid for 192.168.1.10, not 192.168.1.20所以IP变更的第一步不是你改配置文件而是重新签发或者补签apiserver证书让新IP进入信任名单。1.2 etcd集群比apiserver还敏感第二个很难缠的环节是etcd。etcd是K8s的“存储大脑”它自己有两套TLS证书体系一套是client证书给apiserver访问etcd用的另一套是peer证书给etcd节点之间互相通信用的。这两套证书同样在IP SAN里绑定了地址。更麻烦的是etcd的启动参数里还有一堆URL比如--advertise-client-urls、--initial-advertise-peer-urls、--listen-client-urls、--listen-peer-urls这些东西缺一个没改都会导致节点要么拉不起来要么反复尝试加入集群却始终失败。这里顺带说明一下如果你的集群是多master多etcd节点那么初始集群地址--initial-cluster里的peer地址也要保持一致否则节点之间互相找不到。单master单etcd节点虽然简单一点但同样要全部核对一遍不能想当然。2. 变更前的保命操作备份和检查清单2.1 etcd快照备份这是你后悔药IP变更过程中最怕的就是改到一半发现某个关键配置改错了想回退却发现没有任何可用备份。所以动手之前第一步就是给etcd做快照。如果你用的etcd是kubeadm部署的static podetcdctl多半在容器里命令大概是这个风格ETCDCTL_API3 etcdctl \ --endpointshttps://192.168.1.10:2379 \ --cacert/etc/kubernetes/pki/etcd/ca.crt \ --cert/etc/kubernetes/pki/etcd/server.crt \ --key/etc/kubernetes/pki/etcd/server.key \ snapshot save /backup/etcd-snapshot-$(date %F).db备份完一定要验证一下快照是否可用ETCDCTL_API3 etcdctl snapshot status /backup/etcd-snapshot-$(date %F).db能正常输出revision和total key说明快照好的。这一步永远不能省我见过太多人在变更失败之后想回滚结果发现根本没备份只能从零开始重建集群那才叫欲哭无泪。2.2 证书与配置目录备份除了etcd快照证书文件和配置文件也要完整备份。K8s集群里涉及证书的目录主要是/etc/kubernetes/pkiapiserver、apiserver-kubelet-client、etcd相关的证书和私钥/etc/kubernetesadmin.conf、controller-manager.conf、scheduler.conf、kubelet.conf等一堆kubeconfig/etc/etcd如果etcd不是static pod方式而是以systemd服务跑的那么配置在这里/var/lib/kubelet/pkikubelet的客户端证书变更过程中这个目录很大概率会被重建提前备份能省很多麻烦。直接一条命令全部带走cp -a /etc/kubernetes /backup/kubernetes-$(date %F) cp -a /etc/etcd /backup/etcd-$(date %F) cp -a /var/lib/kubelet/pki /backup/kubelet-pki-$(date %F)2.3 变更前必须记录的信息备份做完别急着改先把当前状态的关键信息记录下来后面排错全靠它们。当前apiserver证书里的IP SAN用上面openssl命令查看当前etcd的启动参数和监听地址当前所有节点的主机名和对应的node对象确认IP变更会不会影响node注册KubeSphere installer的configmap内容因为里面可能存了etcd地址或集群地址kubectl -n kubesphere-system get cm ks-installer -o yaml把这些信息落到文本文件里后续每改一个组件就对照一次基本可以避免“漏改”的问题。3. 核心实操证书重新签发与逐组件改造3.1 重新生成apiserver并更新kubeconfig如果你的KubeSphere集群是用kubeadm搭的重新签发apiserver证书可以走kubeadm的phase命令。注意这一步会覆盖原有的apiserver证书和私钥正式执行业务前备份一定要做掉。kubeadm init phase certs apiserver \ --apiserver-advertise-address 192.168.1.20 \ --apiserver-cert-extra-sans 10.96.0.1,192.168.1.20如果你还有域名、负载均衡的VIP也要通过--apiserver-cert-extra-sans补进去。如果集群里开了NodePort或者外部访问的域名一并写进去省得下次再补。证书重新签发之后K8s自己管理的那几个kubeconfig文件里server:这一行地址还是旧的必须全部替换。涉及的文件包括/etc/kubernetes/admin.conf/etc/kubernetes/controller-manager.conf/etc/kubernetes/scheduler.conf/etc/kubernetes/kubelet.conf先手动操作admin.conf其他文件可以直接用sed一把梭sed -i s/192.168.1.10:6443/192.168.1.20:6443/g /etc/kubernetes/admin.conf sed -i s/192.168.1.10:6443/192.168.1.20:6443/g /etc/kubernetes/controller-manager.conf sed -i s/192.168.1.10:6443/192.168.1.20:6443/g /etc/kubernetes/scheduler.conf sed -i s/192.168.1.10:6443/192.168.1.20:6443/g /etc/kubernetes/kubelet.conf同时把你本机的~/.kube/config也改掉否则后面想用kubectl排查都连不上。如果是二进制部署的集群没有kubeadm这个捷径就只能用openssl或者cfssl手动签署apiserver证书。操作逻辑一样先检查旧证书的SAN生成新的CSR时把新IP加进去再用集群CA签发。这个过程相对繁琐但原理和上面是一致的不要看到一堆openssl命令就慌。3.2 etcd配置修改与重启顺序etcd的配置修改要区分部署方式。如果你用的是kubeadm部署的static pod文件在/etc/kubernetes/manifests/etcd.yaml里面主要改这几个参数--listen-client-urlshttps://192.168.1.20:2379,https://127.0.0.1:2379 --advertise-client-urlshttps://192.168.1.20:2379 --listen-peer-urlshttps://192.168.1.20:2380 --initial-advertise-peer-urlshttps://192.168.1.20:2380 initial-cluster: master01https://192.168.1.20:2380如果你直接把etcd跑在宿主机上、用systemd管理默认的配置文件路径可能是/etc/etcd/etcd.config内容大同小异修改思路完全一致。etcd证书同样需要重新签发。通常涉及/etc/kubernetes/pki/etcd/目录下的几个证书文件server.crt、peer.crt、healthcheck-client.crt。用kubeadm的话可以分别用kubeadm init phase certs etcd-server和kubeadm init phase certs etcd-peer重新生成。重点来了重启顺序。这里分享我的实操经验不要一台一台单独重启etcd在一个多节点etcd集群里如果只重启了一台它带着新IP起来其他节点还用旧IP跟它通信很可能会导致这个节点始终处于“unhealthy”状态甚至干扰leader选举。正确做法是把三台etcd节点的配置全部改完然后在一个相对空闲的时间窗口里一个一个依次重启。每重启一台等它起来稳定几秒确认没有报错再重启下一台。单节点etcd反而简单只要配置改全了重启之后ss -lntp | grep 2379能看到监听新IP就可以了。3.3 修改kubelet、kube-proxy等节点组件证书和etcd都搞定之后接下来处理节点组件。kubelet的kubeconfig前面已经通过sed命令改过了但还有两个容易漏的点第一个是kubelet的--node-ip参数。如果你的kubelet启动参数里显式指定了旧IP需要同步改掉。以systemd方式为例vim /etc/systemd/system/kubelet.service.d/10-kubeadm.conf # 修改 --node-ip192.168.1.20 systemctl daemon-reload systemctl restart kubelet第二个是kube-proxy。kube-proxy的配置存在configmap里里面记录了访问apiserver的server地址。更新方式有两种一种直接在configmap里改另一种是执行时通过kubectl edit修改。实操中我习惯用cm方式改完再重启组件kubectl -n kube-system edit cm kube-proxy # 把 conf 里面的 server: https://192.168.1.10:6443 改成新地址 kubectl -n kube-system rollout restart ds kube-proxy这里要特别说明一个场景如果master节点的主机名没有变化操作系统底层网络变化之后kubelet大概率可以带着新的node-ip继续注册到同一个node对象上但如果某些情况下node对象还是绑着旧IPkubelet启动后可能会报节点找不到或者一直NotReady。这种情况下建议直接删除旧的node对象让kubelet重新注册kubectl delete node master01 systemctl restart kubelet之后记得查看CSR新节点注册需要approvekubectl get csr kubectl certificate approve csr-name3.4 KubeSphere平台组件的配置与重启到了KubeSphere这一层很多人以为底层集群正常了控制台自然就好了实际上不是这样。需要检查的第一个地方是ks-installer这个configmap它里面可能记录了etcd的地址。如果etcd的IP变了这里还是旧IP那么KubeSphere的监控组件比如那些通过etcd查询数据的服务会持续报错。修改方法就是编辑configmap把etcd地址替换掉然后重启相关组件。第二个需要关注的是ks-apiserver。在KubeSphere多集群架构里如果你有一个host集群和一个或多个member集群host集群侧会记录member集群的apiserver地址。member集群master IP变了这个地址不更新host这边会一直显示member集群“无法连接”。排查命令是kubectl -n kubesphere-system get cm ks-apiserver -o yaml看里面multicluster相关的配置找到member集群地址并更新。最后把这些组件的pod全部滚动重启一遍让新配置生效kubectl -n kubesphere-system rollout restart deploy ks-apiserver ks-console ks-controller-manager kubectl -n kubesphere-system get pod -w等所有pod都变成Running用浏览器访问KubeSphere控制台地址用admin账户登录确认。4. 常见翻车现场与排查技巧实录4.1 apiserver起来又退证书过期做变更时最容易遇到的翻车现场apiserver一直起不来kubelet把它拉起又崩溃。这时候不要慌先看apiserver的具体日志。因为apiserver是static pod日志要看容器运行时crictl ps -a | grep kube-apiserver crictl logs container-id如果日志里出现类似server certificate is not valid for the requested IP的报错说明apiserver证书里的SAN没有包含新IP重新回到3.1节检查是不是--apiserver-cert-extra-sans少加了参数。还有一种情况是apiserver配置文件/etc/kubernetes/manifests/kube-apiserver.yaml里--advertise-address或者--bind-address没有改成新IP。这个参数如果还是旧IP即使证书是对的apiserver也只会监听在旧地址上根本访问不到。4.2 etcd连接拒绝apiserver起不来apiserver启动时报failed to connect etcd大概率是etcd没起来或者监听地址不对。先确认etcd进程状态ss -lntp | grep -E 2379|2380如果看到etcd监听的是旧IP你就知道问题出在etcd的启动参数没改全。有些时候etcd的配置改了但进程没重启或者重启后又读到了旧配置这就得仔细检查systemd unit文件的ExecStart里有没有写死旧IP尤其是有的人喜欢在unit文件里直接铺参数这种写法最容易漏。另一个容易忽略的问题是apiserver访问etcd时用的客户端证书如果apiserver和etcd之间用的是同一个CA而etcd重新签发了证书之后CA没变那么客户端证书一般还能继续用如果整套证书都重新生成了apiserver那边的etcd-client证书也必须同步替换否则一样连不上。4.3 kubelet反复NotReady证书轮换不生效节点改完IP之后最常见的现象是kubectl get nodes看到节点一直NotReady而且kubelet日志里反复报TLS握手失败或者证书校验失败。先别急着删节点先看kubelet当前的客户端证书有没有更新openssl x509 -in /var/lib/kubelet/pki/kubelet-client-current.pem -noout -text | grep -A 3 Alternative Name如果证书里的IP还是旧的说明kubelet没有触发证书轮换有可能是因为kubelet.conf里的server地址没改它还在尝试连接旧IP的apiserver自然拿不到新的证书。回到3.3节把kubelet.conf检查一遍。如果证书已经是新IP了节点还是NotReady看一下是不是CSR没有approve。尤其在你删掉旧的node对象、让kubelet重新注册的场景下新的CSR必须手动approve否则节点注册流程走不完。4.4 KubeSphere控制台登不上或者token校验失败底层集群完全正常kubectl也能用但打开KubeSphere控制台却一直报错这种情况多半不是K8s的问题而是KubeSphere平台侧出了问题。先确认ks-console的pod是不是Runningkubectl -n kubesphere-system get pod | grep console如果pod一直CrashLoopBackOff看日志kubectl -n kubesphere-system logs ks-console-podKubeSphere组件之间通过JWT做认证如果ks-installer configmap里的jwtSecret之类的配置没有被正确读取或者ks-apiserver没有成功重启token校验就会失败。这种情况下建议把ks-apiserver和ks-console都强制重启一遍再重新登录。另外还有一个高频问题控制台本身通过Ingress或者LoadBalancer暴露很多环境下pipeline的Ingress地址绑定了master旧IP。如果换了IP外部流量进不来。检查一下ingress-nginx的负载均衡地址或者NodePort对应的节点IP该改改、该切切。5. 变更后如何验证集群真的恢复正常了吗配置全部改完、组件全部重启之后不要急着下班花几分钟做一轮完整验证。第一步先确认节点状态kubectl get nodes -o wide所有节点应该是Ready而且INTERNAL-IP一列显示的是新IP。第二步确认核心组件都正常kubectl get pod -n kube-system -o wide重点关注coredns、kube-proxy、calico或者你用的其他CNI插件这些系统组件。第三步真正验证一个业务容器能不能正常发布。这里正好回答很多人问过的“如何使用KubeSphere发布容器”的问题IP变更之后你需要确认用户侧依然可以走通完整的业务链路。我习惯用kubectl直接验证调度kubectl run nginx-test --imagenginx --restartNever kubectl wait --forconditionReady pod/nginx-test kubectl delete pod nginx-test如果调度、拉镜像、启动全部正常说明集群的调度链路没问题。再用kubectl暴露一个Service验证网络转发kubectl create deployment test --imagenginx kubectl expose deployment test --port80 --typeNodePort curl http://任意节点新IP:NodePort能正常返回nginx页面说明Pod网络、Service网络、NodePort链路都通了。这一步做完才算真正有底气把变更收尾。根据我个人经验IP变更这种操作最怕的不是某一个组件改不动而是改了七八个地方之后发现后面还有漏网之鱼。所以我的习惯一直是先备份、再梳理、改一处验一处。还有一个小技巧分享给你——所有涉及地址的配置文件改完之后统一执行一次grep -rn 旧IP /etc/kubernetes /etc/etcd /etc/systemd/system把所有遗漏的旧IP一次性揪出来比肉眼检查可靠得多。本文还有配套的精品资源点击获取