すべてのプロダクト
Search
ドキュメントセンター

Container Service for Kubernetes:ACK GlobalNetworkPolicyの使用

最終更新日:Oct 31, 2024

Kubernetes NetworkPolicyは、ラベルセレクタを使用するポッドレベルのネットワーク管理ポリシーです。 ここからのアップグレードとして、Container Service for Kubernetes (ACK) はGlobalNetworkPolicyを提供します。これにより、クラスターディメンションでのネットワークポリシー管理のためのクラスターレベルのネットワークポリシー機能が追加されます。 このトピックでは、ACK GlobalNetworkPolicyを使用して、クラスターのネットワークセキュリティをきめ細かく管理する方法について説明します。

前提条件

ステップ1: Poseidonコンポーネントのインストール

Poseidonは、ACKクラスターでKubernetesネットワークポリシーをサポートするためにACKによって提供されるコンポーネントです。

Poseidonコンポーネントバージョン0.5.1以降をインストールし、ACK NetworkPolicyオプションを有効にします。

  1. ACKコンソールにログインします。 左側のナビゲーションウィンドウで、[クラスター] をクリックします。

  2. [クラスター] ページで、管理するクラスターの名前をクリックします。 左側のナビゲーションウィンドウで、[操作] > [アドオン] を選択します。

  3. [アドオン] ページで、[ネットワーク] タブをクリックし、Poseidonコンポーネントカードの右下隅にある [インストール] をクリックします。

  4. [Poseidonのインストール] ダイアログボックスで、[ACK NetworkPolicyの有効化] をオンにし、[OK] をクリックします。

ステップ2: ACK GlobalNetworkPolicyの使用

ACK GlobalNetworkPolicyの定義と使用法は、Kubernetes NetworkPolicyと同様です。 デフォルトでは、ACK GlobalNetworkPolicyのルールは、クラスター内のすべてのノードとポッドに影響します。

構文の説明

ACK GlobalNetworkPolicyの基本構造は次のとおりです。

apiVersion: network.alibabacloud.com/v1beta2
kind: GlobalNetworkPolicy
metadata:
  name: example
spec:
  podSelector:      # The scope of the NetworkPolicy's effect on Pods, default: match all Pods.
    matchLabels:
      foo: bar      # Select Pods with the label foo:bar.
  namespaceSelector:   # The scope of the NetworkPolicy's effect on Namespaces. Default: match all Namespaces, this rule has an AND relationship with podSelector.
    matchLabels:
      foo: bar      # Select Namespaces with the label foo:bar.
  policyTypes:      # The direction in which the NetworkPolicy takes effect.
    - Ingress       # The policy will apply to inbound traffic.
    - Egress        # The policy will apply to outbound traffic.
  ingress: []       # Inbound rules.
  egress: []        # Outbound rules.

制限

単一のクラスターでルールを使用する場合、次の制限事項に注意してください。

  • GlobalNetworkPolicyリソースの数は100未満である必要があります。

  • 1つのGlobalNetworkPolicy内のインバウンドingressルールとアウトバウンドegressルールの合計数は20未満である必要があります。

  • 1つのインバウンドルールまたはアウトバウンドルールのポートポート数は10未満にする必要があります。

ingress/egressルール

ingressおよびegressルールは、NetworkPolicyを介して許可されるトラフィックの送信元アドレスと送信先アドレスを設定します。 両方のルールの構造は同じであり、from (ingressの場合) とto (egressの場合) を通る許可された通信範囲を指定します。

apiVersion: network.alibabacloud.com/v1beta2
kind: GlobalNetworkPolicy
metadata:
  name: example                          # Policy name
