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インスタンスを保護する方法を示します。
.. Note::
続行する前に、`cluster-example` Postgresクラスターが環境で稼働していることを確認してください。
Ciliumのデフォルト拒否動作
--------------------------
デフォルトでは、Ciliumは明示的に構成されていない限り、すべてのトラフィックを拒否しません*\*。ポリシーが名前空間に存在すると、デフォルトによる拒否モデルを使用するKubernetes
NetworkPolicyとは対照的に、Ciliumはデフォルトの拒否動作をより柔軟に制御します。
Ciliumでデフォルトの拒否ポスチャを適用するには、特に許可されない限り、ポッドのセットへのすべてのトラフィックを拒否するポリシーを明示的に作成する必要があります。これは一般に、
**空の\ ``ingress`` セクション** を\ ``endpointSelector``
と組み合わせて使用するか、より広範な適用のためにCiliumエージェントレベルで
**``--enable-default-deny``** を有効にすることにより実現されます。
デフォルトの拒否ポリシーの最小限の例
.. code:: yaml
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``
名前空間のポッドにアクセスできます。
.. code:: yaml
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
.. Note::
`cnpg-system` 名前空間は、YAMLマニフェストを使用する場合のオペレーターのデフォルトの名前空間です。オペレーターが別のプロセスHelm、OLMなどを使用してインストールされた場合、名前空間は異なる場合があります。名前空間を適切に調整してください。
クラスターポッド間のアクセスの許可
----------------------------------
デフォルトポリシーは「deny
all」であるため、同じ名前空間内のクラスターポッド間のアクセスを明示的に許可する必要があります。必要なイングレスルールを追加することにより、以前のポリシーを改善します。
.. code:: yaml
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``
を定義します。他のすべての入力トラフィックはデフォルトでブロックされます。
.. code:: yaml
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への入力トラフィックを許可する方法を示します。
.. code:: yaml
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への入力トラフィックを許可します。
.. code:: yaml
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への入力トラフィックを許可します。
.. code:: yaml
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適用に拡張したりできます。