为混合节点配置 CNI - Amazon EKS

帮助改进此页面

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

为混合节点配置 CNI

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

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

本页之前的 Calico 文档已移至 EKS Hybrid Examples Repository

版本兼容性

对于 Amazon EKS 支持的每个 Kubernetes 版本,EKS 混合节点都支持 Cilium v1.17.x 版本。

有关 Amazon EKS 支持的 Kubernetes 版本,请参阅 Kubernetes 版本支持。EKS 混合节点功能提供的 Kubernetes 版本支持与具有云端节点的 Amazon EKS 集群相同。

支持的功能

AWS 维护基于开源 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 注意事项

  • Helm 存储库:AWS 在 Amazon EKS Cilium/Cilium 的 Amazon Elastic Container Registry Public(Amazon ECR Public)中托管 Cilium Helm 图表。您可以在 helm 命令中通过以下 URI 来使用此存储库:oci://public.ecr.aws/eks/cilium/cilium:1.17.6-0。本主题中的命令使用此存储库。请注意,某些 helm repo 命令对于 Amazon ECR Public 中的 Helm 存储库无效,因此您无法从本地 Helm 存储库名称中引用此存储库。因此请在大多数命令中使用完整的 URI。

  • 默认情况下,Cilium 配置为在覆盖/隧道模式下运行,并以 VXLAN 为封装方法。此模式对底层物理网络的要求最低。

  • 默认情况下,对于离开集群的所有容器组流量,Cilium 会将其源 IP 地址伪装为该节点的 IP 地址。如果禁用伪装功能,则您的容器组(pod)CIDR 必须可在本地网络上路由。

  • 如果在混合节点上运行 Webhook,则您的容器组(pod)CIDR 必须可在本地网络上路由。如果容器组 CIDR 无法在本地网络上路由,则建议在同一集群中的云端节点上运行 Webhook。有关更多信息,请参阅 为混合节点配置 Webhook准备混合节点的联网

  • AWS 建议使用 Cilium 的内置 BGP 功能,使您的容器组(pod)CIDR 可在本地网络上路由。有关如何为 Cilium BGP 配置混合节点的更多信息,请参阅为混合节点配置 Cilium BGP

  • Cilium 中的默认 IP 地址管理(IPAM)称为集群范围,其中 Cilium 管理器根据用户配置的容器组(pod)CIDR 为每个节点分配 IP 地址。

在混合节点上安装 Cilium

过程

  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 之后,请勿更改 clusterPoolIpv4PodCIDRListclusterPoolIpv4MaskSize,请参阅 Expanding the cluster pool 了解更多信息。

    • 如果在 kube-proxy 替换模式下运行 Cilium,请在 Helm 值中设置 kubeProxyReplacement: "true",并确保在与 Cilium 相同的节点上没有运行现有的 kube-proxy 部署。

    • 以下示例禁用了 Cilium 用于 L7 网络策略和入口的 Envoy 第 7 层(L7)代理。有关更多信息,请参阅为混合节点配置 Kubernetes 网络策略Cilium 入口和 Cilium 网关概述

    • 以下示例配置 loadBalancer.serviceTopology: true,以便在您为服务配置了服务流量分发功能的情况下,该功能可以正常运行。有关更多信息,请参阅 配置服务流量分布

    • 有关适用于 Cilium 的完整 Helm 值列表,请参阅 Cilium 文档中的 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"
  2. 在集群上安装 Cilium。

    • 请将 CILIUM_VERSION 替换为某个 Cilium 版本(例如 1.17.5)。建议使用 Cilium 次要版本的最新补丁版本。您可以使用 helm search repo cilium/cilium --versions 命令在本地 Helm 存储库中找到可用的最新补丁版本。

    • 如果使用特定的 kubeconfig 文件,请在 Helm install 命令中使用 --kubeconfig 标志。

      helm install cilium oci://public.ecr.aws/eks/cilium/cilium \ --version CILIUM_VERSION \ --namespace kube-system \ --values cilium-values.yaml
  3. 使用以下命令确认 Cilium 安装是否成功。您应会看到 cilium-operator 部署以及在每个混合节点上运行的 cilium-agent。此外,混合节点现在的状态应为 Ready。有关如何配置 Cilium BGP 以向本地网络通告您的容器组(pod)CIDR 的信息,请转到为混合节点配置 Cilium BGP

    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

在升级 Cilium 部署之前,请仔细查看 Cilium 升级文档和升级说明,以了解目标 Cilium 版本中的更改。

  1. 确保已在命令行环境中安装了 helm CLI。有关安装说明,请参阅 Helm 文档

  2. 运行 Cilium 升级预检。请将 CILIUM_VERSION 替换为您的目标 Cilium 版本。建议运行 Cilium 次要版本的最新补丁版本。您可以在 Cilium 文档的 Stable Releases section 部分找到给定次要 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
  3. 应用 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
  4. 一旦状态为 READY 的容器组数量相等,请确保 Cilium 执行前部署也标记为 READY 1/1。如果显示为 READY 0/1,请先查阅 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
  5. 删除预检

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

    helm get values cilium --namespace kube-system -o yaml > existing-cilium-values.yaml
  7. 在正常的集群操作期间,所有 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
  8. (可选)如果由于问题出现需要回滚升级,请运行以下命令。

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

从混合节点中删除 Cilium

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

    helm uninstall cilium --namespace kube-system

    从集群中移除 CNI 时,Cilium 配置的接口和路由默认不会移除,有关更多信息,请参阅 GitHub issue

  2. 要清理磁盘上的配置文件和资源,如果使用的是标准配置目录,则可以移除 GitHub Cilium 存储库中 cni-uninstall.sh 脚本所显示的文件。

  3. 要从集群中移除 Cilium 自定义资源定义(CRD),可以运行以下命令。

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