在 AWS Outpost 上建立 Amazon Linux 節點 - Amazon EKS

協助改進此頁面

若要為本使用者指南貢獻內容,請點選每個頁面右側面板中的在 GitHub 上編輯此頁面連結。

在 AWS Outpost 上建立 Amazon Linux 節點

本主題會說明如何啟動 Outpost 上已向 Amazon EKS 叢集註冊的 Amazon Linux 節點的 Auto Scaling 群組。叢集可位於 AWS 雲端或 Outpost 上。

  • 現有的 Outpost。如需詳細資訊,請參閱什麼是 AWS Outposts

  • 現有 Amazon EKS 叢集。若要在 AWS 雲端上部署叢集,請參閱 建立 Amazon EKS 叢集。若要在 Outpost 上部署叢集,請參閱建立 AWS Outposts 上的本機 Amazon EKS 叢集,以實現高可用性

  • 假設您在 AWS 雲端上的叢集中建立節點,且在已啟用 AWS Outposts、AWS Wavelength 或 AWS Local Zones 的 AWS 區域中擁有子網路。然後,在您建立叢集時,不得傳入這些子網路。如果您要在 Outpost 上的叢集中建立節點,則必須在建立叢集時便已傳入 Outpost 子網路。

  • (建議 AWS 雲端上的叢集) Kubernetes 專用 Amazon VPC CNI 外掛程式的附加元件設定有自己的 IAM 角色,該角色已連接必要的 IAM 政策。如需詳細資訊,請參閱 設定 Amazon VPC CNI 外掛程式以使用 IRSA。本機叢集不支援服務帳戶的 IAM 角色。

您可使用 eksctl 或 AWS 管理主控台 (使用 AWS CloudFormation 範本) 建立自我管理的 Amazon Linux 節點群組。您也可使用 Terraform。

您可以使用此頁面中所述的下列工具,為本機叢集建立自我管理節點群組:

