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適用に拡張したりできます。