问题描述
我在 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 正常工作的变通方法
简答
- 使用 kubelet 的
--extra-args
安装节点 - 将 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),而不是之前。 (或者弄清楚如何重新生成特定于节点的证书和配置。)