標準クラスタの Kubernetes ネットワーク ポリシーを作成する

このページでは、Google Distributed Cloud(GDC)エアギャップで Kubernetes ネットワーク ポリシーを使用して、標準クラスタのクラスタ内トラフィックを構成する手順について説明します。

Kubernetes NetworkPolicy は、Pod のグループに相互の通信と他のネットワーク エンドポイントとの通信を許可する方法を指定します。NetworkPolicy リソースは、ラベルを使用して Pod を選択し、選択した Pod に対して許可されるトラフィックを指定するルールを定義します。これらのポリシーはローカルにスコープ設定され、定義されているクラスタ内のトラフィックにのみ適用されます。ただし、他の標準クラスタと共有クラスタのエンドポイントとの通信も許可する全許可ポリシーが作成されている場合は除きます。

始める前に

Kubernetes ネットワーク ポリシーを構成するには、関連する Namespace で NetworkPolicy リソースを作成、変更、削除するために必要な権限がクラスタ内に必要です。

クラスタ内の Pod 間ポリシーを作成する

これらのポリシーは、同じ標準クラスタ内の Pod 間のトラフィックを制御します。

クラスタ内の Pod 間内向きポリシーを作成する

  • クラスタ内の Pod 間で Ingress トラフィックを許可するには、次のリソースを作成して適用します。

    kubectl --kubeconfig CLUSTER_API_SERVER apply -f - <<EOF
    apiVersion: networking.k8s.io/v1
    kind: NetworkPolicy
    metadata:
      name: allow-intra-cluster-ingress-traffic
      namespace: SUBJECT_NAMESPACE
    spec:
      podSelector:
        matchLabels:
          SUBJECT_LABEL_KEY: SUBJECT_LABEL_VALUE
      policyTypes:
      - Ingress
      ingress:
      - from:
        - namespaceSelector:
            matchLabels:
              Kubernetes.io/metadata.name: PEER_NAMESPACE
          podSelector:
            matchLabels:
              PEER_LABEL_KEY: PEER_LABEL_VALUE
        ports:
        - protocol: TCP
          port: PORT
    EOF
    

    次のように置き換えます。

    • CLUSTER_API_SERVER: クラスタ API サーバーの kubeconfig パス。API サーバーの kubeconfig ファイルをまだ生成していない場合は、ログインで詳細を確認してください。
    • SUBJECT_NAMESPACE: 標準クラスタのサブジェクト Namespace。
    • PEER_NAMESPACE: Standard クラスタのピア Namespace。
    • SUBJECT_LABEL_KEY: サブジェクト ワークロードの選択に使用されるラベルのキー。例: apptier、または role
    • SUBJECT_LABEL_VALUE: SUBJECT_LABEL_KEY に関連付けられた値。たとえば、SUBJECT_LABEL_KEYapp で、SUBJECT_LABEL_VALUEbackend の場合、ラベル app: backend のワークロードがトラフィックを受信しています。
    • PEER_LABEL_KEY: ピア ワークロードの選択に使用されるラベルのキー。
    • PEER_LABEL_VALUE: PEER_LABEL_KEY に関連付けられた値。
    • PORT: トラフィックが許可されているサブジェクト ワークロードのポート。

クラスタ内の Pod 間外向き(下り)ポリシーを作成する

  • クラスタ内の Pod 間で下り(外向き)トラフィックを許可するには、次のリソースを作成して適用します。

    kubectl --kubeconfig CLUSTER_API_SERVER apply -f - <<EOF
    apiVersion: networking.k8s.io/v1
    kind: NetworkPolicy
    metadata:
      name: allow-egress-intra-cluster-traffic
      namespace: SUBJECT_NAMESPACE
    spec:
      podSelector:
        matchLabels:
          SUBJECT_LABEL_KEY: SUBJECT_LABEL_VALUE
      policyTypes:
      - Egress
      egress:
      - to:
        - namespaceSelector:
            matchLabels:
              Kubernetes.io/metadata.name: PEER_NAMESPACE
          podSelector:
            matchLabels:
              PEER_LABEL_KEY: PEER_LABEL_VALUE
        ports:
        - protocol: TCP
          port: PORT
    EOF
    

    次のように置き換えます。

    • CLUSTER_API_SERVER: クラスタ API サーバーの kubeconfig パス。API サーバーの kubeconfig ファイルをまだ生成していない場合は、ログインで詳細を確認してください。
    • SUBJECT_NAMESPACE: 標準クラスタのサブジェクト Namespace。
    • PEER_NAMESPACE: Standard クラスタのピア Namespace。
    • SUBJECT_LABEL_KEY: サブジェクト ワークロードの選択に使用されるラベルのキー。例: apptier、または role
    • SUBJECT_LABEL_VALUE: SUBJECT_LABEL_KEY に関連付けられた値。たとえば、SUBJECT_LABEL_KEYapp で、SUBJECT_LABEL_VALUEbackend の場合、ラベル app: backend のワークロードがトラフィックを送信しています。
    • PEER_LABEL_KEY: ピア ワークロードの選択に使用されるラベルのキー。
    • PEER_LABEL_VALUE: PEER_LABEL_KEY に関連付けられた値。
    • PORT: トラフィックが許可されているピア ワークロードのポート。

