

本文属于机器翻译版本。若本译文内容与英语原文存在差异，则一律以英文原文为准。

# 插件
<a name="addons"></a>

本主题介绍如何使用 eksctl 管理亚马逊 EKS 集群的 Amazon EKS 插件。EKS Add-Ons 是一项允许您通过 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 身份关联接收 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` and/or `publisher`例如，要查看特定所有者和类型的插件，你可以运行：

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

`types`、`owners`和 `publishers` flags 是可选的，可以一起指定，也可以单独指定以筛选结果。

## 发现插件的配置架构
<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/)。