Amazon Elastic Kubernetes Service (Amazon EKS) 最適化 Bottlerocket Amazon マシンイメージ (AMI) を使用してユーザーデータを構成したいと考えています。起動テンプレートのユーザーデータ書き込みを試行すると、"Instances failed to join the kubernetes cluster" エラーが発生します。
解決策
起動テンプレートに含まれるユーザーデータが正しくない場合、次のエラーメッセージが表示される可能性があります:
"Instances failed to join the kubernetes cluster."
Bottlerocket AMI は、ユーザーデータを Amazon EKS のユーザーデータとマージすることで、ノードがクラスターに参加できるようにします。ユーザーデータに含めた構成は、Amazon EKS が構成する設定をオーバーライドします。サポート対象の設定に関する詳細については、Bottlerocket のウェブサイトで「設定のリファレンス」を参照してください。
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 の例が含まれています。
関連情報
Bottlerocket のファイルディレクトリ (GitHub のウェブサイト)