帮助改进此页面
要帮助改进本用户指南,请选择位于每个页面右侧窗格中的在 GitHub 上编辑此页面链接。
Amazon EKS 混合节点功能支持将 Cilium 和 Calico 作为容器网络接口(CNI)。您必须为混合节点安装 CNI 才能使其做好服务工作负载的准备。在 CNI 开始运行之前,混合节点的状态会显示为 Not Ready
。您可以使用自己选择的工具(例如 Helm)来管理这些 CNI。Amazon VPC CNI 与混合节点功能不兼容,并且 VPC CNI 使用 eks.amazonaws.com/compute-type: hybrid
标签配置了反亲和性。
CNI 版本兼容性
对于 Amazon EKS 支持的每个 Kubernetes 版本,EKS 混合节点都支持并推荐使用 Calico 3.29.x
版本。
对于 Amazon EKS 支持的每个 Kubernetes 版本,EKS 混合节点都支持并推荐使用 Cilium 1.16.x
版本。
支持的功能
AWS 支持将 Cilium 和 Calico 的以下功能用于混合节点。如果您计划使用不属于 AWS 支持范围的功能,我们建议您获得插件的商业支持,或者建立内部的故障排除专业知识并将相关修复贡献给 CNI 插件项目。
功能 | Cilium | Calico |
---|---|---|
Kubernetes 网络合规性 |
支持 |
是 |
控制面板到节点的连接 |
支持 |
是 |
控制面板到容器组的连接 |
支持 |
是 |
生命周期管理 |
安装、升级、删除 |
安装、升级、删除 |
联网模式 |
VXLAN |
VXLAN |
IP 地址管理(IPAM) |
集群范围(Cilium IPAM) |
Calico IPAM |
IP 系列 |
IPv4 |
IPv4 |
BGP |
是(Cilium 控制面板) |
是 |
在混合节点上安装 Cilium
-
确保已在命令行环境中安装了 helm CLI。有关安装说明,请参阅 Helm 文档
。 -
安装 Cilium Helm 存储库。
helm repo add cilium https://helm.cilium.io/
-
创建一个名为
cilium-values.yaml
的 YAML 文件。如果您配置了至少一个远程容器组网络,请为clusterPoolIPv4PodCIDRList
配置相同的容器组 CIDR。在集群上部署 Cilium 后,不应该更改clusterPoolIPv4PodCIDRList
。您可以根据每个节点所需的容器组数量配置clusterPoolIPv4MaskSize
,具体请参阅 Cilium 文档中的 Expanding the cluster pool。有关适用于 Cilium 的完整 Helm 值列表,请参阅 Cilium 文档中的 Helm reference 。以下示例将所有 Cilium 组件配置为仅在混合节点上运行,因为这些组件都带有 eks.amazonaws.com/compute-type: hybrid
标签。默认情况下,对于离开集群的所有容器组流量,Cilium 会将其源 IP 地址伪装为该节点的 IP 地址。这使得 Cilium 既可以使用配置了远程容器组网络的 Amazon EKS 集群运行,也可以使用未配置远程容器组网络的集群运行。如果您为 Cilium 部署禁用了伪装功能,则必须为 Amazon EKS 集群配置远程容器组网络,并且必须使用本地网络公开您的容器组地址。如果在混合节点上运行 Webhook,则必须为集群配置远程容器组网络,并且必须使用本地网络公开您的容器组地址。
在本地网络中公开容器组地址的一种常用方法是使用 BGP。要将 BGP 与 Cilium 配合使用,必须设置
bgpControlPlane.enabled: true
。要详细了解 Cilium 对 BGP 的 支持,请参阅 Cilium 文档中的 Cilium BGP Control Plane。 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 operator: affinity: nodeAffinity: requiredDuringSchedulingIgnoredDuringExecution: nodeSelectorTerms: - matchExpressions: - key: eks.amazonaws.com/compute-type operator: In values: - hybrid unmanagedPodWatcher: restart: false envoy: enabled: false
-
在集群上安装 Cilium。请将
CILIUM_VERSION
替换为所需的 Cilium 版本。建议运行 Cilium 次要版本的最新补丁版本。您可以在 Cilium 文档的 Stable Releases section部分找到给定次要 Cilium 版本的最新补丁版本。如果要为部署启用 BGP,请在下面的命令中添加 --set bgpControlPlane.enabled=true
标志。如果使用特定的 kubeconfig 文件,请在 Helm install 命令中使用--kubeconfig
标志。helm install cilium cilium/cilium \ --version
CILIUM_VERSION
\ --namespace kube-system \ --values cilium-values.yaml -
您可以使用以下命令确认 Cilium 安装是否成功。您应会看到
cilium-operator
部署以及在每个混合节点上运行的cilium-agent
。此外,混合节点现在的状态应为Ready
。有关如何为 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
-
要通过将 BGP 与 Cilium 结合使用,来向本地网络公开容器组地址,您必须已经安装了 Cilium 并配置了
bgpControlPlane.enabled: true
。要在 Cilium 中配置 BGP,请先创建一个包含CiliumBGPClusterConfig
且名为cilium-bgp-cluster.yaml
的文件,并将peerAddress
设置为要建立对等连接的本地路由器 IP。根据本地路由器配置来配置localASN
和peerASN
。apiVersion: cilium.io/v2alpha1 kind: CiliumBGPClusterConfig metadata: name: cilium-bgp spec: nodeSelector: matchExpressions: - key: eks.amazonaws.com/compute-type operator: In values: - hybrid bgpInstances: - name: "rack0" localASN: ONPREM_ROUTER_ASN peers: - name: "onprem-router" peerASN: PEER_ASN peerAddress: ONPREM_ROUTER_IP peerConfigRef: name: "cilium-peer"
-
将 Cilium BGP 集群配置应用到集群。
kubectl apply -f cilium-bgp-cluster.yaml
-
CiliumBGPPeerConfig
资源定义 BGP 对等连接配置。多个对等体可以共享相同的配置并引用共同的CiliumBGPPeerConfig
资源。创建一个名为cilium-bgp-peer.yaml
的文件,来配置本地网络的对等连接配置。有关配置选项的完整列表,请参阅 Cilium 文档中的 BGP Peer Configuration。 apiVersion: cilium.io/v2alpha1 kind: CiliumBGPPeerConfig metadata: name: cilium-peer spec: timers: holdTimeSeconds: 30 keepAliveTimeSeconds: 10 gracefulRestart: enabled: true restartTimeSeconds: 120 families: - afi: ipv4 safi: unicast advertisements: matchLabels: advertise: "bgp"
-
将 Cilium BGP 对等连接配置应用到集群。
kubectl apply -f cilium-bgp-peer.yaml
-
CiliumBGPAdvertisement
资源用于定义各种广播类型以及与之相关的属性。创建一个名为cilium-bgp-advertisement.yaml
的文件,并使用所需的设置配置CiliumBGPAdvertisement
资源。apiVersion: cilium.io/v2alpha1 kind: CiliumBGPAdvertisement metadata: name: bgp-advertisements labels: advertise: bgp spec: advertisements: - advertisementType: "PodCIDR" - advertisementType: "Service" service: addresses: - ClusterIP - ExternalIP - LoadBalancerIP
-
将 Cilium BGP 广播配置应用到集群。
kubectl apply -f cilium-bgp-advertisement.yaml
您可以通过 Cilium CLI
,使用 cilium bgp peers
命令来确认 BGP 对等连接是否有效。您应会在输出中看到您环境的正确值,会话状态为established
。有关故障排除的更多信息,请参阅 Cilium 文档中的 Troubleshooting and Operations Guide。
在混合节点上升级 Cilium
在升级 Cilium 部署之前,请仔细查看 Cilium 升级文档
-
确保已在命令行环境中安装了
helm
CLI。有关安装说明,请参阅 Helm 文档。 -
安装 Cilium Helm 存储库。
helm repo add cilium https://helm.cilium.io/
-
运行 Cilium 升级预检。请将
CILIUM_VERSION
替换为您的目标 Cilium 版本。建议运行 Cilium 次要版本的最新补丁版本。您可以在 Cilium 文档的 Stable Releases section部分找到给定次要 Cilium 版本的最新补丁版本。 helm install cilium-preflight cilium/cilium --version CILIUM_VERSION \ --namespace=kube-system \ --set preflight.enabled=true \ --set agent=false \ --set operator.enabled=false
-
应用
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
-
一旦状态为 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
-
删除预检
helm uninstall cilium-preflight --namespace kube-system
-
在正常的集群操作期间,所有 Cilium 组件都应运行相同的版本。以下步骤介绍了如何将所有组件从一个稳定版本升级到更高的稳定版本。从一个次要版本升级到另一个次要版本时,建议先升级到现有 Cilium 次要版本的最新补丁版本。为尽可能减少中断,请将
upgradeCompatibility
选项设置为此集群中安装的初始 Cilium 版本。在运行 helm upgrade 命令之前,请将部署值保留在
cilium-values.yaml
中或为您的设置使用--set
命令行选项。升级操作会覆盖 Cilium ConfigMap,因此在升级时传递配置值至关重要。如果使用 BGP,建议使用--set bgpControlPlane=true
命令行选项,而不是在值文件中提供此信息。helm upgrade cilium cilium/cilium --version CILIUM_VERSION \ --namespace kube-system \ --set upgradeCompatibility=1.X \ -f cilium-values.yaml
-
(可选)如果由于问题出现需要回滚升级,请运行以下命令。
helm history cilium --namespace kube-system helm rollback cilium [REVISION] --namespace kube-system
从混合节点中删除 Cilium
-
运行以下命令从集群中卸载所有 Cilium 组件。请注意,卸载 CNI 可能会影响节点和容器组的运行状况,因此不应在生产集群上执行卸载。
helm uninstall cilium --namespace kube-system
从集群中移除 CNI 时,Cilium 配置的接口和路由默认不会移除,有关更多信息,请参阅 GitHub issue
。 -
要清理磁盘上的配置文件和资源,如果使用的是标准配置目录,则可以移除 GitHub Cilium 存储库中
cni-uninstall.sh
脚本所显示的文件。 -
要从集群中移除 Cilium 自定义资源定义(CRD),可以运行以下命令。
kubectl get crds -oname | grep "cilium" | xargs kubectl delete
在混合节点上安装 Calico
-
确保已在命令行环境中安装了 helm CLI。有关安装说明,请参阅 Helm 文档
。 -
安装 Cilium Helm 存储库。
helm repo add projectcalico https://docs.tigera.io/calico/charts
-
创建一个名为
calico-values.yaml
的 YAML 文件,为 Calico 配置亲和性,以在混合节点上运行。有关不同 Calico 联网模式的更多信息,请参阅 Calico 文档中的 Determining the best networking option。 -
请将
POD_CIDR
替换为容器组的 CIDR 范围。如果为 Amazon EKS 集群配置了远程容器组网络,则您为 Calico 指定的POD_CIDR
应与远程容器组网络相同。例如,10.100.0.0/24
。 -
请将
CIDR_SIZE
替换为要分配给每个节点的 CIDR 分段大小。例如,25
对应于 /25 的分段大小。有关 CIDRblockSize
和更改blockSize
的更多信息,请参阅 Calico 文档中的 Change IP pool block size。 -
在下面的示例中,
natOutgoing
已启用但bgp
已禁用。在此配置中,Calico 既可以在配置了远程容器组网络的 Amazon EKS 集群上运行,也可以在未配置远程容器组网络的集群上运行。如果您将natOutgoing
设置为禁用,则必须为集群配置远程容器组网络,并且本地网络必须能够正确路由发往容器组 CIDR 的流量。在本地网络中公开容器组地址的一种常用方法是使用 BGP。要将 BGP 与 Calico 结合使用,必须启用bgp
。以下示例将所有 Calico 组件配置为仅在混合节点上运行,因为这些组件都带有eks.amazonaws.com/compute-type: hybrid
标签。如果在混合节点上运行 Webhook,则必须为集群配置远程容器组网络,并且必须使用本地网络公开您的容器组地址。以下示例配置的值为controlPlaneReplicas: 1
,如果您有多个混合节点并希望以高可用性方式运行 Calico 控制面板组件,请增加该值。installation: enabled: true cni: type: Calico ipam: type: Calico calicoNetwork: bgp: Disabled ipPools: - cidr: POD_CIDR blockSize: CIDR_SIZE encapsulation: VXLAN natOutgoing: Enabled nodeSelector: eks.amazonaws.com/compute-type == "hybrid" controlPlaneReplicas: 1 controlPlaneNodeSelector: eks.amazonaws.com/compute-type: hybrid calicoNodeDaemonSet: spec: template: spec: nodeSelector: eks.amazonaws.com/compute-type: hybrid csiNodeDriverDaemonSet: spec: template: spec: nodeSelector: eks.amazonaws.com/compute-type: hybrid calicoKubeControllersDeployment: spec: template: spec: nodeSelector: eks.amazonaws.com/compute-type: hybrid typhaDeployment: spec: template: spec: nodeSelector: eks.amazonaws.com/compute-type: hybrid
-
-
在集群上安装 Calico。请将
CALICO_VERSION
替换为需要的 Calico 版本(例如 3.29.0)替换,请参阅 Calico releases以查找 Calico 次要版本的最新补丁版本。建议运行 Calico 次要版本的最新补丁版本。如果您使用特定的 kubeconfig
文件,请使用--kubeconfig
标志。helm install calico projectcalico/tigera-operator \ --version
CALICO_VERSION
\ --namespace kube-system \ -f calico-values.yaml -
您可以使用以下命令确认 Calico 安装是否成功。您应会看到
tigera-operator
部署、在每个混合节点上运行的calico-node
代理,以及部署的calico-apiserver
、csi-node-driver
和calico-kube-controllers
。此外,混合节点现在的状态应为Ready
。如果使用natOutgoing: Disabled
,则在向本地网络公开容器组地址之前,所有 Calico 组件都将无法成功启动。有关如何为 Calico 配置 BGP 的信息,请继续执行下一步。kubectl get pods -A
NAMESPACE NAME READY STATUS RESTARTS AGE calico-apiserver calico-apiserver-6c77bb6d46-2n8mq 1/1 Running 0 69s calico-system calico-kube-controllers-7c5f8556b5-7h267 1/1 Running 0 68s calico-system calico-node-s5nnk 1/1 Running 0 68s calico-system calico-typha-6487cc9d8c-wc5jm 1/1 Running 0 69s calico-system csi-node-driver-cv42d 2/2 Running 0 68s kube-system coredns-7bb495d866-2lc9v 1/1 Running 0 6m27s kube-system coredns-7bb495d866-2t8ln 1/1 Running 0 157m kube-system kube-proxy-lxzxh 1/1 Running 0 18m kube-system tigera-operator-f8bc97d4c-28b4d 1/1 Running 0 90s
kubectl get nodes
NAME STATUS ROLES AGE VERSION mi-0c6ec2f6f79176565 Ready <none> 5h13m v1.31.0-eks-a737599
-
如果您在不启用 BGP 的情况下安装 Calico,请跳过此步骤。要配置 BGP,请创建一个名为
calico-bgp.yaml
的文件,其中包含一个BGPPeer
配置和一个BGPConfiguration
。区分BGPPeer
和BGPConfiguration
十分重要。BGPPeer
是 Calico 集群中的节点将建立对等连接并且启用了 BGP 的路由器或远程资源。BGPPeer
配置中的asNumber
与 Cilium 设置peerASN
类似。BGPConfiguration
会应用到每个 Calico 节点,BGPConfiguration
的asNumber
等效于 Cilium 设置localASN
。请将以下示例中的ONPREM_ROUTER_IP
、ONPREM_ROUTER_ASN
和LOCAL_ASN
替换为本地环境的相应值。keepOriginalNextHop: true
设置用于确保每个节点仅公开其拥有的容器组网络 CIDR。apiVersion: projectcalico.org/v3 kind: BGPPeer metadata: name: calico-hybrid-nodes spec: peerIP:
ONPREM_ROUTER_IP
asNumber:ONPREM_ROUTER_ASN
keepOriginalNextHop: true --- apiVersion: projectcalico.org/v3 kind: BGPConfiguration metadata: name: default spec: nodeToNodeMeshEnabled: false asNumber:LOCAL_ASN
-
将此文件应用于集群。
kubectl apply -f calico-bgp.yaml
-
使用以下命令确认 Calico 容器组正在运行。
kubectl get pods -n calico-system -w
NAMESPACE NAME READY STATUS RESTARTS AGE calico-apiserver calico-apiserver-598bf99b6c-2vltk 1/1 Running 0 3h24m calico-system calico-kube-controllers-75f84bbfd6-zwmnx 1/1 Running 31 (59m ago) 3h20m calico-system calico-node-9b2pg 1/1 Running 0 5h17m calico-system calico-typha-7d55c76584-kxtnq 1/1 Running 0 5h18m calico-system csi-node-driver-dmnmm 2/2 Running 0 5h18m kube-system coredns-7bb495d866-dtn4z 1/1 Running 0 6h23m kube-system coredns-7bb495d866-mk7j4 1/1 Running 0 6h19m kube-system kube-proxy-vms28 1/1 Running 0 6h12m kube-system tigera-operator-55f9d9d565-jj9bg 1/1 Running 0 73m
如果您在这些步骤中遇到问题,请参阅 Calico 文档中的 troubleshooting guidance
在混合节点上升级 Calico
在升级 Calico 部署之前,请仔细查看 Calico 升级文档
-
下载您要升级到的 Calico 版本的操作符清单。请将
CALICO_VERSION
替换为要升级到的版本,例如v3.29.0
。务必要在 major.minor.patch 前面加上v
。kubectl apply --server-side --force-conflicts \ -f https://raw.githubusercontent.com/projectcalico/calico/
CALICO_VERSION
/manifests/operator-crds.yaml -
运行
helm upgrade
以升级 Calico 部署。请将 CALICO_VERSION 替换为要升级到的版本,例如v3.29.0
。根据您用于安装 Calico 的配置值创建calico-values.yaml
文件。helm upgrade calico projectcalico/tigera-operator \ --version
CALICO_VERSION
\ --namespace kube-system \ -f calico-values.yaml
从混合节点中删除 Calico
-
运行以下命令从集群中卸载 Calico 组件。请注意,卸载 CNI 可能会影响节点和容器组(pod)的运行状况,因此不应在生产集群上执行卸载。如果将 Calico 安装在除
kube-system
以外的命名空间中,请更改下面命令中的命名空间。helm uninstall calico --namespace kube-system
请注意,从集群中移除 CNI 时,默认情况下不会移除 Calico 配置的接口和路由。
-
要清理磁盘上的配置文件和资源,请从
/opt/cni
和/etc/cni
目录中移除 Calico 文件。 -
要从集群中移除 Calico CRD,请运行以下命令。
kubectl get crds -oname | grep "calico" | xargs kubectl delete
kubectl get crds -oname | grep "tigera" | xargs kubectl delete