

 **協助改進此頁面** 

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

若要為本使用者指南貢獻內容，請點選每個頁面右側面板中的**在 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` 還要舊，則需要修改 CoreDNS 的 `ConfigMap`，以使用正向附加元件，而不是代理附加元件。

   1. 使用下列命令開啟 `ConfigMap`。

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

   1. 使用 `forward` 取代為下列行中的 `proxy`：儲存檔案，然後退出編輯器。

      ```
      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
   ```