

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

# 附加元件
<a name="addons"></a>

本主題說明如何使用 eksctl 管理 Amazon EKS 叢集的 Amazon EKS 附加元件。EKS 附加元件是一項功能，可讓您透過 EKS API 啟用和管理 Kubernetes 操作軟體，簡化安裝、設定和更新叢集附加元件的程序。

**警告**  
eksctl 現在會將預設附加元件 (vpc-cni、Coredns、kube-proxy) 安裝為 EKS 附加元件，而非自我管理的附加元件。這表示對於使用 eksctl v0.184.0 及更高版本建立的叢集，您應該使用 `eksctl update addon`而非 `eksctl utils update-*`命令。

當您想要使用 Cilium 和 Calico 等替代 CNI 外掛程式時，可以建立不含任何預設聯網附加元件的叢集。

EKS 附加元件現在支援透過 EKS Pod Identity Associations 接收 IAM 許可，允許它們與叢集外部的 AWS 服務連線

## 建立附加元件
<a name="addons-create"></a>

Eksctl 為管理叢集附加元件提供更多彈性：

在組態檔案中，您可以指定您想要的附加元件，以及 （如果需要） 要連接到這些附加元件的角色或政策：

```
apiVersion: eksctl.io/v1alpha5
kind: ClusterConfig
metadata:
  name: example-cluster
  region: us-west-2

iam:
  withOIDC: true

addons:
- name: vpc-cni
  # all below properties are optional
  version: 1.7.5
  tags:
    team: eks
  # you can specify at most one of:
  attachPolicyARNs:
  - arn:aws:iam::account:policy/AmazonEKS_CNI_Policy
  # or
  serviceAccountRoleARN: arn:aws:iam::account:role/AmazonEKSCNIAccess
  # or
  attachPolicy:
    Statement:
    - Effect: Allow
      Action:
      - ec2:AssignPrivateIpAddresses
      - ec2:AttachNetworkInterface
      - ec2:CreateNetworkInterface
      - ec2:DeleteNetworkInterface
      - ec2:DescribeInstances
      - ec2:DescribeTags
      - ec2:DescribeNetworkInterfaces
      - ec2:DescribeInstanceTypes
      - ec2:DetachNetworkInterface
      - ec2:ModifyNetworkInterfaceAttribute
      - ec2:UnassignPrivateIpAddresses
      Resource: '*'
```

您最多可以指定其中一個 `attachPolicy`、 `attachPolicyARNs`和 `serviceAccountRoleARN`。

如果未指定這些項目，則會使用已連接所有建議政策的角色來建立附加元件。

**注意**  
若要將政策連接至附加元件，您的叢集必須`OIDC`已啟用 。如果未啟用，我們會忽略任何附加的政策。

然後，您可以在叢集建立程序期間建立這些附加元件：

```
eksctl create cluster -f config.yaml
```

或者，在建立叢集後，使用組態檔案或 CLI 旗標明確建立附加元件：

```
eksctl create addon -f config.yaml
```

```
eksctl create addon --name vpc-cni --version 1.7.5 --service-account-role-arn <role-arn>
```

```
eksctl create addon --name aws-ebs-csi-driver --namespace-config 'namespace=custom-namespace'
```

**提示**  
使用 `--namespace-config`旗標將附加元件部署到自訂命名空間，而非預設命名空間。

在建立附加元件期間，如果叢集上已存在自我管理版本的附加元件，您可以透過組態檔案設定 `resolveConflicts`選項來選擇解決潛在`configMap`衝突的方式，例如

```
addons:
- name: vpc-cni
  attachPolicyARNs:
    - arn:aws:iam::aws:policy/AmazonEKS_CNI_Policy
  resolveConflicts: overwrite
```

