

 **このページの改善にご協力ください** 

このユーザーガイドに貢献するには、すべてのページの右側のペインにある「**GitHub でこのページを編集する**」リンクを選択してください。

# ハイブリッドノードの CNI を設定する
<a name="hybrid-nodes-cni"></a>

Cilium は、Amazon EKS Hybrid Nodes 向けに AWS でサポートされるコンテナネットワークインターフェイス (CNI) です。ハイブリッドノードがワークロードを処理できるようにするにはCNI をインストールする必要があります。CNI が稼働するまではハイブリッドノードは `Not Ready` のステータスで表示されます。CNI は、Helm など任意のツールで管理できます。このページでは、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 Cloud 内のノードで 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>

Cilium バージョン `v1.17.x` および `v1.18.x` は、Amazon EKS でサポートされているすべての Kubernetes バージョンの 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 version support](https://docs.aws.amazon.com/eks/latest/userguide/kubernetes-versions.html)」を参照してください。EKS Hybrid Nodes には、クラウドノードを使用する Amazon EKS クラスターと同じ Kubernetes バージョンのサポートがあります。

## サポートされる機能
<a name="hybrid-nodes-cilium-support"></a>

 AWS は、オープンソース [Cilium プロジェクト](https://github.com/cilium/cilium) に基づく Cilium for EKS Hybrid Nodes のビルドを維持します。AWS から Cilium のサポートを受けるには、AWS が維持する Cilium ビルドとサポート対象の Cilium バージョンを使用している必要があります。

 AWS は、EKS ハイブリッドノードで使用する Cilium の以下の機能のデフォルト設定についてテクニカルサポートを提供しています。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 replacement  |  はい  | 

## Cilium に関する考慮事項
<a name="hybrid-nodes-cilium-considerations"></a>
+  **Helm リポジトリ** - AWS は、Amazon Elastic Container Registry Public (Amazon ECR Public) の [Amazon EKS Cilium/Cilium](https://gallery.ecr.aws/eks/cilium/cilium) で 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 アドレスをノードの IP アドレスに[マスカレード](https://docs.cilium.io/en/stable/network/concepts/masquerading/)します。マスカレードを無効にする場合は、ポッド CIDR がオンプレミスネットワークでルーティング可能である必要があります。
+ ハイブリッドノードでウェブフックを実行している場合は、オンプレミスネットワークでポッド CIDR をルーティング可能である必要があります。オンプレミスネットワークでポッド CIDR をルーティングできない場合は、同じクラスター内のクラウドノードでウェブフックを実行することをお勧めします。詳細については、「[ハイブリッドノード用のウェブフックを設定する](hybrid-nodes-webhooks.md)」と「[ハイブリッドノード用のネットワークを準備する](hybrid-nodes-networking.md)」を参照してください。
+  AWS では、Cilium に組み込みの BGP 機能を使用して、オンプレミスネットワークでポッド CIDR をルーティング可能にすることをお勧めします。ハイブリッドノードで Cilium BGP を設定する方法の詳細については、「[ハイブリッドノード向けに Cilium BGP を設定する](hybrid-nodes-cilium-bgp.md)」を参照してください。
+ Cilium のデフォルトの IP Address Manager (IPAM) は[クラスタースコープ](https://docs.cilium.io/en/stable/network/concepts/ipam/cluster-pool/)と呼ばれ、Cilium オペレーターがユーザー設定のポッド 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 クラスターの*リモートポッドネットワーク*の場合と同じポッド CIDR で `clusterPoolIpv4PodCIDRList` を設定してください。例えば、`10.100.0.0/24`。Cilium オペレーターは、設定された `clusterPoolIpv4PodCIDRList` IP スペース内から IP アドレススライスを割り当てます。ポッド CIDR は、オンプレミスノード CIDR、VPC CIDR、Kubernetes サービス CIDR と重複してはいけません。
   + ノードあたりに必要なポッドに基づいて `clusterPoolIpv4MaskSize` を設定します。例えば、ノードあたり 128 個のポッドが必要で、そのサイズが /25 セグメントの場合は `25` とします。
   + クラスターに 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 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 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` になっているはずです。ポッド CIDR をオンプレミスネットワークにアドバタイズするように Cilium BGP を設定する方法については、「[ハイブリッドノード向けに 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 マイナーリリースの最新のパッチリリースはCilium ドキュメントの「[安定リリースのセクション](https://github.com/cilium/cilium#stable-releases)」で確認できます。

   ```
   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 の検証](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
   ```