

 **協助改進此頁面** 

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

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

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

# 在使用 EC2 執行個體存放區設定的 AWS Outpost 上準備本機 Amazon EKS 叢集以進行網路中斷連線
<a name="eks-outposts-instance-store-network-disconnects"></a>

如果將本機網路連線至 AWS 雲端的 AWS Outposts 服務連結失去連線，您可以繼續使用 Outpost 上的本機 Amazon EKS 叢集。本主題涵蓋如何準備本機叢集以進行網路連線中斷和相關考量。
+ 本機叢集可在臨時、意外的網路中斷連線期間實現穩定性和持續操作。 AWS Outposts 仍然是完全連線的方案，可做為資料中心中 AWS 雲端的延伸。如果您的 Outpost 和 AWS 雲端之間發生網路中斷連線，建議您嘗試還原連線。如需說明，請參閱 [AWS Outposts 使用者指南中的 Outposts 機架網路故障診斷檢查清單](https://docs.aws.amazon.com/outposts/latest/userguide/network-troubleshoot.html)。 * AWS *
+ Outpost 會發射 `ConnectedStatus` 指標，您可用此指標來監控 Outpost 的連線狀態。如需詳細資訊，請參閱 [Outposts 使用者指南中的 Outposts 指標](https://docs.aws.amazon.com/outposts/latest/userguide/outposts-cloudwatch-metrics.html#outposts-metrics)。 * AWS *

## 網路連線中斷期間的身分驗證
<a name="eks-outposts-instance-store-network-disconnects-authentication"></a>

本機叢集支援多個身分驗證機制。它們在網路連線中斷期間的可用性會有所不同：


| 身分驗證機制 | 在中斷連線期間可用？ | 
| --- | --- | 
|  AWS IAM （存取項目、`aws-auth`ConfigMap) | 否。IAM 需要連線至 AWS 區域。 | 
| OIDC （客戶提供的供應商） | 取決於供應商位置。如果可從 Outpost 的本機網路存取 OIDC 供應商，身分驗證會繼續運作。 | 
| x.509 用戶端憑證 | 是。憑證由 Kubernetes API 伺服器在本機進行驗證。 | 
| IRSA （服務帳戶的 IAM 角色） | 否。請參閱[中斷連線期間的 IRSA 和 Pod 身分](#eks-outposts-instance-store-network-disconnects-irsa)。 | 
| EKS Pod 身分識別 | 否。請參閱[中斷連線期間的 IRSA 和 Pod 身分](#eks-outposts-instance-store-network-disconnects-irsa)。 | 

### x.509 用戶端憑證
<a name="eks-outposts-instance-store-network-disconnects-x509"></a>

若要在網路中斷連線期間維持`kubectl`存取，請在中斷連線發生之前建立用戶端 x.509 憑證。

若要建立管理員憑證：

1. 產生私有金鑰和憑證簽署請求 (CSR)：

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

1. 建立並核准 Kubernetes `CertificateSigningRequest` 資源：

   ```
   cat admin.csr | base64 | tr -d '\n' > admin.csr.b64
   ```

   ```
   apiVersion: certificates.k8s.io/v1
   kind: CertificateSigningRequest
   metadata:
     name: admin-csr
   spec:
     request: <base64-encoded-csr>
     signerName: kubernetes.io/kube-apiserver-client
     usages:
       - client auth
   ```

   ```
   kubectl apply -f admin-csr.yaml
   kubectl certificate approve admin-csr
   ```

1. 擷取已簽章的憑證：

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

1. 建立 `ClusterRoleBinding`以授予管理員存取權：

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

1. 建置`kubeconfig`使用憑證的 ：

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

### 中斷連線期間的叢集端點 DNS 解析
<a name="eks-outposts-instance-store-network-disconnects-cluster-dns"></a>

本機叢集的 Kubernetes API 伺服器端點託管於 Amazon Route 53，並解析為 Amazon EKS 在您的子網路中建立的跨帳戶彈性網路界面 (ENIs) 的私有 IP 地址。這些 ENIs 具有靜態私有 IP 地址，在正常叢集操作期間不會變更。

在網路中斷連線期間，Outpost 無法到達 Route 53，因此叢集端點主機名稱無法解析，除非您準備好本機解析路徑。三種類型的用戶端需要連線到 API 伺服器：
+  執行 **的叢集管理員**`kubectl`。
+  **工作者節點** (`kubelet`) 傳送節點活動訊號和提取規格。
+  ** `kube-proxy` ** 在每個節點上，設定叢集服務 IPs。

#### 選項 1：本機 DNS 解決方案 （建議）
<a name="_option_1_local_dns_solution_recommended"></a>

 AWS 建議部署本機 DNS 解決方案，快取叢集端點記錄，並在 Outpost 中斷連線時為其提供服務。您可以在快取叢集端點記錄的內部部署環境中執行自己的 DNS 伺服器。

如果您使用本機 DNS 解決方案，建議您將 `kubeconfig`和工作者節點 AMIs 指向叢集端點主機名稱 （而不是 ENI IP 地址），以便解析與本機 DNS 解決方案一致。

#### 選項 2：靜態 IP 型存取
<a name="_option_2_static_ip_based_access"></a>

如果您不想執行本機 DNS 解決方案，您可以使用靜態 IP 型存取。
+  **管理員：**設定 `kubeconfig`以直接指向跨帳戶 ENI 私有 IP 地址。透過搜尋`Amazon EKS {{cluster-name}} ` AWS 帳戶中描述的網路介面來尋找 ENIs。在正常操作下，每個 ENI 的 IP 地址在叢集的生命週期內都是穩定的。
+  **工作者節點 (Amazon EKS 最佳化 AMIs)：**當您從 Amazon EKS 最佳化 AMI 啟動工作者節點時，引導指令碼會使用 ENI IP 地址`/etc/hosts`將叢集端點新增至 。不需要額外的組態。
+  **工作者節點 （自訂 AMIs)：**將叢集端點主機名稱和 ENI IP 地址新增至自訂引導`/etc/hosts`中的 。否則， `kubelet`和 `kube-proxy`無法在中斷連線期間連線到 API 伺服器。

**重要**  
如果刪除跨帳戶 ENI 或其 IP 地址變更，例如，如果您刪除或修改它，以防止 Amazon EKS 重新連接它，則每個節點和每個使用靜態 IP 型存取的管理員都必須手動更新。使用本機 DNS 解決方案時，不需要手動介入。

### 中斷連線期間的 Pod DNS 解析
<a name="eks-outposts-instance-store-network-disconnects-pod-dns"></a>

若要防止中斷連線操作期間的 DNS 失敗，請將工作者節點啟動範本設定為覆寫`kubelet’s `resolvConf`設定。在您的使用者資料中，建立只包含 （沒有 VPC 搜尋網域`/etc/kubernetes/resolv.conf`) 的自訂`resolv.conf`檔案 `nameserver 10.0.0.2`（例如 )，然後在您的 `spec.kubelet.config.resolvConf: /etc/kubernetes/resolv.conf`中設定 `NodeConfig`。這會從 Pod DNS 組態中移除` {{region-code}}.compute.internal`搜尋網域，防止查詢在中斷連線時轉送到無法連線的 VPC DNS 解析程式。

下列範例顯示工作者節點 userdata：

```
MIME-Version: 1.0
Content-Type: multipart/mixed; boundary="BOUNDARY"

--BOUNDARY
Content-Type: text/x-shellscript; charset="us-ascii"

#!/bin/bash
mkdir -p /etc/kubernetes
echo "nameserver [.replaceable]``10.0.0.2``" > /etc/kubernetes/resolv.conf

--BOUNDARY
Content-Type: application/node.eks.aws

---
apiVersion: node.eks.aws/v1alpha1
kind: NodeConfig
spec:
  cluster:
    name: my-cluster
    ...
  kubelet:
    config:
      resolvConf: /etc/kubernetes/resolv.conf

--BOUNDARY--
```

### 中斷連線期間的 IRSA 和 Pod 身分
<a name="eks-outposts-instance-store-network-disconnects-irsa"></a>

**重要**  
IRSA 和 EKS Pod Identity 取決於在 AWS 區域中執行的 AWS STS。在網路連線中斷期間，使用 IRSA 或 Pod Identity 的工作負載無法取得新的登入資料。現有的登入資料會在一段時間後過期。

對於必須在網路中斷期間保持可用的工作負載，我們不建議對區域型 AWS 服務採用功能或操作相依性。

## `etcd` 中斷連線期間的行為
<a name="eks-outposts-instance-store-network-disconnects-etcd"></a>

在網路連線中斷期間，無法備份`etcd`快照。如果在中斷連線期間多個`etcd`執行個體無法使用， 會`etcd`遺失規定人數，而且在 Outpost 重新連線並還原規定人數之前，無法使用 Kubernetes API `etcd` 操作。已經在執行的工作負載會繼續運作。

## 在中斷連線期間控制平面記錄
<a name="eks-outposts-instance-store-network-disconnects-cp-logs"></a>

在網路連線中斷期間，控制平面日誌會在控制平面執行個體上本機快取。恢復連線時，日誌會傳送至父 AWS 區域中的 Amazon CloudWatch Logs。您不需要在控制平面上安裝或維護任何記錄代理程式。

## 本機可觀測性
<a name="eks-outposts-instance-store-network-disconnects-local-observability"></a>

您可以使用 [Prometheus](https://prometheus.io/)、[Grafana](https://grafana.com/) 或其他第三方解決方案來抓取 Kubernetes API 伺服器指標端點，在中斷連線期間於本機監控叢集。

## 本機映像儲存庫
<a name="eks-outposts-instance-store-network-disconnects-image-repo"></a>

若要使用其他複本擴展部署，或在中斷連線期間從 Pod 故障中復原，您必須擁有本機容器映像儲存庫 （例如 Docker 登錄檔），或在中斷連線之前必須在節點上快取映像。Amazon ECR 在網路連線中斷期間無法使用。

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

在網路中斷連線期間，Kubernetes 控制平面無法與 AWS 區域通訊。如果節點變得無法連線，預設的 Kubernetes 行為是在逾時期間之後移出 Pod。您可以使用公差和 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="eks-outposts-instance-store-network-disconnects-simulate"></a>

使用本機叢集進入生產環境之前，請模擬中斷連線，以確認您可以在叢集處於中斷連線狀態時存取叢集。

1. 在將 Outpost 連接到 AWS 區域的聯網裝置上套用防火牆規則。這會中斷 Outpost 連結的服務。

1. 使用您建立的 x.509 憑證測試與本機叢集的連線：

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

**注意**  
如果您的 Outpost 已有生產中的服務，請勿模擬中斷連線。中斷連線服務連結會影響 Outpost 上執行的所有服務。