

 **協助改進此頁面** 

本文為英文版的機器翻譯版本，如內容有任何歧義或不一致之處，概以英文版為準。

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

本文為英文版的機器翻譯版本，如內容有任何歧義或不一致之處，概以英文版為準。

# 使用啟動範本自訂受管節點
<a name="launch-templates"></a>

如需最高層級的自訂，您可以根據此頁面上的步驟，使用自己的啟動範本來部署受管節點。使用啟動範本可讓 等功能在部署節點期間提供引導引數 （例如，額外的 [kubelet](https://kubernetes.io/docs/reference/command-line-tools-reference/kubelet/) 引數）、從與指派給節點的 IP 地址不同的 CIDR 區塊將 IP 地址指派給 Pod、將您自己的自訂 AMI 部署至節點，或將您自己的自訂 CNI 部署至節點。

如果您在第一次建立受管節點群組期間提供自己的啟動範本，稍後也會得到更出色的靈活性。只要使用自己的啟動範本部署受管節點群組，您就可以使用不同版本的相同啟動範本來反覆更新。將節點群組更新為不同版本的啟動範本時，群組中的所有節點都會回收，以符合指定啟動範本版本的新組態。

一律使用 Amazon EC2 Auto Scaling 群組所使用的啟動範本部署受管節點群組。如果未提供啟動範本，Amazon EKS API 會使用帳戶中的預設值自動建立此啟動範本。然而，我們不建議您修改自動產生的啟動範本。此外，未使用自訂啟動範本的現有節點群組無法直接更新。相反，您必須建立具有自訂啟動範本的新節點群組，才能執行此動作。

## 啟動範本組態基礎知識
<a name="launch-template-basics"></a>

您可以使用 、 AWS 管理主控台 AWS CLI 或 AWS SDK 建立 Amazon EC2 Auto Scaling 啟動範本。如需詳細資訊，請參閱*《Amazon EC2 Auto Scaling 使用者指南》*中的[建立 Auto Scaling 群組的啟動範本](https://docs.aws.amazon.com/autoscaling/ec2/userguide/create-launch-template.html)。啟動範本中的某些設定與用於受管理節點組態的設定類似。使用啟動範本部署或更新節點群組時，必須在節點群組組態或啟動範本其中一個位置中指定某些設定。請勿同時在兩個位置指定設定。如果設定存在於不應該的地方，則建立或更新節點群組之類的動作會失敗。

下表會列出啟動範本中禁止的設定。該表也會列出受管節點群組組態中需要的類似設定 (如果有)。列出的設定是顯示在主控台中的設定。它們在 CLI 和 SDK AWS 中可能有類似但不同的名稱。


| 啟動範本：禁止 | Amazon EKS 節點群組組態 | 
| --- | --- | 
|   **Network interfaces** (網路介面) (**Add network interface** (新增網路介面)) 下的 **Subnet** (子網)  |   **Specify networking** (指定聯網) 頁面上 **Node Group network configuration** (節點群組網路組態) 下的 **Subnets** (子網)  | 
|   **Advanced details** (進階詳細資訊) 下的 **IAM instance profile** (IAM 執行個體描述檔)   |   **Configure Node Group** (設定節點群組) 頁面上 **Node Group configuration** (節點群組組態) 下的 **Node IAM Role** (節點 IAM 角色)  | 
|   **Advanced details** (進階詳細資訊) 下的 **Shutdown behavior** (關機行為) 和 **Stop - Hibernate behavior** (停用 – 休眠行為)。為兩種設定在啟動範本中保留預設**請勿包含在啟動範本設定中**。  |  無同等。Amazon EKS 必須控制執行個體生命週期，而非 Auto Scaling 群組。  | 

下表會列出受管節點群組組態中禁止的設定。該表也會列出類似的設定 (如果有)，這些設定在啟動範本中是必要設定。列出的設定是顯示在主控台中的設定。它們在 CLI 和 SDK AWS 中可能會有類似的名稱。


| Amazon EKS 節點群組組態設定：禁止 | 啟動範本 | 
| --- | --- | 
|  (僅當您在啟動模板中指定了自訂 AMI 時) 在 **Set compute and scaling configuration** (設定運算和擴展組態) 頁面上 **Node Group compute configuration** (節點群組運算組態) 下的 **AMI type** (AMI 類型) – 主控台顯示 **Specified in launch template** (在啟動範本中指定) 以及指定的 AMI ID。 如果未在啟動範本中指定**應用程式和作業系統映像 (Amazon Machine Image)**，您可在節點群組組態中選取 AMI。  |   **Launch template contents** (啟動範本內容) 下的 **Application and OS Images (Amazon Machine Image)** (應用程式和作業系統映像 (Amazon Machine Image))：如果您有下列任一要求，則必須指定 ID： [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/eks/latest/userguide/launch-templates.html)  | 
|   **Set compute and scaling configuration** (設定運算和擴展組態) 頁面上 **Node Group compute configuration** (節點群組運算組態) 下的 **Disk size** (磁碟大小)：主控台顯示 **Specified in launch template** (在啟動範本中指定)。  |   **Storage (Volumes)** (儲存 (磁碟區)) (**Add new volume** (新增磁碟區)) 下的 **Size** (大小)。您必須在啟動範本中指定此選項。  | 
|   **Specify Networking** (指定聯網) 頁面上 **Node Group configuration** (節點群組組態) 下的 **SSH key pair** (SSH 金鑰對) – 主控台會顯示在啟動範本中指定的金鑰，或顯示 **Not specified in launch template** (未在啟動範本中指定)。  |   **Key pair (login)** (金鑰對 (登入)) 下的 **Key pair name** (金鑰對名稱)。  | 
|  使用啟動範本時，您無法指定允許遠端存取的來源安全群組。  |   針對執行個體的 **Network settings** (網路設定) 下的 **Security groups** (安全群組) 或 **Network interfaces** (網路介面) 下的 **Security groups** (安全群組) (**Add network interface** (新增網路介面))，但不能兩者同時選擇。如需詳細資訊，請參閱[使用自訂安全群組](#launch-template-security-groups)。  | 

**注意**  
如果使用啟動範本部署節點群組，請在啟動範本的 **Launch template contents** (啟動範本內容) 中指定零或一個 **Instance type** (執行個體類型)。您也可以在主控台上的 **Set compute and scaling configuration** (設定運算和擴展組態) 頁面中，為 **Instance types** (執行個體類型) 指定 0 到 20 個執行個體類型。您還可以使用其他使用 Amazon EKS API 的工具來執行這項操作。如果在啟動範本中指定執行個體類型，並使用該啟動範本來部署節點群組，則無法在主控台中指定任何執行個體類型，或使用其他使用 Amazon EKS API 的工具。如果未在啟動範本、主控台中或使用其他使用 Amazon EKS API 的工具指定執行個體類型，請使用 `t3.medium` 執行個體類型。如果您的節點群組正在使用 Spot 容量類型，則建議使用主控台指定多個執行個體類型。如需詳細資訊，請參閱[受管節點群組容量類型](managed-node-groups.md#managed-node-group-capacity-types)。
如果您部署到節點群組的任何容器使用執行個體中繼資料服務版本 2，請確定在啟動範本中將 **Metadata response hop limit** (中繼資料回應躍點限制) 設定為 `2`。如需詳細資訊，請參閱《Amazon EC2 使用者指南》**中的[執行個體中繼資料與使用者資料](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ec2-instance-metadata.html)。
啟動範本不支援允許靈活的執行個體類型選取的 `InstanceRequirements` 功能。

## 標記 Amazon EC2 執行個體
<a name="launch-template-tagging"></a>

您可以使用啟動範本的 `TagSpecification` 參數，以指定要將哪些標籤套用至節點群組中的 Amazon EC2 執行個體。IAM 實體呼叫 `CreateNodegroup` 或 `UpdateNodegroupVersion` API 必須擁有 `ec2:RunInstances` 和 `ec2:CreateTags` 許可，而且標籤必須新增至啟動範本。

## 使用自訂安全群組
<a name="launch-template-security-groups"></a>

您可以使用啟動範本來指定自訂 Amazon EC2 [安全群組](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ec2-security-groups.html)以套用至節點群組中的執行個體。這可以是在執行個體層級安全群組參數中，也可以是網路介面組態參數的一部分。不過，您無法建立同時指定執行個體層級和網路介面安全群組的啟動範本。請考慮下列適用於搭配受管節點群組使用之自訂安全群組的條件：
+ 使用 時 AWS 管理主控台，Amazon EKS 僅允許具有單一網路介面規格的啟動範本。
+ 預設情況下，Amazon EKS 將[叢集安全群組](sec-group-reqs.md)套用至節點群組中的執行個體，以促進節點與控制平面之間的通訊。如果使用先前提到的任一選項在啟動範本中指定自訂安全群組，則 Amazon EKS 不會新增叢集安全群組。因此，您必須確保安全群組的傳入和傳出規則可啟用與叢集端點的通訊。如果安全群組規則不正確，工作節點便無法加入叢集。如需安全群組規則的詳細資訊，請參閱 [檢視叢集的 Amazon EKS 安全群組要求](sec-group-reqs.md)。
+ 如需 SSH 存取節點群組中的執行個體，請包含允許該存取的安全群組。

## Amazon EC2 使用者資料
<a name="launch-template-user-data"></a>

啟動範本包含自訂使用者資料的區段。您可以在此區段中指定節點群組的組態設定，無需手動建立個別自訂 AMI。如需有關 Bottlerocket 可用設定的詳細資訊，請參閱 GitHub 上的[使用使用者資料](https://github.com/bottlerocket-os/bottlerocket#using-user-data)。

您可以在啟動執行個體時使用 `cloud-init` 提供啟動範本中的 Amazon EC2 使用者資料。如需詳細資訊，請參閱 [cloud-init 文件](https://cloudinit.readthedocs.io/en/latest/index.html)。您的使用者資料可用來執行一般組態操作。這包含下列操作：
+  [包括使用者或群組](https://cloudinit.readthedocs.io/en/latest/topics/examples.html#including-users-and-groups) 
+  [安裝套件 ](https://cloudinit.readthedocs.io/en/latest/topics/examples.html#install-arbitrary-packages) 

與受管節點群組搭配使用的啟動範本中的 Amazon EC2 使用者資料，必須為 Amazon Linux AMI 的 [MIME 分段封存](https://cloudinit.readthedocs.io/en/latest/topics/format.html#mime-multi-part-archive)格式和 Bottlerocket AMI 的 TOML 格式。這是因為您的使用者資料與節點加入叢集所需的 Amazon EKS 使用者資料合併。請勿在啟動或修改 `kubelet` 的使用者資料中指定任何命令。這會作為 Amazon EKS 合併使用者資料的一部分執行。某些 `kubelet` 參數 (例如在節點上設定標籤) 可以透過受管節點群組 API 直接設定。

**注意**  
如果有關進階 `kubelet` 自訂 (包括手動啟動或傳入自訂組態參數) 的詳細資訊，請參閱 [指定 AMI](#launch-template-custom-ami)。如果在啟動範本中指定自訂 AMI ID，Amazon EKS 不會合併使用者資料。

下列詳細資訊提供有關使用者資料區段的詳細資訊。

 **Amazon Linux 2 使用者資料**   
您可以將多個使用者資料區塊組合在一起成為單一 MIME 分段檔案。例如，您可以將設定 Docker 常駐程式的雲端 Boothook 與安裝自訂套件的使用者資料 Shell 指令碼合併。MIME 分段檔案包含下列元件：  
+ 內容類型和部分邊界宣告：`Content-Type: multipart/mixed; boundary="==MYBOUNDARY=="`
+ MIME 版本宣告：`MIME-Version: 1.0`
+ 包含以下元件的一或多個使用者資料區塊：
  + 開啟邊界，表示使用者資料區塊的開始 – `--==MYBOUNDARY==` 
  + 區塊的內容類型宣告：`Content-Type: text/cloud-config; charset="us-ascii"`。如需內容類型的詳細資訊，請參閱 [cloud-init](https://cloudinit.readthedocs.io/en/latest/topics/format.html) 文件。
  + 使用者資料的內容 (例如，Shell 命令或 `cloud-init` 指令的清單)。
  + 結束邊界，表示 MIME 分段檔案的結束：`--==MYBOUNDARY==--`

  以下是您可以用來建立自己的 MIME 分段檔案的範例。

```
MIME-Version: 1.0
Content-Type: multipart/mixed; boundary="==MYBOUNDARY=="

--==MYBOUNDARY==
Content-Type: text/x-shellscript; charset="us-ascii"

#!/bin/bash
echo "Running custom user data script"

--==MYBOUNDARY==--
```

 **Amazon Linux 2023 使用者資料**   
Amazon Linux 2023 (AL2023) 推出了新的節點初始化程序 `nodeadm`，該程序會使用 YAML 組態結構描述。如果您使用自我管理節點群組或具有啟動範本的 AMI，則在建立新節點群組時，需要明確提供額外的叢集中繼資料。以下連結展示了一個包含最低必要參數的[範例](https://awslabs.github.io/amazon-eks-ami/nodeadm/)，其中 `apiServerEndpoint`、`certificateAuthority` 和服務 `cidr` 現在是必需的：  

```
---
apiVersion: node.eks.aws/v1alpha1
kind: NodeConfig
spec:
  cluster:
    name: my-cluster
    apiServerEndpoint: https://example.com
    certificateAuthority: Y2VydGlmaWNhdGVBdXRob3JpdHk=
    cidr: 10.100.0.0/16
```
您通常會在使用者資料中設定此組態，可以依原狀設定，也可以內嵌在 MIME 分段文件中：  

```
MIME-Version: 1.0
Content-Type: multipart/mixed; boundary="BOUNDARY"

--BOUNDARY
Content-Type: application/node.eks.aws

---
apiVersion: node.eks.aws/v1alpha1
kind: NodeConfig spec: [...]

--BOUNDARY--
```
在 AL2 中，這些參數的中繼資料是透過 Amazon EKS `DescribeCluster` API 呼叫自動發現的。在 AL2023 中，此行為已改變，因為額外的 API 呼叫在大規模節點擴展時有被限流的風險。如果您使用沒有啟動範本的受管節點群組，或使用 Karpenter，則此變更不會對您造成影響。如需有關 `certificateAuthority` 和服務 `cidr` 的更多資訊，請參閱《*Amazon EKS API 參考*》中的 [https://docs.aws.amazon.com/eks/latest/APIReference/API_DescribeCluster.html](https://docs.aws.amazon.com/eks/latest/APIReference/API_DescribeCluster.html)。  
以下是 AL2023 使用者資料的完整範例，其中結合用於自訂節點的 Shell 指令碼 (例如安裝套件或預先快取容器映像) 與所需的 `nodeadm` 組態。此範例顯示常見的自訂，包括：\$1 安裝其他系統套件 \$1 預先快取容器映像，以改善 Pod 啟動時間 \$1 設定 HTTP 代理組態 \$1 設定節點標籤的 `kubelet` 旗標  

```
MIME-Version: 1.0
Content-Type: multipart/mixed; boundary="BOUNDARY"

--BOUNDARY
Content-Type: text/x-shellscript; charset="us-ascii"

#!/bin/bash
set -o errexit
set -o pipefail
set -o nounset

# Install additional packages
yum install -y htop jq iptables-services

# Pre-cache commonly used container images
nohup docker pull public.ecr.aws/eks-distro/kubernetes/pause:3.2 &

# Configure HTTP proxy if needed
cat > /etc/profile.d/http-proxy.sh << 'EOF'
export HTTP_PROXY="http://proxy.example.com:3128"
export HTTPS_PROXY="http://proxy.example.com:3128"
export NO_PROXY="localhost,127.0.0.1,169.254.169.254,.internal"
EOF

--BOUNDARY
Content-Type: application/node.eks.aws

apiVersion: node.eks.aws/v1alpha1
kind: NodeConfig
spec:
  cluster:
    name: my-cluster
    apiServerEndpoint: https://example.com
    certificateAuthority: Y2VydGlmaWNhdGVBdXRob3JpdHk=
    cidr: 10.100.0.0/16
  kubelet:
    config:
      clusterDNS:
      - 10.100.0.10
    flags:
    - --node-labels=app=my-app,environment=production

--BOUNDARY--
```

 **Bottlerocket 使用者資料**   
Bottlerocket 會以 TOML 格式建構使用者資料。您可以提供要與 Amazon EKS 提供的使用者資料合併的使用者資料。例如，您可以提供額外的 `kubelet` 設定。  

```
[settings.kubernetes.system-reserved]
cpu = "10m"
memory = "100Mi"
ephemeral-storage= "1Gi"
```
如需有關受支援設定的詳細資訊，請參閱 [Bottlerocket 文件](https://github.com/bottlerocket-os/bottlerocket)。您可以在使用者資料中設定節點標籤和[污點](node-taints-managed-node-groups.md)。不過，建議您改為在節點群組內設定。在執行這項操作時，Amazon EKS 會套用這些組態。  
合併使用者資料時，不會保留格式設定，但內容保持不變。您在使用者資料中提供的組態會覆寫 Amazon EKS 所設定的任何設定。所以，如果您設定 `settings.kubernetes.max-pods` 或 `settings.kubernetes.cluster-dns-ip`，則使用者資料中的值會套用至節點。  
Amazon EKS 不支援所有有效的 TOML。以下是已知不支援格式的清單：  
+ 引號鍵內的引號：`'quoted "value"' = "value"`
+ 值中的溢出引號：`str = "I’m a string. \"You can quote me\""`
+ 混合浮點數和正整數：`numbers = [ 0.1, 0.2, 0.5, 1, 2, 5 ]`
+ 陣列中的混合類型：`contributors = ["[foo@example.com](mailto:foo@example.com)", { name = "Baz", email = "[baz@example.com](mailto:baz@example.com)" }]`
+ 帶引號鍵的括號標題：`[foo."bar.baz"]`

 **Windows 使用者資料**   
Windows 使用者資料會使用 PowerShell 命令。建立受管節點群組時，您的自訂使用者資料會與 Amazon EKS 受管使用者資料結合。您的 PowerShell 命令為優先，然後是受管的使用者資料命令，所有這些命令都在一個 `<powershell></powershell>` 標籤中。  
建立 Windows 節點群組時，Amazon EKS 會更新 `aws-auth` `ConfigMap`，以允許 Linux 型節點加入叢集。服務不會自動設定 Windows AMI 的許可。如果您使用的是 Windows 節點，您將需要透過存取項目 API 或直接更新 `aws-auth` `ConfigMap` 來管理存取。如需詳細資訊，請參閱[在 EKS 叢集上部署 Windows 節點](windows-support.md)。
如果啟動範本中未指定任何 AMI ID，請勿在使用者資料中使用 Windows Amazon EKS 引導指令碼來設定 Amazon EKS。
範例使用者資料如下。  

```
<powershell>
Write-Host "Running custom user data script"
</powershell>
```

## 指定 AMI
<a name="launch-template-custom-ami"></a>

如果有下列其中一項要求，請在啟動範本 `ImageId` 欄位中指定 AMI ID。選取您對其他資訊的要求。

### 提供使用者資料將引數傳遞給 `bootstrap.sh` 檔案，其中包含 Amazon EKS 最佳化 Linux/Bottlerocket AMI
<a name="mng-specify-eks-ami"></a>

引導是一個術語，用於描述新增在執行個體啟動時可以執行的命令。例如，引導允許使用額外的 [kubelet](https://kubernetes.io/docs/reference/command-line-tools-reference/kubelet/) 引數。您可以使用 `eksctl` 將引數傳遞給 `bootstrap.sh` 而不指定啟動範本。您也可以在啟動範本的使用者資料區段中指定資訊來執行此動作。

 **eksctl，無需指定啟動範本**   
使用下列內容，建立名為 *my-nodegroup.yaml* 的檔案。使用您自己的值取代每一個*範例值*。`--apiserver-endpoint`、`--b64-cluster-ca`，和 `--dns-cluster-ip` 引數為選用。但是，定義引述會允許 `bootstrap.sh` 指令碼避免進行 `describeCluster` 呼叫。這在經常縮減和擴增節點的私有叢集設定或叢集中非常有用。如需 `bootstrap.sh` 指令碼的詳細資訊，請參閱 GitHub 上的 [bootstrap.sh](https://github.com/awslabs/amazon-eks-ami/blob/main/templates/al2/runtime/bootstrap.sh) 檔案。  
+ 唯一需要的引數是叢集名稱 (*my-cluster*)。
+ 若要擷取 `ami-1234567890abcdef0 ` 的最佳化 AMI ID，您請參閱下列章節：
  +  [擷取建議的 Amazon Linux AMI ID](retrieve-ami-id.md) 
  +  [擷取建議的 Bottlerocket AMI ID](retrieve-ami-id-bottlerocket.md) 
  +  [擷取建議的 Microsoft Windows AMI ID](retrieve-windows-ami-id.md) 
+ 若要擷取您的叢集的 *certificate-authority*，請執行下列命令。

  ```
  aws eks describe-cluster --query "cluster.certificateAuthority.data" --output text --name my-cluster --region region-code
  ```
+ 若要擷取您的叢集的 *api-server-endpoint*，請執行下列命令。

  ```
  aws eks describe-cluster --query "cluster.endpoint" --output text --name my-cluster --region region-code
  ```
+ `--dns-cluster-ip` 的值是結尾處為 `.10` 的服務 CIDR。若要擷取您的叢集的 *service-cidr*，請執行下列命令。例如，如果傳回的值是 `ipv4 10.100.0.0/16`，則您的值是 *10.100.0.10*。

  ```
  aws eks describe-cluster --query "cluster.kubernetesNetworkConfig.serviceIpv4Cidr" --output text --name my-cluster --region region-code
  ```
+ 此範例使用其中包含 Amazon EKS 最佳化 AMI 的 `bootstrap.sh` 指令碼提供 `kubelet` 引數來設定自訂 `max-pods` 值。節點群組名稱不可超過 63 個字元。它必須以字母或數字開頭，但剩餘字元也可以包含連字符和底線。如需選取 *my-max-pods-value* 的說明，請參閱 。如需使用受管節點群組時如何`maxPods`決定 的詳細資訊，請參閱 [maxPods的判斷方式](choosing-instance-type.md#max-pods-precedence)。

  ```
  ---
  apiVersion: eksctl.io/v1alpha5
  kind: ClusterConfig
  
  metadata:
    name: my-cluster
    region: region-code
  
  managedNodeGroups:
    - name: my-nodegroup
      ami: ami-1234567890abcdef0
      instanceType: m5.large
      privateNetworking: true
      disableIMDSv1: true
      labels: { x86-al2-specified-mng }
      overrideBootstrapCommand: |
        #!/bin/bash
        /etc/eks/bootstrap.sh my-cluster \
          --b64-cluster-ca certificate-authority \
          --apiserver-endpoint api-server-endpoint \
          --dns-cluster-ip service-cidr.10 \
          --kubelet-extra-args '--max-pods=my-max-pods-value' \
          --use-max-pods false
  ```

  針對每一個可用的 `eksctl` `config` 檔案選項，請參閱 `eksctl` 文件中的 [Config file schema](https://eksctl.io/usage/schema/) (組態檔案結構描述)。此 `eksctl` 公用程式仍會為您建立啟動範本，並使用在 `config` 檔案提供的資料來填入其使用者資料。

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

  ```
  eksctl create nodegroup --config-file=my-nodegroup.yaml
  ```

 **啟動範本中的使用者資料**   
在啟動範本的使用者資料區段中指定下列資訊。使用您自己的值取代每一個*範例值*。`--apiserver-endpoint`、`--b64-cluster-ca`，和 `--dns-cluster-ip` 引數為選用。但是，定義引述會允許 `bootstrap.sh` 指令碼避免進行 `describeCluster` 呼叫。這在經常縮減和擴增節點的私有叢集設定或叢集中非常有用。如需 `bootstrap.sh` 指令碼的詳細資訊，請參閱 GitHub 上的 [bootstrap.sh](https://github.com/awslabs/amazon-eks-ami/blob/main/templates/al2/runtime/bootstrap.sh) 檔案。  
+ 唯一需要的引數是叢集名稱 (*my-cluster*)。
+ 若要擷取您的叢集的 *certificate-authority*，請執行下列命令。

  ```
  aws eks describe-cluster --query "cluster.certificateAuthority.data" --output text --name my-cluster --region region-code
  ```
+ 若要擷取您的叢集的 *api-server-endpoint*，請執行下列命令。

  ```
  aws eks describe-cluster --query "cluster.endpoint" --output text --name my-cluster --region region-code
  ```
+ `--dns-cluster-ip` 的值是結尾處為 `.10` 的服務 CIDR。若要擷取您的叢集的 *service-cidr*，請執行下列命令。例如，如果傳回的值是 `ipv4 10.100.0.0/16`，則您的值是 *10.100.0.10*。

  ```
  aws eks describe-cluster --query "cluster.kubernetesNetworkConfig.serviceIpv4Cidr" --output text --name my-cluster --region region-code
  ```
+ 此範例使用其中包含 Amazon EKS 最佳化 AMI 的 `bootstrap.sh` 指令碼提供 `kubelet` 引數來設定自訂 `max-pods` 值。如需選取 *my-max-pods-value* 的說明，請參閱 。如需使用受管節點群組時如何`maxPods`決定 的詳細資訊，請參閱 [maxPods的判斷方式](choosing-instance-type.md#max-pods-precedence)。

  ```
  MIME-Version: 1.0
  Content-Type: multipart/mixed; boundary="==MYBOUNDARY=="
  
  --==MYBOUNDARY==
  Content-Type: text/x-shellscript; charset="us-ascii"
  
  #!/bin/bash
  set -ex
  /etc/eks/bootstrap.sh my-cluster \
    --b64-cluster-ca certificate-authority \
    --apiserver-endpoint api-server-endpoint \
    --dns-cluster-ip service-cidr.10 \
    --kubelet-extra-args '--max-pods=my-max-pods-value' \
    --use-max-pods false
  
  --==MYBOUNDARY==--
  ```

### 提供使用者資料將引數傳遞給 `Start-EKSBootstrap.ps1` 檔案，其中包含 Amazon EKS 最佳化 Windows AMI
<a name="mng-specify-eks-ami-windows"></a>

引導是一個術語，用於描述新增在執行個體啟動時可以執行的命令。您可以使用 `eksctl` 將引數傳遞給 `Start-EKSBootstrap.ps1` 而不指定啟動範本。您也可以在啟動範本的使用者資料區段中指定資訊來執行此動作。

如果您想指定自訂 Windows AMI ID，請注意下列考量事項：
+ 您必須使用啟動範本，並在使用者資料區段中提供所需引導命令。若要擷取所需的 Windows ID，您可以使用[使用最佳化的 Windows AMI 建立節點](eks-optimized-windows-ami.md)中的資料表。
+ 您需滿足幾個限制和條件。例如，您必須將 `eks:kube-proxy-windows`新增至 IAM Authenticator AWS 組態映射。如需詳細資訊，請參閱[指定 AMI ID 時的限制和條件](#mng-ami-id-conditions)。

在啟動範本的使用者資料區段中指定下列資訊。使用您自己的值取代每一個*範例值*。`-APIServerEndpoint`、`-Base64ClusterCA`，和 `-DNSClusterIP` 引數為選用。但是，定義引述會允許 `Start-EKSBootstrap.ps1` 指令碼避免進行 `describeCluster` 呼叫。
+ 唯一需要的引數是叢集名稱 (*my-cluster*)。
+ 若要擷取您的叢集的 *certificate-authority*，請執行下列命令。

  ```
  aws eks describe-cluster --query "cluster.certificateAuthority.data" --output text --name my-cluster --region region-code
  ```
+ 若要擷取您的叢集的 *api-server-endpoint*，請執行下列命令。

  ```
  aws eks describe-cluster --query "cluster.endpoint" --output text --name my-cluster --region region-code
  ```
+ `--dns-cluster-ip` 的值是結尾處為 `.10` 的服務 CIDR。若要擷取您的叢集的 *service-cidr*，請執行下列命令。例如，如果傳回的值是 `ipv4 10.100.0.0/16`，則您的值是 *10.100.0.10*。

  ```
  aws eks describe-cluster --query "cluster.kubernetesNetworkConfig.serviceIpv4Cidr" --output text --name my-cluster --region region-code
  ```
+ 如需其他引數，請參閱 [引導指令碼組態參數](eks-optimized-windows-ami.md#bootstrap-script-configuration-parameters)。
**注意**  
如果您使用的是自訂服務 CIDR，則需要使用 `-ServiceCIDR` 參數來對其進行指定。否則，叢集中 Pod 的 DNS 解析將會失敗。

```
<powershell>
[string]$EKSBootstrapScriptFile = "$env:ProgramFiles\Amazon\EKS\Start-EKSBootstrap.ps1"
& $EKSBootstrapScriptFile -EKSClusterName my-cluster `
	 -Base64ClusterCA certificate-authority `
	 -APIServerEndpoint api-server-endpoint `
	 -DNSClusterIP service-cidr.10
</powershell>
```

### 由於特定安全、合規或內部政策要求，執行自訂 AMI
<a name="mng-specify-custom-ami"></a>

如需詳細資訊，請參閱*《Amazon EC2 使用者指南》*中的 [Amazon Machine Images (AMI)](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/AMIs.html)。Amazon EKS AMI 建置規範包含用於建置基於 Amazon Linux 的自訂 Amazon EKS AMI 的資源和組態指令碼。如需詳細資訊，請參閱 GitHub 上的 [Amazon EKS AMI 建置規範](https://github.com/awslabs/amazon-eks-ami/)。若要建置使用其他作業系統安裝的自訂 AMI，則請參閱 GitHub 上的 [Amazon EKS 樣本自訂 AMI](https://github.com/aws-samples/amazon-eks-custom-amis)。

在與受管節點群組搭配使用的啟動範本中，您無法使用 AMI ID 的動態參數參考。

**重要**  
指定 AMI 時，Amazon EKS 不會針對叢集的控制平面版本驗證 AMI 中內嵌的 Kubernetes 版本。您有責任確保自訂 AMI 的 Kubernetes 版本符合 [Kubernetes 版本扭曲政策](https://kubernetes.io/releases/version-skew-policy)：  
節點上的`kubelet`版本不得比叢集版本更新
節點上的`kubelet`版本必須等於或最多 3 個次要版本 （適用於 Kubernetes 版本 `1.28`或更高版本），或最多 2 個次要版本 （適用於 Kubernetes 版本 `1.27`或更低版本）  
建立具有版本扭曲違規的受管節點群組可能會導致：
節點無法加入叢集
未定義的行為或 API 不相容
叢集不穩定或工作負載失敗
指定 AMI 時，Amazon EKS 不會合併任何使用者資料。相反，您必須負責提供所需的 `bootstrap` 命令，讓節點加入叢集。如果節點無法加入叢集，則 Amazon EKS `CreateNodegroup` 和 `UpdateNodegroupVersion` 動作也會失敗。

## 指定 AMI ID 時的限制和條件
<a name="mng-ami-id-conditions"></a>

以下是使用受管節點群組指定 AMI ID 所涉及的限制和條件：
+ 您必須建立新的節點群組，才能在指定啟動範本的 AMI ID 與不指定 AMI ID 之間切換。
+ 有較新的 AMI 版本可用時，您不會在主控台中收到通知。若要將節點群組更新為較新的 AMI 版本，您需要使用更新的 AMI ID 來建立新版本的啟動範本。然後，您需要使用新的啟動範本版本更新節點群組。
+ 如果指定 AMI ID，則無法在 API 中設定下列欄位：
  +  `amiType` 
  +  `releaseVersion` 
  +  `version` 
+ 如果您指定 AMI ID，則 API 的任何 `taints` 集合都會以非同步方式套用。若要在節點加入叢集之前套用污點，您必須使用 `--register-with-taints` 命令列旗標將污點傳遞給使用者資料的 `kubelet`。如需詳細資訊，請參閱 Kubernetes 文件中的 [kubelet](https://kubernetes.io/docs/reference/command-line-tools-reference/kubelet/)。
+ 為 Windows 受管節點群組指定自訂 AMI ID 時，請將 `eks:kube-proxy-windows`新增至您的 AWS IAM Authenticator 組態映射。必須要有這項，DNS 才能正常運作。

  1. 開啟 AWS IAM Authenticator 組態映射以進行編輯。

     ```
     kubectl edit -n kube-system cm aws-auth
     ```

  1. 將此項目新增至與 Windows 節點關聯的每個 `rolearn` 下的 `groups` 清單中。您的組態映射看起來應該類似於 [aws-auth-cm-windows.yaml](https://s3.us-west-2.amazonaws.com/amazon-eks/cloudformation/2020-10-29/aws-auth-cm-windows.yaml)。

     ```
     - eks:kube-proxy-windows
     ```

  1. 儲存檔案並結束您的文字編輯器。
+ 對於任何使用自訂啟動範本的 AMI，受管節點群組的預設 `HttpPutResponseHopLimit` 已設定為 `2`。