bootstrap Kubeadmを使用してAWS上のKubernetesクラスターを試行しています。提案する前に、EKSやKops、Kubesprayなどの別のブートストラップソリューションの使用には興味がありません。
クラウドプロバイダーの統合が、ツリー内ではなくツリー外で管理されていないことについての分裂のため、適切な手順に関する多くの不正確な情報があるようです。そのため、この統合を適切にセットアップする方法について、頭の中で明確なイメージを得るのに苦労してきました。
公式リポジトリ は3つの要件を示します。
1)kubelet
、kube-apiserver
、およびkube-controller-manager
を--cloud-provider=external
引数で初期化する必要があります。私が正しく理解していれば、ツリー外プロバイダーを使用できます。代わりにここでaws
を使用すると、非推奨のタイムラインにあるツリー内プロバイダーが使用されます。
2) 2つのIAMポリシー を作成し、それらをIAMインスタンスプロファイルに関連付けて、上記のポリシーをアタッチしてKubernetesノードを起動する必要があります。
3)クラスター内の各ノードは、基盤となるEC2インスタンスに関連付けられた同じホスト名をPrivate DNS
名として持つ必要があります。
これに加えて、EC2インスタンス、ルートテーブル、セキュリティグループ、サブネットに以下のタグを添付する必要がかつてあったと思います。私も十分な対策を講じています。
"kubernetes.io/cluster/${var.K8S_CLUSTER_NAME}" = "kubernetes.io/cluster/${var.K8S_CLUSTER_NAME}"
ただし、これにも関わらず、ブートストラップ後にワーカーノードがオンラインになると、次の汚染が適用されます。
node.cloudprovider.kubernetes.io/uninitialized: true
これは明らかに、ノードがクラウドプロバイダーによって初期化されていないことを意味します。ここからどこに行くべきか本当にわからない。クラウドプロバイダーとAWSの統合を使用する方法の追加手順については オープンリクエスト がありますが、現在は満足できません。
私がその問題について詳しく説明しているその問題に関するコメントを残したことに気づいたかもしれません。以下は、記載されている要件に準拠している必要があることを示す、私の環境の詳細の要約です。
1)私のKubeadm構成ファイルは、4つの場所でクラウドプロバイダーをexternal
に設定します
KubeletConfigurationおよびInitConfiguration
nodeRegistration:
kubeletExtraArgs:
cloud-provider: external
ClusterConfiguration
apiServer:
extraArgs:
cloud-provider: external
ClusterConfiguration
controllerManager:
extraArgs:
cloud-provider: external
2)私のEC2インスタンスは、READMEで概説されているIAMポリシーのインスタンスプロファイルで起動されました。
$> aws ec2 describe-instances --instance-ids INSTANCE.ID | jq '.Reservations[].Instances[].IamInstanceProfile[]'
"arn:aws-us-gov:iam::ACCOUNT.ID:instance-profile/PROFILE-NAME"
3)ホスト名はEC2プライベートDNS名です。
$> hostname -f
ip-10-0-10-91.us-gov-west-1.compute.internal
4)EC2インスタンスだけでなく、ルートテーブル、サブネットなどにも次のタグが付けられます。
"kubernetes.io/cluster/${var.K8S_CLUSTER_NAME}" = "kubernetes.io/cluster/${var.K8S_CLUSTER_NAME}"
結果として、私はすべての要件に準拠しているように見えるので、なぜノードがまだそのTaintに残っているのかわかりません。どんな助けでも大歓迎です!
各インスタンスのタグを次のように更新しました。
"kubernetes.io/cluster/${var.K8S_CLUSTER_NAME}" = "owned"
そして、このタグを各サブネットに追加しました:
"kubernetes.io/role/internal-elb" = 1
しかし、これは状況を解決していません。
他の場所のユーザーから、cloud-provider-aws
リポジトリの manifests ディレクトリにあるRBACおよびDaemonSetリソースを適用していないことが問題である可能性があるとの提案がありました。 this 画像を使用してこれを実行した後、aws-cloud-controller-manager
がaws
not external`を使用することを期待しているため、これで問題が解決されなかったことを確認できます起動時にポッドによって生成されたログ:
Generated self-signed cert in-memory
Neither --kubeconfig nor --master was specified. Using the inClusterConfig. This might not work.
Version: v0.0.0-master+$Format:%h$
WARNING: aws built-in cloud provider is now deprecated. The AWS provider is deprecated and will be removed in a future release
Building AWS cloudprovider
Zone not specified in configuration file; querying AWS metadata service
Cloud provider could not be initialized: could not init cloud provider "aws": clusterID tags did not match: "example-14150" vs "True"
コミット6a14c81
の時点で、リポジトリを使用して新しいイメージをビルドしました。それは here で見つかります。デフォルトでaws
プロバイダーも使用しているようですか?
Cloud provider could not be initialized: could not init cloud provider "aws": clusterID tags did not match: "example-14150" vs "True"
ドキュメントには、AWS Cloud Controller Managerを必要なRBACポリシーと一緒にデプロイする必要があることは記載されていません。これらは、リポジトリの/manifests
にあります。
現在公開されているAWS Cloud Controller Managerイメージはありません。そのため、ビルドして自分でホストするか、最新のコミットから私のイメージを使用する必要があります here 。
--cloud-provider=aws
が引数として渡されていることがわかります。 EXTERNALクラウドプロバイダー統合であるにもかかわらず、ここではaws
ではなくexternal
を渡す必要がありますIS.
最後に、すべてのインスタンスにもタグを付ける必要があります:"KubernetesCluster" = var.K8S_CLUSTER_NAME