3 Calicoの使用
この項では、KubernetesおよびCalicoネットワーク・ポリシーを使用して、NGINX webサーバー・アプリケーションのトラフィックのネットワーク・ポリシーを定義する例を示します。 Kubernetesネットワーク・ポリシーの例では、Kubernetesネットワーク・ポリシーAPIで使用可能なネットワーク・ポリシーを使用します。 Calicoネットワーク・ポリシーの例では、Calicoポリシーで使用可能な拡張機能が使用され、ネットワーク・ポリシーを設定するためのオプションが追加されています。
Kubernetesネットワーク・ポリシー
この項では、Kubernetesネットワーク・ポリシーを使用する基本的な例を示します。 Kubernetesネットワーク・ポリシーの詳細は、アップストリームの「Calicoのドキュメント」を参照してください。
この例では、ネームスペース内のポッド間のすべてのネットワーク・トラフィックを無効にするNetworkPolicyを定義します。 NetworkPolicyリソースは、アプリケーション・ポッド間で許可されるネットワーク・トラフィックを指定するルールを定義するために作成されます。 ネームスペース内のNetworkPolicyがポッドを選択すると、そのポッドはNetworkPolicyで許可されていない接続を拒否します。
Kubernetesネットワーク・ポリシーを使用するテスト・アプリケーションを作成するには:
-
テスト・アプリケーションのKubernetesネームスペースを作成します:
kubectl create namespace myapp
-
app: nginx
というラベルのNGINXポッドを作成します。 これは、myapp
ネームスペースに作成されます。 コントロール・プレーン・ノードで、nginx.yaml
という名前のファイルを作成し、そのファイルに次をコピーします。apiVersion: v1 kind: Pod metadata: name: nginx namespace: myapp labels: app: nginx spec: containers: - name: nginx image: container-registry.oracle.com/olcne/nginx:1.17.7 ports: - containerPort: 80
-
NGINXポッドを起動します:
kubectl apply -f nginx.yaml
-
app: nginx
というラベルのOracle Linux 9ポッドを作成します。 これは、myapp
ネームスペースに作成されます。ol9.yaml
という名前のファイルを作成し、次のものをファイルにコピーします:apiVersion: v1 kind: Pod metadata: name: ol9 namespace: myapp labels: app: nginx spec: containers: - name: ol9 command: ["/bin/sh", "-c", "trap : TERM INT; sleep infinity & wait"] image: container-registry.oracle.com/os/oraclelinux:9-slim
-
kubectl
コマンドを使用して、ポッドを起動します:kubectl apply -f ol9.yaml
-
kubectl get pods
コマンドを使用して、nginx-app
ポッドおよびol9
ポッドが実行されていることを確認できます:kubectl get pods --namespace myapp -o wide
出力は次のようになります:
NAME READY STATUS RESTARTS AGE IP NODE ... nginx 1/1 Running 0 38s 10.244.140.68 worker1.example.com ... ol9 1/1 Running 0 22h 10.244.80.196 worker2.example.com ...
- Oracle Linux 9ポッド
ol9
をマウントし、curl
を実行して、ポッドに割り当てられたIPアドレスを使用してNGINXサーバー・ポッドnginx
に接続します。kubectl exec -it ol9 --namespace myapp -- curl 10.244.140.68
出力は次のようになります:
<!DOCTYPE html> <html> <head> <title>Welcome to nginx!</title> <style> 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>
- NetworkPolicyを作成して、
myapp
ネームスペース内のすべてのポッドへのすべてのトラフィックを拒否します。deny-all.yaml
という名前のファイルを作成し、そのファイルに次をコピーします。kind: NetworkPolicy apiVersion: networking.k8s.io/v1 metadata: name: default-deny namespace: myapp spec: podSelector: matchLabels: {}
-
kubectl
コマンドを使用して、NetworkPolicyを作成します:kubectl apply -f deny-all.yaml
ヒント:
次のものを使用して、
myapp
ネームスペース内のすべてのNetworkPoliciesのリストを取得できます:kubectl get networkpolicies --namespace myapp
また、
-o yaml
オプションを追加すると、NetworkPoliciesの詳細がリストされます。 - Oracle Linux 9ポッド
ol9
を再度マウントし、curl
を実行してNGINXサーバー・ポッドに接続します。kubectl exec -it ol9 --namespace myapp -- curl 10.244.140.68
今回は、そのネームスペースのポッド間のトラフィックが許可されていないため、結果は返されません。
Ctrl+C
と入力してコマンドを終了できます。 - NetworkPolicyを作成して、
myapp
ネームスペース内のポッドのポート80のイングレス・トラフィックを許可します。 これにより、ポッドはNGINXサーバーに接続できます。ingress.yaml
という名前のファイルを作成し、次のものをファイルにコピーします:kind: NetworkPolicy apiVersion: networking.k8s.io/v1 metadata: name: myapp-ingress namespace: myapp spec: podSelector: matchLabels: app: nginx ingress: - from: - podSelector: matchLabels: app: nginx ports: - port: 80
-
kubectl
コマンドを使用して、NetworkPolicyを作成します:kubectl apply -f ingress.yaml
- Oracle Linux 9ポッド
ol9
を再度マウントし、curl
を実行してNGINXサーバー・ポッドに接続します。kubectl exec -it ol9 --namespace myapp -- curl 10.244.140.68
ポッドへのイングレスが許可されているため、「The NGINX」ページが返されるようになりました。
-
このCalicoテストで作成されたリソースは、次を使用して削除できます:
kubectl delete pod --namespace myapp nginx kubectl delete pod --namespace myapp ol9 kubectl delete networkpolicies --namespace myapp myapp-ingress kubectl delete networkpolicies --namespace myapp default-deny kubectl delete namespace myapp
Calicoネットワーク・ポリシー
この項では、Kubernetesネットワーク・ポリシーAPIのCalicoポリシー拡張を使用する基本的な例を示します。 Calicoポリシーの詳細は、「アップストリームのドキュメント」を参照してください。
この例では、KubernetesシステムおよびCalicoポッドを除くすべてのネットワーク・トラフィックを無効にするGlobalNetworkPolicyを定義します。 NetworkPolicyリソースは、アプリケーション・ポッド間で許可されるネットワーク・トラフィックを指定するルールを定義するために作成されます。 他のポッド・トラフィックは許可されません。
Calicoネットワーク・ポリシーを使用するテスト・アプリケーションを作成するには:
-
テスト・アプリケーションのKubernetesネームスペースを作成します:
kubectl create namespace myapp
-
app: nginx
というラベルのNGINXポッドを作成します。 これは、myapp
ネームスペースに作成されます。 コントロール・プレーン・ノードで、nginx.yaml
という名前のファイルを作成し、そのファイルに次をコピーします。apiVersion: v1 kind: Pod metadata: name: nginx namespace: myapp labels: app: nginx spec: containers: - name: nginx image: container-registry.oracle.com/olcne/nginx:1.17.7 ports: - containerPort: 80
-
NGINXポッドを起動します:
kubectl apply -f nginx.yaml
-
app: nginx
というラベルのOracle Linux 9ポッドを作成します。 これは、myapp
ネームスペースに作成されます。ol9.yaml
という名前のファイルを作成し、次のものをファイルにコピーします:apiVersion: v1 kind: Pod metadata: name: ol9 namespace: myapp labels: app: nginx spec: containers: - name: ol9 command: ["/bin/sh", "-c", "trap : TERM INT; sleep infinity & wait"] image: container-registry.oracle.com/os/oraclelinux:9-slim
-
kubectl
コマンドを使用して、ポッドを起動します:kubectl apply -f ol9.yaml
-
kubectl get pods
コマンドを使用して、nginx-app
ポッドおよびol9
ポッドが実行されていることを確認できます:kubectl get pods --namespace myapp -o wide
出力は次のようになります:
NAME READY STATUS RESTARTS AGE IP NODE ... nginx 1/1 Running 0 38s 10.244.140.68 worker1.example.com ... ol9 1/1 Running 0 22h 10.244.80.196 worker2.example.com ...
- Oracle Linux 9ポッド
ol9
をマウントし、curl
を実行して、ポッドに割り当てられたIPアドレスを使用してNGINXサーバー・ポッドnginx
に接続します。kubectl exec -it ol9 --namespace myapp -- curl 10.244.140.68
出力は次のようになります:
<!DOCTYPE html> <html> <head> <title>Welcome to nginx!</title> <style> 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>
- GlobalNetworkPolicyを作成して、
kube-system
、calico-system
またはcalico-apiserver
ネームスペースにないネームスペース内のすべてのポッドへのすべてのトラフィックを拒否します。deny-all.yaml
という名前のファイルを作成し、そのファイルに次をコピーします。apiVersion: projectcalico.org/v3 kind: GlobalNetworkPolicy metadata: name: default-deny spec: selector: projectcalico.org/namespace not in {'kube-system', 'calico-system', 'calico-apiserver'} types: - Ingress - Egress
-
kubectl
コマンドを使用して、GlobalNetworkPolicyを作成します:kubectl apply -f deny-all.yaml
ヒント:
次のものを使用して、
myapp
ネームスペース内のすべてのCalico GlobalNetworkPoliciesのリストを取得できます:kubectl get globalnetworkpolicies.crd.projectcalico.org --namespace myapp
また、
-o yaml
オプションを追加すると、GlobalNetworkPoliciesの詳細がリストされます。 - Oracle Linux 9ポッド
ol9
を再度マウントし、curl
を実行してNGINXサーバー・ポッドに接続します。kubectl exec -it ol9 --namespace myapp -- curl 10.244.140.68
今回は、そのネームスペースのポッド間のトラフィックが許可されていないため、結果は返されません。
Ctrl+C
と入力してコマンドを終了できます。 - NetworkPolicyを作成して、
myapp
ネームスペース内のポッドのポート80のイングレス・トラフィックを許可します。 これにより、ポッドはNGINXサーバーに接続できます。ingress.yaml
という名前のファイルを作成し、次のものをファイルにコピーします:apiVersion: projectcalico.org/v3 kind: NetworkPolicy metadata: name: allow-nginx-ingress namespace: myapp spec: selector: app == 'nginx' types: - Ingress ingress: - action: Allow protocol: TCP source: selector: app == 'nginx' destination: ports: - 80
-
kubectl
コマンドを使用して、NetworkPolicyを作成します:kubectl apply -f ingress.yaml
ヒント:
次のものを使用して、
myapp
ネームスペース内のすべてのCalico NetworkPoliciesのリストを取得できます:kubectl get networkpolicies.crd.projectcalico.org --namespace myapp
また、
-o yaml
オプションを追加すると、NetworkPoliciesの詳細がリストされます。 - Oracle Linux 9ポッド
ol9
を再度マウントし、curl
を実行してNGINXサーバー・ポッドに接続します。kubectl exec -it ol9 --namespace myapp -- curl 10.244.140.68
そのネームスペースのポッド間のエグレス・トラフィックは許可されていないため、結果は返されません。
Ctrl+C
と入力してコマンドを終了できます。 - NetworkPolicyを作成して、
myapp
ネームスペース内のポッドのエグレス・トラフィックを許可します。egress.yaml
という名前のファイルを作成し、次のものをファイルにコピーします:apiVersion: projectcalico.org/v3 kind: NetworkPolicy metadata: name: allow-nginx-egress namespace: myapp spec: selector: app == 'nginx' types: - Egress egress: - action: Allow
-
kubectl
コマンドを使用して、NetworkPolicyを作成します:kubectl apply -f egress.yaml
- Oracle Linux 9ポッド
ol9
を再度マウントし、curl
を実行してNGINXサーバー・ポッドに接続します。kubectl exec -it ol9 --namespace myapp -- curl 10.244.140.68
ポッドに対してイングレスとエグレスの両方が許可されているため、「The NGINX」ページが返されるようになりました。
-
このCalicoテストで作成されたリソースは、次を使用して削除できます:
kubectl delete pod --namespace myapp nginx kubectl delete pod --namespace myapp ol9 kubectl delete networkpolicies.crd.projectcalico.org --namespace myapp default.allow-nginx-egress kubectl delete networkpolicies.crd.projectcalico.org --namespace myapp default.allow-nginx-ingress kubectl delete globalnetworkpolicies.crd.projectcalico.org --namespace myapp default.default-deny kubectl delete namespace myapp