例: Calicoのインストールおよびネットワーク・ポリシーの設定

Kubernetes Engine (OKE)を使用して作成したクラスタにCalicoをインストールし、ネットワーク・ポリシーを設定する方法をご覧ください。

Kubernetesネットワーキング・モデルは、コンテナ(ポッド)にクラスタ内で一意のルーティング可能なIPアドレスがあることを前提としています。Kubernetesネットワーキング・モデルでは、コンテナがクラスタ内の同じノードにデプロイされているか、別のノードにデプロイされているかに関係なく、コンテナはこれらのIPアドレスを使用して相互に通信します。Kubernetesは、ネットワーク・リソース管理用のコンテナ・ネットワーク・インタフェース(CNI)仕様を採用しています。CNIは、Linuxコンテナでネットワーク・インタフェースを構成するためのプラグインを記述するための仕様およびライブラリと、サポートされている多数のプラグインで構成されます。

デフォルトでは、ポッドは任意のソースからトラフィックを受け入れます。クラスタ・セキュリティを強化するために、ポッドをネットワーク・ポリシー(Kubernetes NetworkPolicyリソース)で選択することによって分離できます。ネットワーク・ポリシーは、ポッドのグループが相互および他のネットワーク・エンドポイントと通信できる方法の仕様です。NetworkPolicyリソースは、ラベルを使用してポッドを選択し、選択したポッドに許可されるトラフィックを指定するルールを定義します。クラスタ・ネームスペースのNetworkPolicyが特定のポッドを選択すると、そのポッドはどのNetworkPolicyでも許可されていない接続を拒否します。NetworkPolicyによって選択されていないネームスペース内の他のポッドは、引き続きすべてのトラフィックを受け入れます。ネットワーク・ポリシーの詳細は、Kubernetesのドキュメントを参照してください。

ネットワーク・ポリシーは、CNIネットワーク・プロバイダによって実装されます。CNIネットワーク・プロバイダを実装せずにNetworkPolicyリソースを作成しても、まったく影響はありません。すべてのCNIネットワーク・プロバイダがNetworkPolicyリソースを実装するわけではないことに注意してください。

Kubernetesエンジンを使用してクラスタを作成する場合は、ネットワーク・タイプを選択します。選択した「ネットワーク・タイプ」によって、ポッド・ネットワーキングに使用されるCNIネットワーク・プロバイダおよび関連するCNIプラグインが次のように決定されます。

  • VCNネイティブ・ポッド・ネットワーク: OCI VCNネイティブ・ポッド・ネットワークCNIプラグインを使用して、Oracle Cloud Infrastructure VCNのポッド・サブネットにワーカー・ノードを接続します。その結果、VCN内のポッドIPアドレスは、そのVCNに接続(ピアリング)されている他のVCN、オンプレミス・ネットワーク、およびインターネットから直接ルーティングできます。「ポッド・ネットワーク用のOCI VCNネイティブ・ポッド・ネットワークCNIプラグインの使用」を参照してください。
  • Flannelオーバーレイ: Flannel CNIプラグインを使用して、IPアドレスをコンテナに接続する単純なプライベート・オーバーレイ仮想ネットワークであるflannelオーバーレイ・ネットワーク内のポッド間の通信をカプセル化します。プライベート・オーバーレイ・ネットワークのポッドには、同じクラスタ内の他のポッドからのみアクセスできます。「ポッド・ネットワーク用のFlannel CNIプラグインの使用」を参照してください。

OCI VCNネイティブ・ポッド・ネットワーキングCNIプラグインとflannel CNIプラグインの両方がKubernetesネットワーキング・モデルの要件を満たしていますが、いずれもKubernetes NetworkPolicyリソースをサポートしていません。ネットワーク・ポリシーを実装してKubernetes Engineで作成するクラスタのセキュリティを強化する場合は、クラスタで使用されるCNIプラグインとともにNetworkPolicyリソースをサポートするネットワーク・プロバイダをインストールして構成する必要があります。そのようなプロバイダの1つがCalicoです(他のネットワーク・プロバイダのリストは、Kubernetesのドキュメントを参照)。

Calicoは、コンテナ、仮想マシンおよびネイティブ・ホストベースのワークロード向けのオープン・ソースのネットワーキングおよびネットワーク・セキュリティのソリューションです。Calicoの詳細は、Calicoのドキュメントを参照してください。

