プロジェクト内のネットワーク ポリシーを作成する

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

プロジェクト ネットワーク ポリシーは、上り(内向き)ルールまたは下り(外向き)ルールのいずれかを定義します。プロジェクト内、プロジェクト間、外部 IP アドレスへの通信を許可するポリシーを定義できます。

デフォルトでは、これらのポリシーはすべてのゾーンにグローバルに適用されます。GDC ユニバースのグローバル リソースの詳細については、マルチゾーンの概要をご覧ください。

単一ゾーン内でプロジェクト内トラフィックの適用が必要な場合は、単一ゾーンのワークロード レベルのプロジェクト内ポリシーを作成するをご覧ください。

始める前に

プロジェクト内トラフィック ネットワーク ポリシーを構成するには、次のものが必要です。

  • 必要な ID とアクセスロール。特定のプロジェクトのポリシーを管理するには、project-networkpolicy-admin ロールが必要です。すべてのゾーンにまたがるポリシーを管理する必要があるマルチゾーン環境では、global-project-networkpolicy-admin ロールが必要です。詳細については、事前定義ロールとアクセスを準備するをご覧ください。
  • 既存のプロジェクト。詳細については、プロジェクトを作成するをご覧ください。

プロジェクト内ポリシーを作成する

プロジェクト内のトラフィックの場合、GDC はデフォルトで、事前定義されたプロジェクト ネットワーク ポリシー(プロジェクト内ポリシー)を各プロジェクトに適用します。デフォルトでは、プロジェクト Namespace のワークロードは、外部リソースに何も公開せずに相互に通信できます。

デフォルトでは下り(外向き)ポリシーがないため、プロジェクト内のすべてのトラフィックでアウトバウンド トラフィックが許可されます。ただし、単一の下り(外向き)ポリシーを設定すると、ポリシーで指定されたトラフィックのみが許可されます。

内向きのプロジェクト内ポリシーを作成する

プロジェクトを作成すると、プロジェクト内の通信を可能にするデフォルトのベース ProjectNetworkPolicy リソースが暗黙的に作成されます。このポリシーでは、同じプロジェクト内の他のワークロードからのインバウンド トラフィックが許可されます。

デフォルト ポリシーは削除できますが、削除すると、プロジェクト内のすべてのサービスとワークロードでプロジェクト内の通信が拒否されることに注意してください。ポリシーを削除するには、kubectl delete コマンドを使用します。

kubectl --kubeconfig GLOBAL_API_SERVER delete pnp base-policy-allow-intra-project-traffic -n PROJECT

次のマニフェストを適用すると、デフォルト ポリシーを元に戻すことができます。

kubectl --kubeconfig GLOBAL_API_SERVER apply -f - <<EOF
apiVersion: networking.global.gdc.goog/v1
kind: ProjectNetworkPolicy
metadata:
  namespace: PROJECT
  name: base-policy-allow-intra-project-traffic
spec:
  policyType: Ingress
  ingress:
  - from:
    - projectSelector:
        projects:
          matchNames:
          - PROJECT
EOF

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

外向き(下り)プロジェクト内ポリシーを作成する

データ漏洩防止を無効にして、外部リソースへのアクセスを禁止するなど、ProjectNetworkPolicy 下り(外向き)ポリシーをプロジェクトに適用する場合は、次の必須ポリシーを使用して、プロジェクト内のアウトバウンド トラフィックを許可します。

kubectl --kubeconfig GLOBAL_API_SERVER apply -f - <<EOF
apiVersion: networking.global.gdc.goog/v1
kind: ProjectNetworkPolicy
metadata:
  namespace: PROJECT
  name: allow-intra-project-outbound-traffic
spec:
  policyType: Egress
  egress:
  - to:
    - projectSelector:
        projects:
          matchNames:
          - PROJECT
EOF

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

ワークロード レベルのプロジェクト内ポリシーを作成する

ワークロード単位のネットワーク ポリシーを使用すると、プロジェクト内の個々のワークロード間の通信をきめ細かく制御できます。この粒度により、ネットワーク アクセスをより厳密に制御できるため、セキュリティとリソースの使用率が向上します。

