Kubeadm: 更改主 IP 地址

创建于 2017-07-06  ·  29评论  ·  资料来源: kubernetes/kubeadm

我正在使用一个在节点启动时动态分配私有 IP 地址的提供程序,它似乎破坏了基于 kubeadm 的设置。

我已经用 kubeadm 设置了全新的主服务器,它运行良好,但在关闭并重新启动机器后,私有 IP 地址已更改,现在使用 kubectl 时出现错误Unable to connect to the server: x509: certificate is valid for 10.96.0.1, 10.4.36.13, not 10.4.20.67
(后者是主服务器的新 IP 地址。)

有没有办法以重置配置的方式运行kubeadm init ? 例如,我想保留集群 pod、RC 等,但我想重新初始化证书以使用主机名而不是 IP 地址。

当我尝试使用主机名而不是默认 IP 地址再次运行 init 时,它不同意我的观点:

[06:20 root<strong i="12">@scumbag01</strong> ~] > kubeadm init --apiserver-advertise-address scumbag01 --skip-preflight-checks
[kubeadm] WARNING: kubeadm is in beta, please do not use it for production clusters.
[init] Using Kubernetes version: v1.7.0
[init] Using Authorization modes: [Node RBAC]
[preflight] Skipping pre-flight checks
[certificates] Using the existing CA certificate and key.
[certificates] Using the existing API Server certificate and key.
[certificates] Using the existing API Server kubelet client certificate and key.
[certificates] Using the existing service account token signing key.
[certificates] Using the existing front-proxy CA certificate and key.
[certificates] Using the existing front-proxy client certificate and key.
[certificates] Valid certificates and keys now exist in "/etc/kubernetes/pki"
a kubeconfig file "/etc/kubernetes/admin.conf" exists already but has got the wrong API Server URL

它会为 10.4.36.13 获取现在无法使用的证书,这是一个不受我控制的 IP 地址,而不是重置它。