ノート

  • Calicoは、管理対象ノード・プールで使用できますが、仮想ノード・プールでは使用できません。
  • オープン・ソースのCalicoの使用のみがサポートされています。Calico Enterpriseの使用はサポートされていません。

  • flannelの場合、ポッドがすでに実行されている既存のノード・プールがあるクラスタにCalicoをインストールする場合、Calicoのインストールが完了したらポッドを再起動する必要があります。たとえば、kubectl rollout restartコマンドを実行します。クラスタにノード・プールを作成する前にCalicoをクラスタにインストールすると(推奨)、再起動するポッドがないことを確認できます。

Calicoの互換性

この表は、OracleがKubernetes Engineを使用して作成されたクラスタで正常にテストしたCalicoネットワーク・プラグインのバージョンを示しています。Oracleでは、テストに成功したCalicoバージョンのみがサポートされています。この表は、Calicoバージョンごとに、成功したテストでクラスタで実行されていたKubernetesバージョンを示しています。

オープン・ソースのCalicoの使用のみがサポートされていることに注意してください。Calico Enterpriseの使用はサポートされていません。

詳細は、例: Calicoのインストールおよびネットワーク・ポリシーの設定を参照してください。

Calicoバージョン Kubernetes 1.28を実行しているクラスタでテスト(およびサポート)されますか。 Kubernetes 1.29を実行しているクラスタでテスト(およびサポート)されますか。 Kubernetes 1.30を実行しているクラスタでテスト(およびサポート)されますか。
3.25.1 (未テスト) (未テスト) (未テスト)
3.26.1 (未テスト) (未テスト) (未テスト)
3.26.4 はい (未テスト) (未テスト)
3.27.2 (未テスト) はい (未テスト)
3.28.0 (未テスト) (未テスト) はい

Flannel CNIプラグインと一緒にCalicoをインストールする

Kubernetes Engineを使用して(コンソールまたはAPIを使用して)クラスタを作成し、「ネットワーク・タイプ」として「flannel overay」を選択した後で、ネットワーク・ポリシーをサポートするために、flannel CNIプラグインとともにクラスタにCalicoをインストールできます。

便宜上、Calicoのインストール手順を次に示します。Calicoのインストール手順は、Calicoのバージョンによって異なります。様々なバージョンのCalicoのインストールに関する情報は、常にCalicoのインストレーション・ドキュメントを参照してください。

  1. まだ実行していない場合は、ステップに従って、クラスタのkubeconfig構成ファイルを設定し、(必要に応じて)そのファイルを指すようにKUBECONFIG環境変数を設定します。自分のkubeconfigファイルを設定する必要があります。別のユーザーが設定したkubeconfigファイルを使用してクラスタにアクセスすることはできません。クラスタ・アクセスの設定を参照してください。
  2. ターミナル・ウィンドウで、次のように入力して、Kubernetes APIデータストアのCalicoポリシーのみのマニフェストをダウンロードします:

    curl https://raw.githubusercontent.com/projectcalico/calico/v3.25.1/manifests/calico-policy-only.yaml -o calico.yaml

    インストールするCalicoのバージョンによって、URLが異なることに注意してください。

  3. calico-policy-only.yamlファイルに追加の環境変数を1つ以上設定する必要があります。
    1. 選択したテキスト・エディタでcalico-policy-only.yamlファイルを開きます。
    2. calico-node DaemonSetのマニフェストに、calico-nodeコンテナの次の環境変数を追加します。
      • CALICO_MANAGE_CNI="true"
      • FELIX_IPTABLESBACKEND="NFT" ノート:この環境変数を追加するのは、クラスタ内のワーカー・ノードにOracle Linux 8イメージを選択した場合のみです。

      変更を行う前に、calico-node DaemonSetマニフェストのcalico-nodeコンテナ環境変数(env:)セクションは次のようになります。

            ...
            containers:
              # Runs calico-node container on each Kubernetes node. This
              # container programs network policy and routes on each
              # host.
              - name: calico-node
                image: docker.io/calico/node:v3.25.1
                env:
                  # Use Kubernetes API as the backing datastore.
                  - name: DATASTORE_TYPE
                    value: "kubernetes"
                  # Wait for the datastore.
                  - name: WAIT_FOR_DATASTORE
                    value: "true"
                  # Set based on the k8s node name.
                  - name: NODENAME
                    valueFrom:
                      fieldRef:
                        fieldPath: spec.nodeName
                  # Don't enable BGP.
                  - name: CALICO_NETWORKING_BACKEND
                    value: "none"
                  - name: CLUSTER_TYPE
                    value: "k8s"
                  - name: FELIX_HEALTHENABLED
                    value: "true"
                  - name: FELIX_LOGSEVERITYSCREEN
                    value: "Info"
                  # Disable file logging so `kubectl logs` works.
                  - name: CALICO_DISABLE_FILE_LOGGING
                    value: "true"
                  # Disable IPv6 on Kubernetes.
                  - name: FELIX_IPV6SUPPORT
                    value: "false"

      変更後、calico-node DaemonSetマニフェストのcalico-nodeコンテナ環境変数(env:)セクションが次のようになっていることを確認します。

            ...
            containers:
              # Runs calico-node container on each Kubernetes node. This
              # container programs network policy and routes on each
              # host.
              - name: calico-node
                image: docker.io/calico/node:v3.25.1
                env:
                  # Use Kubernetes API as the backing datastore.
                  - name: DATASTORE_TYPE
                    value: "kubernetes"
                  # Wait for the datastore.
                  - name: WAIT_FOR_DATASTORE
                    value: "true"
                  # Set based on the k8s node name.
                  - name: NODENAME
                    valueFrom:
                      fieldRef:
                        fieldPath: spec.nodeName
                  # Don't enable BGP.
                  - name: CALICO_NETWORKING_BACKEND
                    value: "none"
                  - name: CLUSTER_TYPE
                    value: "k8s"
                  - name: FELIX_HEALTHENABLED
                    value: "true"
                  - name: FELIX_LOGSEVERITYSCREEN
                    value: "Info"
                  # Disable file logging so `kubectl logs` works.
                  - name: CALICO_DISABLE_FILE_LOGGING
                    value: "true"
                  # Disable IPv6 on Kubernetes.
                  - name: FELIX_IPV6SUPPORT
                    value: "false"
                  - name: CALICO_MANAGE_CNI
                    value: "true"
                  - name: FELIX_IPTABLESBACKEND
                    value: "NFT"
                  ...
    3. 変更したcalico-policy-only.yamlファイルを保存して閉じます。
  4. 次のコマンドを入力して、Calicoをインストールして構成します:

    kubectl apply -f calico.yaml

