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