Cilium
Ciliumについて
Cilium は、2021年にインキュベートプロジェクトとして受け入れられ、2023年に卒業したCNCF卒業プロジェクトです。もともとIsovalentによって作成されました。これは、クラウドネイティブ環境のための高度なネットワーキング、セキュリティ、およびオブザーバビリティのソリューションであり、 eBPF テクノロジーに基づいて構築されています。 Ciliumは、LinuxカーネルにeBPFプログラムを動的に注入することにより、Kubernetesクラスターのネットワークトラフィックを管理し、低遅延、高性能通信を有効にし、きめの細かいセキュリティポリシーを適用します。
Ciliumの主な機能
詳細なL3-L7セキュリティポリシーによるきめの細かいネットワークトラフィック制御
eBPFを介した効率的なカーネルレベルのトラフィック管理
サービスメッシュ統合Cilium Service Mesh
Kubernetes NetworkPolicyとCiliumNetworkPolicyの両方のサポート
ビルトインの可観測性とハッブルによるモニタリング
環境にCiliumをインストールするには、ドキュメントの指示に従ってください。
https://docs.cilium.io/en/stable/gettingstarted/k8s-install-default/
CloudNativePGとCiliumを使用したポッド間のネットワークセキュリティ
Kubernetesのデフォルトの動作は、クラスターネットワーク内の2つのポッド間のトラフィックを許可することです。
Ciliumは、CiliumNetworkPolicy リソースを使用して、高度なL3 /
L4ネットワークセキュリティを提供します。これにより、Kubernetesクラスター内のポッド間のネットワークトラフィックのきめの細かい制御が可能になります。これは、アプリケーションのワークロードとバックエンドサービス間の通信を保護するために特に役立ちます。
次の例では、Ciliumを使用して、入力トラフィックを許可されたポッドのみに制限することにより、CloudNativePG PostgreSQLインスタンスを保護する方法を示します。
注釈
続行する前に、cluster-example Postgresクラスターが環境で稼働していることを確認してください。
Ciliumのデフォルト拒否動作
デフォルトでは、Ciliumは明示的に構成されていない限り、すべてのトラフィックを拒否しません**。ポリシーが名前空間に存在すると、デフォルトによる拒否モデルを使用するKubernetes NetworkPolicyとは対照的に、Ciliumはデフォルトの拒否動作をより柔軟に制御します。
Ciliumでデフォルトの拒否ポスチャを適用するには、特に許可されない限り、ポッドのセットへのすべてのトラフィックを拒否するポリシーを明示的に作成する必要があります。これは一般に、
空の``ingress`` セクション をendpointSelector
と組み合わせて使用するか、より広範な適用のためにCiliumエージェントレベルで
``--enable-default-deny`` を有効にすることにより実現されます。
デフォルトの拒否ポリシーの最小限の例
apiVersion: cilium.io/v2
kind: CiliumNetworkPolicy
metadata:
name: default-deny
namespace: default
spec:
description: "Default deny all ingress traffic to all Pods in this namespace"
endpointSelector: {}
ingress: []
CiliumネットワークポリシーをCloudNativePGオペレーターと連携させる
Ciliumかどうかにかかわらず、ネットワークポリシーを使用する場合、最初のステップは、オペレーターがターゲット名前空間のポッドに到達できることを確認することです。オペレーターはポッドでチェックとアクションを実行できる必要があり、これらのアクションの1つでは、ポッドのポート8000
にアクセスして、内部で実行されているPostgreSQLインスタンスの現在のステータスを取得する必要があるため、これは重要です。
次のCiliumNetworkPolicy
により、オペレーターはターゲットdefault
名前空間のポッドにアクセスできます。
apiVersion: cilium.io/v2
kind: CiliumNetworkPolicy
metadata:
name: cnpg-operator-access
namespace: default
spec:
description: "Allow CloudNativePG operator access to any pod in the target namespace"
endpointSelector: {}
ingress:
- fromEndpoints:
- matchLabels:
io.kubernetes.pod.namespace: cnpg-system
toPorts:
- ports:
- port: "8000"
protocol: TCP
注釈
cnpg-system 名前空間は、YAMLマニフェストを使用する場合のオペレーターのデフォルトの名前空間です。オペレーターが別のプロセスHelm、OLMなどを使用してインストールされた場合、名前空間は異なる場合があります。名前空間を適切に調整してください。
クラスターポッド間のアクセスの許可
デフォルトポリシーは「deny all」であるため、同じ名前空間内のクラスターポッド間のアクセスを明示的に許可する必要があります。必要なイングレスルールを追加することにより、以前のポリシーを改善します。
apiVersion: cilium.io/v2
kind: CiliumNetworkPolicy
metadata:
name: cnpg-cluster-internal-access
namespace: default
spec:
description: "Allow CloudNativePG operator access and connection between pods in the same namespace"
endpointSelector: {}
ingress:
- fromEndpoints:
- matchLabels:
io.kubernetes.pod.namespace: cnpg-system
- matchLabels:
io.kubernetes.pod.namespace: default
cnpg.io/cluster: cluster-example
toPorts:
- ports:
- port: "8000"
protocol: TCP
- port: "5432"
protocol: TCP
このポリシーは、 cnpg-system ポッドと、 cluster-example
にも属するdefault 名前空間ポッドからのアクセスを許可します。
matchLabels
セレクターでは、ポッドにリストされたラベルの完全なセットが必要です。ラベルが1つだけない場合は、ポッドが一致しないことを意味します。
Ciliumを使用してPostgreSQLへのアクセスを制限する
この例では、 default 名前空間のrole=backend
というラベルのポッドのみがcluster-example
という名前のPostgreSQLクラスターに接続することを許可するCiliumNetworkPolicy
を定義します。他のすべての入力トラフィックはデフォルトでブロックされます。
apiVersion: cilium.io/v2
kind: CiliumNetworkPolicy
metadata:
name: postgres-access-backend-label
namespace: default
spec:
description: "Allow PostgreSQL access on port 5432 from Pods with role=backend"
endpointSelector:
matchLabels:
cnpg.io/cluster: cluster-example
ingress:
- fromEndpoints:
- matchLabels:
role: backend
toPorts:
- ports:
- port: "5432"
protocol: TCP
このCiliumNetworkPolicy は、 role=backend
でラベル付けられたポッドのみがdefault
名前空間のポート5432を介してCloudNativePGによって管理されるPostgreSQLインスタンスにアクセスできるようにします。
次のポリシーでは、名前空間のラベルrole=backend
を持つポッドからのみ、cluster-example
という名前のPostgreSQLクラスターのポート5432への入力トラフィックを許可する方法を示します。
apiVersion: cilium.io/v2
kind: CiliumNetworkPolicy
metadata:
name: postgres-access-backend-any-ns
namespace: default
spec:
description: "Allow PostgreSQL access on port 5432 from Pods with role=backend in any namespace"
endpointSelector:
matchLabels:
cnpg.io/cluster: cluster-example
ingress:
- fromEndpoints:
- labelSelector:
matchLabels:
role: backend
matchExpressions:
- key: io.kubernetes.pod.namespace
operator: Exists
toPorts:
- ports:
- port: "5432"
protocol: TCP
次の例では、 backend 名前空間のポッドからcluster-example
クラスター default
名前空間にありますのポート5432への入力トラフィックを許可します。
apiVersion: cilium.io/v2
kind: CiliumNetworkPolicy
metadata:
name: postgres-access-backend-namespace
namespace: default
spec:
description: "Allow PostgreSQL access on port 5432 from any Pods in the backend namespace"
endpointSelector:
matchLabels:
cnpg.io/cluster: cluster-example
ingress:
- fromEndpoints:
- matchLabels:
io.kubernetes.pod.namespace: backend
toPorts:
- ports:
- port: "5432"
protocol: TCP
CiliumのL3 / L4ポリシーモデルを使用して、 backend
名前空間のアプリケーションポッドからのみクラスターポッドへの入力トラフィックを明示的に許可するCiliumNetworkPolicy
を定義します。追加ポリシーで明示的に許可されない限り、他のすべてのトラフィックは暗黙的に拒否されます。
次の例では、Kubernetesクラスター内の任意のソースからcluster-example
クラスターdefault
名前空間にありますのポート5432への入力トラフィックを許可します。
apiVersion: cilium.io/v2
kind: CiliumNetworkPolicy
metadata:
name: postgres-access-cluster-wide
namespace: default
spec:
description: "Allow ingress traffic to port 5432 of the cluster-example from any pods within the Kubernetes cluster"
endpointSelector:
matchLabels:
cnpg.io/cluster: cluster-example
ingress:
- fromEntities:
- cluster
toPorts:
- ports:
- port: "5432"
protocol: TCP
Ciliumネットワークポリシーの作成と検証を簡素化するビジュアルでインタラクティブツール editor.networkpolicy.io の使用を検討できます。視覚的な方法で表示することにより、構成の間違いを回避し、交通ルールをより明確に理解するのに特に役立ちます。
これらのポリシーにより、PostgreSQLのベースラインのアクセス制御が確立されました。 Ciliumのポリシー言語を使用して追加の出力または監査ルールを階層化したり、Envoyを使用してL7適用に拡張したりできます。