内向きワークロード レベルのプロジェクト内ポリシーを作成する

プロジェクトを作成すると、すべてのワークロード間のプロジェクト内通信を可能にするデフォルトのベース ProjectNetworkPolicy リソースが暗黙的に作成されます。このポリシーでは、同じプロジェクト内の他のワークロードからのインバウンド トラフィックが許可されます。

上り(内向き)ワークロード レベルのプロジェクト内ポリシーを作成するには、まずデフォルトのベースポリシーを削除する必要があります。そうしないと、予期しない動作が発生する可能性があります。

  1. デフォルトのベースポリシーを削除するには、次のコマンドを実行します。

    kubectl --kubeconfig GLOBAL_API_SERVER delete pnp base-policy-allow-intra-project-traffic -n PROJECT
    
  2. 上り(内向き)のワークロード レベルのプロジェクト内ポリシーを作成するには、次のカスタム リソースを作成して適用します。

    kubectl --kubeconfig GLOBAL_API_SERVER apply -f - <<EOF
    apiVersion: networking.global.gdc.goog/v1
    kind: ProjectNetworkPolicy
    metadata:
      namespace: PROJECT
      name: allow-intra-project-inbound-traffic-from-target-to-subject
    spec:
      policyType: Ingress
      subject:
        subjectType: UserWorkload
        workloadSelector:
          matchLabels:
            SUBJECT_LABEL_KEY: SUBJECT_LABEL_VALUE
      ingress:
      - from:
        - projectSelector:
            projects:
              matchNames:
              - PROJECT
            workloads:
              matchLabels:
                TARGET_LABEL_KEY: TARGET_LABEL_VALUE
    EOF
    

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

    • GLOBAL_API_SERVER: グローバル API サーバーの kubeconfig パス。詳細については、グローバル API サーバーとゾーン API サーバーをご覧ください。API サーバーの kubeconfig ファイルをまだ生成していない場合は、ログインで詳細を確認してください。
    • PROJECT: プロジェクトの名前。
    • SUBJECT_LABEL_KEY: ソース ワークロードの選択に使用されるラベルのキー。例: apptier、または role
    • SUBJECT_LABEL_VALUE: SUBJECT_LABEL_KEY に関連付けられた値。許可されたトラフィックの送信元となるワークロードを指定します。たとえば、SUBJECT_LABEL_KEYapp で、SUBJECT_LABEL_VALUEbackend の場合、ラベル app: backend のワークロードがトラフィック ソースになります。
    • TARGET_LABEL_KEY: 宛先ワークロードの選択に使用されるラベルのキー。
    • TARGET_LABEL_VALUE: TARGET_LABEL_KEY に関連付けられた値。許可されたトラフィックの宛先となるワークロードを指定します。

下り(外向き)ワークロード レベルのプロジェクト内ポリシーを作成する

  • 外向きワークロード レベルのプロジェクト内ポリシーを作成するには、次のカスタム リソースを作成して適用します。

    kubectl --kubeconfig GLOBAL_API_SERVER apply -f - <<EOF
    apiVersion: networking.global.gdc.goog/v1
    kind: ProjectNetworkPolicy
    metadata:
      namespace: PROJECT
      name: allow-intra-project-outbound-traffic-to-subject-from-target
    spec:
      policyType: Egress
      subject:
        subjectType: UserWorkload
        workloadSelector:
          matchLabels:
            SUBJECT_LABEL_KEY: SUBJECT_LABEL_VALUE
      egress:
      - to:
        - projectSelector:
            projects:
              matchNames:
              - PROJECT
            workloads:
              matchLabels:
                TARGET_LABEL_KEY: TARGET_LABEL_VALUE
    EOF
    

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

    • GLOBAL_API_SERVER: グローバル API サーバーの kubeconfig パス。詳細については、グローバル API サーバーとゾーン API サーバーをご覧ください。API サーバーの kubeconfig ファイルをまだ生成していない場合は、ログインで詳細を確認してください。
    • PROJECT: プロジェクトの名前。
    • SUBJECT_LABEL_KEY: ソース ワークロードの選択に使用されるラベルのキー。例: apptier、または role
    • SUBJECT_LABEL_VALUE: SUBJECT_LABEL_KEY に関連付けられた値。許可されたトラフィックの送信元となるワークロードを指定します。たとえば、SUBJECT_LABEL_KEYapp で、SUBJECT_LABEL_VALUEbackend の場合、ラベル app: backend のワークロードがトラフィック ソースになります。
    • TARGET_LABEL_KEY: 宛先ワークロードの選択に使用されるラベルのキー。
    • TARGET_LABEL_VALUE: TARGET_LABEL_KEY に関連付けられた値。許可されたトラフィックの宛先となるワークロードを指定します。