如果我删除/etc/kubernetes/*.conf ,并重新运行上面的 init 它仍然写入server: https://10.4.20.67:6443而不是使用主机名。

kubeadm init 是否应该覆盖设置并创建新证书? 是否有计划添加kubeadm reset或类似的功能来重置集群,或销毁之前kubeadm init创建的所有工件,以便我可以重新开始?

  • kubeadm 版本:&version.Info{Major:"1", Minor:"7", GitVersion:"v1.7.0", GitCommit:"d3ada0119e776222f11ec7945e6d860061339aad", GitTreeState:"clean", BuildDate:"22555 19Z", GoVersion:"go1.8.3", 编译器:"gc", 平台:"linux/amd64"}
  • Kubernetes 版本:1.7.0
  • 云供应商或硬件配置:Scaleway、Intel ATOM x64
  • 操作系统(例如来自 /etc/os-release):Debian Jessie
  • 内核:4.9.20
kinsupport

最有用的评论

我知道这是一个老问题,但也许我的评论对某人有用。
不幸的是, @patricklucas@weisjohn提出的解决方案对我不起作用,所以我创建了自己的:

systemctl stop kubelet docker

cd /etc/

# backup old kubernetes data
mv kubernetes kubernetes-backup
mv /var/lib/kubelet /var/lib/kubelet-backup

# restore certificates
mkdir -p kubernetes
cp -r kubernetes-backup/pki kubernetes
rm kubernetes/pki/{apiserver.*,etcd/peer.*}

systemctl start docker

# reinit master with data in etcd
# add --kubernetes-version, --pod-network-cidr and --token options if needed
kubeadm init --ignore-preflight-errors=DirAvailable--var-lib-etcd

# update kubectl config
cp kubernetes/admin.conf ~/.kube/config

# wait for some time and delete old node
sleep 120
kubectl get nodes --sort-by=.metadata.creationTimestamp
kubectl delete node $(kubectl get nodes -o jsonpath='{.items[?(@.status.conditions[0].status=="Unknown")].metadata.name}')

# check running pods
kubectl get pods --all-namespaces

所有29条评论

这不是 kubeadm 的限制,而只是一般的安全实践。
该证书是为 {your-old-IP-here} 签名的,因此 {your-new-ip-here} 无法进行安全通信

您可以事先在证书中添加更多 IP...

谢谢您的答复。

由于 IP 地址是由云提供商分配的,因此只有当我可以将其设置为通配符时,才能预先生成证书。 (对不起,我对证书一无所知。)

我忽略了kubeadm reset确实存在,因为参考指南中没有提到它。 Reset 和 init 对我来说工作得很好,我想我会避免关闭主机 - 我认为我的问题很少见,而且远离任何生产用例。 不过,我想知道是否有更好的方法。 我想我可以模仿kubeadm reset步骤,但保留 etcd 数据文件夹以保留我的集群设置?

无论哪种方式,感谢您在 kubeadm 上所做的所有工作! 看到集群在几分钟内出现真是太神奇了 - 我从 0.14 开始使用 Kubernetes,从 1.0 开始在生产中使用。

@analytik我和你的问题完全一样。 我的公司网络阻止了 gcr.io 。 所以我使用加密狗进行安装。 然而,提供者 IP 不断动态变化,不受我的控制。 所以即使我也在寻找解决方案。 即使我保持我的加密狗插入,有时由于网络重置 IP 更改。 你有什么解决办法吗? 你怎么处理这个?
@luxas能否请您建议我如何继续。 我是 K8S 的新手。 完全失去了这个配置。 你能告诉我如何解决这个动态 IP 问题吗?

你们是如何处理更改的主IP的?

有关于这个问题的任何更新吗?

同样的问题在这里。 请在不重置整个集群的情况下进行主 IP 修改的任何文档?

我能够通过以下方式实现这一目标:

  • 替换 /etc/kubernetes 中所有配置文件中的 IP 地址
  • 备份 /etc/kubernetes/pki
  • 识别 /etc/kubernetes/pki 中具有旧 IP 地址作为替代名称的证书 [1]
  • 删除他们每个人的证书和密钥(对我来说它只是 apiserver 和 etcd/peer)
  • 使用kubeadm alpha phase certs [2] 重新生成证书
  • 在引用旧 IP[3] 的kube-system命名空间中识别配置映射
  • 手动编辑这些配置映射
  • 重新启动 kubelet 和 docker(强制重新创建所有容器)

[1]

/etc/kubernetes/pki# for f in $(find -name "*.crt"); do openssl x509 -in $f -text -noout > $f.txt; done
/etc/kubernetes/pki# grep -Rl 12\\.34\\.56\\.78 .
./apiserver.crt.txt
./etcd/peer.crt.txt
/etc/kubernetes/pki# for f in $(find -name "*.crt"); do rm $f.txt; done

[2]

/etc/kubernetes/pki# rm apiserver.crt apiserver.key
/etc/kubernetes/pki# kubeadm alpha phase certs apiserver
...
/etc/kubernetes/pki# rm etcd/peer.crt etcd/peer.key
/etc/kubernetes/pki# kubeadm alpha phase certs etcd-peer
...

[3]

$ kubectl -n kube-system get cm -o yaml | less
...
$ kubectl -n kube-system edit cm ...

哇,我不知道这些命令。 伟大的信息,这就是诀窍。 谢谢 !

有没有办法手动查找配置映射并更改它们?

我希望 kubeadm 可以在未来的版本中涵盖这个过程。

@patricklucas 说真的,谢谢你写

对于那些寻求更清晰的人,以下是我的经验:

  1. 替换/etc/kubernetes中所有配置文件中的 IP 地址
    bash oldip=192.168.1.91 newip=10.20.2.210 cd /etc/kubernetes # see before find . -type f | xargs grep $oldip # modify files in place find . -type f | xargs sed -i "s/$oldip/$newip/" # see after find . -type f | xargs grep $newip
  2. 备份/etc/kubernetes/pki
    bash mkdir ~/k8s-old-pki cp -Rvf /etc/kubernetes/pki/* ~/k8s-old-pki
  3. 识别/etc/kubernetes/pki中具有旧 IP 地址作为替代名称的证书(这可以清理)
    bash cd /etc/kubernetes/pki for f in $(find -name "*.crt"); do openssl x509 -in $f -text -noout > $f.txt; done grep -Rl $oldip . for f in $(find -name "*.crt"); do rm $f.txt; done
  4. kube-system命名空间中识别引用旧 IP 的 configmap,编辑它们:

    # find all the config map names
    configmaps=$(kubectl -n kube-system get cm -o name | \
      awk '{print $1}' | \
      cut -d '/' -f 2)
    
    # fetch all for filename reference
    dir=$(mktemp -d)
    for cf in $configmaps; do
      kubectl -n kube-system get cm $cf -o yaml > $dir/$cf.yaml
    done
    
    # have grep help you find the files to edit, and where
    grep -Hn $dir/* -e $oldip
    
    # edit those files, in my case, grep only returned these two:
    kubectl -n kube-system edit cm kubeadm-config
    kubectl -n kube-system edit cm kube-proxy
    
  5. 更改 IP 地址(通过 cli 或 gui 为您的发行版)
  6. 删除上一步中由 grep 标识的每个证书和密钥,重新生成这些证书

    注意:在通过kubeadm admin phase certs ...重新创建证书之前,您需要应用新的 IP 地址

    rm apiserver.crt apiserver.key
    kubeadm alpha phase certs apiserver
    
    rm etcd/peer.crt etcd/peer.key
    kubeadm alpha phase certs etcd-peer
    
  7. 重启 kubelet 和 docker
    bash sudo systemctl restart kubelet sudo systemctl restart docker
  8. 复制新配置
    bash sudo cp /etc/kubernetes/admin.conf $HOME/.kube/config

@mariamTr ^

另一件需要注意的是,通过在配置文件中指定 k8s 版本,可以在离线模式下更改证书: https :

@weisjohn您能否还请注意更新您的评论:

kubectl edit cm -nkube-public cluster-info

kubeadm 也需要吗?

否则,我的 kubeadm join 命令在过程中途使用旧的/错误的 apiserver IP 会一直失败。

谢谢!

我已经应用了@weisjohn (https://github.com/kubernetes/kubeadm/issues/338#issuecomment-418879755)和@michaelfig (https://github.com/kubernetes/kubeadm/issues/)的所有步骤338#issuecomment-428340099) 替换所有地址。

这用于让 kubernetes 使用 eth1 上新创建的 VPC 地址,而不是 eth0 上的公共 IP。 然而,当我运行kubeadm upgrade diff v1.12.3它仍然希望将--advertise-address中的更改恢复为/etc/kubernetes/manifests/kube-apiserver.yaml

有什么线索吗?

即使在kubectl get all --export=true --all-namespaces -o yaml ,旧 IP 也不存在任何地方

更新:事实证明kubeadm upgrade diff确实建议更改,但kubeadm upgrade apply实际上根本没有更改地址。 (kubernetes 1.13 等修复的众多错误之一)

@weisjohn谢谢你

@patricklucas 说真的,谢谢你写

对于那些寻求更清晰的人,以下是我的经验:

  1. 替换/etc/kubernetes中所有配置文件中的 IP 地址
    shell oldip=192.168.1.91 newip=10.20.2.210 cd /etc/kubernetes # see before find . -type f | xargs grep $oldip # modify files in place find . -type f | xargs sed -i "s/$oldip/$newip/" # see after find . -type f | xargs grep $newip
  2. 备份/etc/kubernetes/pki
    shell mkdir ~/k8s-old-pki cp -Rvf /etc/kubernetes/pki/* ~/k8s-old-pki
  3. 识别/etc/kubernetes/pki中具有旧 IP 地址作为替代名称的证书(这可以清理)
    shell cd /etc/kubernetes/pki for f in $(find -name "*.crt"); do openssl x509 -in $f -text -noout > $f.txt; done grep -Rl $oldip . for f in $(find -name "*.crt"); do rm $f.txt; done
  4. kube-system命名空间中识别引用旧 IP 的 configmap,编辑它们:

    # find all the config map names
    configmaps=$(kubectl -n kube-system get cm -o name | \
     awk '{print $1}' | \
     cut -d '/' -f 2)
    
    # fetch all for filename reference
    dir=$(mktemp -d)
    for cf in $configmaps; do
     kubectl -n kube-system get cm $cf -o yaml > $dir/$cf.yaml
    done
    
    # have grep help you find the files to edit, and where
    grep -Hn $dir/* -e $oldip
    
    # edit those files, in my case, grep only returned these two:
    kubectl -n kube-system edit cm kubeadm-config
    kubectl -n kube-system edit cm kube-proxy
    
  5. 更改 IP 地址(通过 cli 或 gui 为您的发行版)
  6. 删除上一步中由 grep 标识的每个证书和密钥,重新生成这些证书

    注意:在通过kubeadm admin phase certs ...重新创建证书之前,您需要应用新的 IP 地址

    rm apiserver.crt apiserver.key
    kubeadm alpha phase certs apiserver
    
    rm etcd/peer.crt etcd/peer.key
    kubeadm alpha phase certs etcd-peer
    
  7. 重启 kubelet 和 docker
    shell sudo systemctl restart kubelet sudo systemctl restart docker
  8. 复制新配置
    shell sudo cp /etc/kubernetes/admin.conf $HOME/.kube/config

@mariamTr ^

谢谢你的步骤。
您能否提供更多类似我们需要在主节点上进行哪些更改以及之后我们需要如何申请旧工作节点加入重新配置的主节点的程序?

提前致谢 :)

值得一提的是,当将主 IP 移动到专用网络时,更新覆盖网络也很有用。 Calico 没有使用 VPC 接口,直到它绑定到该接口:

         env:
            - name: IP_AUTODETECTION_METHOD
              value: interface=eth1

kubeadm alpha 阶段证书 apiserver

@weisjohn kubeadm alpha phase certs apiserver 在 v1.13.0 中不起作用,显示“此命令不应单独运行。请参阅可用子命令列表。” 任何可用的更新评论?

在 1.13 中,该命令称为kubeadm init phase certs apiserver
https://kubernetes.io/docs/reference/setup-tools/kubeadm/kubeadm-init-phase/#cmd -phase-certs

非常有用的补救步骤-感谢@patricklucas@weisjohn

如果像我一样,您从 IP 地址已经更改的状态开始,那么您无法在第 4 步中联系 api-server 来更改配置映射,这是一个额外的提示:
api-server 证书为主机名kubernetes签名,因此您可以将其作为别名添加到/etc/hosts的新 IP 地址,然后执行kubectl --server=https://kubernetes:6443 ...

@bboreham @weisjohn @patricklucas非常感谢您的体验。 能否给个建议,在master节点上更改ip后,我应该在worker节点上做什么?
删除/添加到集群? 或者只是手动更改 _/etc/kubernetes/kubelet.conf_ 和 _/etc/kubernetes/pki/ca.crt_ ?

我知道这是一个老问题,但也许我的评论对某人有用。
不幸的是, @patricklucas@weisjohn提出的解决方案对我不起作用,所以我创建了自己的:

systemctl stop kubelet docker

cd /etc/

# backup old kubernetes data
mv kubernetes kubernetes-backup
mv /var/lib/kubelet /var/lib/kubelet-backup

# restore certificates
mkdir -p kubernetes
cp -r kubernetes-backup/pki kubernetes
rm kubernetes/pki/{apiserver.*,etcd/peer.*}

systemctl start docker

# reinit master with data in etcd
# add --kubernetes-version, --pod-network-cidr and --token options if needed
kubeadm init --ignore-preflight-errors=DirAvailable--var-lib-etcd

# update kubectl config
cp kubernetes/admin.conf ~/.kube/config

# wait for some time and delete old node
sleep 120
kubectl get nodes --sort-by=.metadata.creationTimestamp
kubectl delete node $(kubectl get nodes -o jsonpath='{.items[?(@.status.conditions[0].status=="Unknown")].metadata.name}')

# check running pods
kubectl get pods --all-namespaces

@valerius257谢谢你,你拯救了我们的周末)

谢谢@ valerius257👍
我已经尝试了来自@patricklucas@weisjohn 的所有文章/说明。 它们不适用于我的集群。 好的部分是这些说明突出了证书和密钥的一些关键方面以及他们需要注意的时间表。

@valerius257提到的指令无缝地工作,直到我遇到了非常特定于我的 kubeadm 主节点的问题。 我试图恢复 IP 被更改的 kubeadm 主节点。

继续@valerius257 提到的步骤
我在一个主节点上使用 flannel n/w 插件。
法兰绒问题:kube-flannel-ds-xxxx 退避重新启动失败的容器
Pod 状态:CrashLoopBackOff。 由于这个原因,其他像 core-dns-xxx 这样的 Pod 也没有出现。

解决方案:由于我已经使用 kubeadm init 和 cidr n/w 启动了集群(当 IP 旧时或在调试主节点时),以下步骤已从“/etc/kubernetes/manifests/kube-controller-manager”中擦除了 cidr 设置.yaml”文件。
kubeadm init --ignore-preflight-errors=DirAvailable--var-lib-etcd.

因此,如果您已使用命令“kubeadm init --token {{ kubeadm_token }} --pod-network-cidr=10.244.0.0/16" " 启动了 kubeadm 主节点(具有第一个 IP 地址),然后发布分配新 IP 您应该使用 --pod-network-cidr=10.244.0.0/16 执行以下命令。
“ kubeadm init --ignore-preflight-errors=DirAvailable--var-lib-etcd --token {{ kubeadm_token }} --pod-network-cidr=10.244.0.0/16”

或者修改文件“/etc/kubernetes/manifests/kube-controller-manager.yaml,包含以下参数,如果它们在Spec:containers :command 下丢失:

  • --allocate-node-cidrs=true
  • --cluster-cidr=10.244.0.0/16

    • --node-cidr-mask-size=24

      参考: https :

      一旦上述变化到位,

      systemctl 停止 kubelet docker

      睡觉 20

      systemctl 启动 docker kubelet

      检查所有 Pod 是否已启动并正在运行,包括 flannel。

      kubect 获取 pods -n kube-system

问题 2:
应用程序命名空间或 kube-system 上的所有 pod 开始在 describe pod 命令中显示错误,例如:
“警告 FailedScheduling 默认调度程序 0/1 节点可用:1 个节点存在 Pod 无法容忍的污点。”
执行命令:kubectl taint nodes --all node-role.kubernetes.io/master-
描述在应用程序工作区或 kube-system 命名空间中运行的所有 pod,不会观察到提到的错误。 在多节点集群中,您可能需要格外小心。

@patricklucas 说真的,谢谢你写

对于那些寻求更清晰的人,以下是我的经验:

  1. 替换/etc/kubernetes中所有配置文件中的 IP 地址
    shell oldip=192.168.1.91 newip=10.20.2.210 cd /etc/kubernetes # see before find . -type f | xargs grep $oldip # modify files in place find . -type f | xargs sed -i "s/$oldip/$newip/" # see after find . -type f | xargs grep $newip
  2. 备份/etc/kubernetes/pki
    shell mkdir ~/k8s-old-pki cp -Rvf /etc/kubernetes/pki/* ~/k8s-old-pki
  3. 识别/etc/kubernetes/pki中具有旧 IP 地址作为替代名称的证书(这可以清理)
    shell cd /etc/kubernetes/pki for f in $(find -name "*.crt"); do openssl x509 -in $f -text -noout > $f.txt; done grep -Rl $oldip . for f in $(find -name "*.crt"); do rm $f.txt; done
  4. kube-system命名空间中识别引用旧 IP 的 configmap,编辑它们:

    # find all the config map names
    configmaps=$(kubectl -n kube-system get cm -o name | \
     awk '{print $1}' | \
     cut -d '/' -f 2)
    
    # fetch all for filename reference
    dir=$(mktemp -d)
    for cf in $configmaps; do
     kubectl -n kube-system get cm $cf -o yaml > $dir/$cf.yaml
    done
    
    # have grep help you find the files to edit, and where
    grep -Hn $dir/* -e $oldip
    
    # edit those files, in my case, grep only returned these two:
    kubectl -n kube-system edit cm kubeadm-config
    kubectl -n kube-system edit cm kube-proxy
    
  5. 更改 IP 地址(通过 cli 或 gui 为您的发行版)
  6. 删除上一步中由 grep 标识的每个证书和密钥,重新生成这些证书

    注意:在通过kubeadm admin phase certs ...重新创建证书之前,您需要应用新的 IP 地址

    rm apiserver.crt apiserver.key
    kubeadm alpha phase certs apiserver
    
    rm etcd/peer.crt etcd/peer.key
    kubeadm alpha phase certs etcd-peer
    
  7. 重启 kubelet 和 docker
    shell sudo systemctl restart kubelet sudo systemctl restart docker
  8. 复制新配置
    shell sudo cp /etc/kubernetes/admin.conf $HOME/.kube/config

@mariamTr ^

我们应该给哪个 ip 代替 newip?
我们可以创建一个我们自己的IP吗?

@VipinKrizz这个问题的背景是 IP 已经由于基础设施内的因素而改变。 除了熟悉您的特定设置的人之外,没有人可以回答您应该使用哪个 IP。

也许你可以在 Slack 上找人聊聊这个? Kubeadm 问题不是正确的地方。

@valerius257非常感谢那个脚本,我现在看到我的方法有很多缺点。 我可以确认您的解决方案有效,但是,有很多小边缘(就像在所有 k8s 中一样)。 我不得不将任何补丁重新应用于启用的服务/内置程序、DNS、特殊存储类等。

但是,是的,你的脚本今天救了我的培根。

@valerius257我按照您的步骤操作,但遇到了以下问题

root@ubuntu :/etc/kubernetes/pki# kubeadm init --ignore-preflight-errors=DirAvailable--var-lib-etcd
W0122 10:15:34.819150 102032 version.go:101] 无法从 Internet 获取 Kubernetes 版本:无法获取 URL“ https://dl.k8s.io/release/stable-1.txt ”:获取https: //dl.k8s.io/release/stable-1.txt : dial tcp: lookup dl.k8s.io on 127.0.0.53:53: 服务器行为异常
W0122 10:15:34.819340 102032 version.go:102] 回退到本地客户端版本:v1.16.3
[init] 使用 Kubernetes 版本:v1.16.3
[预检] 运行预检
[警告 IsDockerSystemdCheck]:检测到“cgroupfs”作为 Docker cgroup 驱动程序。 推荐的驱动程序是“systemd”。 请按照https://kubernetes.io/docs/setup/cri/ 上的指南进行操作
[警告 DirAvailable--var-lib-etcd]: /var/lib/etcd 不为空
[预检] 拉取设置 Kubernetes 集群所需的镜像
[预检] 这可能需要一两分钟,具体取决于您的互联网连接速度
[预检] 您也可以使用“kubeadm config images pull”预先执行此操作
[kubelet-start] 将带有标志的 kubelet 环境文件写入文件“/var/lib/kubelet/kubeadm-flags.env”
[kubelet-start] 将 kubelet 配置写入文件“/var/lib/kubelet/config.yaml”
[kubelet-start] 激活 kubelet 服务
[certs] 使用 certificateDir 文件夹“/etc/kubernetes/pki”
[certs] 使用现有的 ca 证书颁发机构
[certs] 生成“apiserver”证书和密钥
[certs] apiserver 服务证书为 DNS 名称 [ubuntu kubernetes kubernetes.default kubernetes.default.svc kubernetes.default.svc.cluster.local] 和 IPs [10.96.0.1 192.168.120.137] 签名
[certs] 使用磁盘上现有的 apiserver-kubelet-client 证书和密钥
[certs] 使用现有的 front-proxy-ca 证书颁发机构
[certs] 使用磁盘上现有的前端代理客户端证书和密钥
[certs] 使用现有的 etcd/ca 证书颁发机构
[certs] 使用现有的 etcd/server 证书和磁盘上的密钥
[certs] 生成“etcd/peer”证书和密钥
[certs] etcd/peer 服务证书为 DNS 名称 [ubuntu localhost] 和 IP [192.168.120.137 127.0.0.1 ::1] 签名
[certs] 使用现有的 etcd/healthcheck-client 证书和磁盘上的密钥
[certs] 使用磁盘上现有的 apiserver-etcd-client 证书和密钥
[certs] 使用现有的“sa”密钥
[kubeconfig] 使用 kubeconfig 文件夹“/etc/kubernetes”
[kubeconfig] 编写“admin.conf” kubeconfig 文件
[kubeconfig] 编写“kubelet.conf” kubeconfig 文件
[kubeconfig] 编写“controller-manager.conf” kubeconfig 文件
[kubeconfig] 编写“scheduler.conf” kubeconfig 文件
[控制平面] 使用清单文件夹“/etc/kubernetes/manifests”
[控制平面] 为“kube-apiserver”创建静态 Pod 清单
[控制平面] 为“kube-controller-manager”创建静态 Pod 清单
[控制平面] 为“kube-scheduler”创建静态 Pod 清单
[etcd] 在“/etc/kubernetes/manifests”中为本地 etcd 创建静态 Pod 清单
[wait-control-plane] 等待 kubelet 将控制平面作为静态 Pod 从目录“/etc/kubernetes/manifests”启动。 这最多可能需要 4 分钟
[kubelet-check] 初始超时 40 秒已过。
[kubelet-check] kubelet 似乎没有运行或未正常运行。
[kubelet-check] 等于'curl -sSL http://localhost :10248/healthz' 的 HTTP 调用失败,错误:Get http://localhost :10248/healthz: dial tcp 127.0.0.1:10248: connect: connection拒绝了。
[kubelet-check] kubelet 似乎没有运行或未正常运行。
[kubelet-check] 等于'curl -sSL http://localhost :10248/healthz' 的 HTTP 调用失败,错误:Get http://localhost :10248/healthz: dial tcp 127.0.0.1:10248: connect: connection拒绝了。
[kubelet-check] kubelet 似乎没有运行或未正常运行。
[kubelet-check] 等于'curl -sSL http://localhost :10248/healthz' 的 HTTP 调用失败,错误:Get http://localhost :10248/healthz: dial tcp 127.0.0.1:10248: connect: connection拒绝了。
[kubelet-check] kubelet 似乎没有运行或未正常运行。
[kubelet-check] 等于'curl -sSL http://localhost :10248/healthz' 的 HTTP 调用失败,错误:Get http://localhost :10248/healthz: dial tcp 127.0.0.1:10248: connect: connection拒绝了。
[kubelet-check] kubelet 似乎没有运行或未正常运行。
[kubelet-check] 等于'curl -sSL http://localhost :10248/healthz' 的 HTTP 调用失败,错误:Get http://localhost :10248/healthz: dial tcp 127.0.0.1:10248: connect: connection拒绝了。

不幸的是,发生了错误:
等待条件超时

此错误可能由以下原因引起:
- kubelet 没有运行
- 由于节点在某些方面的错误配置,kubelet 不健康(需要禁用 cgroups)

如果您在 systemd 驱动的系统上,您可以尝试使用以下命令解决错误:
- 'systemctl status kubelet'
- 'journalctl -xeu kubelet'

此外,控制平面组件在由容器运行时启动时可能已崩溃或退出。
要进行故障排除,请使用您首选的容器运行时 CLI(例如 docker)列出所有容器。
这是一个如何列出在 docker 中运行的所有 Kubernetes 容器的示例:
- 'docker ps -a | grep kube | grep -v 暂停'
找到失败的容器后,您可以使用以下命令检查其日志:
- 'docker 日志 CONTAINERID'
错误执行阶段等待控制平面:无法初始化 Kubernetes 集群
要查看此错误的堆栈跟踪,请使用 --v=5 或更高版本执行

好心帮助

我能够通过以下方式实现这一目标:

  • 替换 /etc/kubernetes 中所有配置文件中的 IP 地址
  • 备份 /etc/kubernetes/pki
  • 识别 /etc/kubernetes/pki 中具有旧 IP 地址作为替代名称的证书 [1]
  • 删除他们每个人的证书和密钥(对我来说它只是 apiserver 和 etcd/peer)
  • 使用kubeadm alpha phase certs [2] 重新生成证书
  • 在引用旧 IP[3] 的kube-system命名空间中识别配置映射
  • 手动编辑这些配置映射
  • 重新启动 kubelet 和 docker(强制重新创建所有容器)

[1]

/etc/kubernetes/pki# for f in $(find -name "*.crt"); do openssl x509 -in $f -text -noout > $f.txt; done
/etc/kubernetes/pki# grep -Rl 12\\.34\\.56\\.78 .
./apiserver.crt.txt
./etcd/peer.crt.txt
/etc/kubernetes/pki# for f in $(find -name "*.crt"); do rm $f.txt; done

[2]

/etc/kubernetes/pki# rm apiserver.crt apiserver.key
/etc/kubernetes/pki# kubeadm alpha phase certs apiserver
...
/etc/kubernetes/pki# rm etcd/peer.crt etcd/peer.key
/etc/kubernetes/pki# kubeadm alpha phase certs etcd-peer
...

[3]

$ kubectl -n kube-system get cm -o yaml | less
...
$ kubectl -n kube-system edit cm ...

为我工作谢谢

唯一的事情是你需要使用

 kubeadm init phase ..

对于最新的 kubectl 版本

@bboreham
我已按照@patricklucas 提到的步骤进行操作
正如您在第 4 步中提到的,需要在 /etc/hosts 中进行一些配置,因为 IP 已经更改并且无法连接到 api-server。

使用生成证书
kubeadm init --kubernetes-version=v1.16.3 阶段证书 apiserver

我在 /etc/hosts 中改变了

并尝试 kubectl --server=https://:6443 仍然无法正常工作:(

在 /etc/hosts 中需要做任何特定的配置吗??

此页面是否有帮助?
0 / 5 - 0 等级