如何将外部AWS实例添加到现有Kops Kubernetes集群?
能否将外部AWS Ubuntu实例接入kops创建的Kubernetes集群?
是的,你完全可以将自己的外部AWS Ubuntu实例接入现有的kops Kubernetes集群,但需要根据使用场景选择不同的接入方式,以下是详细说明和操作步骤:
一、临时接入(不纳入kops管理,适合测试场景)
这种方式下,你手动将节点加入集群,但kops的集群配置中不会记录这个节点,后续执行kops update cluster或kops rolling-update时,kops可能会将这个“额外”节点判定为非集群管理节点并移除,因此仅适合短期测试使用。
操作步骤:
准备外部实例环境
- 确保实例与集群处于同一个VPC内(或通过VPC对等连接、VPN等实现网络互通,需开放集群API服务器6443端口、节点间10250/2379/2380等通信端口)
- 给实例分配与集群节点一致的安全组(或配置等价的入站/出站规则)
- 关闭swap(kubelet强制要求):
swapoff -a sed -i '/ swap / s/^\(.*\)$/#\1/g' /etc/fstab - 安装与集群版本完全匹配的容器 runtime(如containerd或Docker)、kubelet、kubeadm、kubectl:
以Ubuntu为例,添加对应版本的K8s apt源后安装组件(假设集群版本为1.27.3):# 添加GPG密钥 curl -fsSL https://pkgs.k8s.io/core:/stable:/v1.27/deb/Release.key | sudo gpg --dearmor -o /etc/apt/trusted.gpg.d/kubernetes-apt-keyring.gpg # 添加K8s apt源 echo 'deb https://pkgs.k8s.io/core:/stable:/v1.27/deb/ /' | sudo tee /etc/apt/sources.list.d/kubernetes.list # 更新并安装指定版本组件 sudo apt update sudo apt install -y kubelet=1.27.3-00 kubeadm=1.27.3-00 kubectl=1.27.3-00 # 锁定版本防止自动更新 sudo apt-mark hold kubelet kubeadm kubectl
获取集群节点加入命令
在你用来管理kops集群的机器上:- 先导出集群kubeconfig:
kops export kubecfg --name <你的集群名称> --state <你的kops状态存储路径,比如s3://my-kops-state-store> - 生成节点加入命令:
命令会输出类似如下内容:kubeadm token create --print-join-commandkubeadm join api.your-cluster.example.com:6443 --token abcdef.0123456789abcdef --discovery-token-ca-cert-hash sha256:abcdef1234567890abcdef1234567890abcdef1234567890abcdef1234567890
- 先导出集群kubeconfig:
在外部实例执行加入命令
将上面生成的命令复制到外部Ubuntu实例,以sudo权限执行,等待节点完成注册。在管理机器上运行kubectl get nodes,当节点状态变为Ready时,即完成接入。
二、永久接入(纳入kops管理,避免被清理)
如果希望外部实例长期留在集群中,且不被kops的更新操作移除,需要将实例纳入kops的集群配置,让kops管理它的生命周期。
操作步骤:
获取外部实例核心信息
通过AWS控制台或CLI获取实例的ID、可用区、子网ID:aws ec2 describe-instances --instance-ids <你的外部实例ID> --query 'Reservations[0].Instances[0].[Placement.AvailabilityZone, SubnetId]'编辑kops集群配置
在管理机器上打开集群配置编辑器:kops edit cluster <你的集群名称> --state <你的kops状态存储路径>在配置的
spec.nodes部分,新增一个节点组并指定你的外部实例:spec: nodes: - name: existing-external-node instanceGroup: nodes zone: <实例所在可用区,比如us-east-1a> subnet: <实例所在子网ID> # 关键:指定外部实例的ID instanceID: i-0123456789abcdef0 # 其他配置与现有节点组保持一致,如镜像、IAM角色、安全组等 image: <集群使用的Ubuntu镜像ID> iam: profile: nodes.<你的集群名称> securityGroup: nodes.<你的集群名称>应用配置并同步集群
提交配置修改:kops update cluster <你的集群名称> --state <你的kops状态存储路径> --yes执行滚动更新让kops同步配置到外部实例:
kops rolling-update cluster <你的集群名称> --state <你的kops状态存储路径> --yes验证节点状态
运行kubectl get nodes,确认外部实例已作为集群节点存在,且状态为Ready。
重要注意事项
- 外部实例的Ubuntu版本、K8s组件版本必须与集群现有节点完全一致,否则会出现兼容性问题
- 实例的IAM角色权限要与集群节点的IAM角色权限相同,否则节点无法正常与API服务器通信、获取集群资源
- 永久接入后,后续所有kops集群操作都会包含该节点,需保证其配置与集群其他节点保持同步
内容的提问来源于stack exchange,提问作者Shruthi Bhaskar
相关产品推荐
相关产品推荐