単一ゾーンのワークロード レベルのプロジェクト内ポリシーを作成する

ワークロード単位のネットワーク ポリシーは、単一のゾーンに沿って PNP を適用できます。特定のラベルを単一ゾーン内のワークロードに追加すると、そのゾーンのプロジェクト内または異なるプロジェクト内の個々のワークロード間の通信を制御できます。

単一ゾーンの内向きワークロード レベルのプロジェクト内ポリシーを作成する

プロジェクトを作成すると、すべてのワークロード間のプロジェクト内通信を可能にするデフォルトのベース ProjectNetworkPolicy リソースが暗黙的に作成されます。このポリシーでは、同じプロジェクト内の他のワークロードからのインバウンド トラフィックが許可されます。

単一ゾーンのイングレステワークロード レベルのプロジェクト内ポリシーを作成するには、まずデフォルトの基本ポリシーを削除する必要があります。そうしないと、予期しない動作が発生する可能性があります。

  1. デフォルトのベースポリシーを削除するには、次のコマンドを実行します。

    kubectl --kubeconfig GLOBAL_API_SERVER delete pnp base-policy-allow-intra-project-traffic -n PROJECT
    
  2. 単一ゾーンの Ingress ワークロード レベルのプロジェクト内トラフィック ネットワーク ポリシーを作成するには、次のカスタム リソースを作成して適用します。

    kubectl --kubeconfig GLOBAL_API_SERVER apply -f - <<EOF
    apiVersion: networking.global.gdc.goog/v1
    kind: ProjectNetworkPolicy
    metadata:
      namespace: PROJECT
      name: allow-single-zone-intra-project-inbound-traffic-from-target-to-subject
    spec:
      policyType: Ingress
      subject:
        subjectType: UserWorkload
        workloadSelector:
          matchLabels:
            SUBJECT_LABEL_KEY: SUBJECT_LABEL_VALUE
            ZONE_SUBJECT_LABEL_KEY: ZONE_SUBJECT_LABEL_VALUE
      ingress:
      - from:
        - projectSelector:
            projects:
              matchNames:
              - PROJECT
            workloads:
              matchLabels:
                TARGET_LABEL_KEY: TARGET_LABEL_VALUE
                ZONE_TARGET_LABEL_KEY: ZONE_TARGET_LABEL_VALUE
    EOF
    

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

    • GLOBAL_API_SERVER: グローバル API サーバーの kubeconfig パス。詳細については、グローバル API サーバーとゾーン API サーバーをご覧ください。API サーバーの kubeconfig ファイルをまだ生成していない場合は、ログインで詳細を確認してください。
    • PROJECT: プロジェクトの名前。
    • SUBJECT_LABEL_KEY: ソース ワークロードの選択に使用されるラベルのキー。例: apptier、または role
    • SUBJECT_LABEL_VALUE: SUBJECT_LABEL_KEY に関連付けられた値。許可されたトラフィックの送信元となるワークロードを指定します。たとえば、SUBJECT_LABEL_KEYapp で、SUBJECT_LABEL_VALUEbackend の場合、ラベル app: backend のワークロードがトラフィック ソースになります。
    • TARGET_LABEL_KEY: 宛先ワークロードの選択に使用されるラベルのキー。
    • TARGET_LABEL_VALUE: TARGET_LABEL_KEY に関連付けられた値。許可されたトラフィックの宛先となるワークロードを指定します。
    • ZONE_SUBJECT_LABEL_KEY: ソースゾーンの選択に使用されるラベルのキー。例: zone、または region
    • ZONE_SUBJECT_LABEL_VALUE: ZONE_SUBJECT_LABEL_KEY に関連付けられた値。許可されたトラフィックの送信元ゾーンを指定します。たとえば、ZONE_SUBJECT_LABEL_KEYzone で、ZONE_SUBJECT_LABEL_VALUEus-central1-a の場合、ラベル zone: us-central1-a のワークロードがトラフィック ソースになります。
    • ZONE_TARGET_LABEL_KEY: 宛先ゾーンの選択に使用されるラベルのキー。
    • ZONE_TARGET_LABEL_VALUE: ZONE_TARGET_LABEL_KEY に関連付けられた値。許可されたトラフィックの宛先となるゾーンを指定します。

