GCP手动搭建k8s集群如何实现新创建VM自动加入Master作为节点
自动加入K8s集群的可行方案
核心实现逻辑为:基于你已预装Docker、K8s组件的自定义镜像,只需在弹性实例启动阶段自动获取集群加入凭证、执行kubeadm join命令即可实现无人值守接入,两种落地方式如下:
方案1:实例模板配置启动脚本(推荐,复杂度最低)
- 首先登录K8s Master节点生成长期有效的加入凭证(默认token有效期仅24小时,生成永久有效期凭证避免定期更新),执行命令:
kubeadm token create --ttl 0 --print-join-command
保存输出的完整join命令,格式参考:kubeadm join [Master内网IP]:6443 --token [生成的token] --discovery-token-ca-cert-hash sha256:[CA证书哈希] - 进入GCP控制台编辑弹性实例组绑定的实例模板,在「元数据」板块添加键为
startup-script的配置项,值填写如下内容,替换为你刚才保存的join命令:
#!/bin/bash # 增加重复执行判断,避免实例重启时重复执行加入逻辑 if ! kubectl get node &> /dev/null; then 替换为你保存的完整kubeadm join命令 fi
- 注意需保证弹性实例所属VPC网络可访问Master节点的6443端口,无需额外开放公网权限
方案2:cloud-init配置集成(适合需额外初始化的场景)
如果节点启动需要同步完成内核参数调整、磁盘挂载等其他初始化操作,可将加入逻辑集成到cloud-init配置中:
- 在实例模板的元数据板块添加键为
user-data的配置项,值参考如下:
#cloud-config runcmd: - | if ! systemctl is-active --quiet kubelet; then 替换为你保存的完整kubeadm join命令 systemctl enable --now kubelet fi
生产环境安全优化
如果你不想将join凭证明文写在实例模板配置中,可配合GCP Secret Manager做凭证托管:
- 将完整join命令存储为名为
k8s-join-command的Secret,给实例模板绑定的服务账号授予该Secret的只读权限 - 启动脚本调整为如下内容,启动时自动拉取凭证执行:
#!/bin/bash if ! kubectl get node &> /dev/null; then JOIN_CMD=$(gcloud secrets versions access latest --secret=k8s-join-command --region=你的Secret所属区域) eval $JOIN_CMD fi
内容的提问来源于stack exchange,提问作者TheAkashKamble
相关产品推荐
相关产品推荐

