首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >k8s中apiserver地址修改方案

k8s中apiserver地址修改方案

作者头像
没有故事的陈师傅
发布2025-11-17 19:19:31
发布2025-11-17 19:19:31
380
举报
文章被收录于专栏:运维开发故事运维开发故事

适用场景: 通常是自建k8s环境,创建的时候不规范,apiserver地址使用的是负载均衡器地址代理的,由于业务需要变更负载均衡器地址,因此需要对apiserver地址进行修改,生产实践之后的一个方案分享

1、k8s中集群证书修改操作步骤

1.1 master节点操作

当前证书情况
代码语言:javascript
复制
openssl x509 -in /etc/kubernetes/pki/apiserver.crt -noout -text | grep -A1 "Subject Alternative Name"
备份关键文件
代码语言:javascript
复制
# 备份整个master /etc/kubernetes 目录
sudo cp -r /etc/kubernetes /etc/kubernetes.bak

# 备份整个 $HOME/.kube 目录
cp -r $HOME/.kube $HOME/.kube.bak
所有机器添加本地hosts

本次修改直接改成走域名,因为添加hosts解析到新的负载均衡

代码语言:javascript
复制
10.xx.xxx.xxx  lb.k8s.local
修改 Kubernetes 集群配置
  • 导出当前配置
代码语言:javascript
复制
#导出当前配置
kubectl get cm -n kube-system kubeadm-config -o jsonpath='{.data.ClusterConfiguration}' > kubeadm-config.yaml
  • 编辑配置文件

找到 apiServer 部分下的 certSANs 字段。你需要修改 IPs 列表,将旧的 IP 替换为新的 IP,并确保保留所有其他必需的 IP(如 127.0.0.1)和域名(如 kubernetes, kubernetes.default, kubernetes.default.svc 等)

  • 修改前
代码语言:javascript
复制
apiServer:
     certSANs:
     - 10.xxx.10.97 # 旧的 IP
     extraArgs:
       authorization-mode: Node,RBAC
     timeoutForControlPlane: 4m0s
   apiVersion: kubeadm.k8s.io/v1beta3
   ...
  • 修改后
代码语言:javascript
复制
apiServer:
     certSANs:
     - 10.xxx.10.97  # 旧的 IP
     - lb.k8s.local # 新的域名
     - 127.0.0.1
     - 10.xxx.11.71 # master节点ip
     - 10.xxx.11.188 # master节点ip
     - 10.xxx.10.189 # master节点ip
     extraArgs:
       authorization-mode: Node,RBAC
     timeoutForControlPlane: 4m0s
   apiVersion: kubeadm.k8s.io/v1beta3
  • 更新 kubeadm ConfigMap
代码语言:javascript
复制
kubeadm init phase upload-config kubeadm --config=kubeadm-config.yaml
更新 API Server 证书
  • 删除旧的证书和密钥
代码语言:javascript
复制
rm /etc/kubernetes/pki/apiserver.*
  • 使用 kubeadm 重新生成证书
代码语言:javascript
复制
kubeadm init phase certs apiserver --config=kubeadm-config.yaml
更新 kubeconfig 文件

管理员和 kubelet 使用的 kubeconfig 文件中嵌入了旧的 API Server 地址,也需要更新。

  • 更新 admin.conf
代码语言:javascript
复制
sudo kubeadm init phase kubeconfig admin --config=kubeadm-config.yaml
   # 将新生成的 admin.conf 复制到当前用户目录
sudo cp /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
  • 更新 kubelet.conf (在所有节点上执行): kubelet 的配置也需要更新以指向新的 API Server 地址。
代码语言:javascript
复制
# 首先,更新 kubelet.conf 中的 server 地址
sudo sed -i "s/server: https:\/\/10.xxxx.10.97:[0-9]*/server: https:\/\/lb.k8s.local:443/" /etc/kubernetes/kubelet.conf

# 然后,重启 kubelet 以应用更改
sudo systemctl restart kubelet
重启控制平面组件

