

 **協助改進此頁面** 

本文為英文版的機器翻譯版本，如內容有任何歧義或不一致之處，概以英文版為準。

若要為本使用者指南貢獻內容，請點選每個頁面右側面板中的**在 GitHub 上編輯此頁面**連結。

本文為英文版的機器翻譯版本，如內容有任何歧義或不一致之處，概以英文版為準。

# 設定混合節點的 CNI
<a name="hybrid-nodes-cni"></a>

Cilium 是 AWS Amazon EKS 混合節點支援的容器聯網界面 (CNI)。您必須為混合節點安裝 CNI，才能做好準備以為工作負載提供服務。在 CNI 執行之前，混合節點會顯示為 `Not Ready` 狀態。您可以使用您選擇的工具 (例如 Helm) 來管理 CNI。此頁面的說明涵蓋 Cilium 生命週期管理 (安裝、升級、刪除)。如需如何為傳入、載入平衡和網路政策設定 Cilium，請參閱 [Cilium Ingress 和 Cilium Gateway 概觀](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 混合範例儲存庫](https://github.com/aws-samples/eks-hybrid-examples)。

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

Amazon EKS 支援的每個 Kubernetes 版本`v1.18.x`都支援 Cilium 版本 `v1.17.x`和 EKS 混合節點。

**注意**  
 **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 混合節點對包含雲端節點的 Amazon EKS 叢集具有相同的 Kubernetes 版本支援。

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

 AWS 維護以開放原始碼 Cilium [專案為基礎的 EKS 混合節點的 Cilium](https://github.com/cilium/cilium) 組建。若要從 取得 Cilium AWS 的支援，您必須使用 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 Ingress | Cilium Ingress、Cilium Gateway | 
| Service LoadBalancer IP 配置 | Cilium Load Balancer IPAM | 
| Service LoadBalancer IP 位址公告 | Cilium BGP 控制平面 | 
| kube-proxy 取代 | 是 | 

## Cilium 考量事項
<a name="hybrid-nodes-cilium-considerations"></a>
+  **Helm 儲存庫** - 在 Amazon EKS Cilium/Cilium 的 Amazon Elastic Container Registry Public (Amazon ECR Public) 中 AWS 託管 Cilium Helm Chart。 [https://gallery.ecr.aws/eks/cilium/cilium](https://gallery.ecr.aws/eks/cilium/cilium)可用的版本包括：
  + Cilium 1.17.9 版： `oci://public.ecr.aws/eks/cilium/cilium:1.17.9-0`
  + Cilium 1.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 會將離開叢集的所有 Pod 流量的來源 IP 位址[偽裝](https://docs.cilium.io/en/stable/network/concepts/masquerading/)為節點的 IP 位址。如果您停用偽裝，則您的 Pod CIDR 必須在內部部署網路上可路由。
+ 如果您在混合節點上執行 Webhook，您的 Pod CIDR 必須在內部部署網路上可路由。如果您的 Pod CIDR 在內部部署網路上不可路由，那麼建議您在相同叢集的雲端節點上執行 Webhook。如需詳細資訊，請參閱 [設定混合節點的 Webhook](hybrid-nodes-webhooks.md) 和 [準備混合節點的聯網](hybrid-nodes-networking.md)。
+  AWS 建議使用 Cilium 的內建 BGP 功能，讓您的 Pod CIDRs可在內部部署網路上路由。如需如何使用混合節點設定 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 Service CIDR 重疊。
   + 基於每個節點所需的 Pod 來設定 `clusterPoolIpv4MaskSize`。例如，對於每個節點 128 個 Pod 的 /25 區段大小，其值為 `25`。
   + 在叢集上部署 Cilium 之後，請勿變更 `clusterPoolIpv4PodCIDRList` 或 `clusterPoolIpv4MaskSize`，如需詳細資訊，請參閱[展開叢集集區](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 Layer 7 (L7) 代理。如需詳細資訊，請參閱[設定混合節點的 Kubernetes 網路政策](hybrid-nodes-network-policies.md)及[Cilium Ingress 和 Cilium Gateway 概觀](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 參考](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 安裝命令使用 `--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 版本取代 `CILIUM_VERSION`。我們建議您為 Cilium 次要版本執行最新的修補程式版本。您可以在 Cilium 文件的[穩定版本部分](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. 只要就緒 Pod 的數量相等，請確保 Cilium 預檢部署也標記為 READY 1/1。如果顯示 READY 0/1，請參閱 [CNP 驗證](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 問題](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
   ```