ロードバランサを使用してクラスタ内の Pod 間ポリシーを作成する

これらのポリシーは、トラフィックが外部ロードバランサを介して転送されるときに、同じクラスタ内の Pod 間のトラフィックを制御します。

ロードバランサを使用してクラスタ内の Pod 間 Ingress ポリシーを作成する

  • ロードバランサを使用してクラスタ内の Pod 間で Ingress トラフィックを許可するには、次のリソースを作成して適用します。

    kubectl --kubeconfig CLUSTER_API_SERVER apply -f - <<EOF
    apiVersion: networking.k8s.io/v1
    kind: NetworkPolicy
    metadata:
      name: allow-intra-cluster-ingress-traffic-via-elb
      namespace: SUBJECT_NAMESPACE
    spec:
      podSelector:
        matchLabels:
          SUBJECT_LABEL_KEY: SUBJECT_LABEL_VALUE
      policyTypes:
      - Ingress
      ingress:
      - from:
        - ipBlock:
            cidr: EGRESS_NAT_IP/32
        ports:
        - protocol: TCP
          port: PORT
    EOF
    

    次のように置き換えます。

    • CLUSTER_API_SERVER: クラスタ API サーバーの kubeconfig パス。API サーバーの kubeconfig ファイルをまだ生成していない場合は、ログインで詳細を確認してください。
    • SUBJECT_NAMESPACE: 標準クラスタのサブジェクト Namespace。
    • SUBJECT_LABEL_KEY: サブジェクト ワークロードの選択に使用されるラベルのキー。例: apptier、または role
    • SUBJECT_LABEL_VALUE: SUBJECT_LABEL_KEY に関連付けられた値。たとえば、SUBJECT_LABEL_KEYapp で、SUBJECT_LABEL_VALUEbackend の場合、ラベル app: backend のワークロードがトラフィックを受信しています。
    • EGRESS_NAT_IP: 送信元 Pod の下り(外向き)NAT IP。
    • PORT: トラフィックが許可されているサブジェクト ワークロードのポート。

ロードバランサを使用してクラスタ内の Pod 間下り(外向き)ポリシーを作成する

  • ロードバランサを使用してクラスタ内の Pod 間で下り(外向き)トラフィックを許可するには、次のリソースを作成して適用します。

    kubectl --kubeconfig CLUSTER_API_SERVER apply -f - <<EOF
    apiVersion: networking.k8s.io/v1
    kind: NetworkPolicy
    metadata:
      name: allow-intra-cluster-egress-traffic-via-elb
      namespace: SUBJECT_NAMESPACE
    spec:
      podSelector:
        matchLabels:
          SUBJECT_LABEL_KEY: SUBJECT_LABEL_VALUE
      policyTypes:
      - Egress
      egress:
      - to:
        - ipBlock:
            cidr: ELB_EXTERNAL_IP/32
        ports:
        - protocol: TCP
          port: PORT
    EOF
    

    次のように置き換えます。

    • CLUSTER_API_SERVER: クラスタ API サーバーの kubeconfig パス。API サーバーの kubeconfig ファイルをまだ生成していない場合は、ログインで詳細を確認してください。
    • SUBJECT_NAMESPACE: 標準クラスタのサブジェクト Namespace。
    • SUBJECT_LABEL_KEY: サブジェクト ワークロードの選択に使用されるラベルのキー。例: apptier、または role
    • SUBJECT_LABEL_VALUE: SUBJECT_LABEL_KEY に関連付けられた値。たとえば、SUBJECT_LABEL_KEYapp で、SUBJECT_LABEL_VALUEbackend の場合、ラベル app: backend のワークロードがトラフィックを送信しています。
    • ELB_EXTERNAL_IP: ロードバランサの外部 IP アドレス。
    • PORT: トラフィックが許可される外部エンドポイントのポート。

組織外ポリシーを作成する

これらのポリシーは、標準クラスタ内の Pod と外部エンドポイント(クラスタ外の IP アドレス)間のトラフィックを制御します。

