web-dev-qa-db-ja.com

AWSクラウドプロバイダーとKubernetesの統合-ブートストラップ後にノードが「uninitialized:true」の汚染でスタックする

概要

bootstrap Kubeadmを使用してAWS上のKubernetesクラスターを試行しています。提案する前に、EKSやKops、Kubesprayなどの別のブートストラップソリューションの使用には興味がありません。

クラウドプロバイダーの統合が、ツリー内ではなくツリー外で管理されていないことについての分裂のため、適切な手順に関する多くの不正確な情報があるようです。そのため、この統合を適切にセットアップする方法について、頭の中で明確なイメージを得るのに苦労してきました。

要求事項

公式リポジトリ は3つの要件を示します。

1)kubeletkube-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

しかし、これは状況を解決していません。

編集2

他の場所のユーザーから、cloud-provider-awsリポジトリの manifests ディレクトリにあるRBACおよびDaemonSetリソースを適用していないことが問題である可能性があるとの提案がありました。 this 画像を使用してこれを実行した後、aws-cloud-controller-manageraws 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"

編集3

コミット6a14c81の時点で、リポジトリを使用して新しいイメージをビルドしました。それは here で見つかります。デフォルトでawsプロバイダーも使用しているようですか?

Cloud provider could not be initialized: could not init cloud provider "aws": clusterID tags did not match: "example-14150" vs "True"
2
TJ Zimmerman

ドキュメントには、AWS Cloud Controller Managerを必要なRBACポリシーと一緒にデプロイする必要があることは記載されていません。これらは、リポジトリの/manifestsにあります。

現在公開されているAWS Cloud Controller Managerイメージはありません。そのため、ビルドして自分でホストするか、最新のコミットから私のイメージを使用する必要があります here

--cloud-provider=awsが引数として渡されていることがわかります。 EXTERNALクラウドプロバイダー統合であるにもかかわらず、ここではawsではなくexternalを渡す必要がありますIS.

最後に、すべてのインスタンスにもタグを付ける必要があります:"KubernetesCluster" = var.K8S_CLUSTER_NAME

2
TJ Zimmerman