Kubernetes NetworkPolicyは、ラベルセレクタを使用するポッドレベルのネットワーク管理ポリシーです。 ここからのアップグレードとして、Container Service for Kubernetes (ACK) はGlobalNetworkPolicyを提供します。これにより、クラスターディメンションでのネットワークポリシー管理のためのクラスターレベルのネットワークポリシー機能が追加されます。 このトピックでは、ACK GlobalNetworkPolicyを使用して、クラスターのネットワークセキュリティをきめ細かく管理する方法について説明します。
前提条件
ACK Proクラスターが作成され、クラスターはTerwayをネットワークプラグインとして使用します。 詳細については、「ACK管理クラスターの作成」をご参照ください。
Terwayのバージョンは1.9.4以降で、NetworkPolicy機能が有効になっています。 詳細については、「ネットワークポリシーの有効化」をご参照ください。
ステップ1: Poseidonコンポーネントのインストール
Poseidonは、ACKクラスターでKubernetesネットワークポリシーをサポートするためにACKによって提供されるコンポーネントです。
Poseidonコンポーネントバージョン0.5.1以降をインストールし、ACK NetworkPolicyオプションを有効にします。
ACKコンソールにログインします。 左側のナビゲーションウィンドウで、[クラスター] をクリックします。
[クラスター] ページで、管理するクラスターの名前をクリックします。 左側のナビゲーションウィンドウで、 を選択します。
[アドオン] ページで、[ネットワーク] タブをクリックし、Poseidonコンポーネントカードの右下隅にある [インストール] をクリックします。
[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 | このセレクターは、ラベルを使用してアドレスを動的に選択し、クラスター内のポッドのアドレスを記述するために使用されます。 |
ネットワークポリシーを作成する場合、同じルールでipBlock
とpodSelector
、またはipBlock
とnamespaceSelector
を使用することはできません。 次のように、ipBlock
とpodSelector
を分離する必要があります。
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
次のサンプルコードでは、誤った例を示します。
例
このセクションのすべての例では、podSelector
パラメーターが設定されています。 このパラメーターは、ビジネス要件に基づいて設定できます。
GlobalNetworkPolicy
の設定時にpodSelector
とnamespaceSelector
が指定されていない場合、ポリシーはクラスター内のすべてのポッドに適用されます。
特定のポッドのすべてのトラフィックルールを拒否する
次の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