我想使用经过 Amazon Elastic Kubernetes Service (Amazon EKS) 优化的 Bottlerocket 亚马逊机器映像 (AMI) 来配置用户数据。当我尝试为启动模板写入用户数据时,收到“Instances failed to join the kubernetes cluster.”错误。
解决方法
如果您在启动模板中包含不正确的用户数据,则可能会收到以下错误消息:
“Instances failed to join the kubernetes cluster.”
Bottlerocket AMI 将用户数据与 Amazon EKS 用户数据合并,以便节点可以加入集群。您在用户数据中包含的配置会覆盖 Amazon EKS 配置的设置。有关支持的设置的详细信息,请参阅 Bottlerocket 网站上的 Settings reference(设置参考)。
您用于基于 Bottlerocket AMI 的托管节点组的启动模板中的 Amazon Elastic Compute Cloud (Amazon EC2) 用户数据必须采用 TOML 格式。有关详细信息,请参阅 GitHub 网站上的 TOML。Amazon EKS 不支持所有有效的 TOML 格式。有关详细信息,请参阅 Amazon EC2 用户数据。
EC2 用户数据还必须包含以下 Kubernetes 设置:
- settings.kubernetes.cluster-certificate
- settings.kubernetes.api-server
- settings.kubernetes.cluster-name
将以下示例用户数据配置与启动模板的用户数据部分中的前述设置一起添加:
[settings.kubernetes]
api-server = "https://abc.def.us-east-1.eks.amazonaws.com"
cluster-certificate = "TkQgQ0VSVElGSUNBVEUtLS0tLQo="
cluster-name = "eks-dev"
**注意:**将 us-east-1 替换为部署 Amazon EKS 集群的 AWS 区域。
具有 node-labels 和 node-taints 设置的用户数据示例:
[settings.kubernetes]
api-server = "https://abc.def.us-east-1.eks.amazonaws.com"
cluster-certificate = "TkQgQ0VSVElGSUNBVEUtLS0tLQo="
cluster-name = "eks-dev"
[settings.kubernetes.node-labels]
"label1" = "foo"
"label2" = "bar"
[settings.kubernetes.node-taints]
"dedicated" = "airflow:NoSchedule"
**注意:**请将 cluster-name 替换为您的集群名称,将 us-east-1 替换为您的区域。
您还可以运行以下 eksctl 命令为您的集群生成基本的 userdata.toml 文件:
~ eksctl get cluster --region us-east-1 --name cluster-name -o json | jq --raw-output '.[] | "[settings.kubernetes]\napi-server = \"" + .Endpoint + "\"\ncluster-certificate =\"" + .CertificateAuthority.Data + "\"\ncluster-name = " + .Name'
**注意:**请将 cluster-name 替换为您的集群名称,将 us-east-1 替换为您的区域。该命令的输出包括预先编写的 userdata 示例。
相关信息
GitHub 网站上的 Bottlerocket file directory(Bottlerocket 文件目录)