對於附加元件建立， `resolveConflicts` 欄位支援三個不同的值：
+  `none` - EKS 不會變更值。建立可能會失敗。
+  `overwrite` - EKS 會將任何組態變更覆寫回 EKS 預設值。
+  `preserve` - EKS 不會變更值。建立可能會失敗。（類似 `none`，但與[`preserve`更新附加元件](#update-addons)不同）。

## 列出已啟用的附加元件
<a name="_listing_enabled_addons"></a>

您可以執行下列動作，查看叢集中已啟用哪些附加元件：

```
eksctl get addons --cluster <cluster-name>
```

或

```
eksctl get addons -f config.yaml
```

## 設定附加元件的版本
<a name="_setting_the_addons_version"></a>

設定 附加元件的版本是選用的。如果`version`欄位保持空白， `eksctl`會解析附加元件的預設版本。如需哪些版本是特定附加元件預設版本的詳細資訊，請參閱 EKS 的 AWS 文件。請注意，預設版本不一定是可用的最新版本。

附加元件版本可以設定為 `latest`。或者，您可以使用指定的 EKS 建置標籤來設定版本，例如 `v1.7.5-eksbuild.1`或 `v1.7.5-eksbuild.2`。它也可以設定為附加元件的發行版本，例如 `v1.7.5`或 `1.7.5`，並且會為您探索和設定`eksbuild`尾碼標籤。

請參閱以下章節，了解如何探索可用的附加元件及其版本。

## 探索附加元件
<a name="_discovering_addons"></a>

您可以執行下列動作，探索可在叢集上安裝哪些附加元件：

```
eksctl utils describe-addon-versions --cluster <cluster-name>
```

這將探索叢集的 kubernetes 版本並篩選該版本。或者，如果您想要查看特定 kubernetes 版本可用的附加元件，您可以執行：

```
eksctl utils describe-addon-versions --kubernetes-version <version>
```

您也可以透過篩選附加元件的 `type`、 `owner`和/或 來探索附加元件`publisher`。例如，若要查看特定擁有者和類型的附加元件，您可以執行：

```
eksctl utils describe-addon-versions --kubernetes-version 1.22 --types "infra-management, policy-management" --owners "aws-marketplace"
```

`types`、 `owners`和 `publishers`旗標是選用的，可以一起或個別指定來篩選結果。

## 探索附加元件的組態結構描述
<a name="_discovering_the_configuration_schema_for_addons"></a>

探索附加元件和版本後，您可以透過擷取其 JSON 組態結構描述來檢視自訂選項。

```
eksctl utils describe-addon-configuration --name vpc-cni --version v1.12.0-eksbuild.1
```

這會傳回此附加元件可用的各種選項的 JSON 結構描述。

## 使用組態值
<a name="_working_with_configuration_values"></a>

 `ConfigurationValues` 可以在建立或更新附加元件期間在組態檔案中提供。僅支援 JSON 和 YAML 格式。

例如，

```
addons:
- name: coredns
  configurationValues: |-
    replicaCount: 2
```

```
addons:
- name: coredns
  version: latest
  configurationValues: "{\"replicaCount\":3}"
  resolveConflicts: overwrite
```

**注意**  
請記住，修改附加元件組態值時，會出現組態衝突。

```
Thus, we need to specify how to deal with those by setting the `resolveConflicts` field accordingly.
As in this scenario we want to modify these values, we'd set `resolveConflicts: overwrite`.
```

此外，get 命令現在也會`ConfigurationValues`擷取附加元件的 。例如

```
eksctl get addon --cluster my-cluster --output yaml
```

```
- ConfigurationValues: '{"replicaCount":3}'
  IAMRole: ""
  Issues: null
  Name: coredns
  NewerVersion: ""
  Status: ACTIVE
  Version: v1.8.7-eksbuild.3
```

## 使用自訂命名空間
<a name="_using_custom_namespace"></a>

在建立附加元件期間，可以在組態檔案中提供自訂命名空間。建立附加元件後，命名空間就無法更新。

### 使用組態檔案
<a name="_using_config_file"></a>

```
addons:
  - name: aws-ebs-csi-driver
    version: latest
    namespaceConfig:
      namespace: custom-namespace
```

### 使用 CLI 旗標
<a name="_using_cli_flag"></a>

或者，您可以使用 `--namespace-config`旗標指定自訂命名空間：

```
eksctl create addon --cluster my-cluster --name aws-ebs-csi-driver --namespace-config 'namespace=custom-namespace'
```

get 命令也會擷取附加元件的命名空間值

```
- ConfigurationValues: ""
  IAMRole: ""
  Issues: null
  Name: aws-ebs-csi-driver
  NamespaceConfig:
    namespace: custom-namespace
  NewerVersion: ""
  PodIdentityAssociations: null
  Status: ACTIVE
  Version: v1.47.0-eksbuild.1
```

## 更新附加元件
<a name="update-addons"></a>

您可以將附加元件更新為較新版本，並透過執行下列動作來變更附加的政策：

```
eksctl update addon -f config.yaml
```

```
eksctl update addon --name vpc-cni --version 1.8.0 --service-account-role-arn <new-role>
```

**注意**  
建立附加元件後，命名空間組態就無法更新。`--namespace-config` 旗標僅在附加元件建立期間可用。

與附加元件建立類似，更新附加元件時，您可以完全控制先前套用至該附加元件的 的設定變更`configMap`。具體而言，您可以保留或覆寫它們。此選用功能可透過相同的組態檔案欄位 取得`resolveConflicts`，例如

```
addons:
- name: vpc-cni
  attachPolicyARNs:
    - arn:aws:iam::aws:policy/AmazonEKS_CNI_Policy
  resolveConflicts: preserve
```

對於附加元件更新， `resolveConflicts` 欄位接受三個不同的值：
+  `none` - EKS 不會變更值。更新可能會失敗。
+  `overwrite` - EKS 會將任何組態變更覆寫回 EKS 預設值。
+  `preserve` - EKS 會保留 值。如果您選擇此選項，建議您先在非生產叢集上測試任何欄位和值變更，再更新生產叢集上的附加元件。

## 刪除附加元件
<a name="_deleting_addons"></a>

您可以執行下列動作來刪除 附加元件：

```
eksctl delete addon --cluster <cluster-name> --name <addon-name>
```

這將刪除附加元件和與其相關聯的任何 IAM 角色。

當您刪除叢集時，也會刪除與附加元件相關聯的所有 IAM 角色。

## 預設聯網附加元件的叢集建立彈性
<a name="barecluster"></a>

建立叢集時，EKS 會自動將 VPC CNI、CoreDNS 和 kube-proxy 安裝為自我管理附加元件。若要停用此行為以使用其他 CNI 外掛程式，例如 Cilium 和 Calico，eksctl 現在支援在沒有任何預設聯網附加元件的情況下建立叢集。若要建立這類叢集，請設定 `addonsConfig.disableDefaultAddons`，如 所示：

```
addonsConfig:
  disableDefaultAddons: true
```

```
eksctl create cluster -f cluster.yaml
```

若要建立僅具有 CoreDNS 和 kube-proxy 而非 VPC CNI 的叢集，請在 中明確指定附加元件`addons`並設定 `addonsConfig.disableDefaultAddons`，如 所示：

```
addonsConfig:
  disableDefaultAddons: true
addons:
  - name: kube-proxy
  - name: coredns
```

```
eksctl create cluster -f cluster.yaml
```

作為此變更的一部分，如果 `addonsConfig.disableDefaultAddons`未明確設定為 true，eksctl 現在會在叢集建立期間將預設附加元件安裝為 EKS 附加元件，而非自我管理附加元件。因此，`eksctl utils update-*`命令無法再用於更新使用 eksctl v0.184.0 及更高版本建立之叢集的附加元件：
+  `eksctl utils update-aws-node` 
+  `eksctl utils update-coredns` 
+  `eksctl utils update-kube-proxy` 

相反地， `eksctl update addon`應該立即使用。

若要進一步了解，請參閱 [Amazon EKS 引入聯網附加元件的叢集建立彈性](https://aws.amazon.com/about-aws/whats-new/2024/06/amazon-eks-cluster-creation-flexibility-networking-add-ons/)。