

本文属于机器翻译版本。若本译文内容与英语原文存在差异，则一律以英文原文为准。

# EKS Fully-Private 集群
<a name="eks-private-cluster"></a>

eksctl 支持创建没有出站 Internet 访问权限且只有私有子网的完全私有集群。VPC 终端节点用于实现对 AWS 服务的私有访问。

本指南介绍如何创建没有出站 Internet 访问权限的私有集群。

## 创建完全私有集群
<a name="_creating_a_fully_private_cluster"></a>

创建完全私有集群的唯一必填字段是：`privateCluster.enabled`

```
privateCluster:
  enabled: true
```

创建集群后，需要访问 Kubernetes API 服务器的 eksctl 命令必须从集群的 VPC、对等 VPC 或使用其他方式（例如 AWS Direct Connect）运行。需要访问 EKS API 的 eksctl 命令如果在集群的 VPC 内运行，则无法运行。要解决这个问题，请[为亚马逊 EKS 创建一个接口终端节点，以便从您的亚马逊](https://docs.aws.amazon.com/eks/latest/userguide/vpc-interface-endpoints.html)虚拟私有云 (VPC) 私有访问亚马逊弹性 Kubernetes Service (Amazon EKS) 管理 API。在 future 版本中，eksctl 将增加对创建此端点的支持，因此无需手动创建。启用 AWS for A PrivateLink mazon EKS 后，需要访问 OpenID Connect 提供商 URL 的命令将需要从集群的 VPC 外部运行。

创建托管节点组将继续起作用，并且创建自我管理的节点组将起作用，因为如果命令是在集群的 VPC、对等的 VPC 内运行的，或者使用其他方式（例如 AWS Direct Connect），则需要通过 EKS [接口终端节点](https://aws.amazon.com/about-aws/whats-new/2022/12/amazon-eks-supports-aws-privatelink/)访问 API 服务器。

**注意**  
VPC 终端节点按小时和使用量收费。有关定价的更多详细信息，请参阅 A [WS PrivateLink 定价](https://aws.amazon.com/privatelink/pricing/) 

**警告**  
Fully-private 中不支持群集`eu-south-1`。

## 配置对其他 AWS 服务的私有访问权限
<a name="_configuring_private_access_to_additional_aws_services"></a>

为了使工作节点能够私下访问 AWS 服务，eksctl 为以下服务创建 VPC 终端节点：
+ 用于提取容器镜像的 ECR（两者`ecr.api`兼有`ecr.dkr`）的接口终端节点（AWS CNI 插件等）
+ S3 用于提取实际图像层的网关端点
+ `aws-cloud-provider`集成所需的 EC2 接口终端节点
+ STS 的接口终端节点，用于支持服务账户的 Fargate 和 IAM 角色 (IRSA)
+ 用于 CloudWatch 记录的接口端点 (`logs`)（如果启用了 CloudWatch 日志记录）

这些 VPC 终端节点对于正常运行的私有集群来说是必不可少的，因此，eksctl 不支持配置或禁用它们。但是，集群可能需要私有访问其他 AWS 服务（例如，集群自动扩缩器所需的自动扩缩功能）。可以在中指定这些服务`privateCluster.additionalEndpointServices`，它指示 eksctl 为每个服务创建一个 VPC 终端节点。

例如，要允许私人访问自动缩放和 CloudWatch 日志记录，请执行以下操作：

```
privateCluster:
  enabled: true
  additionalEndpointServices:
  # For Cluster Autoscaler
  - "autoscaling"
  # CloudWatch logging
  - "logs"
```

中支持的端点`additionalEndpointServices`是`autoscaling`、`cloudformation`和`logs`。

### 跳过端点创建
<a name="_skipping_endpoint_creations"></a>

如果已经创建了 VPC，并设置了必要的 AWS 终端节点并链接到 EKS 文档中描述的子网，则`eksctl`可以通过提供`skipEndpointCreation`如下选项来跳过创建它们：

```
privateCluster:
  enabled: true
  skipEndpointCreation: true
```

此设置不能与一起使用`additionalEndpointServices`。它将跳过所有端点的创建。此外，仅当端点`<→`子网拓扑设置正确时，才建议使用此设置。如果子网 ID 正确，则使用前缀地址设置`vpce`路由，创建所有必要的 EKS 端点并将其链接到提供的 VPC。 `eksctl`不会更改这些资源中的任何一个。

## 节点组
<a name="private-nodegroups"></a>

在完全私有集群中仅支持私有节点组（包括托管和自管理），因为集群的 VPC 是在没有任何公有子网的情况下创建的。必须明确设置`privateNetworking`字段（`nodeGroup[].privateNetworking `和`managedNodeGroup[`）。在完全私有集群中`privateNetworking`未设置是错误的。

```
nodeGroups:
- name: ng1
  instanceType: m5.large
  desiredCapacity: 2
  # privateNetworking must be explicitly set for a fully-private cluster
  # Rather than defaulting this field to `true`,
  # we require users to explicitly set it to make the behaviour
  # explicit and avoid confusion.
  privateNetworking: true

managedNodeGroups:
- name: m1
  instanceType: m5.large
  desiredCapacity: 2
  privateNetworking: true
```

## 集群终端节点访问
<a name="_cluster_endpoint_access"></a>

完全私有集群不支持在创建集群`clusterEndpointAccess`期间进行修改。设置`clusterEndpoints.publicAccess`或都是错误的`clusterEndpoints.privateAccess`，因为完全私有集群只能拥有私有访问权限，并且允许修改这些字段可能会破坏集群。

## User-supplied VPC 和子网
<a name="_user_supplied_vpc_and_subnets"></a>

eksctl 支持使用预先存在的 VPC 和子网创建完全私有集群。只能指定私有子网，在下方指定子网是错误的。`vpc.subnets.public`

eksctl 在提供的 VPC 中创建 VPC 终端节点，并修改所提供子网的路由表。每个子网都应有一个与之关联的显式路由表，因为 eksctl 不会修改主路由表。

```
apiVersion: eksctl.io/v1alpha5
kind: ClusterConfig

metadata:
  name: private-cluster
  region: us-west-2

privateCluster:
  enabled: true
  additionalEndpointServices:
  - "autoscaling"

vpc:
  subnets:
    private:
      us-west-2b:
        id: subnet-0818beec303f8419b
      us-west-2c:
        id: subnet-0d42ef09490805e2a
      us-west-2d:
        id: subnet-0da7418077077c5f9


nodeGroups:
- name: ng1
  instanceType: m5.large
  desiredCapacity: 2
  # privateNetworking must be explicitly set for a fully-private cluster
  # Rather than defaulting this field to true for a fully-private cluster, we require users to explicitly set it
  # to make the behaviour explicit and avoid confusion.
  privateNetworking: true

managedNodeGroups:
- name: m1
  instanceType: m5.large
  desiredCapacity: 2
  privateNetworking: true
```

## 管理全私有集群
<a name="_managing_a_fully_private_cluster"></a>

要使所有命令在集群创建后起作用，eksctl 需要私有访问 EKS API 服务器端点和出站互联网访问权限（对于`EKS:DescribeCluster`）。如果 eksctl 具有出站互联网访问权限，则将支持不需要访问 API 服务器的命令。

## Force-delete 一个完全私有的集群
<a name="_force_delete_a_fully_private_cluster"></a>

通过 eksctl 删除完全私有集群时可能会出现错误，因为 eksctl 无法自动访问集群的所有资源。 `--force`存在是为了解决这个问题：它将强制删除集群，并在出现错误时继续。

## 限制
<a name="_limitations"></a>

当前实现的一个局限性是，eksctl 最初在创建集群时启用了公有和私有终端节点访问权限，并在所有操作完成后禁用公共端点访问权限。这是必需的，因为 eksctl 需要访问 Kubernetes API 服务器才能允许自我管理的节点加入集群并支持和 Fargate。 GitOps 这些操作完成后，eksctl 会将集群终端节点的访问权限切换为仅限私有。此额外更新确实意味着创建完全私有集群所需的时间将比标准集群更长。将来，eksctl 可能会切换到 Lambd VPC-enabled a 函数来执行这些 API 操作。

## 通过 HTTP 代理服务器进行出站访问
<a name="_outbound_access_via_http_proxy_servers"></a>

eksctl 能够通过配置的 HTTP (S) 代理服务器与 AWS API 通信，但是您需要确保正确设置代理排除列表。

通常，您需要通过设置适当的`no_proxy`环境变量（包括该值）来确保集群的 VPC 终端节点请求不会通过代理进行路由。`.eks.amazonaws.com`

如果您的代理服务器执行 “SSL 拦截”，并且您使用的是服务账户的 IAM 角色 (IRSA)，则需要确保明确绕过该域 Man-in-the-Middle 的 SSL。`oidc.<region>.amazonaws.com`不这样做将导致 eksctl 为 OIDC 提供商获取错误的根证书指纹，并且 AWS VPC CNI 插件将由于无法获取 IAM 证书而无法启动，从而导致您的集群无法运行。

## 进一步信息
<a name="_further_information"></a>
+  [EKS 私有集群](https://docs.aws.amazon.com/eks/latest/userguide/private-clusters.html) 