

 **協助改進此頁面** 

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

若要為本使用者指南貢獻內容，請點選每個頁面右側面板中的**在 GitHub 上編輯此頁面**連結。

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

# 在 AWS Outposts 上準備本機 Amazon EKS 叢集以進行網路中斷連線
<a name="eks-outposts-network-disconnects"></a>

如果您的本機網路與 AWS 雲端失去連線，您可以繼續使用 Outpost 上的本機 Amazon EKS 叢集。本主題包含如何準備本機叢集以應對網路連線中斷和相關考量事項。
+ 本機叢集可在臨時、意外的網路中斷連線期間實現穩定性和持續操作。 AWS Outposts 仍是完全連線的方案，可做為資料中心中 AWS 雲端的延伸。如果您的 Outpost 和 AWS Cloud 之間發生網路中斷連線，建議您嘗試還原連線。如需說明，請參閱《[AWS Outposts 使用者指南》中的 Outposts 機架網路故障診斷檢查清單](https://docs.aws.amazon.com/outposts/latest/userguide/network-troubleshoot.html)。 * AWS *如需有關如何針對本機叢集問題進行疑難排解的詳細資訊，請參閱 [Outposts 上的本機 Amazon EKS AWS 叢集疑難排解](eks-outposts-troubleshooting.md)。
+ Outpost 會發射 `ConnectedStatus` 指標，您可用此指標來監控 Outpost 的連線狀態。如需詳細資訊，請參閱《 [Outposts 使用者指南》中的 Outposts 指標](https://docs.aws.amazon.com/outposts/latest/userguide/outposts-cloudwatch-metrics.html#outposts-metrics)。 * AWS *
+ 本機叢集會使用 IAM 作為預設身分驗證機制，而該機制使用 [Kubernetes 的AWS Identity and Access Management 驗證器](https://github.com/kubernetes-sigs/aws-iam-authenticator)。IAM 在網路連線中斷期間無法使用。因此，本機叢集會使用 `x.509` 憑證支援替代身分驗證機制，您可使用這些憑證在網路連線中斷期間連線至叢集。如需有關如何取得和使用您叢集 `x.509` 憑證的資訊，請參閱 [在網路連線中斷期間針對本機叢集進行身分驗證](#outposts-network-disconnects-authentication)。
+ 如果您無法在網路連線中斷期間存取 Route 53，請考慮在內部部署環境中使用本機 DNS 伺服器。Kubernetes 控制平面執行個體會使用靜態 IP 位址。您可使用端點主機名稱和 IP 地址來設定用來連線至叢集的主機，以此作為使用本機 DNS 伺服器的替代方法。如需詳細資訊，請參閱 * AWS Outposts 使用者指南*中的 [DNS](https://docs.aws.amazon.com/outposts/latest/userguide/how-outposts-works.html#dns)。
+ 如果您預期應用程式流量會在網路連線中斷期間增加，則可在連線至雲端時在叢集中佈建備用運算容量。Amazon EC2 執行個體包含在 AWS Outpost 的價格中。因此，執行備用執行個體不會影響您的 AWS 用量成本。
+ 在網路連線中斷期間，若要啟用工作負載的建立、更新和擴展操作，則必須可透過區域網路存取應用程式的容器映像，且叢集須有足夠容量。本機叢集不會為您託管容器登錄檔。如果先前已在這些節點上執行 Pod，則系統會在節點上快取容器映像。如果您通常會從雲端中的 Amazon ECR 提取應用程式的容器映像，則請考慮執行本機快取或登錄檔。如果您在網路連線中斷期間需要建立、更新和擴展工作負載資源的操作，則本機快取或登錄會很有幫助。
+ 本機叢集會使用 Amazon EBS 作為持久性磁碟區的預設儲存類別，並使用 Amazon EBS CSI 驅動程式管理 Amazon EBS 持久性磁碟區的生命週期。在網路連線中斷期間，無法建立、更新或擴展由 Amazon EBS 支援的 Pod。這是因為這些操作需要呼叫雲端中的 Amazon EBS API。如果您要在本機叢集上部署具狀態的工作負載，且在網路連線中斷期間需要建立、更新或擴展操作，則請考慮使用替代儲存機制。
+ 如果 AWS Outposts 無法存取相關的 AWS 區域內 APIs （例如 Amazon EBS 或 Amazon S3 APIs)，則無法建立或刪除 Amazon EBS 快照。
+ 將 ALB （輸入） 與 AWS Certificate Manager (ACM) 整合時，會將憑證推送並儲存在 AWS Outposts ALB 運算執行個體的記憶體中。如果 AWS 區域中斷連線，目前的 TLS 終止將繼續運作。在此內容中變動操作將會失敗 (例如新的輸入定義、新的 ACM 型憑證 API 操作、ALB 運算規模或憑證輪換)。如需詳細資訊，請參閱 * AWS Certificate Manager 使用者指南*中的對[受管憑證續約進行故障診斷](https://docs.aws.amazon.com/acm/latest/userguide/troubleshooting-renewal.html)。
+ Amazon EKS 控制平面日誌會在網路連線中斷期間於 Kubernetes 控制平面執行個體上進行本機快取。重新連線時，日誌會傳送至父 AWS 區域中的 CloudWatch Logs。您可以使用 [Prometheus](https://prometheus.io/)、[Grafana](https://grafana.com/) 或 Amazon EKS 合作夥伴解決方案，以透過 Kubernetes API 伺服器的指標端點或使用日誌的 Fluent Bit 在本機上監控叢集。
+ 如果您將 Outposts AWS Load Balancer控制器用於應用程式流量，則 AWS Load Balancer控制器前方的現有 Pod 會在網路中斷期間繼續接收流量。在網路中斷連線期間建立的新 Pod 在 Outpost 重新連線至 AWS 雲端之前不會接收流量。連線至 AWS 雲端時，請考慮為您的應用程式設定複本計數，以在網路中斷連線期間滿足您的擴展需求。
+ Kubernetes 專用 Amazon VPC CNI 外掛程式預設為[次要 IP 模式](https://aws.github.io/aws-eks-best-practices/networking/vpc-cni/#overview)。其使用 `WARM_ENI_TARGET`=`1` 來設定，這會允許外掛程式保留可用 IP 位址的「完整彈性網路介面」。請依據中斷連線狀態期間的擴展需求來考慮變更 `WARM_ENI_TARGET`、`WARM_IP_TARGET` 和 `MINIMUM_IP_TARGET` 值。如需詳細資訊，請參閱 GitHub 上外掛程式的 [readme](https://github.com/aws/amazon-vpc-cni-k8s/blob/master/README.md) 檔案。如需每個執行個體類型支援的 Pod 數目上限清單，請參閱 GitHub 上的 [eni-max-pods.txt](https://github.com/aws/amazon-vpc-cni-k8s/blob/master/misc/eni-max-pods.txt) 檔案。

## 調校 Kubernetes Pod 容錯移轉行為
<a name="outposts-network-disconnects-pod-failover"></a>

在網路中斷連線期間，Kubernetes 節點生命週期控制器會將無法連線的節點標示為具有`node.kubernetes.io/unreachable`污點`NoExecute`效果的節點。根據預設，沒有相符公差的 Pod 會在 300 秒 (5 分鐘） 後移出。您可以使用 DaemonSets、在應用程式 Pod `tolerationSeconds`上設定或實作自訂控制器來調整此行為，允許 Pod 在暫時中斷連線期間保留在其節點上，而不會進行不必要的移出。如需詳細指引和範例，請參閱《Amazon EKS 最佳實務指南》中的 https://docs.aws.amazon.com/eks/latest/best-practices/hybrid-nodes-network-disconnection-best-practices.html\#tune\_kubernetes\_pod\_failover\_behavior【Tune Kubernetes Pod 容錯移轉行為】。**

## 在網路連線中斷期間針對本機叢集進行身分驗證
<a name="outposts-network-disconnects-authentication"></a>

 AWS 網路連線中斷期間無法使用 Identity and Access Management (IAM)。中斷連線時，您無法使用 IAM 憑證對本機叢集進行身分驗證。但是，您可以在中斷連線時使用 `x509` 憑證，透過區域網路連接至您的叢集。您需要下載並存放客戶端 `X509` 憑證，以在中斷連線期間使用。本此主題中，您將了解如何在中斷連線時建立和使用憑證，以對叢集進行身分驗證。

1. 建立憑證簽署請求。

   1. 產生憑證簽署請求。

      ```
      openssl req -new -newkey rsa:4096 -nodes -days 365 \
          -keyout admin.key -out admin.csr -subj "/CN=admin"
      ```

   1. 在 Kubernetes 中建立憑證簽署請求。

      ```
      BASE64_CSR=$(cat admin.csr | base64 -w 0)
      cat << EOF > admin-csr.yaml
      apiVersion: certificates.k8s.io/v1
      kind: CertificateSigningRequest
      metadata:
        name: admin-csr
      spec:
        signerName: kubernetes.io/kube-apiserver-client
        request: ${BASE64_CSR}
        usages:
        - client auth
      EOF
      ```

1. 使用 `kubectl` 建立憑證簽署請求。

   ```
   kubectl create -f admin-csr.yaml
   ```

1. 檢查憑證簽署請求的狀態。

   ```
   kubectl get csr admin-csr
   ```

   範例輸出如下。

   ```
   NAME       AGE   REQUESTOR                       CONDITION
   admin-csr  11m   kubernetes-admin                Pending
   ```

   Kubernetes 已建立憑證簽署請求。

1. 核准憑證簽署請求。

   ```
   kubectl certificate approve admin-csr
   ```

1. 重新檢查核准的憑證簽署請求狀態。

   ```
   kubectl get csr admin-csr
   ```

   範例輸出如下。

   ```
   NAME       AGE   REQUESTOR                     CONDITION
   admin-csr  11m   kubernetes-admin              Approved
   ```

1. 擷取並驗證憑證。

   1. 擷取憑證。

      ```
      kubectl get csr admin-csr -o jsonpath='{.status.certificate}' | base64 --decode > admin.crt
      ```

   1. 驗證憑證。

      ```
      cat admin.crt
      ```

1. 建立與 `admin` 使用者綁定的叢集角色。

   ```
   kubectl create clusterrolebinding admin --clusterrole=cluster-admin \
       --user=admin --group=system:masters
   ```

1. 產生中斷連線狀態的使用者範圍 kubeconfig。

   您可以使用下載的 `admin` 憑證來產生 `kubeconfig` 檔案。取代下列命令中的 {{my-cluster}} 和 {{apiserver-endpoint}}。

   ```
   aws eks describe-cluster --name my-cluster \
       --query "cluster.certificateAuthority" \
       --output text | base64 --decode > ca.crt
   ```

   ```
   kubectl config --kubeconfig admin.kubeconfig set-cluster my-cluster \
       --certificate-authority=ca.crt --server apiserver-endpoint --embed-certs
   ```

   ```
   kubectl config --kubeconfig admin.kubeconfig set-credentials admin \
       --client-certificate=admin.crt --client-key=admin.key --embed-certs
   ```

   ```
   kubectl config --kubeconfig admin.kubeconfig set-context admin@my-cluster \
       --cluster my-cluster --user admin
   ```

   ```
   kubectl config --kubeconfig admin.kubeconfig use-context admin@my-cluster
   ```

1. 檢視您的 `kubeconfig` 檔案。

   ```
   kubectl get nodes --kubeconfig admin.kubeconfig
   ```

1. 如果您在 Outpost 上已有生產中的服務，請跳過此步驟。如果 Amazon EKS 是您 Outpost 上唯一執行的服務，且 Outpost 目前尚未處於生產中，則您可模擬網路連線中斷。在您使用本機叢集進入生產之前，模擬中斷連線以確保在中斷連線狀態下可存取叢集。

   1. 在將 Outpost 連接到 AWS 區域的聯網裝置上套用防火牆規則。這會中斷 Outpost 連結的服務。您無法建立任何新的執行個體。目前執行的執行個體失去與 AWS 區域和網際網路的連線。

   1. 您可在中斷連線時使用 `x509` 憑證，測試連結至您本機叢集的連線。請確保將您的 `kubeconfig` 變更為您在上一步中建立的 `admin.kubeconfig`。使用您本機叢集的名稱取代 {{my-cluster}}。

      ```
      kubectl config use-context admin@my-cluster --kubeconfig admin.kubeconfig
      ```

   如果您在本機叢集處於中斷連線狀態時發現任何問題，建議您開啟支援票證。