重要
  • 自我管理節點群組包含您帳戶的 Amazon EC2 執行個體。當您或 Amazon EKS 代您更新控制平面版本時,這些執行個體不會自動升級。自我管理節點群組在主控台中沒有任何需要更新的指示。您可以檢視安裝在節點上的 kubelet 版本,方法是選取您叢集的 Overview (概觀) 標籤上的 Nodes (節點) 清單上的節點,以判斷哪些節點需要更新。您必須手動更新節點。如需詳細資訊,請參閱 更新您的叢集的自我管理節點

  • 您自我管理節點上的 kubelet 使用的憑證已核發,一年過期。預設不會啟用憑證輪換 (請參閱:https://kubernetes.io/docs/reference/config-api/kubelet-config.v1beta1/#kubelet-config-k8s-io-v1beta1-KubeletConfiguration),這表示如果您的自我管理節點執行超過一年,則將無法再向 Kubernetes API 進行身分驗證。

  • 基於最佳實務,建議客戶定期更新其自我管理節點群組,以從最新的 Amazon EKS 最佳化 AMI 接收 CVE 和安全性修補程式。更新自我管理節點群組中使用的 AMI 也會觸發節點的重新建立,並確保它們不會因為過期的 kubelet 憑證而發生問題。

  • 或者,您也可以在建立自我管理節點群組時啟用用戶端憑證輪換 (請參閱:https://kubernetes.io/docs/tasks/tls/certificate-rotation/),以確保在 kubelet 憑證在目前的憑證即將過期時及時更新。

eksctl

使用 eksctl 啟動自我管理的 Linux 節點

  1. 在裝置或 AWS CloudShell 上安裝版本 0.214.0 或更新版本的 eksctl 命令列工具。如需有關安裝或更新 eksctl 的指示,請參閱 eksctl 文件中的安裝一節。

  2. 若您的叢集位於 AWS 雲端上,且 AmazonEKS_CNI_Policy 受管 IAM 政策已連接至您的 Amazon EKS 節點 IAM 角色,建議您改為將其指派給您與 Kubernetes aws-node 服務帳戶相關聯的 IAM 角色。如需詳細資訊,請參閱 設定 Amazon VPC CNI 外掛程式以使用 IRSA。若您的叢集位於 Outpost 上,則政策必須連接至您的節點角色。

  3. 以下命令會在現有的叢集建立節點群組。叢集必須使用 eksctl 來建立。將 al-nodes 取代為您的節點群組名稱。節點群組名稱不可超過 63 個字元。它必須以字母或數字開頭,但剩餘字元也可以包含連字符和底線。使用您叢集的名稱取代 my-cluster。此名稱僅能使用英數字元 (區分大小寫) 和連字號。必須以英數字元開頭,且長度不可超過 100 個字元。在您要建立叢集的 AWS 區域和 AWS 帳戶中,該名稱必須是唯一的。若您的叢集存在於 Outpost 上,請使用 Outpost 子網路的 ID 來取代 id。若您的叢集存在於 AWS 雲端上,請使用您在建立叢集時未指定的子網路 ID 來取代 id。使用您 Outpost 支援的執行個體類型來取代 instance-type。使用您自己的值取代其餘範例值。依預設,系統會使用與控制平面相同的 Kubernetes 版本來建立節點。

    使用您 Outpost 上可用的執行個體類型來取代 instance-type

    使用 Amazon EC2 金鑰對或公有金鑰的名稱取代 my-key。此金鑰會在節點啟動後用於將 SSH 套用至節點。如果您還沒有 Amazon EC2 金鑰對,可以在 AWS 管理主控台 中建立一個。如需詳細資訊,請參閱《Amazon EC2 使用者指南》中的 Amazon EC2 金鑰對

    使用下列命令來建立您的節點群組。

    eksctl create nodegroup --cluster my-cluster --name al-nodes --node-type instance-type \ --nodes 3 --nodes-min 1 --nodes-max 4 --managed=false --node-volume-type gp2 --subnet-ids subnet-id

    如果將您的叢集部署在 AWS 雲端上:

    如需所有可用選項和預設值的完整清單,請參閱 eksctl 文件中的 AWS Outposts 支援

  4. (選用) 部署範例應用程式以測試您的叢集和 Linux 節點。

AWS 管理主控台

步驟 1:使用 AWS 管理主控台 啟動自我管理的 Linux 節點

  1. 下載最新版的 AWS CloudFormation 範本。

    curl -O https://s3.us-west-2.amazonaws.com/amazon-eks/cloudformation/2022-12-23/amazon-eks-nodegroup.yaml
  2. 開啟 AWS CloudFormation 主控台

  3. 選擇 Create stack (建立堆疊),然後選取 With new resources (standard) (使用新資源 (標準))。

  4. 針對 Specify template (指定範本),選取 Upload a template file (上傳範本檔案),然後選取 Choose file (選擇檔案)。選取在上一步驟中下載的 amazon-eks-nodegroup.yaml 檔案,然後選取 Next (下一步)。

  5. Specify stack details (指定堆疊詳細資訊) 頁面上,據此填寫下列參數,然後選擇 Next (下一步):

    • 堆疊名稱:為您的 AWS CloudFormation 堆疊選擇堆疊名稱。例如,您可以稱它為 al-nodes。此名稱僅能使用英數字元 (區分大小寫) 和連字號。必須以英數字元開頭,且長度不可超過 100 個字元。在您要建立叢集的 AWS 區域和 AWS 帳戶中,該名稱必須是唯一的。

    • ClusterName:請輸入您叢集的名稱。若此名稱與您叢集的名稱不相符,則您的節點便無法加入叢集。

    • ClusterControlPlaneSecurityGroup:選擇來自您建立 VPC 時所產生 AWS CloudFormation 輸出的 SecurityGroups 值。

      下列步驟顯示擷取適用群組的一種操作。

      1. 開啟 Amazon EKS 主控台

      2. 選擇叢集的名稱。

      3. 選擇 Networking (網路) 索引標籤。

      4. ClusterControlPlaneSecurityGroup 下拉式清單中選取時,請使用 Additional Security Group (其他安全群組) 值作為參考。

    • NodeGroupName:輸入節點群組的名稱。此名稱稍後可用於識別為您節點建立的 Auto Scaling 節點群組。

    • NodeAutoScalingGroupMinSize:輸入節點 Auto Scaling 群組可以縮減的最低節點數。

    • NodeAutoScalingGroupDesiredCapacity:堆疊建立時,輸入欲擴展的所需節點數量。

    • NodeAutoScalingGroupMaxSize:輸入節點 Auto Scaling 群組可以擴增的最大節點數。

    • NodeInstanceType:選擇節點的執行個體類型。若您的叢集正於 AWS 雲端上執行,則如需詳細資訊,請參閱 選擇最佳的 Amazon EC2 節點執行個體類型。若您的叢集正於 Outpost 上執行,則您僅可選取 Outpost 上可用的執行個體類型。

    • NodeImageIdSSMParam:為變數 Kubernetes 版本預先填入了最近 Amazon EKS 最佳化 AMI 的 Amazon EC2 Systems Manager 參數。若要使用 Amazon EKS 支援不同的 Kubernetes 次要版本,請將 1.XX 取代為不同的支援的版本。建議指定與叢集相同的 Kubernetes 版本。

      若要使用 Amazon EKS 最佳化加速 AMI,請將 amazon-linux-2 取代為 amazon-linux-2-gpu。若要使用 Amazon EKS 最佳化 Arm AMI,請將 amazon-linux-2 取代為 amazon-linux-2-arm64

      注意

      Amazon EKS 節點 AMI 以 Amazon Linux 為基礎。您可以透過選擇所需版本的標籤,在 Amazon Linux 安全中心追蹤 Amazon Linux 的安全或隱私權事件。您也可以訂閱適用的 RSS 摘要。安全與隱私權事件包含問題的概觀、哪些套件受到影響,以及如何更新您的執行個體以修正問題。

    • NodeImageId:(選用) 如果您使用自己的自訂 AMI (而不是 Amazon EKS 最佳化 AMI),請輸入 AWS 區域的節點 AMI ID。如果您在此指定值,則會覆寫 NodeImageIdSSMParam 欄位中的任何值。

    • NodeVolumeSize:為您的節點指定根磁碟區大小 (以 GiB 為單位)。

    • NodeVolumeType:為您的節點指定根磁碟區類型。

    • KeyName:輸入 Amazon EC2 SSH 金鑰對的名稱,您可以在節點啟動後使用該金鑰對來透過 SSH 連接至節點。如果您還沒有 Amazon EC2 金鑰對,可以在 AWS 管理主控台 中建立一個。如需詳細資訊,請參閱《Amazon EC2 使用者指南》中的 Amazon EC2 金鑰對

      注意

      如果您未在此提供金鑰對,則 AWS CloudFormation 堆疊建立失敗。

    • BootstrapArguments:您可將多個選用引數傳遞至節點。如需詳細資訊,請檢視 GitHub 上的 bootstrap script usage information (啟動程序指令碼使用資訊)。如果您要將節點新增至 AWS Outposts 上的 Amazon EKS 本機叢集 (其中 Kubernetes 控制平面執行個體會在 AWS Outposts 上執行),且叢集沒有輸入和輸出網際網路連線 (亦稱為私有叢集),則必須提供下列引導引數 (以單行)。

      --b64-cluster-ca ${CLUSTER_CA} --apiserver-endpoint https://${APISERVER_ENDPOINT} --enable-local-outpost true --cluster-id ${CLUSTER_ID}

      若要擷取 Amazon EKS 本機叢集的 CLUSTER_CAAPISERVER_ENDPOINTCLUSTER_ID 的值,請執行下列 AWS CLI 命令。將 cluster-name 取代為您的叢集名稱,以及將 region (例如 us-east-1) 取代為您叢集的 AWS 區域。

      echo "CLUSTER_CA=$(aws eks describe-cluster --name cluster-name --region region --query cluster.certificateAuthority.data --output text)" echo "APISERVER_ENDPOINT=$(aws eks describe-cluster --name cluster-name --region region --query cluster.endpoint --output text)" echo "CLUSTER_ID=$(aws eks describe-cluster --name cluster-name --region region --query cluster.id --output text)"
    • DisableIMDSv1:預設情況下,每個節點都支援執行個體中繼資料服務版本 1 (IMDSv1) 和 IMDSv2。您可以停用 IMDSv1。若要防止節點群組中的未來節點和 Pod 使用 IMDSv1,請將 DisableIMDSv1 設定為 true。如需 IMDS 的詳細資訊,請參閱設定執行個體中繼資料服務。如需在節點上限制存取的詳細資訊,請參閱限制存取指派給工作節點的執行個體設定檔

    • VpcId:輸入您建立的 VPC ID。在選擇子網路之前,請先檢閱 VPC 要求和考量事項

    • 子網路:如果叢集位於 Outpost 上,則請至少在 VPC 中選擇一個私有子網路。在選擇子網路之前,請先檢閱子網路需求和注意事項。您可以看到哪些子網是私有子網,方法是從叢集的 Networking (聯網) 標籤打開每一個子網連結。

  6. 請在 Configure stack options (設定堆疊選項) 頁面上選取所需的選項,然後選擇 Next (下一頁)。

  7. 選取我了解 AWS CloudFormation 會建立 IAM 資源。左側的核取方塊,然後選擇建立堆疊

  8. 當當堆疊已完成建立時,從主控台將其選取,然後選擇 Outputs (輸出)

  9. 為已建立的節點群組記錄 NodeInstanceRole。當您設定 Amazon EKS 節點時會需要此值。

步驟 2:讓節點加入叢集

  1. 檢查以瞭解是否有 aws-auth ConfigMap

    kubectl describe configmap -n kube-system aws-auth
  2. 如果您看到 aws-auth ConfigMap,請視需要更新之。

    1. 開啟 ConfigMap 進行編輯。

      kubectl edit -n kube-system configmap/aws-auth
    2. 視需要新增 mapRoles 個項目。將 rolearn 值設定為您在先前程序中記錄的 NodeInstanceRole 值。

      [...] data: mapRoles: | - rolearn: <ARN of instance role (not instance profile)> username: system:node:{{EC2PrivateDNSName}} groups: - system:bootstrappers - system:nodes [...]
    3. 儲存檔案並結束您的文字編輯器。

  3. 如果您收到一個錯誤,說明 "Error from server (NotFound): configmaps "aws-auth" not found,那麼請套用股票 ConfigMap

    1. 下載組態對應。

      curl -O https://s3.us-west-2.amazonaws.com/amazon-eks/cloudformation/2020-10-29/aws-auth-cm.yaml
    2. aws-auth-cm.yaml 檔案中,將 rolearn 設定為您在先前程序中紀錄的 NodeInstanceRole 值。您可以使用文字編輯器來完成此操作,或者透過取代 my-node-instance-role 並執行下列命令:

      sed -i.bak -e 's|<ARN of instance role (not instance profile)>|my-node-instance-role|' aws-auth-cm.yaml
    3. 套用組態。此命令可能需要幾分鐘的時間來完成。

      kubectl apply -f aws-auth-cm.yaml
  4. 查看節點的狀態,並等待他們到達 Ready 狀態。

    kubectl get nodes --watch

    輸入 Ctrl+C 傳回 Shell 提示。

    注意

    如果您收到任何授權或資源類型錯誤,請參閱故障診斷主題中的未經授權或存取遭拒 (kubectl)

    如果節點無法加入叢集,則請參閱對 Amazon EKS 叢集和節點問題進行故障診斷中的 節點無法加入叢集,以及對 AWS Outposts 上的本機 Amazon EKS 叢集進行故障診斷中的 無法將節點加入叢集

  5. 安裝 Amazon EBS CSI 驅動程式。如需詳細資訊,請參閱 GitHub 上的 Installation (安裝)。在 Set up driver permission (設定驅動程式權限) 區段中,請務必依照 Using IAM instance profile (使用 IAM 執行個體設定檔) 選項指示操作。您必須使用 gp2 儲存類別。不支援 gp3 儲存類別。

    若要在叢集上建立 gp2 儲存類別,請完成以下步驟。

    1. 執行下列命令以建立 gp2-storage-class.yaml 檔案。

      cat >gp2-storage-class.yaml <<EOF apiVersion: storage.k8s.io/v1 kind: StorageClass metadata: annotations: storageclass.kubernetes.io/is-default-class: "true" name: ebs-sc provisioner: ebs.csi.aws.com volumeBindingMode: WaitForFirstConsumer parameters: type: gp2 encrypted: "true" allowVolumeExpansion: true EOF
    2. 將清單檔案套用至叢集。

      kubectl apply -f gp2-storage-class.yaml
  6. (僅限 GPU 節點) 若您選擇了 GPU 執行個體類型和 Amazon EKS 最佳化加速 AMI,則必須套用 Kubernetes 專用 NVIDIA 裝置外掛程式作為叢集上的 DaemonSet。請先以您想要的 NVIDIA/k8s-device-plugin 版本來取代 vX.X.X,然後再執行下列命令。

    kubectl apply -f https://raw.githubusercontent.com/NVIDIA/k8s-device-plugin/vX.X.X/deployments/static/nvidia-device-plugin.yml

步驟 3:其他動作

  1. (選用) 部署範例應用程式以測試您的叢集和 Linux 節點。

  2. 若您的叢集部署在 Outpost 上,請跳過此步驟。若您的叢集部署在 AWS 雲端上,以下資訊可供您選擇性使用。如果 AmazonEKS_CNI_Policy 受管 IAM 政策已連接至您的 Amazon EKS 節點 IAM 角色,建議您改為將其指派給您與 Kubernetes aws-node 服務帳戶相關聯的 IAM 角色。如需詳細資訊,請參閱 設定 Amazon VPC CNI 外掛程式以使用 IRSA