更新 CoreDNS 自行管理的附加组件 - Amazon EKS

更新 CoreDNS 自行管理的附加组件

重要

本主题将于 2023 年 7 月 1 日从本指南中删除。建议您向集群添加 Amazon EKS 类型的附加组件,而不是自行管理类型的附加组件。如果不熟悉这些类型之间的区别,请参阅 Amazon EKS 附加组件。有关向集群中添加 Amazon EKS 附加组件的更多信息,请参阅 创建附加组件

CoreDNS 是一个灵活、可扩展的 DNS 服务器,可用作 Kubernetes 集群 DNS。当您启动具有至少一个节点的 Amazon EKS 集群时,无论集群中部署的节点数量如何,预设情况下都会部署 CoreDNS 镜像的两个副本。这些 CoreDNS pods 为集群中的所有 pods 提供名称解析。如果您的集群包含命名空间与 CoreDNS deployment 的命名空间相匹配的 AWS Fargate 配置文件 时,则可以将 CoreDNS pods 容器部署到 Fargate 节点。有关 CoreDNS 的更多信息,请参阅 Kubernetes 文档中的使用 CoreDNS 进行服务发现

下表列出了每个 Amazon EKS 集群版本可用的 CoreDNS 容器映像的最新版本。

每个 Amazon EKS 集群版本的最新可用的自行管理 CoreDNS 容器映像版本
Kubernetes 版本 1.25 1.24 1.23 1.22 1.21 1.20 1.19
v1.9.3-eksbuild.2 v1.8.7-eksbuild.3 v1.8.7-eksbuild.3 v1.8.7-eksbuild.3 v1.8.4-eksbuild.2 v1.8.3-eksbuild.1 1.8.0
重要

更新 Amazon EKS 附加组件类型时,可以指定有效的 Amazon EKS 附加组件版本,该版本可能不是此表中列出的版本。这是因为 Amazon EKS 附加组件版本并不总是与更新此附加组件的自行管理类型时指定的容器映像版本相匹配。更新此附加组件的自行管理类型时,可指定此表中列出的有效容器映像版本。

先决条件
  • 现有 版 Amazon EKS 集群。要部署一个角色,请参阅 开始使用 Amazon EKS

  • 如果您的集群为 1.21 版本或更高版本,请确保 Amazon VPC CNI plugin for Kubernetes 和 CoreDNS 附加组件为 集群附加组件 中列出的最低版本。

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

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

    如果返回错误消息,则表明集群上安装有自行管理类型的附加组件。本主题中的其余步骤用于更新自行管理类型的附加组件。如果返回版本号,则表明集群上安装有 Amazon EKS 类型的附加组件。要对其进行更新,请使用 更新附加组件 中的步骤,而不是本主题中的步骤。如果不熟悉这些附加组件类型之间的区别,请参阅 Amazon EKS 附加组件

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

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

    输出示例如下。

    v1.8.7-eksbuild.2
  3. 如果您的当前 CoreDNS 版本是 v1.5.0 或更高版本,但早于 CoreDNS 版本表中列出的版本,请跳过此步骤。如果您的当前版本低于 1.5.0,则需要修改 ConfigMap,以使 CoreDNS 使用转发附加组件,而不是代理附加组件。

    1. 使用以下命令打开 configmap。

      kubectl edit configmap coredns -n kube-system
    2. 将以下行中的 proxy 替换为 forward。保存文件,然后退出编辑器。

      proxy . /etc/resolv.conf
  4. 如果您最初在 Kubernetes 1.17 或更低版本上部署了集群,那么您可能需要从 CoreDNS 清单中删除已停用的行。

    重要

    在更新到 CoreDNS 版本 1.7.0 之前,您必须完成此步骤,但是即使您要更新到早期版本,我们也建议您完成此步骤。

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

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

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

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

      kubectl edit configmap coredns -n kube-system -o yaml
  5. 检索您当前的 CoreDNS 映像版本:

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

    输出示例如下。

    602401143452.dkr.ecr.region-code.amazonaws.com/eks/coredns:v1.8.7-eksbuild.2
  6. 如果您要更新到 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 ...
  7. 通过来更新 CoreDNS 附加组件,602401143452region-code 替换为上一步中返回的输出值。1.9.3-eksbuild.2 替换为每个 Amazon EKS 集群版本的最新可用的自行管理 CoreDNS 容器映像版本表中列出的 CoreDNS 版本。

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

    输出示例如下。

    deployment.apps/coredns image updated
  8. 再次检查容器映像版本,确认它已更新到您在上一步中指定的版本。

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

    输出示例如下。

    v1.8.7-eksbuild.3