組織外のトラフィックの内向きポリシーを作成する

  • 組織外のエンドポイントからの上り(内向き)トラフィックを許可するには、次のリソースを作成して適用します。

    kubectl --kubeconfig CLUSTER_API_SERVER apply -f - <<EOF
    apiVersion: networking.k8s.io/v1
    kind: NetworkPolicy
    metadata:
      name: allow-ingress-from-organization-external-to-standard-cluster-pod
      namespace: SUBJECT_NAMESPACE
    spec:
      podSelector:
        matchLabels:
          SUBJECT_LABEL_KEY: SUBJECT_LABEL_VALUE
      policyTypes:
      - Ingress
      ingress:
      - from:
        - ipBlock:
            cidr: EXTERNAL_CIDR
        ports:
        - protocol: TCP
          port: PORT
    EOF
    

    次のように置き換えます。

    • CLUSTER_API_SERVER: クラスタ API サーバーの kubeconfig パス。API サーバーの kubeconfig ファイルをまだ生成していない場合は、ログインで詳細を確認してください。
    • SUBJECT_NAMESPACE: 標準クラスタのサブジェクト Namespace。
    • SUBJECT_LABEL_KEY: サブジェクト ワークロードの選択に使用されるラベルのキー。例: apptier、または role
    • SUBJECT_LABEL_VALUE: SUBJECT_LABEL_KEY に関連付けられた値。たとえば、SUBJECT_LABEL_KEYapp で、SUBJECT_LABEL_VALUEbackend の場合、ラベル app: backend のワークロードがトラフィックを受信しています。
    • EXTERNAL_CIDR: 外部 CIDR(例: 20.0.0.0/16)。
    • PORT: トラフィックが許可されているサブジェクト ワークロードのポート。

組織外のトラフィック用の下り(外向き)ポリシーを作成する

  • 組織外のエンドポイントへの下り(外向き)トラフィックを許可するには、次のリソースを作成して適用します。

    kubectl --kubeconfig CLUSTER_API_SERVER apply -f - <<EOF
    apiVersion: networking.k8s.io/v1
    kind: NetworkPolicy
    metadata:
      name: allow-egress-from-standard-cluster-pod-to-organization-external
      namespace: SUBJECT_NAMESPACE
    spec:
      podSelector:
        matchLabels:
          SUBJECT_LABEL_KEY: SUBJECT_LABEL_VALUE
      policyTypes:
      - Egress
      egress:
      - to:
        - ipBlock:
            cidr: EXTERNAL_CIDR
        ports:
        - protocol: TCP
          port: PORT
    EOF
    

    次のように置き換えます。

    • CLUSTER_API_SERVER: クラスタ API サーバーの kubeconfig パス。API サーバーの kubeconfig ファイルをまだ生成していない場合は、ログインで詳細を確認してください。
    • SUBJECT_NAMESPACE: 標準クラスタのサブジェクト Namespace。
    • SUBJECT_LABEL_KEY: サブジェクト ワークロードの選択に使用されるラベルのキー。例: apptier、または role
    • SUBJECT_LABEL_VALUE: SUBJECT_LABEL_KEY に関連付けられた値。たとえば、SUBJECT_LABEL_KEYapp で、SUBJECT_LABEL_VALUEbackend の場合、ラベル app: backend のワークロードがトラフィックを送信しています。
    • EXTERNAL_CIDR: 外部 CIDR(例: 20.0.0.0/16)。
    • PORT: トラフィックが許可される外部エンドポイントのポート。

すべて許可ポリシーを作成する

次のポリシーを使用して、すべてのトラフィックを明示的に許可できます。これにより、他の標準クラスタと共有クラスタのエンドポイントとの通信が可能になります。

内向きのすべて許可ポリシーを作成する

  • すべての上り(内向き)トラフィックを許可するには、次のリソースを作成して適用します。

    kubectl --kubeconfig CLUSTER_API_SERVER apply -f - <<EOF
    apiVersion: networking.k8s.io/v1
    kind: NetworkPolicy
    metadata:
      name: allow-all-ingress-traffic
      namespace: SUBJECT_NAMESPACE
    spec:
      podSelector: {}
      policyTypes:
      - Ingress
      ingress:
      - {}
    EOF
    

    次のように置き換えます。

    • CLUSTER_API_SERVER: クラスタ API サーバーの kubeconfig パス。API サーバーの kubeconfig ファイルをまだ生成していない場合は、ログインで詳細を確認してください。
    • SUBJECT_NAMESPACE: 標準クラスタのサブジェクト Namespace。

外向きのすべて許可ポリシーを作成する

  • すべての送信トラフィックを許可するには、次のリソースを作成して適用します。

    kubectl --kubeconfig CLUSTER_API_SERVER apply -f - <<EOF
    apiVersion: networking.k8s.io/v1
    kind: NetworkPolicy
    metadata:
      name: allow-all-egress-traffic
      namespace: SUBJECT_NAMESPACE
    spec:
      podSelector: {}
      policyTypes:
      - Egress
      egress:
      - {}
    EOF
    

    次のように置き換えます。

    • CLUSTER_API_SERVER: クラスタ API サーバーの kubeconfig パス。API サーバーの kubeconfig ファイルをまだ生成していない場合は、ログインで詳細を確認してください。
    • SUBJECT_NAMESPACE: 標準クラスタのサブジェクト Namespace。