単一ゾーンの下り(外向き)ワークロード レベルのプロジェクト内ポリシーを作成する

  • 単一ゾーンの外部送信ワークロード レベルのプロジェクト内ポリシーを作成するには、次のカスタム リソースを作成して適用します。

    kubectl --kubeconfig GLOBAL_API_SERVER apply -f - <<EOF
    apiVersion: networking.global.gdc.goog/v1
    kind: ProjectNetworkPolicy
    metadata:
      namespace: PROJECT
      name: allow-single-zone-intra-project-outbound-traffic-to-subject-from-target
    spec:
      policyType: Egress
      subject:
        subjectType: UserWorkload
        workloadSelector:
          matchLabels:
            SUBJECT_LABEL_KEY: SUBJECT_LABEL_VALUE
            ZONE_SUBJECT_LABEL_KEY: ZONE_SUBJECT_LABEL_VALUE
      egress:
      - to:
        - projectSelector:
            projects:
              matchNames:
              - PROJECT
            workloads:
              matchLabels:
                TARGET_LABEL_KEY: TARGET_LABEL_VALUE
                ZONE_TARGET_LABEL_KEY: ZONE_TARGET_LABEL_VALUE
    EOF
    

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

    • GLOBAL_API_SERVER: グローバル API サーバーの kubeconfig パス。詳細については、グローバル API サーバーとゾーン API サーバーをご覧ください。API サーバーの kubeconfig ファイルをまだ生成していない場合は、ログインで詳細を確認してください。
    • PROJECT: プロジェクトの名前。
    • SUBJECT_LABEL_KEY: ソース ワークロードの選択に使用されるラベルのキー。例: apptier、または role
    • SUBJECT_LABEL_VALUE: SUBJECT_LABEL_KEY に関連付けられた値。許可されたトラフィックの送信元となるワークロードを指定します。たとえば、SUBJECT_LABEL_KEYapp で、SUBJECT_LABEL_VALUEbackend の場合、ラベル app: backend のワークロードがトラフィック ソースになります。
    • TARGET_LABEL_KEY: 宛先ワークロードの選択に使用されるラベルのキー。
    • TARGET_LABEL_VALUE: TARGET_LABEL_KEY に関連付けられた値。許可されたトラフィックの宛先となるワークロードを指定します。
    • ZONE_SUBJECT_LABEL_KEY: ソースゾーンの選択に使用されるラベルのキー。例: zone、または region
    • ZONE_SUBJECT_LABEL_VALUE: ZONE_SUBJECT_LABEL_KEY に関連付けられた値。許可されたトラフィックの送信元ゾーンを指定します。たとえば、ZONE_SUBJECT_LABEL_KEYzone で、ZONE_SUBJECT_LABEL_VALUEus-central1-a の場合、ラベル zone: us-central1-a のワークロードがトラフィック ソースになります。
    • ZONE_TARGET_LABEL_KEY: 宛先ゾーンの選択に使用されるラベルのキー。
    • ZONE_TARGET_LABEL_VALUE: ZONE_TARGET_LABEL_KEY に関連付けられた値。許可されたトラフィックの宛先となるゾーンを指定します。