为网络断开连接做好准备 - Amazon EKS
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)

为网络断开连接做好准备

如果本地网络断开与 Amazon Web Services 云 的连接,您可以继续在 Outpost 上使用本地 Amazon EKS 集群。本主题介绍如何针对网络断开连接的情况准备本地集群以及相关注意事项。

针对网络断开连接的情况准备本地集群时的注意事项:
  • 本地集群可在临时、计划外网络断开连接期间实现稳定性和持续操作。Amazon Outposts 仍是一个完全连接的产品,充当您的数据中心内 Amazon Web Services 云 的扩展。当 Outpost 与 Amazon Web Services 云 之间的网络断开连接,我们建议您尝试恢复连接。如需查看相关说明,请参阅《Amazon Outposts 用户指南》中的 Amazon Outposts 机架网络故障排除清单。有关如何对本地集群的问题进行故障排除的更多信息,请参阅 对 Amazon Outposts 上的 Amazon EKS 的本地集群进行故障排除

  • Outpost 将发出一个 ConnectedStatus 指标,您可用于监控 Outpost 的连接状态。有关更多信息,请参阅《Amazon Outposts 用户指南》中的 Outposts 指标

  • 本地集群使用 IAM 作为默认身份验证机制,该身份验证机制将 Amazon Identity and Access Management 身份验证器用于 Kubernetes。IAM 在网络连接断开期间不可用。因此,本地集群支持使用 x.509 证书的替代身份验证机制,您可以使用该机制在网络连接断开期间连接到集群。有关如何获取 x.509 证书并将其用于您的集群的信息,请参阅 在网络断开连接期间对您的本地集群进行身份验证

  • 如果您在网络连接断开期间无法访问 Route 53,请考虑在您的本地环境中使用本地 DNS 服务器。Kubernetes 控制面板实例使用静态 IP 地址。您可以使用端点主机名和 IP 地址配置用于连接到您的集群的主机,作为使用本地 DNS 服务器的替代方法。有关更多信息,请参阅 Amazon Outposts 用户指南中的 DNS

  • 如果您预计在网络连接断开期间应用程序流量会增加,则可以在连接到云时在您的集群中预调配备用计算容量。Amazon EC2 实例包含在 Amazon Outposts 的价格中。因此,运行备用实例不会影响您的 Amazon 用量成本。

  • 在网络连接断开期间,要启用工作负载的创建、更新和扩缩操作,必须可以通过本地网络访问您的应用程序的容器映像,并且您的集群必须具有足够的容量。本地集群不会为您托管容器注册表。如果 Pods 之前已在节点上运行过,则容器映像将缓存在这些节点上。如果您通常从云中的 Amazon ECR 提取应用程序的容器映像,建议运行本地缓存或注册表。如果您需要在网络连接断开期间创建、更新和扩展工作负载资源的操作,那么本地缓存或注册表会很有帮助。

  • 本地集群使用 Amazon EBS 作为持久卷的默认存储类,并使用 Amazon EBS CSI 驱动程序来管理 Amazon EBS 持久卷的生命周期。网络连接断开期间,由 Amazon EBS 备份的 Pods 将无法创建、更新或扩展。这是因为这些操作需要调用云端的 Amazon EBS API。如果您在本地集群上部署有状态工作负载,并且需要在网络断开连接期间执行创建、更新或扩缩操作,请考虑使用替代存储机制。

  • 如果 Amazon Outposts 无法访问相关 Amazon 区域内 API(例如 Amazon EBS 或 Amazon S3 的 API),则无法创建或删除 Amazon EBS 快照。

  • 将 ALB(Ingress)与 Amazon Certificate Manager(ACM)集成时,证书会被推送并存储在 Amazon Outposts ALB 计算实例的内存中。如果与 Amazon Web Services 区域断开连接,当前的 TLS 终止将继续运行。在这种情况下,更改操作将失败(例如新的传入定义、新的基于 ACM 的证书 API 操作、ALB 计算扩展或证书轮换)。有关更多信息,请参阅《Amazon Certificate Manager 用户指南》中的排查托管证书续订的问题

  • 在网络断开连接期间,Amazon EKS 控制面板日志将本地缓存在 Kubernetes 控制面板实例上。重新连接后,会将这些日志发送到父级 Amazon Web Services 区域 中的 CloudWatch 日志。您可以使用 PrometheusGrafana 或 Amazon EKS 合作伙伴解决方案,使用 Kubernetes API 服务器的指标端点或将 Fluent Bit 用于日志,以在本地监控集群。

  • 如果您将 Outpost 上的 Amazon Load Balancer Controller 用于应用程序流量,则在网络连接断开期间,前面带有 Amazon Load Balancer Controller 的现有 Pods 将继续接收流量。在网络断开连接期间创建的新 Pods 不会接收流量,直到 Outpost 重新连接到 Amazon Web Services 云 为止。考虑在连接到 Amazon Web Services 云 时为您的应用程序设置副本计数,以满足您在网络断开连接期间的扩缩需求。

  • Amazon VPC CNI plugin for Kubernetes 默认为辅助 IP 模式。它配置为 WARM_ENI_TARGET=1,这将允许插件保持可用 IP 地址的“完全弹性网络接口”。考虑在断开连接状态下根据您的扩缩需求更改 WARM_ENI_TARGETWARM_IP_TARGETMINIMUM_IP_TARGET 值。有关更多信息,请参阅 GitHub 上插件的 readme 文件。有关每种实例类型支持的 Pods 最大数量列表,请参阅 GitHub 上的 eni-max-pods.txt 文件。

