

 **帮助改进此页面** 

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

# 为混合节点配置 CNI
<a name="hybrid-nodes-cni"></a>

Cilium 是 AWS 支持的 Amazon EKS 混合节点功能容器网络接口（CNI）。您必须为混合节点安装 CNI 才能使其做好服务工作负载的准备。在 CNI 开始运行之前，混合节点的状态会显示为 `Not Ready`。您可以使用自己选择的工具（例如 Helm）来管理该 CNI。本页上的说明涵盖了 Cilium 生命周期管理（安装、升级、删除）。有关如何配置 Cilium 的入口、负载均衡和网络策略的信息，请参阅[Cilium 入口和 Cilium 网关概述](hybrid-nodes-ingress.md#hybrid-nodes-ingress-cilium)、[服务类型 LoadBalancer](hybrid-nodes-ingress.md#hybrid-nodes-ingress-cilium-loadbalancer)和[为混合节点配置 Kubernetes 网络策略](hybrid-nodes-network-policies.md)。

在 AWS 云中的节点上运行时，AWS 不支持 Cilium。Amazon VPC CNI 与混合节点功能不兼容，并且 VPC CNI 使用 `eks.amazonaws.com/compute-type: hybrid` 标签配置了反亲和性。

本页之前的 Calico 文档已移至 [EKS Hybrid Examples Repository](https://github.com/aws-samples/eks-hybrid-examples)。

## 版本兼容性
<a name="hybrid-nodes-cilium-version-compatibility"></a>

对于 Amazon EKS 所支持的全部 Kubernetes 版本，其 EKS 混合节点均兼容 Cilium `v1.17.x` 与 `v1.18.x` 版本。

**注意**  
 **Cilium v1.18.3 内核版本要求**：由于该版本存在内核版本限制（要求 Linux 内核版本 ≥ 5.10），因此 Cilium v1.18.3 无法在以下节点上使用：
+ Ubuntu 20.04
+ Red Hat Enterprise Linux (RHEL) 8

有关系统要求，请参阅 [Cilium 系统要求](https://docs.cilium.io/en/stable/operations/system_requirements/)。

有关 Amazon EKS 支持的 Kubernetes 版本，请参阅 [Kubernetes 版本支持](https://docs.aws.amazon.com/eks/latest/userguide/kubernetes-versions.html)。EKS 混合节点功能提供的 Kubernetes 版本支持与具有云端节点的 Amazon EKS 集群相同。

## 支持的功能
<a name="hybrid-nodes-cilium-support"></a>

 AWS 维护基于开源 [Cilium 项目](https://github.com/cilium/cilium)的适用于 EKS 混合节点的 Cilium 构建版本。要获得 AWS 对 Cilium 的支持，您必须使用由 AWS 维护的 Cilium 构建版本和支持的 Cilium 版本。

 AWS 为 Cilium 以下功能的默认配置提供技术支持，以用于 EKS 混合节点。如果您计划使用不属于 AWS 支持范围的功能，建议您获得 Cilium 的替代商业支持，或者利用内部专业知识对 Cilium 项目进行问题排查并提供修复。


| Cilium 功能 | 由 AWS 支持  | 
| --- | --- | 
|  Kubernetes 网络合规性  |  是  | 
|  核心集群连接性  |  是  | 
|  IP 系列  |  IPv4  | 
|  生命周期管理  |  Helm  | 
|  联网模式  |  VXLAN 封装  | 
|  IP 地址管理（IPAM）  |  Cilium IPAM 集群范围  | 
|  网络策略  |  Kubernetes 网络策略  | 
|  边界网关协议（BGP）  |  Cilium BGP 控制面板  | 
|  Kubernetes 入口  |  Cilium 入口、Cilium 网关  | 
|  服务 LoadBalancer IP 分配  |  Cilium 负载均衡器 IPAM  | 
|  服务 LoadBalancer IP 地址通告  |  Cilium BGP 控制面板  | 
|  kube-proxy 替换  |  是  | 

## Cilium 注意事项
<a name="hybrid-nodes-cilium-considerations"></a>
+  **Helm 存储库**：AWS 在 [Amazon EKS Cilium/Cilium](https://gallery.ecr.aws/eks/cilium/cilium) 的 Amazon Elastic Container Registry Public（Amazon ECR Public）中托管 Cilium Helm 图表。可用版本包括：
  + Cilium v1.17.9：`oci://public.ecr.aws/eks/cilium/cilium:1.17.9-0`
  + Cilium v1.18.3：`oci://public.ecr.aws/eks/cilium/cilium:1.18.3-0`

    本主题中的命令使用此存储库。请注意，某些 `helm repo` 命令对于 Amazon ECR Public 中的 Helm 存储库无效，因此您无法从本地 Helm 存储库名称中引用此存储库。因此请在大多数命令中使用完整的 URI。
+ [默认情况下，Cilium 配置为在覆盖/隧道模式下运行，并以 VXLAN 为封装方法](https://docs.cilium.io/en/stable/network/concepts/routing/#encapsulation)。此模式对底层物理网络的要求最低。
+ 默认情况下，对于离开集群的所有容器组流量，Cilium 会将其源 IP 地址[伪装](https://docs.cilium.io/en/stable/network/concepts/masquerading/)为该节点的 IP 地址。如果禁用伪装功能，则您的容器组（pod）CIDR 必须可在本地网络上路由。
+ 如果在混合节点上运行 Webhook，则您的容器组（pod）CIDR 必须可在本地网络上路由。如果容器组 CIDR 无法在本地网络上路由，则建议在同一集群中的云端节点上运行 Webhook。有关更多信息，请参阅 [为混合节点配置 Webhook](hybrid-nodes-webhooks.md) 和 [准备混合节点的联网](hybrid-nodes-networking.md)。
+  AWS 建议使用 Cilium 的内置 BGP 功能，使您的容器组（pod）CIDR 可在本地网络上路由。有关如何为 Cilium BGP 配置混合节点的更多信息，请参阅[为混合节点配置 Cilium BGP](hybrid-nodes-cilium-bgp.md)。
+ Cilium 中的默认 IP 地址管理（IPAM）称为[集群范围](https://docs.cilium.io/en/stable/network/concepts/ipam/cluster-pool/)，其中 Cilium 管理器根据用户配置的容器组（pod）CIDR 为每个节点分配 IP 地址。

## 在混合节点上安装 Cilium
<a name="hybrid-nodes-cilium-install"></a>

### 过程
<a name="_procedure"></a>

1. 创建一个名为 `cilium-values.yaml` 的 YAML 文件。以下示例通过设置 Cilium 代理和管理器的 `eks.amazonaws.com/compute-type: hybrid` 标签的亲和性，将 Cilium 配置为仅在混合节点上运行。
   + 使用为 EKS 集群的*远程容器组（pod）网络*配置的相同 容器组（pod）CIDR，对 `clusterPoolIpv4PodCIDRList` 进行配置。例如 `10.100.0.0/24`。Cilium 管理器从配置的 `clusterPoolIpv4PodCIDRList` IP 空间内分配 IP 地址切片。容器组（pod）CIDR 不得与本地节点 CIDR、VPC CIDR 或 Kubernetes 服务 CIDR 重叠。
   + 根据每个节点所需的容器组数量配置 `clusterPoolIpv4MaskSize`。例如，`25` 对应于分段大小 /25，每个节点 128 个容器组。
   + 在集群上部署 Cilium 之后，请勿更改 `clusterPoolIpv4PodCIDRList` 或 `clusterPoolIpv4MaskSize`，请参阅 [Expanding the cluster pool](https://docs.cilium.io/en/stable/network/concepts/ipam/cluster-pool/#expanding-the-cluster-pool) 了解更多信息。
   + 如果在 kube-proxy 替换模式下运行 Cilium，请在 Helm 值中设置 `kubeProxyReplacement: "true"`，并确保在与 Cilium 相同的节点上没有运行现有的 kube-proxy 部署。
   + 以下示例禁用了 Cilium 用于 L7 网络策略和入口的 Envoy 第 7 层（L7）代理。有关更多信息，请参阅[为混合节点配置 Kubernetes 网络策略](hybrid-nodes-network-policies.md)和[Cilium 入口和 Cilium 网关概述](hybrid-nodes-ingress.md#hybrid-nodes-ingress-cilium)。
   + 以下示例配置 `loadBalancer.serviceTopology`: `true`，以便在您为服务配置了服务流量分发功能的情况下，该功能可以正常运行。有关更多信息，请参阅 [配置服务流量分布](hybrid-nodes-webhooks.md#hybrid-nodes-mixed-service-traffic-distribution)。
   + 有关适用于 Cilium 的完整 Helm 值列表，请参阅 Cilium 文档中的 [Helm reference](https://docs.cilium.io/en/stable/helm-reference/)。

     ```
     affinity:
       nodeAffinity:
         requiredDuringSchedulingIgnoredDuringExecution:
           nodeSelectorTerms:
           - matchExpressions:
             - key: eks.amazonaws.com/compute-type
               operator: In
               values:
               - hybrid
     ipam:
       mode: cluster-pool
       operator:
         clusterPoolIPv4MaskSize: 25
         clusterPoolIPv4PodCIDRList:
         - POD_CIDR
     loadBalancer:
       serviceTopology: true
     operator:
       affinity:
         nodeAffinity:
           requiredDuringSchedulingIgnoredDuringExecution:
             nodeSelectorTerms:
             - matchExpressions:
               - key: eks.amazonaws.com/compute-type
                 operator: In
                 values:
                   - hybrid
       unmanagedPodWatcher:
         restart: false
     loadBalancer:
       serviceTopology: true
     envoy:
       enabled: false
     kubeProxyReplacement: "false"
     ```

1. 在集群上安装 Cilium。
   + 将 `CILIUM_VERSION` 替换为某个 Cilium 版本（例如 `1.17.9-0` 或 `1.18.3-0`）。建议使用 Cilium 次要版本的最新补丁版本。
   + 确保节点符合所选版本的内核版本要求。Cilium v1.18.3 要求 Linux 内核版本 ≥ 5.10。
   + 如果使用特定的 kubeconfig 文件，请在 Helm install 命令中使用 `--kubeconfig` 标志。

     ```
     helm install cilium oci://public.ecr.aws/eks/cilium/cilium \
         --version CILIUM_VERSION \
         --namespace kube-system \
         --values cilium-values.yaml
     ```

1. 使用以下命令确认 Cilium 安装是否成功。您应会看到 `cilium-operator` 部署以及在每个混合节点上运行的 `cilium-agent`。此外，混合节点现在的状态应为 `Ready`。有关如何配置 Cilium BGP 以向本地网络通告您的容器组（pod）CIDR 的信息，请转到[为混合节点配置 Cilium BGP](hybrid-nodes-cilium-bgp.md)。

   ```
   kubectl get pods -n kube-system
   ```

   ```
   NAME                              READY   STATUS    RESTARTS   AGE
   cilium-jjjn8                      1/1     Running   0          11m
   cilium-operator-d4f4d7fcb-sc5xn   1/1     Running   0          11m
   ```

   ```
   kubectl get nodes
   ```

   ```
   NAME                   STATUS   ROLES    AGE   VERSION
   mi-04a2cf999b7112233   Ready    <none>   19m   v1.31.0-eks-a737599
   ```

## 在混合节点上升级 Cilium
<a name="hybrid-nodes-cilium-upgrade"></a>

在升级 Cilium 部署之前，请仔细查看 [Cilium 升级文档](https://docs.cilium.io/en/v1.17/operations/upgrade/)和升级说明，以了解目标 Cilium 版本中的更改。

1. 确保已在命令行环境中安装了 `helm` CLI。有关安装说明，请参阅 [Helm 文档](https://helm.sh/docs/intro/quickstart/)。

1. 运行 Cilium 升级预检。请将 `CILIUM_VERSION` 替换为您的目标 Cilium 版本。建议运行 Cilium 次要版本的最新补丁版本。您可以在 Cilium 文档的 [Stable Releases section](https://github.com/cilium/cilium#stable-releases) 部分找到给定次要 Cilium 版本的最新补丁版本。

   ```
   helm install cilium-preflight oci://public.ecr.aws/eks/cilium/cilium --version CILIUM_VERSION \
     --namespace=kube-system \
     --set preflight.enabled=true \
     --set agent=false \
     --set operator.enabled=false
   ```

1. 应用 `cilium-preflight.yaml` 后，请确保状态为 `READY` 的容器组（pod）数量与正在运行的 Cilium 容器组（pod）数量相同。

   ```
   kubectl get ds -n kube-system | sed -n '1p;/cilium/p'
   ```

   ```
   NAME                      DESIRED   CURRENT   READY   UP-TO-DATE   AVAILABLE   NODE SELECTOR   AGE
   cilium                    2         2         2       2            2           <none>          1h20m
   cilium-pre-flight-check   2         2         2       2            2           <none>          7m15s
   ```

1. 一旦状态为 READY 的容器组数量相等，请确保 Cilium 执行前部署也标记为 READY 1/1。如果显示为 READY 0/1，请先查阅 [CNP Validation](https://docs.cilium.io/en/v1.17/operations/upgrade/#cnp-validation) 部分并解决部署问题，然后再继续升级。

   ```
   kubectl get deployment -n kube-system cilium-pre-flight-check -w
   ```

   ```
   NAME                      READY   UP-TO-DATE   AVAILABLE   AGE
   cilium-pre-flight-check   1/1     1            0           12s
   ```

1. 删除预检

   ```
   helm uninstall cilium-preflight --namespace kube-system
   ```

1. 在运行 `helm upgrade` 命令之前，请将部署值保留在 `existing-cilium-values.yaml` 中，或在运行升级命令时为您的设置使用 `--set` 命令行选项。升级操作会覆盖 Cilium ConfigMap，因此在升级时传递配置值至关重要。

   ```
   helm get values cilium --namespace kube-system -o yaml > existing-cilium-values.yaml
   ```

1. 在正常的集群操作期间，所有 Cilium 组件都应运行相同的版本。以下步骤介绍了如何将所有组件从一个稳定版本升级到更高的稳定版本。从一个次要版本升级到另一个次要版本时，建议先升级到现有 Cilium 次要版本的最新补丁版本。为尽可能减少中断，请将 `upgradeCompatibility` 选项设置为此集群中安装的初始 Cilium 版本。

   ```
   helm upgrade cilium oci://public.ecr.aws/eks/cilium/cilium --version CILIUM_VERSION \
     --namespace kube-system \
     --set upgradeCompatibility=1.X \
     -f existing-cilium-values.yaml
   ```

1. （可选）如果由于问题出现需要回滚升级，请运行以下命令。

   ```
   helm history cilium --namespace kube-system
   helm rollback cilium [REVISION] --namespace kube-system
   ```

## 从混合节点中删除 Cilium
<a name="hybrid-nodes-cilium-delete"></a>

1. 运行以下命令从集群中卸载所有 Cilium 组件。请注意，卸载 CNI 可能会影响节点和容器组（pod）的运行状况，因此不应在生产集群上执行卸载。

   ```
   helm uninstall cilium --namespace kube-system
   ```

   从集群中移除 CNI 时，Cilium 配置的接口和路由默认不会移除，有关更多信息，请参阅 [GitHub issue](https://github.com/cilium/cilium/issues/34289)。

1. 要清理磁盘上的配置文件和资源，如果使用的是标准配置目录，则可以移除 GitHub Cilium 存储库中 [`cni-uninstall.sh` 脚本](https://github.com/cilium/cilium/blob/main/plugins/cilium-cni/cni-uninstall.sh)所显示的文件。

1. 要从集群中移除 Cilium 自定义资源定义（CRD），可以运行以下命令。

   ```
   kubectl get crds -oname | grep "cilium" | xargs kubectl delete
   ```