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

Container Engine for Kubernetes (OKE)を使用して作成したクラスタにCalicoをインストールし、ネットワーク・ポリシーを設定する方法を確認します。

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

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

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

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

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

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

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

ノート

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

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

Calicoの互換性

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

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

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

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

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

Container Engine for Kubernetes (コンソールまたはAPIのいずれかを使用)を使用してクラスタを作成し、ネットワーク・タイプとしてチャネル・オーバーレイを選択して、ネットワーク・ポリシーをサポートするために、その後、クラスタに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コンテナの次の環境変数をcalico-node DaemonSetのマニフェストに追加します。
      • 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ネイティブPod Networking CNIプラグインとともにCalicoをインストールする

Container Engine for Kubernetes (コンソールまたはAPIを使用)を使用してクラスタを作成し、VCNネイティブのポッド・ネットワーキングネットワーク・タイプとして選択した後、ネットワーク・ポリシーをサポートするためにOCI VCN- Native Pod Networking 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- Native Pod Networking 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

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

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

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

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