Amazon-Web-Services

AWS 雲提供商與 Kubernetes 的集成 - 引導後節點卡在“未初始化:真”污點

  • May 13, 2020

概括

我正在嘗試使用 Kubeadm 在 AWS 上引導 Kubernetes 集群。請在您提出建議之前,我對使用 EKS 或其他引導解決方案(如 Kops、Kubespray 等)不感興趣。

似乎有很多關於正確程序的不准確資訊,這是由於雲提供商集成不是在樹外而不是樹內管理的分裂。因此,我一直在努力弄清楚如何正確設置此集成。

要求

官方回購指出了三個要求。

  1. 您必須使用參數初始化kubeletkube-apiserver和。如果我理解正確,這允許您使用 out of tree 提供程序。在這裡使用將使用在棄用時間表上的樹內提供程序。kube-controller-manager``--cloud-provider=external``aws

  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 配置文件將雲提供商設置為external四個地方

KubeletConfiguration 和 InitConfiguration

nodeRegistration:
 kubeletExtraArgs:
   cloud-provider: external

集群配置

apiServer:
 extraArgs:
   cloud-provider: external

集群配置

controllerManager:
 extraArgs:
   cloud-provider: external
  1. 我的 EC2 實例是使用帶有自述文件中概述的 IAM 策略的實例配置文件啟動的:
$> aws ec2 describe-instances --instance-ids INSTANCE.ID | jq '.Reservations[].Instances[].IamInstanceProfile[]'
"arn:aws-us-gov:iam::ACCOUNT.ID:instance-profile/PROFILE-NAME"
  1. 主機名是 EC2 私有 DNS 名稱:
$> hostname -f
ip-10-0-10-91.us-gov-west-1.compute.internal
  1. EC2 實例以及我的路由表、子網等標記為:
"kubernetes.io/cluster/${var.K8S_CLUSTER_NAME}" = "kubernetes.io/cluster/${var.K8S_CLUSTER_NAME}"

結果,看起來我符合所有要求,所以我不確定為什麼我的節點仍然帶有那個污點。任何幫助將不勝感激!

編輯

我已將每個實例上的標籤更新為:

"kubernetes.io/cluster/${var.K8S_CLUSTER_NAME}" = "owned"

並將此標籤添加到每個子網:

"kubernetes.io/role/internal-elb" = 1

然而,這並沒有解決問題。

編輯 2

其他地方的使用者建議問題可能是我沒有應用repo清單目錄中存在的 RBAC 和 DaemonSet 資源cloud-provider-aws。使用圖像執行此操作後,我可以確認這並沒有解決我的問題,因為根據 Pod 在啟動時生成的日誌,aws-cloud-controller-manager似乎期望您使用not externalaws`

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

我使用送出時的 repo 建構了一個新圖像6a14c81。可以在這裡找到。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 策略。這些可以在/manifestsrepo 中找到。

目前沒有發布的 AWS Cloud Controller Manager 映像。因此,您需要自己建構並託管它,或者使用我在此處找到的最新送出中的圖像。

您會注意到這--cloud-provider=aws是作為參數傳遞的。儘管是外部雲提供商集成,但實際上有必要aws不在external這里傳遞。

最後,您的所有實例還必須標記為:"KubernetesCluster" = var.K8S_CLUSTER_NAME

引用自:https://serverfault.com/questions/1016010