Kubernetes NetworkPolicy は、ラベルセレクターを使用して Pod レベルでネットワークポリシーを定義します。ACK GlobalNetworkPolicy はこの機能をクラスターレベルに拡張し、クラスター全体のネットワークポリシーを管理できるようにします。このトピックでは、ACK GlobalNetworkPolicy を使用して、クラスターに詳細なネットワークセキュリティポリシーを実装する方法について説明します。
前提条件
Terway ネットワークプラグインを使用する ACK Pro マネージドクラスターが作成されていること。詳細については、「ACK マネージドクラスターの作成」をご参照ください。
Terway ネットワークプラグインのバージョンが 1.9.4 以降であり、NetworkPolicy 機能が有効になっていること。詳細については、「ネットワークポリシーの有効化」をご参照ください。
ノードは Terway ネットワークプラグインを実行する必要があります。排他的な Elastic Network Interface (ENI) モードのノード、仮想ノード、ハイブリッドクラウドノード、またはその他の Alibaba Cloud 以外のノードはサポートされていません。
ステップ 1: Poseidon コンポーネントのインストール
Poseidon は、標準の Kubernetes NetworkPolicy 機能をサポートするコンテナーネットワークポリシーコンポーネントです。
バージョン 0.5.1 以降の Poseidon コンポーネントをインストールし、ACK NetworkPolicy 機能を有効にします。
ACK コンソールにログインします。左側のナビゲーションウィンドウで、[クラスター] をクリックします。
クラスター ページで、管理するクラスターを見つけてその名前をクリックします。左側のナビゲーションウィンドウで、[アドオン] をクリックします。
[コンポーネント管理] ページで、[ネットワーク] タブをクリックします。[Poseidon] コンポーネントカードの右下隅にある [インストール] をクリックします。
[Poseidon のインストール] ダイアログボックスで、[ACK NetworkPolicy の有効化] を選択し、[確認] をクリックします。
ステップ 2: ACK GlobalNetworkPolicy の使用
ACK GlobalNetworkPolicy の定義と使用方法は、Kubernetes NetworkPolicy のものと似ています。デフォルトでは、特に指定しない限り、そのルールはクラスター内のすべてのノードと Pod に適用されます。
構文
ACK GlobalNetworkPolicy の基本的な構造は次のとおりです。
apiVersion: network.alibabacloud.com/v1beta2
kind: GlobalNetworkPolicy
metadata:
name: example
spec:
podSelector: # ポリシーが適用される Pod。デフォルト: すべての Pod。
matchLabels:
foo: bar # ラベル foo:bar を持つ Pod を選択します。
namespaceSelector: # ポリシーが適用される名前空間。デフォルト: すべての名前空間。このルールと podSelector は AND 演算子を使用して評価されます。
matchLabels:
foo: bar # ラベル foo:bar を持つ名前空間を選択します。
policyTypes: # ポリシーが適用されるトラフィックの種類。
- Ingress # インバウンドトラフィックに適用されます。
- Egress # アウトバウンドトラフィックに適用されます。
ingress: [] # Ingress ルール。
egress: [] # Egress ルール。制限
単一のクラスター内のルールには、次の制限が適用されます。
GlobalNetworkPolicy リソースの数は 100 未満である必要があります。
単一の GlobalNetworkPolicy 内の
ingressおよびegressルールの数は 20 未満である必要があります。単一の ingress または egress ルール内の
portsの数は 10 未満である必要があります。
Ingress および Egress ルール
ingress および egress ルールは、NetworkPolicy で許可されるトラフィックソースと宛先を定義します。両方のルールタイプは同じ構造を持っています。これらは、許可される通信範囲を指定するために from ( ingress の場合) と to ( egress の場合) を使用します。
apiVersion: network.alibabacloud.com/v1beta2
kind: GlobalNetworkPolicy
metadata:
name: example # ポリシー名
spec:
podSelector: {}
namespaceSelector: null
policyTypes:
- Ingress # ポリシーには ingress ルールが含まれます。
- Egress # ポリシーには egress ルールが含まれます。
ingress:
- from:
- namespaceSelector: # 一致するラベルを持つ名前空間内の Pod からのインバウンドトラフィックを許可します。
matchLabels:
foo: bar
podSelector: # 一致するラベルを持つ Pod からのインバウンドトラフィックを許可します。
matchLabels:
foo: bar
ports:
- protocol: TCP # TCP トラフィックを許可します。有効な値は TCP と UDP です。
port: 443 # ポート 443 でのトラフィックを許可します。
- from:
- ipBlock: # クラスター外からのインバウンドリクエストが許可される CIDR 範囲を定義します。
cidr: "172.16.0.0/16"
except:
- "172.16.1.0/24" # クラスター外の許可されたインバウンドソースから CIDR 範囲 "172.16.1.0/24" を除外します。
egress:
- to:
- namespaceSelector: # 一致するラベルを持つ名前空間内の Pod へのアウトバウンドトラフィックを許可します。
matchLabels:
foo: bar
podSelector: # 一致するラベルを持つ Pod へのアウトバウンドトラフィックを許可します。
matchLabels:
foo: bar
- to:
- ipBlock: # クラスター外の宛先へのアウトバウンドトラフィックが許可される CIDR 範囲を定義します。
cidr: "172.16.0.0/16"
except:
- "172.16.1.0/24" # クラスター外の許可されたアウトバウンド宛先から CIDR 範囲 "172.16.1.0/24" を除外します。フィールド | 説明 |
ipBlock | クラスター外のトラフィックアドレスを記述する静的な CIDR ブロック。このブロックは、クラスター外のどの IP アドレス範囲がクラスター内の Pod へのトラフィックの送信または Pod からのトラフィックの受信を許可されるかを定義します。 |
podSelector | ラベルを使用してアドレスを動的に選択します。これは、クラスター内の Pod のアドレスを記述するために使用されます。 |
同じルール内で ipBlock を podSelector または namespaceSelector と一緒に使用することはできません。次の例に示すように、ipBlock と podSelector を異なるルールに分割してください。
ingress:
- from:
- ipBlock: # 最初のソース条件は ipBlock です。
cidr: "192.168.0.0/16"
- podSelector: # 2 番目のソース条件は podSelector です。
matchLabels:
key: value
ports:
- protocol: TCP
port: 80以下は、フィールドが相互排他的であるため、不正な例です。
使用例
このトピックの例には、podSelector 構成が含まれています。必要に応じて構成を調整できます。
GlobalNetworkPolicy を構成する際は注意してください。podSelector または namespaceSelector フィールドを指定しない場合、ポリシーはクラスター内のすべての Pod に適用されます。
特定のアプリケーション Pod のすべてのトラフィックを拒否する
次の YAML ファイルは、ラベル foo: bar を持つ Pod にのみ適用される GlobalNetworkPolicy を定義します。このポリシーは、これらの Pod のすべてのインバウンドおよびアウトバウンドネットワークトラフィックを拒否します。
apiVersion: network.alibabacloud.com/v1beta2
kind: GlobalNetworkPolicy
metadata:
name: default-deny
spec:
podSelector:
matchLabels:
foo: bar
namespaceSelector: null
policyTypes:
- Ingress
- Egress
ingress: []
egress: []特定のアプリケーション Pod が DNS にアクセスできるようにする
次の YAML ファイルは、ラベル foo: bar を持つ Pod にのみ適用される GlobalNetworkPolicy を定義します。このポリシーにより、これらの Pod はクラスターで実行されている 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