API Server 以及其他控制平面组件(如 scheduler, controller-manager)是以静态 Pod 运行的,kubelet 会自动监控并重启它们。

代码语言:javascript
复制
# 最简单的方法是移动它们的 manifest 文件,稍后再移回来,kubelet 会自动重启它们
sudo mv /etc/kubernetes/manifests/kube-apiserver.yaml /tmp/
# 等待几秒钟,确认 apiserver pod 已终止
sudo mv /tmp/kube-apiserver.yaml /etc/kubernetes/manifests/

# 同样地,重启 controller-manager 和 scheduler 以确保它们使用新的 API Server 地址(可选但推荐)
sudo mv /etc/kubernetes/manifests/kube-controller-manager.yaml /tmp/
# 等待几秒钟,
sudo mv /etc/kubernetes/manifests/kube-scheduler.yaml /tmp/
sleep 10
sudo mv /tmp/kube-controller-manager.yaml /etc/kubernetes/manifests/
# 等待几秒钟,
sudo mv /tmp/kube-scheduler.yaml /etc/kubernetes/manifests/
验证
  • 检查证书信息
代码语言:javascript
复制
openssl x509 -in /etc/kubernetes/pki/apiserver.crt -noout -text | grep -A1 "Subject Alternative Name"

输出中应该包含你新添加的域名地址lb.k8s.local

  • 验证集群状态
代码语言:javascript
复制
kubectl get nodes
kubectl get pods --all-namespaces
更新cluster-info的configmap文件
  • 获取当前的配置,不更新这个配置会导致kubeadm添加节点报错
代码语言:javascript
复制
kubectl get cm -n kube-public cluster-info -o yaml > cluster-info.yaml
  • 更新configmap配置

修改server地址为最新的apiserver地址,然后apply

代码语言:javascript
复制
kubectl apply -f cluster-info.yaml
更新kube-proxy的configmap文件

不更新这个配置会导致svc转发流量异常

  • 获取当前的配置
代码语言:javascript
复制
kubectl get cm -n kube-system kube-proxy -o yaml > kube-proxy.yaml
  • 修改里面的server字段为新的apiserver地址
代码语言:javascript
复制
kubectl apply -f kube-proxy.yaml

1.2 更新所有work节点操作

备份关键文件
代码语言:javascript
复制
# 备份整个master /etc/kubernetes 目录
sudo cp -r /etc/kubernetes /etc/kubernetes.bak

# 备份整个 $HOME/.kube 目录
cp -r $HOME/.kube $HOME/.kube.bak
所有机器添加本地hosts
代码语言:javascript
复制
10.xxx.10.97  lb.k8s.local
节点驱逐
代码语言:javascript
复制
kubectl drain xxxx --ignore-daemonsets --delete-emptydir-data
kubelet更新
  • 更新 kubelet.conf (在所有节点上执行): kubelet 的配置也需要更新以指向新的 API Server 地址。
代码语言:javascript
复制
# 首先,更新 kubelet.conf 中的 server 地址
sudo sed -i "s/server: https:\/\/10.xxx.10.97:[0-9]*/server: https:\/\/lb.k8s.local:443/" /etc/kubernetes/kubelet.conf

# 然后,重启 kubelet 以应用更改
sudo systemctl restart kubelet
验证服务是否可以正常调度
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2025-11-12,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 运维开发故事 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1、k8s中集群证书修改操作步骤
    • 1.1 master节点操作
      • 当前证书情况
      • 备份关键文件
      • 所有机器添加本地hosts
      • 修改 Kubernetes 集群配置
      • 更新 API Server 证书
      • 更新 kubeconfig 文件
      • 重启控制平面组件
      • 验证
      • 更新cluster-info的configmap文件
      • 更新kube-proxy的configmap文件
    • 1.2 更新所有work节点操作
      • 备份关键文件
      • 所有机器添加本地hosts
      • 节点驱逐
      • kubelet更新
      • 验证服务是否可以正常调度
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档