如何重新配置​​k8s节点的IP

问题描述

我在 aws ec2 实例上创建了一个由 k0s 安装的 k8s。为了更快地交付新集群,我尝试为它制作一个AMI。

然而,我启动了一个新的ec2实例,内部IP变了,节点变成了NotReady

ubuntu@ip-172-31-26-46:~$ k get node
NAME               STATUS     ROLES    AGE   VERSION
ip-172-31-18-145   NotReady   <none>   95m   v1.21.1-k0s1
ubuntu@ip-172-31-26-46:~$

是否可以重新配置它?


解决

我找到了使 AWS AMI 正常工作的变通方法

简答

  1. 使用 kubelet 的 --extra-args 安装节点
  2. 将 kube-api 更新为新 IP 并重启 kubelet

详情:: 1

在 kubernete 集群中,kubelet 扮演节点代理节点。它会告诉kube-api“嘿,我在这里,我的名字是 XXX”。

节点的名称是它的主机名,创建后不能更改。可以通过 --hostname-override 设置。

如果您不更改节点名称kube-api 将尝试使用主机名,然后由于未找到 old-node-name 导致错误

详情:: 2

到k0s,它把kubelet'KUBECONfig放在/var/lib/k0s/kubelet.conf中,有一个kubelet api服务器位置

server: https://172.31.18.9:6443

为了连接新的 kube-api 位置,请更新它

解决方法

你检查过 kubelet 日志了吗?很可能是证书的问题。由于证书是针对特定 IP 签名的,因此您不能只是将现有节点制作成 ami 并希望它能正常工作。

查看 github 上的 awslabs/amazon-eks-ami 存储库。你可以看看 aws 如何做它的 k8s ami。

repo 中有一个 files/bootstrap.sh 文件,用于引导实例。它执行各种特定于实例的事情,包括获取证书。

如果您想“更快地交付新集群”,我建议您使用 all dependencies 创建一个 ami,但没有实际的 k8s boostraping。从 ami 启动实例后安装 k8s(或在您的情况下为 k0s),而不是之前。 (或者弄清楚如何重新生成特定于节点的证书和配置。)