Kubernetesネットワークポリシー
概要 ジュニパークラウドネイティブのContrail® Networking™ (CN2)では、Contrailファイアウォールセキュリティポリシーフレームワーク内にKubernetesネットワークポリシーを導入できます。ネットワークポリシーを展開するには、Contrailなどのサポートする NetworkPolicy
コンテナネットワークインターフェイス(CNI)を使用する必要があります。このトピックでは、CN2を実行する環境にKubernetesネットワークポリシーを展開する方法について説明します。
Kubernetesネットワークポリシーの概要
Kubernetesネットワークポリシーでは、ポッドを他のポッドやネットワークエンドポイントと通信する方法を指定できます。Kubernetes NetworkPolicy
リソースを使用すると、ポッドは次のように通信できます。
-
許可リスト内の他のポッド(ポッドはそれ自体へのアクセスをブロックできません)。
-
許可リスト内の名前空間。
-
IPブロック、またはクラスレスドメイン間ルーティング(CIDR)。
Kubernetesネットワークポリシーは、名前空間内のポッドにのみ適用され、イングレス(送信元)およびエグレス(宛先)ルールを定義します。Kubernetesネットワークポリシーは、ポッドに適用される場合、以下の特性を持っています。
-
ポッド固有で、1つのポッドまたはポッドのグループに適用されます。ネットワークポリシールールは、そのポッドへのトラフィックを決定します。
-
イングレストラフィック、エグレストラフィック、またはその両方のポッドのトラフィックルールを定義します。方向を明示的に指定しない場合、ポリシーはデフォルトでイングレス方向に適用されます。
-
イングレスおよびエグレス方向の許可リストからのトラフィックを指定する明示的なルールを含める必要があります。許可リストのルールに一致しないトラフィックは拒否されます。
-
許可されるトラフィックには、ポッドに適用されたネットワークポリシーのいずれかに一致するトラフィックが含まれます。
Kubernetes ネットワーク ポリシーには、次のような追加の特性があります。
-
ポッドに適用されていない場合、そのポッドはすべてのソースからのトラフィックを受け入れます。
-
個々のパケットではなく、接続に基づいて動作します。例えば、設定されたポリシーでポッドAからポッドBへのトラフィックが許可されている場合、そのポリシーがポッドBからポッドAへの接続を開始することを許可しない場合でも、ポッドBからポッドAへのパケットも許可されます。
Kubernetesネットワークポリシーは、以下のセクションで構成されています。
-
spec
: Kubernetes オブジェクトの望ましい状態について説明します。ネットワークポリシーの場合、仕様内のpodSelector
およびpolicyTypes
フィールドは、そのポリシーのルールを指定します。 -
podSelector
:ポリシーが適用されるポッドのグループを選択します。空podSelector
の場合、名前空間内のすべてのポッドが選択されます。 -
policyTypes
: ポリシーが、選択したポッドからのイングレストラフィックに適用されるか、または選択したポッドへのエグレストラフィックに適用されるかを指定します。が指定されていないpolicyTypes
場合、イングレス方向がデフォルトで選択されます。 -
ingress
: とports
セクションに一致するイングレス トラフィックをfrom
許可します。以下の例では、イングレスルールにより、ラベルアプリを使用して名前空間内dev
のすべてのポッドへの接続を許可しています。webserver-dev
のTCPポート80では、-
ラベル
app: client1-dev
を持つデフォルト名前空間のポッド。 -
10.169.25.20/32 範囲内のすべての IP アドレス。
-
ラベル
project: jtac
を持つデフォルト名前空間のポッド。
-
-
egress
: およびports
セクションに一致するエグレス トラフィックをto
許可します。例1では、エグレスルールは、デフォルト名前空間の任意のポッドから、ラベルapp: dbserver-dev
を使用してTCP 80をポートに接続できます。 -
ipBlock
:IP CIDR範囲を選択して、イングレスソースまたはエグレス宛先として許可します。ipBlock
ネットワーク ポリシーのセクションには、以下の 2 つのフィールドが含まれています。-
cidr(ipBlock.cidr):ネットワークポリシーにより、指定されたIP範囲へのエグレストラフィック、またはからのイングレストラフィックが許可されます。
-
except (ipBlock.except): Kubernetes は、指定された IP 範囲のトラフィックがポリシーと一致しないことを想定しています。ネットワークポリシーは、 で
except
指定されたIP範囲へのイングレストラフィックを拒否するか、 からトラフィックをエグレスします。メモ:ネットワークポリシーで使用except
する場合、Kubernetesは、IP範囲内のexcept
識別されたトラフィックがポリシーと一致しないことを期待します。CN2は、条件を使用するこの特定のシナリオをexcept
サポートしていません。その結果、使用except
を避けるようにお勧めします.
-
次NetworkPolicy
のリソース例は、 および ルールをegress
示していますingress
。
#policy1-do.yaml apiVersion: networking.k8s.io/v1 kind: NetworkPolicy metadata: name: policy1 namespace: dev spec: podSelector: matchLabels: app: webserver-dev policyTypes: - Ingress - Egress ingress: - from: - ipBlock: cidr: 10.169.25.20/32 - namespaceSelector: matchLabels: project: jtac - podSelector: matchLabels: app: client1-dev ports: - protocol: TCP port: 80 egress: - to: - podSelector: matchLabels: app: dbserver-dev ports: - protocol: TCP port: 80
この例では、CIDR 10.169.25.20/32
port: 80
内のIPからのイングレスTCPトラフィックが許可されています。が許可されているポッドmatchLabels
app: dbserver-dev
にトラフィックをTCP port: 80
送信します。
クラウドネイティブのContrail NetworkingにKubernetesネットワークポリシーを導入
CN2では、Kubernetesネットワークポリシーを設定して展開すると、そのポリシーがContrailで自動的に作成されます。Kubernetesネットワークポリシーの例を次に示します。
apiVersion: networking.k8s.io/v1 kind: NetworkPolicy metadata: name: test-network-policy namespace: default spec: podSelector: matchLabels: role: db policyTypes: - Ingress - Egress ingress: - from: - ipBlock: cidr: 172.17.0.0/16 except: - 172.17.1.0/24 - namespaceSelector: matchLabels: project: myproject - podSelector: matchLabels: role: frontend ports: - protocol: TCP port: 6379 egress: - to: - ipBlock: cidr: 10.0.0.0/24 ports: - protocol: TCP port: 5978
このポリシーにより、CN2で以下のオブジェクトが作成されます。
キー | 値 |
---|---|
役割 | Db |
名前 空間 | 既定 |
プロジェクト | myproject |
役割 | フロント エンド |
名前 | プレフィックス |
---|---|
test-network-policy-except | 172.17.1.0/24 |
テストネットワークポリシー | 172.17.0.0/16 |
test-network-policy-egress | 10.0.0.0/24 |
ルール名 | アクション | サービス | エンドポイント1 | 方向 | エンドポイント2 |
---|---|---|---|---|---|
default-ingress-test-network-policy-0-ipBlock-0-17x.xx.1.0/24-0 | 拒否 | tcp:6379 | role=db & 名前空間=デフォルト | イングレス | アドレス グループ:172.17.1.0/24 |
default-ingress-test-network-policy-0-ipBlock-0-cidr-17x.xx.0.0/16-0 | 渡す | tcp:6379 | role=db & 名前空間=デフォルト | イングレス | アドレス グループ:172.17.0.0/16 |
default-ingress-test-network-policy-0-namespaceSelector-1-0 | 渡す | tcp:6379 | role=db & 名前空間=デフォルト | イングレス | project=myproject |
default-ingress-test-network-policy-0-podSelector-2-0 | 渡す | tcp:6379 | role=db & 名前空間=デフォルト | イングレス | 名前空間=default & role=フロントエンド |
default-egress-test-network-policy-ipBlock-0-cidr-10.0.0.0/24-0 | 渡す | tcp:5978 | role=db & 名前空間=デフォルト | 出口 | アドレス グループ:10.0.0.0/24 |
名前 | ルール |
---|---|
default-test-network-policy | default-ingress-test-network-policy-0-ipBlock-0-172.17.1.0/24-0、default-ingress-test-network-policy-0-ipBlock-0-cidr-172.17.0.0/16-0 default-ingress-test-network-policy-0-namespaceSelector-1-0 default-ingress-test-network-policy-0-podSelector-2-0、default-egress-test-network-policy-ipBlock-0-cidr-10.0.0.0/24-0 |
Kubernetes ネットワーク ポリシー一致表現
クラウドネイティブのContrail Networking(CN2)バージョン22.3以降、CN2 matchExpressions
は.詳細については matchExpressions
、Kubernetesのドキュメント の「セットベースの要件をサポートするリソース」 を参照してください。