在网络断开连接期间对您的本地集群进行身份验证

Amazon 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"
    2. 在 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
  2. 使用 kubectl 创建证书签名请求。

    kubectl create -f admin-csr.yaml
  3. 检查证书签名请求的状态。

    kubectl get csr admin-csr

    示例输出如下。

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

    Kubernetes 已创建证书签名请求。

  4. 批准证书签名请求。

    kubectl certificate approve admin-csr
  5. 重新检查证书签名请求状态是否为已批准。

    kubectl get csr admin-csr

    示例输出如下。

    NAME AGE REQUESTOR CONDITION admin-csr 11m kubernetes-admin Approved
  6. 检索并验证证书。

    1. 检索证书。

      kubectl get csr admin-csr -o jsonpath='{.status.certificate}' | base64 --decode > admin.crt
    2. 验证证书。

      cat admin.crt
  7. admin 用户创建集群角色绑定。

    kubectl create clusterrolebinding admin --clusterrole=cluster-admin \ --user=admin --group=system:masters
  8. 为断开连接状态生成用户范围的 kubeconfig。

    您可以使用已下载的 admin 证书生成 kubeconfig 文件。替换以下命令中的 my-clusterapiserver-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
  9. 查看您的 kubeconfig 文件。

    kubectl get nodes --kubeconfig admin.kubeconfig
  10. 如果您的 Outpost 上已有投入生产中的服务,请跳过此步骤。如果 Amazon EKS 是在您的 Outpost 上运行的唯一服务,并且 Outpost 当前未投入生产,则您可以模拟网络断开连接。在使用本地集群投入生产之前,请模拟断开连接,以确保在集群处于断开连接状态时可以访问该集群。

    1. 在将您的 Outpost 连接到 Amazon Web Services 区域 的联网设备上应用防火墙规则。这将断开 Outpost 的服务链接。您无法创建任何新实例。当前正在运行的实例将断开与 Amazon Web Services 区域 和互联网的连接。

    2. 您可以使用 x509 证书在断开连接时测试与您的本地集群的连接。确保将 kubeconfig 更改为您在上一步创建的 admin.kubeconfig。将 my-cluster 替换为您的本地集群的名称。

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

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