You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Azure VM上Kubernetes单节点修改IP后kubelet启动失败、连接被拒求助

问题排查与解决方法

现有操作的核心错误

  • 证书生成命令存在拼写错误:adminserver是非法参数,正确参数应为apiserver,这直接导致你运行的证书生成命令未生效,所以会出现apiserver.crt和原始证书完全一致的情况
  • 执行kubeadm init phase相关命令时未填入实际的新IP值,空参数会默认读取旧的集群配置,相当于没有修改IP绑定
  • 遗漏了Azure VM的特有网络配置检查:本地环境没有Azure的网络栈限制,所以操作后可以正常运行,但Azure默认的安全规则会拦截K8s的内部流量
  • 未修改/etc/kubernetes/manifests/下的静态Pod配置,kube-apiserver、etcd仍然绑定旧IP启动,所以会出现新IP连接被拒的报错

正确修复步骤

1. 停止服务并清理残留配置

systemctl stop kubelet
# 若使用containerd则替换为systemctl stop containerd
systemctl stop docker
# 清理旧证书
rm -rf /etc/kubernetes/pki/*
# 清理旧iptables规则
iptables -F && iptables -t nat -F && iptables -t mangle -F && iptables -X

编辑以下文件,将所有旧IP替换为新的VM内部IP:

  • /var/lib/kubelet/config.yaml
  • /etc/default/kubelet
  • /etc/kubernetes/manifests/kube-apiserver.yaml(重点修改--advertise-address、--etcd-servers参数)
  • /etc/kubernetes/manifests/etcd.yaml(重点修改--listen-client-urls、--listen-peer-urls、--initial-advertise-peer-urls参数)

2. 重新生成证书

将以下命令中的<新VM内部IP>替换为实际IP值后执行:

kubeadm init phase certs apiserver --apiserver-advertise-address <新VM内部IP> --apiserver-cert-extra-sans <新VM内部IP>,127.0.0.1,kubernetes,kubernetes.default,kubernetes.default.svc,kubernetes.default.svc.cluster.local

依次执行剩余证书生成命令:

  • kubeadm init phase certs apiserver-kubelet-client
  • kubeadm init phase certs front-proxy-ca
  • kubeadm init phase certs front-proxy-client
  • kubeadm init phase certs apiserver-etcd-client
  • kubeadm init phase certs etcd-ca
  • kubeadm init phase certs etcd-healthcheck-client
  • kubeadm init phase certs etcd/peer --apiserver-advertise-address <新VM内部IP>
  • kubeadm init phase certs etcd/server --apiserver-advertise-address <新VM内部IP>

3. 重新生成kubeconfig并更新配置

kubeadm init phase kubeconfig all --apiserver-advertise-address <新VM内部IP>
cp /etc/kubernetes/admin.conf ~/.kube/config

4. 调整Azure网络配置

  1. 进入Azure门户,打开对应VM的网卡配置页,找到「IP配置」选项,将IP转发设置为开启,否则Azure网络栈会拦截K8s的跨Pod流量
  2. 检查VM关联的网络安全组(NSG)入站规则,确保6443、2379-2380、10250等K8s必要端口对内部IP放通

5. 重启服务验证

systemctl daemon-reload
# 若使用containerd则替换为systemctl restart containerd
systemctl restart docker
systemctl start kubelet

等待2分钟后执行kubectl get nodes验证集群状态即可。

内容的提问来源于stack exchange,提问作者Razvan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.04 04:54:03