

 **帮助改进此页面** 

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

# 准备混合节点的联网
<a name="hybrid-nodes-networking"></a>

本主题概述创建 Amazon EKS 集群和挂载混合节点之前必须配置的联网设置。本指南假设您已满足使用 [AWS Site-to-Site VPN](https://docs.aws.amazon.com/vpn/latest/s2svpn/SetUpVPNConnections.html)、[AWS Direct Connect](https://docs.aws.amazon.com/directconnect/latest/UserGuide/Welcome.html) 或您自己的 VPN 解决方案进行混合网络连接的先决条件。

![\[混合节点网络连接。\]](http://docs.aws.amazon.com/zh_cn/eks/latest/userguide/images/hybrid-prereq-diagram.png)


## 本地联网配置
<a name="hybrid-nodes-networking-on-prem"></a>

### 最低网络要求
<a name="hybrid-nodes-networking-min-reqs"></a>

为确保最佳体验，我们建议您从混合节点到 AWS 区域的可靠网络连接至少达到 100 Mbps，并且往返延迟最大 200 毫秒。这是适用于大多数使用案例的一般指导，但并非严格要求。带宽和延迟要求可能因混合节点的数量和工作负载特征而异，例如应用程序映像大小，应用程序弹性、监控和日志记录配置，以及需要访问其他 AWS 服务中所存储数据的应用程序依赖项。我们建议在部署到生产环境之前使用自己的应用程序和环境进行测试，从而验证您的网络设置是否满足工作负载的要求。

### 本地节点和容器组 CIDR
<a name="hybrid-nodes-networking-on-prem-cidrs"></a>

确定您将用于混合节点以及在其上运行的工作负载的节点和容器组 CIDR。节点 CIDR 是从本地网络分配的，如果您为 CNI 使用叠加网络，则容器组 CIDR 是从您的容器网络接口（CNI）分配的。创建 EKS 集群时，您可以使用 `RemoteNodeNetwork` 和 `RemotePodNetwork` 字段将本地节点 CIDR 和容器组 CIDR 作为输入传递。本地节点 CIDR 必须可在本地网络上路由。有关本地容器组 CIDR 可路由性的信息，请参阅以下一节。

本地节点和容器组 CIDR 块必须满足以下要求：

1. 位于以下 `IPv4` RFC-1918 范围之一：`10.0.0.0/8`、`172.16.0.0/12` 或 `192.168.0.0/16`，或位于 RFC 6598 定义的 CGNAT 范围：`100.64.0.0/10`。

1. 不相互重叠，也不与 EKS 集群的 VPC CIDR 或 Kubernetes 服务 `IPv4` CIDR 重叠。

### 本地容器组网络路由
<a name="hybrid-nodes-networking-on-prem-pod-routing"></a>

使用 EKS 混合节点时，我们通常建议您将本地容器组 CIDR 设置为在本地网络上可路由，以便在云和本地环境之间实现完整的集群通信和功能。

 **可路由的容器组网络** 

如果您能够将容器组网络设置为在本地网络上可路由，则请按照以下指导操作。

1. 使用本地容器 CIDR 配置 EKS 集群的 `RemotePodNetwork` 字段，使用本地容器 CIDR 配置您的 VPC 路由表，以及使用本地容器 CIDR 配置您的 EKS 集群安全组。

1. 您可以通过多种方法来使本地容器组 CIDR 可在本地网络上路由，包括边界网关协议（BGP）、静态路由或其他自定义路由解决方案。我们推荐使用 BGP 解决方案，因为与需要自定义或手动路由配置的备选解决方案相比，此方案具有更好的可扩展性并且更易于管理。AWS 支持使用 Cilium 和 Calico 的 BGP 功能来公开容器组 CIDR，有关更多信息，请参阅[为混合节点配置 CNI](hybrid-nodes-cni.md)和[可路由的远程容器组（pod）CIDR](hybrid-nodes-concepts-kubernetes.md#hybrid-nodes-concepts-k8s-pod-cidrs)。

1. Webhook 可以在混合节点上运行，因为 EKS 控制面板能够与分配给 Webhook 的容器组 IP 地址进行通信。

1. 在云节点上运行的工作负载能够直接与同一 EKS 集群中混合节点上运行的工作负载进行通信。

1. 其他 AWS 服务（例如 AWS 应用程序负载均衡器和 Amazon Managed Service for Prometheus）能够与在混合节点上运行的工作负载进行通信，以平衡网络流量并抓取容器组指标。

 **不可路由的容器组网络** 

如果您*无法*将容器组网络设置为在本地网络上可路由，则请按照以下指导操作。

1. Webhook 无法在混合节点上运行，因为 Webhook 需要从 EKS 控制面板连接到分配给 Webhook 的容器组 IP 地址。在这种情况下，我们建议您在与混合节点位于同一 EKS 集群中的云节点上运行 Webhook；有关更多信息，请参阅[为混合节点配置 Webhook](hybrid-nodes-webhooks.md)。

1. 对云节点使用 VPC CNI 并对混合节点使用 Cilium 或 Calico 时，在云节点上运行的工作负载无法直接与在混合节点上运行的工作负载进行通信。

1. 使用服务流量分布将流量保持在其源区域的本地。有关服务流量分布的更多信息，请参阅[配置服务流量分布](hybrid-nodes-webhooks.md#hybrid-nodes-mixed-service-traffic-distribution)。

1. 将 CNI 配置为在离开本地主机时对容器组流量使用出口伪装或网络地址转换（NAT）。此项在 Cilium 中默认为启用状态。Calico 需要将 `natOutgoing` 设置为 `true`。

1. 其他 AWS 服务（例如 AWS 应用程序负载均衡器和 Amazon Managed Service for Prometheus）能够与在混合节点上运行的工作负载进行通信。

### 混合节点安装和升级期间必需的访问权限
<a name="hybrid-nodes-networking-access-reqs"></a>

在安装过程中，您必须具有以下域的访问权限，以便在主机上安装混合节点依赖项。此过程可以在生成操作系统映像时一次执行，也可以在运行时中在每台主机上完成。这包括初始安装以及升级混合节点的 Kubernetes 版本时。

某些软件包使用操作系统的默认软件包管理器进行安装。对于 AL2023 和 RHEL，使用 `yum` 命令安装 `containerd`、`ca-certificates`、`iptables` 和 `amazon-ssm-agent`。对于 Ubuntu，使用 `apt` 安装 `containerd`、`ca-certificates` 和 `iptables`，并使用 `snap` 安装 `amazon-ssm-agent`。


| 组件 | URL | 协议 | 端口： | 
| --- | --- | --- | --- | 
|  EKS 节点构件（S3）  |  https://hybrid-assets.eks.amazonaws.com  |  HTTPS  |  443  | 
|   [EKS 服务端点](https://docs.aws.amazon.com/general/latest/gr/eks.html)   |  https://eks.*region*.amazonaws.com  |  HTTPS  |  443  | 
|   [ECR 服务端点](https://docs.aws.amazon.com/general/latest/gr/ecr.html)   |  https://api.ecr.*region*.amazonaws.com  |  HTTPS  |  443  | 
|  EKS ECR 端点  |  区域性端点请参阅[查看 Amazon EKS 附加组件的 Amazon 容器映像注册表](add-ons-images.md)。  |  HTTPS  |  443  | 
|  SSM 二进制端点 1   |  https://amazon-ssm-*region*.s3.*region*.amazonaws.com  |  HTTPS  |  443  | 
|   [SSM 服务端点](https://docs.aws.amazon.com/general/latest/gr/ssm.html) 1   |  https://ssm.*region*.amazonaws.com  |  HTTPS  |  443  | 
|  IAM Anywhere 二进制端点 2   |  https://rolesanywhere.amazonaws.com  |  HTTPS  |  443  | 
|   [IAM Anywhere 服务端点](https://docs.aws.amazon.com/general/latest/gr/rolesanywhere.html) 2   |  https://rolesanywhere.*region*.amazonaws.com  |  HTTPS  |  443  | 
|  操作系统软件包管理器端点  |  软件包存储库端点是特定于操作系统的端点，并且可能因地理区域而异。  |  HTTPS  |  443  | 

**注意**  
 1 仅在将 AWS SSM 混合激活用作本地 IAM 凭证提供者时，才需要 AWS SSM 端点访问权限。  
 2 仅在将 AWS IAM Roles Anywhere 用作本地 IAM 凭证提供者时，才需要 AWS IAM 端点访问权限。

### 正在进行的集群操作需要的访问权限
<a name="hybrid-nodes-networking-access-reqs-ongoing"></a>

正在进行的集群操作需要拥有本地防火墙的以下网络访问权限。

**重要**  
根据您选择的 CNI，您需要为 CNI 端口配置其他网络访问规则。有关详细信息，请参阅 [Cilium 文档](https://docs.cilium.io/en/stable/operations/system_requirements/#firewall-rules)和 [Calico 文档](https://docs.tigera.io/calico/latest/getting-started/kubernetes/requirements#network-requirements)。


| Type | 协议 | Direction | 端口： | 来源 | 目标 | 用法 | 
| --- | --- | --- | --- | --- | --- | --- | 
|  HTTPS  |  TCP  |  出站  |  443  |  远程节点 CIDR  |  EKS 集群 IP 1   |  Kubelet 到 Kubernetes API 服务器  | 
|  HTTPS  |  TCP  |  出站  |  443  |  远程容器组 CIDR  |  EKS 集群 IP 1   |  容器组（pod）到 Kubernetes API 服务器  | 
|  HTTPS  |  TCP  |  出站  |  443  |  远程节点 CIDR  |   [SSM 服务端点](https://docs.aws.amazon.com/general/latest/gr/ssm.html)   |  SSM 混合激活凭证刷新和 SSM 心跳信号发送每隔 5 分钟进行一次  | 
|  HTTPS  |  TCP  |  出站  |  443  |  远程节点 CIDR  |   [IAM Anywhere 服务端点](https://docs.aws.amazon.com/general/latest/gr/rolesanywhere.html)   |  IAM Roles Anywhere 凭证刷新  | 
|  HTTPS  |  TCP  |  出站  |  443  |  远程容器组 CIDR  |   [STS 区域性端点](https://docs.aws.amazon.com/general/latest/gr/sts.html)   |  容器组（pod）到 STS 端点，仅对 IRSA 为必需  | 
|  HTTPS  |  TCP  |  出站  |  443  |  远程节点 CIDR  |   [Amazon EKS 身份验证服务端点](https://docs.aws.amazon.com/general/latest/gr/eks.html)   |  节点到 Amazon EKS 身份验证端点，仅对 Amazon EKS 容器组身份为必需  | 
|  HTTPS  |  TCP  |  入站  |  10250  |  EKS 集群 IP 1   |  远程节点 CIDR  |  Kubernetes API 服务器到 kubelet  | 
|  HTTPS  |  TCP  |  入站  |  Webhook 端口  |  EKS 集群 IP 1   |  远程容器组 CIDR  |  Kubernetes API 服务器到 Webhook  | 
|  HTTPS  |  TCP、UDP  |  入站、出站  |  53  |  远程容器组 CIDR  |  远程容器组 CIDR  |  容器组（pod）到 CoreDNS。如果您在云端运行至少 1 个 CoreDNS 副本，则必须允许指向运行 CoreDNS 的 VPC 的 DNS 流量。  | 
|  用户定义  |  用户定义  |  入站、出站  |  应用程序端口  |  远程容器组 CIDR  |  远程容器组 CIDR  |  容器组（pod）到容器组（pod）  | 

**注意**  
 1 EKS 集群的 IP。请参阅以下有关 Amazon EKS 弹性网络接口的章节。

### Amazon EKS 网络接口
<a name="hybrid-nodes-networking-eks-network-interfaces"></a>

Amazon EKS 将网络接口附加到您在集群创建期间传递的 VPC 中的子网，从而实现 EKS 控制面板与您的 VPC 之间的通信。Amazon EKS 创建的网络接口可以在集群创建后通过 Amazon EC2 控制台查看，也可以通过 AWS CLI 查看。对 EKS 集群应用更改（例如 Kubernetes 版本升级）时，系统会删除原始网络接口并创建新的网络接口。您可以在集群创建期间传递子网时使用受限子网大小来限制 Amazon EKS 网络接口的 IP 范围，从而更轻松地配置本地防火墙，允许与已知受限 IP 集的入站/出站连接。要控制要在其中创建网络接口的子网，您可以在创建集群时限制指定的子网数，或者在创建集群后更新子网。

由 Amazon EKS 预置的网络接口的描述格式为 `Amazon EKS your-cluster-name `。有关可用于查找 Amazon EKS 所预置网络接口的 IP 地址的 AWS CLI 命令，请参阅以下示例。请将 `VPC_ID` 替换为您在创建集群时传递的 VPC 的 ID。

```
aws ec2 describe-network-interfaces \
--query 'NetworkInterfaces[?(VpcId == VPC_ID && contains(Description,Amazon EKS))].PrivateIpAddress'
```

## AWS VPC 和子网设置
<a name="hybrid-nodes-networking-vpc"></a>

Amazon EKS 的现有 [VPC 和子网要求](network-reqs.md)适用于使用混合节点的集群。此外，VPC CIDR 不能与本地节点和容器组 CIDR 重叠。必须在 VPC 路由表中为本地节点以及（可选）容器组 CIDR 配置路由。这些路由必须设置为将流量路由到用于混合网络连接的网关，这通常是虚拟专用网关（VGW）或中转网关（TGW）。如果您使用 TGW 或 VGW 来连接 VPC 和本地环境，则必须为您的 VPC 创建 TGW 或 VGW 连接。VPC 必须具有 DNS 主机名和 DNS 解析支持。

以下步骤会用到 AWS CLI。您还可以在 AWS 管理控制台中或使用其他接口（例如 AWS CloudFormation、AWS CDK 或 Terraform）创建这些资源。

### 第 1 步：创建 VPC
<a name="_step_1_create_vpc"></a>

1. 运行以下命令以创建一个 VPC。将 VPC\$1CIDR 替换为符合 RFC 1918（私有）、CGNAT（RFC 6598）或非 RFC 1918/非 CGNAT（公有）的 IPv4 CIDR 范围（例如 10.0.0.0/16）。注意：VPC 会默认启用 DNS 解析，这是 EKS 的一项要求。

   ```
   aws ec2 create-vpc --cidr-block VPC_CIDR
   ```

1. 为 VPC 启用 DNS 主机名。VPC 会默认启用 DNS 解析。请将 `VPC_ID` 替换为在上一步中创建的 VPC 的 ID。

   ```
   aws ec2 modify-vpc-attribute --vpc-id VPC_ID --enable-dns-hostnames
   ```

### 第 2 步：创建子网
<a name="_step_2_create_subnets"></a>

至少创建 2 个子网。Amazon EKS 会将这些子网作为集群网络接口。有关更多信息，请参阅[子网要求和注意事项](network-reqs.md#network-requirements-subnets)。

1. 您可以使用以下命令找到 AWS 区域的可用区。请将 `us-west-2` 替换为您的区域。

   ```
   aws ec2 describe-availability-zones \
        --query 'AvailabilityZones[?(RegionName == us-west-2)].ZoneName'
   ```

1. 创建子网。请将 `VPC_ID` 替换为 VPC 的 ID。请将 `SUBNET_CIDR` 替换为子网的 CIDR 块（例如 10.0.1.0/24）。请将 `AZ` 替换为将在其中创建子网的可用区（例如 us-west-2a）。您创建的子网必须至少位于 2 个不同的可用区。

   ```
   aws ec2 create-subnet \
       --vpc-id VPC_ID \
       --cidr-block SUBNET_CIDR \
       --availability-zone AZ
   ```

### （可选）第 3 步：使用 Amazon VPC Transit Gateway（TGW）或 AWS Direct Connect 虚拟专用网关（VGW）附加 VPC
<a name="optional_step_3_attach_vpc_with_amazon_vpc_transit_gateway_tgw_or_shared_aws_direct_connect_virtual_private_gateway_vgw"></a>

如果使用 TGW 或 VGW，请将您的 VPC 连接到该 TGW 或 VGW。有关更多信息，请参阅 [Amazon VPC attachments in Amazon VPC Transit Gateways](https://docs.aws.amazon.com/vpc/latest/tgw/tgw-vpc-attachments.html) 或 [AWS Direct Connect virtual private gateway associations](https://docs.aws.amazon.com/vpn/latest/s2svpn/how_it_works.html#VPNGateway)。

 **Transit Gateway** 

运行以下命令连接某个中转网关。请将 `VPC_ID` 替换为 VPC 的 ID。请将 `SUBNET_ID1` 和 `SUBNET_ID2` 替换为在上一步中创建的子网的 ID。请将 `TGW_ID` 替换为 TGW 的 ID。

```
aws ec2 create-transit-gateway-vpc-attachment \
    --vpc-id VPC_ID \
    --subnet-ids SUBNET_ID1 SUBNET_ID2 \
    --transit-gateway-id TGW_ID
```

 **虚拟专用网关** 

运行以下命令连接某个中转网关。请将 `VPN_ID` 替换为 VGW 的 ID。请将 `VPC_ID` 替换为 VPC 的 ID。

```
aws ec2 attach-vpn-gateway \
    --vpn-gateway-id VPN_ID \
    --vpc-id VPC_ID
```

### （可选）第 4 步：创建路由表
<a name="_optional_step_4_create_route_table"></a>

您可以修改 VPC 的主路由表，也可以创建自定义路由表。以下步骤将创建一个自定义路由表，其中包含本地节点和容器组 CIDR 的路由。有关更多信息，请参阅[子网路由表](https://docs.aws.amazon.com/vpc/latest/userguide/subnet-route-tables.html)。请将 `VPC_ID` 替换为 VPC 的 ID。

```
aws ec2 create-route-table --vpc-id VPC_ID
```

### 第 5 步：创建本地节点和容器组的路由
<a name="_step_5_create_routes_for_on_premises_nodes_and_pods"></a>

在路由表中创建每个本地远程节点的路由。您可以修改 VPC 的主路由表，也可以使用您在上一步中创建的自定义路由表。

以下示例展示了如何创建本地节点和容器组 CIDR 的路由。这些示例使用中转网关（TGW）将 VPC 连接到本地环境。如果您有多个本地节点和容器组 CIDR，请对每个 CIDR 重复这些步骤。
+ 如果您使用互联网网关或虚拟专用网关（VGW），请将 `--transit-gateway-id` 替换为 `--gateway-id`。
+ 请将 `RT_ID` 替换为在上一步中创建的路由表的 ID。
+ 请将 `REMOTE_NODE_CIDR` 替换为将用于混合节点的 CIDR 范围。
+ 请将 `REMOTE_POD_CIDR` 替换为将在混合节点上运行的容器组的 CIDR 范围。容器组 CIDR 范围对应于容器网络接口（CNI）配置，后者最常使用的是叠加本地网络。有关更多信息，请参阅 [为混合节点配置 CNI](hybrid-nodes-cni.md)。
+ 请将 `TGW_ID` 替换为 TGW 的 ID。

 **远程节点网络** 

```
aws ec2 create-route \
    --route-table-id RT_ID \
    --destination-cidr-block REMOTE_NODE_CIDR \
    --transit-gateway-id TGW_ID
```

 **远程容器组（pod）网络** 

```
aws ec2 create-route \
    --route-table-id RT_ID \
    --destination-cidr-block REMOTE_POD_CIDR \
    --transit-gateway-id TGW_ID
```

### （可选）第 6 步：将子网关联到路由表
<a name="_optional_step_6_associate_subnets_with_route_table"></a>

如果在上一步中创建了自定义路由表，请将您在上一步中创建的每个子网关联到您的自定义路由表。如果您选择修改 VPC 主路由表，则子网会自动关联到 VPC 的主路由表，因此可以跳过此步骤。

为您在之前步骤中创建的每个子网运行以下命令。请将 `RT_ID` 替换为在上一步中创建的路由表。请将 `SUBNET_ID` 替换为子网的 ID。

```
aws ec2 associate-route-table --route-table-id RT_ID --subnet-id SUBNET_ID
```

## 集群安全组配置
<a name="hybrid-nodes-networking-cluster-sg"></a>

EKS 集群安全组需要具有以下访问权限才能进行持续集群操作。当您创建或更新配置了远程节点和容器组（pod）网络的集群时，Amazon EKS 会自动为混合节点创建所需的**入站**安全组规则。默认情况下，安全组允许所有**出站**流量，因此 Amazon EKS 不会自动为混合节点修改集群安全组的**出站**规则。如果要自定义集群安全组，可将流量限制在下表中的规则范围内。


| Type | 协议 | Direction | 端口： | 来源 | 目标 | 用法 | 
| --- | --- | --- | --- | --- | --- | --- | 
|  HTTPS  |  TCP  |  入站  |  443  |  远程节点 CIDR  |  不适用  |  Kubelet 到 Kubernetes API 服务器  | 
|  HTTPS  |  TCP  |  入站  |  443  |  远程容器组 CIDR  |  不适用  |  当 CNI 未使用 NAT 来处理容器组流量时，容器组需要访问 K8s API 服务器的权限。  | 
|  HTTPS  |  TCP  |  出站  |  10250  |  不适用  |  远程节点 CIDR  |  Kubernetes API 服务器到 Kubelet  | 
|  HTTPS  |  TCP  |  出站  |  Webhook 端口  |  不适用  |  远程容器组 CIDR  |  Kubernetes API 服务器到 Webhook（如果在混合节点上运行 Webhook）  | 

**重要**  
 **安全组规则限制**：Amazon EC2 安全组默认最多有 60 条入站规则。如果集群安全组接近此限制，则安全组入站规则可能无法生效。在这种情况下，可能需要手动添加缺少的入站规则。  
 **CIDR 清理责任**：如果您从 EKS 集群中移除远程节点或容器组（pod）网络，EKS 不会自动移除相应的安全组规则。您负责从安全组规则中手动移除未使用的远程节点或容器组（pod）网络。

有关 Amazon EKS 创建的集群安全组的更多信息，请参阅 [查看集群的 Amazon EKS 安全组要求](sec-group-reqs.md)。

### （可选）手动安全组配置
<a name="_optional_manual_security_group_configuration"></a>

如果您需要创建其他安全组或修改自动创建的规则，可以参考以下命令。默认情况下，以下命令会创建一个允许所有出站访问的安全组。您可以将出站访问范围限定为仅包含上述规则。如果您考虑限制出站规则，我们建议您首先全面测试所有应用程序和容器组，然后再将更改后的规则应用于生产集群。
+ 请将第一个命令中的 `SG_NAME` 替换为安全组的名称
+ 请将第一个命令中的 `VPC_ID` 替换为在上一步中创建的 VPC 的 ID
+ 请将第二个命令中的 `SG_ID` 替换为您在第一个命令中创建的安全组的 ID
+ 请将第二个命令中的 `REMOTE_NODE_CIDR` 和 `REMOTE_POD_CIDR` 替换为混合节点和本地网络的相应值。

```
aws ec2 create-security-group \
    --group-name SG_NAME \
    --description "security group for hybrid nodes" \
    --vpc-id VPC_ID
```

```
aws ec2 authorize-security-group-ingress \
    --group-id SG_ID \
    --ip-permissions '[{"IpProtocol": "tcp", "FromPort": 443, "ToPort": 443, "IpRanges": [{"CidrIp": "REMOTE_NODE_CIDR"}, {"CidrIp": "REMOTE_POD_CIDR"}]}]'
```