OCI VCNネイティブ・ポッド・ネットワークCNIプラグインとともにCalicoをインストールしています

Kubernetesエンジンを使用して(コンソールまたはAPIを使用して)クラスタを作成し、ネットワーク・タイプとしてVCNネイティブ・ポッド・ネットワーキングを選択した後、ネットワーク・ポリシーをサポートするために、OCI VCNネイティブ・ポッド・ネットワーキングCNIプラグインとともにクラスタにCalicoをインストールできます。

便宜上、Calicoのインストール手順を次に示します。Calicoのインストール手順は、Calicoのバージョンによって異なります。様々なバージョンのCalicoのインストールに関する情報は、常にCalicoのインストレーション・ドキュメントを参照してください。

  1. まだ実行していない場合は、ステップに従って、クラスタのkubeconfig構成ファイルを設定し、(必要に応じて)そのファイルを指すようにKUBECONFIG環境変数を設定します。自分のkubeconfigファイルを設定する必要があります。別のユーザーが設定したkubeconfigファイルを使用してクラスタにアクセスすることはできません。クラスタ・アクセスの設定を参照してください。
  2. ターミナル・ウィンドウで、次のように入力して、Kubernetes APIデータストアのCalicoポリシーのみのマニフェストをダウンロードします:

    curl https://raw.githubusercontent.com/projectcalico/calico/v3.25.1/manifests/calico-policy-only.yaml -o calico.yaml

    インストールするCalicoのバージョンによって、URLが異なることに注意してください。

  3. calico-policy-only.yamlファイルには、OCI VCNネイティブ・ポッド・ネットワーキングCNIプラグインとともにCalicoを使用する場合には必要ないCalicoコンポーネントが含まれているため、これらのコンポーネントを削除する必要があります。追加の環境変数も設定する必要があります。
    1. 選択したテキスト・エディタでcalico-policy-only.yamlファイルを開きます。
    2. calico-node DaemonSetのマニフェストからinitContainersセクションを削除します。
    3. calico-node DaemonSetのマニフェストから、calico-nodeコンテナのenvセクションから次を削除します。
                # Typha support: controlled by the ConfigMap.
                - name: FELIX_TYPHAK8SSERVICENAME
                    valueFrom:
                        configMapKeyRef:
                            name: calico-config
                            key: typha_service_name
    4. calico-nodeコンテナの次のenvFromセクションをcalico-node DaemonSetのマニフェストから削除します。
                envFrom:
                - configMapRef:
                    # Allow KUBERNETES_SERVICE_HOST and KUBERNETES_SERVICE_PORT to be overridden for eBPF mode.
                    name: kubernetes-services-endpoint
                    optional: true
    5. calico-node DaemonSetのマニフェストのvolumesセクションから次のボリュームを削除します。
      • cni-bin-dir
      • cni-net-dir
      • cni-log-dir

      変更を行う前に、calico-node DaemonSetマニフェストのvolumesセクションは次のようになります。

            ...
            volumes:
              # Used by calico-node.
              - name: lib-modules
                hostPath:
                  path: /lib/modules
              - name: var-run-calico
                hostPath:
                  path: /var/run/calico
              - name: var-lib-calico
                hostPath:
                  path: /var/lib/calico
              - name: xtables-lock
                hostPath:
                  path: /run/xtables.lock
                  type: FileOrCreate
              - name: sysfs
                hostPath:
                  path: /sys/fs/
                  type: DirectoryOrCreate
              # Used to install CNI.
              - name: cni-bin-dir
                hostPath:
                  path: /opt/cni/bin
              - name: cni-net-dir
                hostPath:
                  path: /etc/cni/net.d
              # Used to access CNI logs.
              - name: cni-log-dir
                hostPath:
                  path: /var/log/calico/cni
              # Used to create per-pod Unix Domain Sockets
              - name: policysync
                hostPath:
                  type: DirectoryOrCreate
                  path: /var/run/nodeagent
                ...

      変更後、calico-node DaemonSetマニフェストのvolumesセクションが次のようになっていることを確認します。

            ...
            volumes:
              # Used by calico-node.
              - name: lib-modules
                hostPath:
                  path: /lib/modules
              - name: var-run-calico
                hostPath:
                  path: /var/run/calico
              - name: var-lib-calico
                hostPath:
                  path: /var/lib/calico
              - name: xtables-lock
                hostPath:
                  path: /run/xtables.lock
                  type: FileOrCreate
              - name: sysfs
                hostPath:
                  path: /sys/fs/
                  type: DirectoryOrCreate
              # Used to create per-pod Unix Domain Sockets
              - name: policysync
                hostPath:
                  type: DirectoryOrCreate
                  path: /var/run/nodeagent
                ...
    6. calico-node DaemonSetのマニフェスト内のcalico-nodeコンテナのvolumeMountsセクションから、次のボリューム・マウントを削除します。
      • cni-net-dir(関連するコメント# For maintaining CNI plugin API credentials.を含む)
      • cni-log-dir

      変更を行う前に、volumeMountsセクションは次のようになります。

                ...
                volumeMounts:
                  # For maintaining CNI plugin API credentials.
                  - mountPath: /host/etc/cni/net.d
                    name: cni-net-dir
                    readOnly: false
                  - mountPath: /lib/modules
                    name: lib-modules
                    readOnly: true
                  - mountPath: /run/xtables.lock
                    name: xtables-lock
                    readOnly: false
                  - mountPath: /var/run/calico
                    name: var-run-calico
                    readOnly: false
                  - mountPath: /var/lib/calico
                    name: var-lib-calico
                    readOnly: false
                  - name: policysync
                    mountPath: /var/run/nodeagent
                  # For eBPF mode, we need to be able to mount the BPF filesystem at /sys/fs/bpf so we mount in the
                  # parent directory.
                  - name: bpffs
                    mountPath: /sys/fs/bpf
                  - name: cni-log-dir
                    mountPath: /var/log/calico/cni
                    readOnly: true
                    ...

      変更後、volumeMountsセクションが次のようになっていることを確認します。

                ...
                volumeMounts:
                  - mountPath: /lib/modules
                    name: lib-modules
                    readOnly: true
                  - mountPath: /run/xtables.lock
                    name: xtables-lock
                    readOnly: false
                  - mountPath: /var/run/calico
                    name: var-run-calico
                    readOnly: false
                  - mountPath: /var/lib/calico
                    name: var-lib-calico
                    readOnly: false
                  - name: policysync
                    mountPath: /var/run/nodeagent
                  # For eBPF mode, we need to be able to mount the BPF filesystem at /sys/fs/bpf so we mount in the
                  # parent directory.
                  - name: bpffs
                    mountPath: /sys/fs/bpf
                    ...
    7. calico-node DaemonSetのマニフェストに、calico-nodeコンテナの次の環境変数を追加します。
      • FELIX_INTERFACEPREFIX="oci"
      • NO_DEFAULT_POOLS="true"
      • FELIX_CHAININSERTMODE="Append"
      • FELIX_IPTABLESMANGLEALLOWACTION="Return"
      • FELIX_IPTABLESBACKEND="NFT" ノート:この環境変数を追加するのは、クラスタ内のワーカー・ノードにOracle Linux 8イメージを選択した場合のみです。

      変更を行う前に、calico-node DaemonSetマニフェストのcalico-nodeコンテナ環境変数(env:)セクションは次のようになります。

            ...
            containers:
              # Runs calico-node container on each Kubernetes node. This
              # container programs network policy and routes on each
              # host.
              - name: calico-node
                image: docker.io/calico/node:v3.25.1
                env:
                  # Use Kubernetes API as the backing datastore.
                  - name: DATASTORE_TYPE
                    value: "kubernetes"
                  # Wait for the datastore.
                  - name: WAIT_FOR_DATASTORE
                    value: "true"
                  # Set based on the k8s node name.
                  - name: NODENAME
                    valueFrom:
                      fieldRef:
                        fieldPath: spec.nodeName
                  # Don't enable BGP.
                  - name: CALICO_NETWORKING_BACKEND
                    value: "none"
                  - name: CLUSTER_TYPE
                    value: "k8s"
                  - name: FELIX_HEALTHENABLED
                    value: "true"
                  - name: FELIX_LOGSEVERITYSCREEN
                    value: "Info"
                  # Disable file logging so `kubectl logs` works.
                  - name: CALICO_DISABLE_FILE_LOGGING
                    value: "true"
                  # Disable IPv6 on Kubernetes.
                  - name: FELIX_IPV6SUPPORT
                    value: "false"

      変更後、calico-node DaemonSetマニフェストのcalico-nodeコンテナ環境変数(env:)セクションが次のようになっていることを確認します。

            ...
            containers:
              # Runs calico-node container on each Kubernetes node. This
              # container programs network policy and routes on each
              # host.
              - name: calico-node
                image: docker.io/calico/node:v3.25.1
                env:
                  # Use Kubernetes API as the backing datastore.
                  - name: DATASTORE_TYPE
                    value: "kubernetes"
                  # Wait for the datastore.
                  - name: WAIT_FOR_DATASTORE
                    value: "true"
                  # Set based on the k8s node name.
                  - name: NODENAME
                    valueFrom:
                      fieldRef:
                        fieldPath: spec.nodeName
                  # Don't enable BGP.
                  - name: CALICO_NETWORKING_BACKEND
                    value: "none"
                  - name: CLUSTER_TYPE
                    value: "k8s"
                  - name: FELIX_HEALTHENABLED
                    value: "true"
                  - name: FELIX_LOGSEVERITYSCREEN
                    value: "Info"
                  # Disable file logging so `kubectl logs` works.
                  - name: CALICO_DISABLE_FILE_LOGGING
                    value: "true"
                  # Disable IPv6 on Kubernetes.
                  - name: FELIX_IPV6SUPPORT
                    value: "false"
                  # Configuration for Native Pod Networking
                  - name: FELIX_INTERFACEPREFIX
                    value: "oci"
                  - name: NO_DEFAULT_POOLS
                    value: "true"
                  - name: FELIX_CHAININSERTMODE
                    value: "Append"
                  - name: FELIX_IPTABLESMANGLEALLOWACTION
                    value: "Return"   
                  - name: FELIX_IPTABLESBACKEND
                    value: "NFT"         
                  ...
    8. 変更したcalico-policy-only.yamlファイルを保存して閉じます。
  4. 次のコマンドを入力して、Calicoをインストールして構成します:

    kubectl apply -f calico.yaml

ネットワーク・ポリシーの設定

Kubernetes Engineで作成したクラスタにCalicoをインストールしたら、Kubernetes NetworkPolicyリソースを作成して、必要に応じてポッドを分離できます。

NetworkPolicyの例およびその使用方法は、Calicoのドキュメントを参照してください。具体的には:

例は、インストールしたCalicoのバージョンによって異なります。