

 **帮助改进此页面** 

要帮助改进本用户指南，请选择位于每个页面右侧窗格中的**在 GitHub 上编辑此页面**链接。

# 在 AWS Outposts 上准备本地 Amazon EKS 集群以防断网
<a name="eks-outposts-network-disconnects"></a>

如果本地网络断开与 AWS 云的连接，您可以继续在 Outpost 上使用本地 Amazon EKS 集群。本主题介绍如何针对网络断开连接的情况准备本地集群以及相关注意事项。
+ 本地集群可在临时、计划外网络断开连接期间实现稳定性和持续操作。AWSOutposts 仍是一个完全连接的产品，充当您的数据中心内 AWS 云的扩展。当 Outpost 与 AWS 云之间的网络断开连接，我们建议您尝试恢复连接。如需查看相关说明，请参阅 *AWS Outposts 用户指南*中的 [AWS Outposts 机架网络故障排除核对清单](https://docs.aws.amazon.com/outposts/latest/userguide/network-troubleshoot.html)。有关如何对本地集群的问题进行故障排除的更多信息，请参阅 [排查 AWS Outposts 上的本地 Amazon EKS 集群问题](eks-outposts-troubleshooting.md)。
+ Outpost 将发出一个 `ConnectedStatus` 指标，您可用于监控 Outpost 的连接状态。有关更多信息，请参阅 *AWS Outposts 用户指南*中的 [Outposts 指标](https://docs.aws.amazon.com/outposts/latest/userguide/outposts-cloudwatch-metrics.html#outposts-metrics)。
+ 本地集群使用 IAM 作为默认身份验证机制，该身份验证机制[将 AWS Identity and Access Management 身份验证器用于 Kubernetes](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 Outposts 的价格中。因此，运行备用实例不会影响您的 AWS 用量成本。
+ 在网络连接断开期间，要启用工作负载的创建、更新和扩缩操作，必须可以通过本地网络访问您的应用程序的容器映像，并且您的集群必须具有足够的容量。本地集群不会为您托管容器注册表。如果容器组（pod）之前已在这些节点上运行过，则容器映像将缓存在这些节点上。如果您通常从云中的 Amazon ECR 拉取应用程序的容器映像，建议运行本地缓存或注册表。如果您需要在网络连接断开期间创建、更新和扩展工作负载资源的操作，那么本地缓存或注册表会很有帮助。
+ 本地集群使用 Amazon EBS 作为持久卷的默认存储类，并使用 Amazon EBS CSI 驱动程序来管理 Amazon EBS 持久卷的生命周期。网络连接断开期间，由 Amazon EBS 备份的容器组（pod）将无法创建、更新或扩展。这是因为这些操作需要调用云端的 Amazon EBS API。如果您在本地集群上部署有状态工作负载，并且需要在网络断开连接期间执行创建、更新或扩缩操作，请考虑使用替代存储机制。
+ 如果 AWS Outposts 无法访问相关 AWS 区域内 API（例如 Amazon EBS 或 Amazon S3 的 API），则无法创建或删除 Amazon EBS 快照。
+ 将 ALB（Ingress）与 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 日志。您可以使用 [Prometheus](https://prometheus.io/)、[Grafana](https://grafana.com/) 或 Amazon EKS 合作伙伴解决方案，利用 Kubernetes API 服务器的指标端点或将 Kubernetes 用于日志，在本地监控集群。
+ 如果您将 Outpost 上的 AWS 负载均衡器控制器用于应用程序流量，则在网络连接断开期间，前面带有 AWS 负载均衡器控制器的现有容器组（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 上插件的[自述文件](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) 文件。

## 在网络断开连接期间对您的本地集群进行身份验证
<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
      ```

   如果您在本地集群处于断开连接状态时发现其存在任何问题，则我们建议开具支持票证。