3.2. ネットワークポリシーの作成
namespace のネットワークポリシーを作成できます。
3.2.1. サンプル NetworkPolicy オブジェクト
以下は、サンプル NetworkPolicy オブジェクトにアノテーションを付けます。
kind: NetworkPolicy apiVersion: networking.k8s.io/v1 metadata: name: allow-27107 1 spec: podSelector: 2 matchLabels: app: mongodb ingress: - from: - podSelector: 3 matchLabels: app: app ports: 4 - protocol: TCP port: 27017
3.2.2. CLI を使用したネットワークポリシーの作成
クラスターの namespace に許可される Ingress または egress ネットワークトラフィックを記述する詳細なルールを定義するには、ネットワークポリシーを作成できます。
前提条件
-
OpenShift CLI (
oc
) がインストールされている。 - ネットワークポリシーが適用される namespace で作業している。
手順
ポリシールールを作成します。
<policy_name>.yaml
ファイルを作成します。$ touch <policy_name>.yaml
ここでは、以下のようになります。
<policy_name>
- ネットワークポリシーファイル名を指定します。
作成したばかりのファイルで、以下の例のようなネットワークポリシーを定義します。
すべての namespace のすべての Pod から ingress を拒否します。
これは基本的なポリシーであり、他のネットワークポリシーの設定によって許可されたクロス Pod トラフィック以外のすべてのクロス Pod ネットワーキングをブロックします。
kind: NetworkPolicy apiVersion: networking.k8s.io/v1 metadata: name: deny-by-default spec: podSelector: {} policyTypes: - Ingress ingress: []
同じ namespace のすべての Pod から ingress を許可します。
kind: NetworkPolicy apiVersion: networking.k8s.io/v1 metadata: name: allow-same-namespace spec: podSelector: ingress: - from: - podSelector: {}
特定のnamespaceから 1 つの Pod への上りトラフィックを許可する
このポリシーは、
namespace-y
で実行されている Pod からpod-a
というラベルの付いた Pod へのトラフィックを許可します。kind: NetworkPolicy apiVersion: networking.k8s.io/v1 metadata: name: allow-traffic-pod spec: podSelector: matchLabels: pod: pod-a policyTypes: - Ingress ingress: - from: - namespaceSelector: matchLabels: kubernetes.io/metadata.name: namespace-y
ネットワークポリシーオブジェクトを作成するには、以下のコマンドを入力します。
$ oc apply -f <policy_name>.yaml -n <namespace>
ここでは、以下のようになります。
<policy_name>
- ネットワークポリシーファイル名を指定します。
<namespace>
- オプション: オブジェクトが現在の namespace 以外の namespace に定義されている場合は namespace を指定します。
出力例
networkpolicy.networking.k8s.io/deny-by-default created
3.2.3. デフォルトの全拒否ネットワークポリシーの作成
これは基本的なポリシーであり、他のデプロイメントされたネットワークポリシーの設定によって許可されたネットワークトラフィック以外のすべてのクロス Pod ネットワークをブロックします。この手順では、デフォルトの deny-by-default
ポリシーを適用します。
前提条件
-
OpenShift CLI (
oc
) がインストールされている。 - ネットワークポリシーが適用される namespace で作業している。
手順
すべての namespace におけるすべての Pod からの ingress を拒否する
deny-by-default
ポリシーを定義する次の YAML を作成します。YAML をdeny-by-default.yaml
ファイルに保存します。kind: NetworkPolicy apiVersion: networking.k8s.io/v1 metadata: name: deny-by-default namespace: default 1 spec: podSelector: {} 2 ingress: [] 3
次のコマンドを入力して、ポリシーを適用します。
$ oc apply -f deny-by-default.yaml
出力例
networkpolicy.networking.k8s.io/deny-by-default created
3.2.4. 外部クライアントからのトラフィックを許可するネットワークポリシーの作成
deny-by-default
ポリシーを設定すると、外部クライアントからラベル app=web
を持つ Pod へのトラフィックを許可するポリシーの設定に進むことができます。
firewalld ルールは、NetworkPolicy
が適用される前に実行されます。
この手順に従って、パブリックインターネットから直接、またはロードバランサーを使用して Pod にアクセスすることにより、外部サービスを許可するポリシーを設定します。トラフィックは、ラベル app=web
を持つ Pod にのみ許可されます。
前提条件
-
OpenShift CLI (
oc
) がインストールされている。 - ネットワークポリシーが適用される namespace で作業している。
手順
パブリックインターネットからのトラフィックが直接、またはロードバランサーを使用して Pod にアクセスできるようにするポリシーを作成します。YAML を
web-allow-external.yaml
ファイルに保存します。kind: NetworkPolicy apiVersion: networking.k8s.io/v1 metadata: name: web-allow-external namespace: default spec: policyTypes: - Ingress podSelector: matchLabels: app: web ingress: - {}
次のコマンドを入力して、ポリシーを適用します。
$ oc apply -f web-allow-external.yaml
出力例
networkpolicy.networking.k8s.io/web-allow-external created
3.2.5. すべてのnamespaceからアプリケーションへのトラフィックを許可するネットワークポリシーを作成する
この手順に従って、すべてのnamespace内のすべての Pod から特定のアプリケーションへのトラフィックを許可するポリシーを設定します。
前提条件
-
OpenShift CLI (
oc
) がインストールされている。 - ネットワークポリシーが適用される namespace で作業している。
手順
すべてのnamespaceのすべての Pod から特定のアプリケーションへのトラフィックを許可するポリシーを作成します。YAML を
web-allow-all-namespaces.yaml
ファイルに保存します。kind: NetworkPolicy apiVersion: networking.k8s.io/v1 metadata: name: web-allow-all-namespaces namespace: default spec: podSelector: matchLabels: app: web 1 policyTypes: - Ingress ingress: - from: - namespaceSelector: {} 2
注記デフォルトでは、
namespaceSelector
の指定を省略した場合、namespace は選択されません。つまり、ポリシーは、ネットワークポリシーがデプロイされている namespace からのトラフィックのみを許可します。次のコマンドを入力して、ポリシーを適用します。
$ oc apply -f web-allow-all-namespaces.yaml
出力例
networkpolicy.networking.k8s.io/web-allow-all-namespaces created
検証
次のコマンドを入力して、
default
namespace で Web サービスを開始します。$ oc run web --namespace=default --image=nginx --labels="app=web" --expose --port=80
次のコマンドを実行して、
alpine
イメージをsecondary
namespace にデプロイし、シェルを開始します。$ oc run test-$RANDOM --namespace=secondary --rm -i -t --image=alpine -- sh
シェルで次のコマンドを実行し、リクエストが許可されていることを確認します。
# wget -qO- --timeout=2 http://web.default
予想される出力
<!DOCTYPE html> <html> <head> <title>Welcome to nginx!</title> <style> html { color-scheme: light dark; } body { width: 35em; margin: 0 auto; font-family: Tahoma, Verdana, Arial, sans-serif; } </style> </head> <body> <h1>Welcome to nginx!</h1> <p>If you see this page, the nginx web server is successfully installed and working. Further configuration is required.</p> <p>For online documentation and support please refer to <a href="http://nginx.org/">nginx.org</a>.<br/> Commercial support is available at <a href="http://nginx.com/">nginx.com</a>.</p> <p><em>Thank you for using nginx.</em></p> </body> </html>
3.2.6. namespaceからアプリケーションへのトラフィックを許可するネットワークポリシーの作成
特定の namespace からラベル app=web
を持つ Pod へのトラフィックを許可するポリシーを設定するには、次の手順に従います。以下の場合にこれを行うことができます。
- 運用データベースへのトラフィックを、運用ワークロードがデプロイされているnamespaceのみに制限します。
- 特定のnamespaceにデプロイされた監視ツールを有効にして、現在のnamespaceからメトリックをスクレイピングします。
前提条件
-
OpenShift CLI (
oc
) がインストールされている。 - ネットワークポリシーが適用される namespace で作業している。
手順
ラベルが
purpose=production
の特定の namespace 内にあるすべての Pod からのトラフィックを許可するポリシーを作成します。YAML をweb-allow-prod.yaml
ファイルに保存します。kind: NetworkPolicy apiVersion: networking.k8s.io/v1 metadata: name: web-allow-prod namespace: default spec: podSelector: matchLabels: app: web 1 policyTypes: - Ingress ingress: - from: - namespaceSelector: matchLabels: purpose: production 2
次のコマンドを入力して、ポリシーを適用します。
$ oc apply -f web-allow-prod.yaml
出力例
networkpolicy.networking.k8s.io/web-allow-prod created
検証
次のコマンドを入力して、
default
namespace で Web サービスを開始します。$ oc run web --namespace=default --image=nginx --labels="app=web" --expose --port=80
次のコマンドを実行して、
prod
namespace を作成します。$ oc create namespace prod
次のコマンドを実行して、
prod
namespace にラベルを付けます。$ oc label namespace/prod purpose=production
次のコマンドを実行して、
dev
namespace を作成します。$ oc create namespace dev
次のコマンドを実行して、
dev
namespace にラベルを付けます。$ oc label namespace/dev purpose=testing
次のコマンドを実行して、
alpine
イメージをdev
namespace にデプロイし、シェルを開始します。$ oc run test-$RANDOM --namespace=dev --rm -i -t --image=alpine -- sh
シェルで次のコマンドを実行し、リクエストがブロックされていることを確認します。
# wget -qO- --timeout=2 http://web.default
予想される出力
wget: download timed out
次のコマンドを実行して、
alpine
イメージをprod
namespace にデプロイし、シェルを開始します。$ oc run test-$RANDOM --namespace=prod --rm -i -t --image=alpine -- sh
シェルで次のコマンドを実行し、リクエストが許可されていることを確認します。
# wget -qO- --timeout=2 http://web.default
予想される出力
<!DOCTYPE html> <html> <head> <title>Welcome to nginx!</title> <style> html { color-scheme: light dark; } body { width: 35em; margin: 0 auto; font-family: Tahoma, Verdana, Arial, sans-serif; } </style> </head> <body> <h1>Welcome to nginx!</h1> <p>If you see this page, the nginx web server is successfully installed and working. Further configuration is required.</p> <p>For online documentation and support please refer to <a href="http://nginx.org/">nginx.org</a>.<br/> Commercial support is available at <a href="http://nginx.com/">nginx.com</a>.</p> <p><em>Thank you for using nginx.</em></p> </body> </html>