spec:
  podSelector: {}                       
  namespaceSelector: null                     
  policyTypes:
    - Ingress                            # The policy includes inbound rules
    - Egress                             # The policy includes outbound rules
  ingress:
    - from:
        - namespaceSelector:             # Allow inbound from Pods in Namespaces with matching labels.
            matchLabels:
              foo: bar
          podSelector:                   # Allow inbound from Pods with matching labels.
            matchLabels:
              foo: bar
        ports:
          - protocol: TCP                # Allow TCP traffic, value can be TCP or UDP.
            port: 443                    # Allow port 443.
    - from:
        - ipBlock:                       # Define the CIDR block allowed to initiate inbound requests from outside the cluster.
            cidr: "172.16.0.0/16"
            except:
              - "172.16.1.0/24"          # Exclude the CIDR block "172.16.1.0/24" from the allowed inbound sources outside the cluster.
  egress:
    - to:
        - namespaceSelector:             # Allow outbound to Pods in Namespaces with matching labels.
            matchLabels:
              foo: bar
          podSelector:                   # Allow outbound to Pods with matching labels.
            matchLabels:
              foo: bar
    - to:
        - ipBlock:                       # Define the CIDR block allowed for outbound traffic from the cluster.
            cidr: "172.16.0.0/16"
            except:
              - "172.16.1.0/24"          # Exclude the CIDR block "172.16.1.0/24" from the allowed outbound destinations outside the cluster.

項目

説明

ipBlock

クラスタ外のトラフィックアドレスを記述するために使用される静的CIDRブロック。 このブロックは、クラスター外のどのIPアドレス範囲がクラスター内のポッドへの出入りを許可または拒否されるかを定義します。

podSelector

このセレクターは、ラベルを使用してアドレスを動的に選択し、クラスター内のポッドのアドレスを記述するために使用されます。

ネットワークポリシーを作成する場合、同じルールでipBlockpodSelector、またはipBlocknamespaceSelectorを使用することはできません。 次のように、ipBlockpodSelectorを分離する必要があります。

ingress:
  - from:
      - ipBlock:               # The first source condition is ipBlock.
          cidr: "192.168.0.0/16"
      - podSelector:           # The second source condition is podSelector.
          matchLabels:
            key: value
    ports:
      - protocol: TCP
        port: 80

次のサンプルコードでは、誤った例を示します。

正しくない例を展開します。

ingress:
  - from:
      - ipBlock:                  # CIDR block definition.
          cidr: "192.168.0.0/16"
        podSelector:              # Error: Cannot be used with ipBlock in the same entry.
          matchLabels:
            key: value
    ports:
      - protocol: TCP
        port: 443

このセクションのすべての例では、podSelectorパラメーターが設定されています。 このパラメーターは、ビジネス要件に基づいて設定できます。

重要

GlobalNetworkPolicyの設定時にpodSelectornamespaceSelectorが指定されていない場合、ポリシーはクラスター内のすべてのポッドに適用されます。

特定のポッドのすべてのトラフィックルールを拒否する

次のYAMLファイルは、foo: barラベルを持つポッドに適用されるGlobalNetworkPolicyを定義します。 このポリシーは、これらのポッドとの間のすべてのインバウンドおよびアウトバウンドネットワークトラフィックを拒否します。

apiVersion: network.alibabacloud.com/v1beta2
kind: GlobalNetworkPolicy
metadata:
  name: default-deny
spec:
  podSelector:
    matchLabels:
      foo: bar
  namespaceSelector: null
  policyTypes:
    - Ingress
    - Egress
  ingress: []
  egress: []

特定のポッドがDNSにアクセスできるようにする

次のYAMLファイルは、foo: barラベルを持つポッドに適用されるGlobalNetworkPolicyを定義します。 このポリシーは、これらのポッドとクラスターで実行されているDNSサービス間の通信を許可します。

apiVersion: network.alibabacloud.com/v1beta2
kind: GlobalNetworkPolicy                     
metadata:
  name: allow-dns                            
spec:
  podSelector:                                
    matchLabels:
      foo: bar                                
  namespaceSelector: null                 
  policyTypes:                                
    - Egress
  egress:                                     
    - to:                                 
        - namespaceSelector:              
            matchLabels:
              kubernetes.io/metadata.name: kube-system
          podSelector:
            matchLabels:
              k8s-app: kube-dns