

 **帮助改进此页面** 

要帮助改进本用户指南，请选择位于每个页面右侧窗格中的**在 GitHub 上编辑此页面**链接。

# 更新 CoreDNS Amazon EKS 自主管理型附加组件
<a name="coredns-add-on-self-managed-update"></a>

**重要**  
建议您向集群添加 Amazon EKS 类型的附加组件，而不是自行管理类型的附加组件。如果不熟悉这些类型之间的区别，请参阅 [Amazon EKS 附加组件](eks-add-ons.md)。有关向集群中添加 Amazon EKS 附加组件的更多信息，请参阅 [创建 Amazon EKS 附加组件](creating-an-add-on.md)。如果您无法使用 Amazon EKS 附加组件，我们鼓励您向[容器路线图 GitHub 存储库](https://github.com/aws/containers-roadmap/issues)提交有关您为什么无法使用的问题。

在开始之前，请查看升级的注意事项。有关更多信息，请参阅 [重要的 CoreDNS 升级注意事项](managing-coredns.md#coredns-upgrade)。

1. 确认已在集群上安装自行管理类型的附加组件。将 *my-cluster* 替换为您的集群的名称。

   ```
   aws eks describe-addon --cluster-name my-cluster --addon-name coredns --query addon.addonVersion --output text
   ```

   如果返回错误消息，则表明集群上安装有自行管理类型的附加组件。完成此过程的其余步骤。如果返回版本号，则表明集群上安装有 Amazon EKS 类型的附加组件。要更新附加组件的 Amazon EKS 类型，请使用[更新 CoreDNS Amazon EKS 附加组件](coredns-add-on-update.md)中的过程，而不是此过程。如果不熟悉这些附加组件类型之间的区别，请参阅 [Amazon EKS 附加组件](eks-add-ons.md)。

1. 查看集群上当前安装的容器映像版本。

   ```
   kubectl describe deployment coredns -n kube-system | grep Image | cut -d ":" -f 3
   ```

   示例输出如下。

   ```
   v1.8.7-eksbuild.2
   ```

1. 如果当前 CoreDNS 版本是 `v1.5.0` 或更高版本，但低于 [CoreDNS 版本](managing-coredns.md#coredns-versions)表中列出的版本，请跳过此步骤。如果当前版本低于 `1.5.0`，则需修改 `ConfigMap`，以使 CoreDNS 使用转发附加组件，而不是代理附加组件。

   1. 使用以下命令打开 `ConfigMap`。

      ```
      kubectl edit configmap coredns -n kube-system
      ```

   1. 将以下行中的 `proxy` 替换为 `forward`。保存文件，然后退出编辑器。

      ```
      proxy . /etc/resolv.conf
      ```

1. 如果您最初在 Kubernetes `1.17` 或更早版本上部署了集群，则可能需要从 CoreDNS 清单中删除已停用的行。
**重要**  
在更新到 CoreDNS 版本 `1.7.0` 之前，您必须完成此步骤，但是即使要更新到早期版本，我们也建议您完成此步骤。

   1. 检查您的 CoreDNS 清单是否包含该行。

      ```
      kubectl get configmap coredns -n kube-system -o jsonpath='{$.data.Corefile}' | grep upstream
      ```

      如果未返回任何输出，则说明清单没有此类行，您可以跳到下一步来更新 CoreDNS。如果返回了输出，则需要删除该行。

   1. 使用以下命令编辑 `ConfigMap`，删除文件中包含词语 `upstream` 的该行。不要更改文件中的任何其他内容。删除该行后，保存更改。

      ```
      kubectl edit configmap coredns -n kube-system -o yaml
      ```

1. 检索当前的 CoreDNS 映像版本：

   ```
   kubectl describe deployment coredns -n kube-system | grep Image
   ```

   示例输出如下。

   ```
   602401143452.dkr.ecr.region-code.amazonaws.com/eks/coredns:v1.8.7-eksbuild.2
   ```

1. 如果要更新到 CoreDNS `1.8.3` 或更高版本，则需要将 `endpointslices` 权限添加到 `system:coredns` Kubernetes `clusterrole`。

   ```
   kubectl edit clusterrole system:coredns -n kube-system
   ```

   在文件中的 `rules` 部分的现有权限行下添加以下行。

   ```
   [...]
   - apiGroups:
     - discovery.k8s.io
     resources:
     - endpointslices
     verbs:
     - list
     - watch
   [...]
   ```

1. 通过将 *602401143452* 和 *region-code* 替换为上一步中返回的输出的值，更新 CoreDNS 附加组件。将 *v1.11.3-eksbuild.1* 替换为 Kubernetes 版本的[最新版本表](managing-coredns.md#coredns-versions)中列出的 CoreDNS 版本。

   ```
   kubectl set image deployment.apps/coredns -n kube-system  coredns=602401143452.dkr.ecr.region-code.amazonaws.com/eks/coredns:v1.11.3-eksbuild.1
   ```

   示例输出如下。

   ```
   deployment.apps/coredns image updated
   ```

1. 再次检查容器映像版本，确认它已更新到您在上一步中指定的版本。

   ```
   kubectl describe deployment coredns -n kube-system | grep Image | cut -d ":" -f 3
   ```

   示例输出如下。

   ```
   v1.11.3-eksbuild.1
   ```