

 **帮助改进此页面** 

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

# 部署具有有限互联网访问权限的私有集群
<a name="private-clusters"></a>

本主题将介绍如何部署部署在 AWS 云上但没有出站互联网访问权限的 Amazon EKS 集群。如果您在 AWS 上有一个本地集群，请参阅[在 AWS Outpost 上创建 Amazon Linux 节点](eks-outposts-self-managed-nodes.md)而不是本主题。

如果您不熟悉 Amazon EKS 联网，请参阅 [Amazon EKS 工作线程节点的集群联网解密](https://aws.amazon.com/blogs/containers/de-mystifying-cluster-networking-for-amazon-eks-worker-nodes)。如果集群没有出站互联网访问权限，则其必须满足以下要求：

## 集群架构要求
<a name="private-clusters-architecture"></a>
+ 您的集群必须从 VPC 中的容器注册表中拉取映像。您可以在 VPC 中创建 Amazon Elastic Container Registry，并将容器映像复制到其中，以供节点拉取。有关更多信息，请参阅 [将容器镜像从一个存储库复制到另一个存储库](copy-image-to-repository.md)。
+ 集群必须启用端点私有访问权限。需要启用该访问权限，节点才能注册到集群端点。终端节点公有访问权限是可选的。有关更多信息，请参阅 [集群 API 服务器端点](cluster-endpoint.md)。

## 节点要求
<a name="private-clusters-node"></a>
+ 自主管理型 Linux 和 Windows 节点必须包含以下引导参数才能启动。这些实际参数绕过 Amazon EKS 自检，且无需从 VPC 内访问 Amazon EKS API。

  1. 使用以下命令确定集群端点的值。将 *my-cluster* 替换为您的集群的名称。

     ```
     aws eks describe-cluster --name my-cluster --query cluster.endpoint --output text
     ```

     示例输出如下。

     ```
     https://EXAMPLE108C897D9B2F1B21D5EXAMPLE.sk1.region-code.eks.amazonaws.com
     ```

  1. 使用以下命令确定集群证书颁发机构的值。将 *my-cluster* 替换为您的集群的名称。

     ```
     aws eks describe-cluster --name my-cluster --query cluster.certificateAuthority --output text
     ```

     返回的输出是一个长字符串。

  1. 请将 NodeConfig 对象中的 `apiServerEndpoint` 和 `certificateAuthority` 值替换为以上命令的输出中返回的值。有关在启动 Amazon Linux 2023 自主管理型节点时指定引导参数的更多信息，请参阅[创建自行管理的 Amazon Linux 节点](launch-workers.md)和[创建自主管理型 Microsoft Windows 节点](launch-windows-workers.md)。
     + 对于 Linux 节点：

       ```
       ---
       MIME-Version: 1.0
       Content-Type: multipart/mixed; boundary="BOUNDARY"
       
       --BOUNDARY
       Content-Type: application/node.eks.aws
       
       ---
       apiVersion: node.eks.aws/v1alpha1
       kind: NodeConfig
       spec:
         cluster:
           name: my-cluster
           apiServerEndpoint: [.replaceable]https://EXAMPLE108C897D9B2F1B21D5EXAMPLE.sk1.region-code.eks.amazonaws.com
           certificateAuthority: [.replaceable]Y2VydGlmaWNhdGVBdXRob3JpdHk=
           ...
       ```

       有关更多参数，请参阅 GitHub 上的[引导启动脚本](https://github.com/awslabs/amazon-eks-ami/blob/main/templates/al2/runtime/bootstrap.sh)。
     + 对于 Windows 节点：
**注意**  
如果您使用自定义服务 CIDR，则需要使用 `-ServiceCIDR` 参数进行指定。否则，集群中的容器组（pod）DNS 解析将失败。

       ```
       -APIServerEndpoint cluster-endpoint -Base64ClusterCA certificate-authority
       ```

       有关更多参数，请参阅 [引导脚本配置参数](eks-optimized-windows-ami.md#bootstrap-script-configuration-parameters)。
+ 必须从 VPC 内创建集群的 `aws-auth` `ConfigMap`。有关在 `aws-auth` `ConfigMap` 中创建和添加条目的更多信息，请在终端中输入 `eksctl create iamidentitymapping --help`。如果您的服务器上不存在 `ConfigMap`，则 `eksctl` 将在您使用命令添加身份映射时创建。

## 容器组（pod）要求
<a name="private-clusters-pod"></a>
+  **容器组身份**：配置了 EKS 容器组身份的容器组（pod）从 EKS Auth API 获取凭证。如果没有出站互联网访问权限，则必须创建并使用一个用于 EKS Auth API 的 VPC 端点：`com.amazonaws.region-code.eks-auth`。有关 EKS 和 EKS Auth VPC 端点的更多信息，请参阅[使用 AWS PrivateLink 访问 Amazon EKS](vpc-interface-endpoints.md)。
+  **IRSA**：配置了[服务账户的 IAM 角色](iam-roles-for-service-accounts.md)的容器组（pod）通过 AWS Security Token Service（AWS STS）API 调用获取凭证。如果没有出站互联网访问权限，则您必须在 VPC 中创建并使用 AWS STS VPC 端点。默认情况下，大多数 AWS `v1` SDK 均使用全局 AWS STS 端点（`sts.amazonaws.com`），而此端点不使用 AWS STS VPC 端点。要使用 AWS STS VPC 端点，您可能需要将 SDK 配置为使用区域 AWS STS 端点（`sts.region-code.amazonaws.com`）。有关更多信息，请参阅 [为服务账户配置 AWS Security Token Service 端点](configure-sts-endpoint.md)。
+ 集群的 VPC 子网必须具有容器组（pod）需要访问的任何 AWS 服务的 VPC 接口端点。有关更多信息，请参阅[使用接口 VPC 端点访问 AWS 服务](https://docs.aws.amazon.com/vpc/latest/privatelink/create-interface-endpoint.html)。下表列出了一些常用的服务和端点。有关端点的完整列表，请参阅《AWS PrivateLink 指南》[https://docs.aws.amazon.com/vpc/latest/privatelink/](https://docs.aws.amazon.com/vpc/latest/privatelink/)中的[与 AWS PrivateLink 集成的 AWS 服务](https://docs.aws.amazon.com/vpc/latest/privatelink/aws-services-privatelink-support.html)。

  我们建议您为 VPC 端点[启用私有 DNS 名称](https://docs.aws.amazon.com/vpc/latest/privatelink/interface-endpoints.html#enable-private-dns-names)，这样工作负载即可继续正常使用公共 AWS 服务端点。    
[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/eks/latest/userguide/private-clusters.html)
+ 任何自行管理的节点都必须部署到具有您需要的 VPC 接口端点的子网中。如果您创建托管节点组，则 VPC 接口端点安全组必须允许子网的 CIDR，或者您必须将已创建的节点安全组添加到 VPC 接口端点安全组。
+  **EFS 存储**：如果容器组（pod）使用 Amazon EFS 卷，在部署[使用 Amazon EFS 存储弹性文件系统](efs-csi.md)之前，必须更改驱动程序的 [kustomization.yaml](https://github.com/kubernetes-sigs/aws-efs-csi-driver/blob/master/deploy/kubernetes/overlays/stable/kustomization.yaml) 文件，才能将容器映像设置为使用与 Amazon EKS 集群相同的 AWS 区域。
+ Route53 不支持 AWS PrivateLink。您无法从私有 Amazon EKS 集群管理 Route53 DNS 记录。这会影响 Kubernetes [external-dns](https://github.com/kubernetes-sigs/external-dns)。
+ 如果您使用 EKS 优化版 AMI，则应启用上表中的 `ec2` 端点。您也可以手动设置节点 DNS 名称。优化版 AMI 使用 EC2 API 来自动设置节点 DNS 名称。
+ 您可以使用 [AWS Load Balancer Controller](aws-load-balancer-controller.md) 将 AWS Application Load Balancers（ALB）和 Network Load Balancers 部署到私有集群。部署时，您应该使用[命令行标记](https://kubernetes-sigs.github.io/aws-load-balancer-controller/latest/deploy/configurations/#controller-command-line-flags)将 `enable-shield`、`enable-waf` 和 `enable-wafv2` 设置为 false。带有来自 Ingress 对象中的主机名的[证书发现](https://kubernetes-sigs.github.io/aws-load-balancer-controller/latest/guide/ingress/cert_discovery/#discover-via-ingress-rule-host)不受支持。这是因为控制器需要访问没有 VPC 接口端点的 AWS Certificate Manager。

  该控制器支持带有 IP 目标的网络负载均衡器，结合 Fargate 一起使用时需要网络负载均衡器。有关更多信息，请参阅[使用应用程序负载均衡器路由应用程序和 HTTP 流量](alb-ingress.md)和[创建网络负载均衡器](network-load-balancing.md#network-load-balancer)。
+  支持 [Cluster Autoscaler](https://github.com/kubernetes/autoscaler/blob/master/cluster-autoscaler/cloudprovider/aws/README.md)。在部署 Cluster Autoscaler 容器组（pod）时，请确保命令行包括 `--aws-use-static-instance-list=true`。有关更多信息，请参阅 GitHub 上的[使用静态实例列表](https://github.com/kubernetes/autoscaler/blob/master/cluster-autoscaler/cloudprovider/aws/README.md#use-static-instance-list)。Worker 节点 VPC 还必须包括 AWS STS VPC 端点和弹性伸缩 VPC 端点。
+ 一些容器软件产品使用 API 调用来访问监控使用情况的 AWS Marketplace Metering Service。私有集群不允许这些调用，因此您不能在私有集群中使用这些容器类型。