安装或升级 CoreDNS - Amazon EKS
AWS 文档中描述的 AWS 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅中国的 AWS 服务入门

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

安装或升级 CoreDNS

在具有 Kubernetes 版本 CoreDNS 或更高版本的 Amazon EKS 集群上支持 1.15。使用 Kubernetes 版本 1.10 创建的集群作为默认 DNS 和服务发现提供程序随 kube-dns 一起提供。如果已从 1.10 集群更新,要将 CoreDNS 用于 DNS 和服务发现,则必须安装 CoreDNS 并删除 kube-dns

要检查您的集群是否已运行 CoreDNS,请使用以下命令。

kubectl get pod -n kube-system -l k8s-app=kube-dns

如果输出在 pod 名称中显示 coredns,则表示您的集群已在运行 CoreDNS。如果没有,请使用以下过程将您的 DNS 和服务发现提供程序更新为 CoreDNS。

注意

的服务仍称为 CoreDNS 以实现向后兼容。kube-dns

使用 CoreDNS 在更新的 Amazon EKS 集群上安装kubectl

  1. {"eks.amazonaws.com/component": "kube-dns"} 选择器添加到集群的 kube-dns 部署。这将防止两个 DNS 部署争夺对同一组标签的控制。

    kubectl patch -n kube-system deployment/kube-dns --patch \ '{"spec":{"selector":{"matchLabels":{"eks.amazonaws.com/component":"kube-dns"}}}}'
  2. 将 CoreDNS 部署到您的集群。

    1. 将集群的 DNS IP 地址设置为 DNS_CLUSTER_IP 环境变量。

      export DNS_CLUSTER_IP=$(kubectl get svc -n kube-system kube-dns -o jsonpath='{.spec.clusterIP}')
    2. <region-code>(包括 <>)替换为您的集群所在的区域代码。

      export REGION="<region-code>"
    3. 从与集群所在的区域对应的 CoreDNS 资源存储桶下载 Amazon EKS 清单。

      • 区域之外的所有区域。中国

        curl -o dns.yaml https://s3.us-west-2.amazonaws.com/amazon-eks/cloudformation/2020-10-29/dns.yaml
      • 北京和宁夏 中国区域。

        curl -o dns.yaml https://s3.cn-north-1.amazonaws.com.cn/amazon-eks//cloudformation/2020-10-29/dns.yaml
    4. dns.yaml 文件中的变量占位符替换为您的环境变量值并将更新后的清单应用于您的集群。以下命令将一步完成此操作。

      cat dns.yaml | sed -e "s/REGION/$REGION/g" | sed -e "s/DNS_CLUSTER_IP/$DNS_CLUSTER_IP/g" | kubectl apply -f -
    5. 从集群中获取 coredns pod 名称。

      COREDNS_POD=$(kubectl get pod -n kube-system -l eks.amazonaws.com/component=coredns \ -o jsonpath='{.items[0].metadata.name}')
    6. 查询 coredns pod 以确保其接收请求。

      kubectl get --raw /api/v1/namespaces/kube-system/pods/$COREDNS_POD:9153/proxy/metrics \ | grep 'coredns_dns_request_count_total'
      注意

      预期输出正确返回可能需要几分钟时间,具体取决于集群中 DNS 请求的速率。

      在下面的预期输出中,数字 23 是 DNS 请求总数。

      # HELP coredns_dns_request_count_total Counter of DNS requests made per zone, protocol and family.
      # TYPE coredns_dns_request_count_total counter
      coredns_dns_request_count_total{family="1",proto="udp",server="dns://:53",zone="."} 23
  3. 通过完成CoreDNS中的步骤,将 升级 CoreDNS 更新为您的集群的建议版本。

  4. kube-dns 部署缩减至零个副本。

    kubectl scale -n kube-system deployment/kube-dns --replicas=0
  5. 清理旧的 kube-dns 资源。

    kubectl delete -n kube-system deployment/kube-dns serviceaccount/kube-dns configmap/kube-dns

升级 CoreDNS

  1. 检查集群的 coredns 部署的当前版本。

    kubectl describe deployment coredns --namespace kube-system | grep Image | cut -d "/" -f 3

    输出:

    coredns:v<1.1.3>

    建议的对应 Kubernetes 版本的 coredns 版本如下所示:

    Kubernetes 版本 1.18 1.17 1.16 1.15
    CoreDNS 1.7.0 1.6.6 1.6.6 1.6.6
  2. 如果当前 coredns 版本是 1.5.0 或更高版本,但早于推荐版本,请跳过此步骤。如果当前版本早于 1.5.0,则需要修改 coredns 的配置映射以使用 forward 插件,而不是 proxy 插件。

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

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

      proxy . /etc/resolv.conf
  3. 如果您最初在 Kubernetes 1.17 或更早版本上部署了集群,则可能需要从 CoreDNS 清单中删除已弃用的期限。

    重要

    在升级到 CoreDNS 版本 1.7.0 之前,您必须完成此步骤,即使您要升级到早期版本也是如此。

    1. 检查 CoreDNS 清单是否具有该行。

      kubectl get configmap coredns -n kube-system -o yaml |grep upstream

      如果没有返回输出,则清单没有该行,您可以跳到下一步以更新 CoreDNS。 如果返回输出,则您需要删除该行。

    2. 使用以下命令编辑 configmap,删除文件中包含单词 upstream 的行。请勿更改文件中的任何其他内容。在删除该行后,保存更改。

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

    kubectl get deployment coredns --namespace kube-system -o=jsonpath='{$.spec.template.spec.containers[:1].image}'
  5. 通过获取上一步中的输出并将 <1.7.0>(包括 <>)替换为集群的建议 coredns 版本,将 coredns 更新到建议的版本:

    kubectl set image --namespace kube-system deployment.apps/coredns \ coredns=<602401143452.dkr.ecr.us-west-2.amazonaws.com>/eks/coredns:v<1.7.0>-eksbuild.1