このページでは、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: サブジェクト ワークロードの選択に使用されるラベルのキー。例:app、tier、またはroleSUBJECT_LABEL_VALUE:SUBJECT_LABEL_KEYに関連付けられた値。たとえば、SUBJECT_LABEL_KEYがappで、SUBJECT_LABEL_VALUEがbackendの場合、ラベル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: サブジェクト ワークロードの選択に使用されるラベルのキー。例:app、tier、またはroleSUBJECT_LABEL_VALUE:SUBJECT_LABEL_KEYに関連付けられた値。たとえば、SUBJECT_LABEL_KEYがappで、SUBJECT_LABEL_VALUEがbackendの場合、ラベル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: サブジェクト ワークロードの選択に使用されるラベルのキー。例:app、tier、またはroleSUBJECT_LABEL_VALUE:SUBJECT_LABEL_KEYに関連付けられた値。たとえば、SUBJECT_LABEL_KEYがappで、SUBJECT_LABEL_VALUEがbackendの場合、ラベル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: サブジェクト ワークロードの選択に使用されるラベルのキー。例:app、tier、またはroleSUBJECT_LABEL_VALUE:SUBJECT_LABEL_KEYに関連付けられた値。たとえば、SUBJECT_LABEL_KEYがappで、SUBJECT_LABEL_VALUEがbackendの場合、ラベル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: サブジェクト ワークロードの選択に使用されるラベルのキー。例:app、tier、またはroleSUBJECT_LABEL_VALUE:SUBJECT_LABEL_KEYに関連付けられた値。たとえば、SUBJECT_LABEL_KEYがappで、SUBJECT_LABEL_VALUEがbackendの場合、ラベル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: サブジェクト ワークロードの選択に使用されるラベルのキー。例:app、tier、またはroleSUBJECT_LABEL_VALUE:SUBJECT_LABEL_KEYに関連付けられた値。たとえば、SUBJECT_LABEL_KEYがappで、SUBJECT_LABEL_VALUEがbackendの場合、ラベル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。