機械翻訳について

3 Calicoの使用

この項では、KubernetesおよびCalicoネットワーク・ポリシーを使用して、NGINX webサーバー・アプリケーションのトラフィックのネットワーク・ポリシーを定義する例を示します。 Kubernetesネットワーク・ポリシーの例では、Kubernetesネットワーク・ポリシーAPIで使用可能なネットワーク・ポリシーを使用します。 Calicoネットワーク・ポリシーの例では、Calicoポリシーで使用可能な拡張機能が使用され、ネットワーク・ポリシーを設定するためのオプションが追加されています。

Kubernetesネットワーク・ポリシー

この項では、Kubernetesネットワーク・ポリシーを使用する基本的な例を示します。 Kubernetesネットワーク・ポリシーの詳細は、アップストリームの「Calicoのドキュメント」を参照してください。

この例では、ネームスペース内のポッド間のすべてのネットワーク・トラフィックを無効にするNetworkPolicyを定義します。 NetworkPolicyリソースは、アプリケーション・ポッド間で許可されるネットワーク・トラフィックを指定するルールを定義するために作成されます。 ネームスペース内のNetworkPolicyがポッドを選択すると、そのポッドはNetworkPolicyで許可されていない接続を拒否します。

Kubernetesネットワーク・ポリシーを使用するテスト・アプリケーションを作成するには:

  1. テスト・アプリケーションのKubernetesネームスペースを作成します:

    kubectl create namespace myapp
  2. 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
  3. NGINXポッドを起動します:

    kubectl apply -f nginx.yaml
  4. 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
  5. kubectlコマンドを使用して、ポッドを起動します:
    kubectl apply -f ol9.yaml
  6. 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         ...
  7. 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>
  8. NetworkPolicyを作成して、myappネームスペース内のすべてのポッドへのすべてのトラフィックを拒否します。 deny-all.yamlという名前のファイルを作成し、そのファイルに次をコピーします。
    kind: NetworkPolicy
    apiVersion: networking.k8s.io/v1
    metadata:
      name: default-deny
      namespace: myapp
    spec:
      podSelector:
        matchLabels: {}
  9. kubectlコマンドを使用して、NetworkPolicyを作成します:
    kubectl apply -f deny-all.yaml

    ヒント:

    次のものを使用して、myappネームスペース内のすべてのNetworkPoliciesのリストを取得できます:

    kubectl get networkpolicies --namespace myapp

    また、-o yamlオプションを追加すると、NetworkPoliciesの詳細がリストされます。

  10. Oracle Linux 9ポッドol9を再度マウントし、curlを実行してNGINXサーバー・ポッドに接続します。
    kubectl exec -it ol9 --namespace myapp -- curl 10.244.140.68

    今回は、そのネームスペースのポッド間のトラフィックが許可されていないため、結果は返されません。 Ctrl+Cと入力してコマンドを終了できます。

  11. 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
  12. kubectlコマンドを使用して、NetworkPolicyを作成します:
    kubectl apply -f ingress.yaml
  13. Oracle Linux 9ポッドol9を再度マウントし、curlを実行してNGINXサーバー・ポッドに接続します。
    kubectl exec -it ol9 --namespace myapp -- curl 10.244.140.68

    ポッドへのイングレスが許可されているため、「The NGINX」ページが返されるようになりました。

  14. この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ネットワーク・ポリシーを使用するテスト・アプリケーションを作成するには:

  1. テスト・アプリケーションのKubernetesネームスペースを作成します:

    kubectl create namespace myapp
  2. 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
  3. NGINXポッドを起動します:

    kubectl apply -f nginx.yaml
  4. 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
  5. kubectlコマンドを使用して、ポッドを起動します:
    kubectl apply -f ol9.yaml
  6. 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         ...
  7. 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>
  8. GlobalNetworkPolicyを作成して、kube-systemcalico-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
  9. kubectlコマンドを使用して、GlobalNetworkPolicyを作成します:
    kubectl apply -f deny-all.yaml

    ヒント:

    次のものを使用して、myappネームスペース内のすべてのCalico GlobalNetworkPoliciesのリストを取得できます:

    kubectl get globalnetworkpolicies.crd.projectcalico.org --namespace myapp

    また、-o yamlオプションを追加すると、GlobalNetworkPoliciesの詳細がリストされます。

  10. Oracle Linux 9ポッドol9を再度マウントし、curlを実行してNGINXサーバー・ポッドに接続します。
    kubectl exec -it ol9 --namespace myapp -- curl 10.244.140.68

    今回は、そのネームスペースのポッド間のトラフィックが許可されていないため、結果は返されません。 Ctrl+Cと入力してコマンドを終了できます。

  11. 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
  12. kubectlコマンドを使用して、NetworkPolicyを作成します:
    kubectl apply -f ingress.yaml

    ヒント:

    次のものを使用して、myappネームスペース内のすべてのCalico NetworkPoliciesのリストを取得できます:

    kubectl get networkpolicies.crd.projectcalico.org --namespace myapp

    また、-o yamlオプションを追加すると、NetworkPoliciesの詳細がリストされます。

  13. Oracle Linux 9ポッドol9を再度マウントし、curlを実行してNGINXサーバー・ポッドに接続します。
    kubectl exec -it ol9 --namespace myapp -- curl 10.244.140.68

    そのネームスペースのポッド間のエグレス・トラフィックは許可されていないため、結果は返されません。 Ctrl+Cと入力してコマンドを終了できます。

  14. 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
  15. kubectlコマンドを使用して、NetworkPolicyを作成します:
    kubectl apply -f egress.yaml
  16. Oracle Linux 9ポッドol9を再度マウントし、curlを実行してNGINXサーバー・ポッドに接続します。
    kubectl exec -it ol9 --namespace myapp -- curl 10.244.140.68

    ポッドに対してイングレスとエグレスの両方が許可されているため、「The NGINX」ページが返されるようになりました。

  17. この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