AWS 雲提供商與 Kubernetes 的集成 - 引導後節點卡在“未初始化:真”污點
概括
我正在嘗試使用 Kubeadm 在 AWS 上引導 Kubernetes 集群。請在您提出建議之前,我對使用 EKS 或其他引導解決方案(如 Kops、Kubespray 等)不感興趣。
似乎有很多關於正確程序的不准確資訊,這是由於雲提供商集成不是在樹外而不是樹內管理的分裂。因此,我一直在努力弄清楚如何正確設置此集成。
要求
官方回購指出了三個要求。
您必須使用參數初始化
kubelet
、kube-apiserver
和。如果我理解正確,這允許您使用 out of tree 提供程序。在這裡使用將使用在棄用時間表上的樹內提供程序。kube-controller-manager``--cloud-provider=external``aws
您必須創建兩個 IAM 策略,將它們與 IAM 實例配置文件關聯,並啟動附加了所述策略的 Kubernetes 節點。
集群中的每個節點必須具有與底層 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 集成的額外說明的公開請求,但目前不滿意。
我的配置
您可能已經註意到我在該問題上發表了評論,並詳細說明了我的問題。這是我的環境詳細資訊的摘要,表明我應該符合列出的要求。
- 我的 Kubeadm 配置文件將雲提供商設置為
external
四個地方KubeletConfiguration 和 InitConfiguration
nodeRegistration: kubeletExtraArgs: cloud-provider: external
集群配置
apiServer: extraArgs: cloud-provider: external
集群配置
controllerManager: extraArgs: cloud-provider: external
- 我的 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"
- 主機名是 EC2 私有 DNS 名稱:
$> hostname -f ip-10-0-10-91.us-gov-west-1.compute.internal
- 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 external:
aws`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 策略。這些可以在
/manifests
repo 中找到。目前沒有發布的 AWS Cloud Controller Manager 映像。因此,您需要自己建構並託管它,或者使用我在此處找到的最新送出中的圖像。
您會注意到這
--cloud-provider=aws
是作為參數傳遞的。儘管是外部雲提供商集成,但實際上有必要aws
不在external
這里傳遞。最後,您的所有實例還必須標記為:
"KubernetesCluster" = var.K8S_CLUSTER_NAME