Tanzu Mission Control(TMC) の NetworkPolicy を試してみる

Tanzu Mission Control(TMC) は、マルチKubernetes クラスタを一元的に管理出来るSaaS ソリューションです。TMC からIaaS 環境に対して、Kubernetes クラスタをデプロイ出来たり、任意のKubernetes クラスタをTMC にAttach して一元的に管理する事が可能です。

TMC の管理機能の一つである、NetworkPolicy に機能について試してみたので、そのメモです。


環境


手順

TMC からTKGm をAWS 上にデプロイ

TMC のドキュメントに従って、AWS 環境にTKGm をTMC 上にデプロイします。

TKGm がAWS 環境に出来たら、TMC のClusters ビューの ACTIONS からAccess this cluster を選択し、kubeconfig ファイルをダウンロードします。



TMC 左側のメニューにあるAutomation Center のガイドに従い、tmc CLI の設定をしておきます。

これが出来た状態で、kubectl CLI でデプロイしたTKGm にアクセスします。この中では、Pinniped というオープンソースが利用されています。Pinnipedに関しては、こちらのブログ「Pinnipedを試す」が非常に分かりやすいので、参考にしてみて下さい。

TMC からTKGm をデプロイした直後では、以下のPod が稼働しています。

$ kubectl --kubeconfig=~/Downloads/kubeconfig-np-test.yml get pods -A
NAMESPACE        NAME                                                       READY   STATUS     RESTARTS   AGE
kube-system     calico-kube-controllers-675d8749dd-ftbmc                              1/1  Running       0    48m
kube-system     calico-node-9wfp2                                                     1/1  Running       0    48m
kube-system     calico-node-gbqs2                                                     1/1  Running       0    47m
kube-system     coredns-585d96fb45-2mwrm                                              1/1  Running       0    48m
kube-system     coredns-585d96fb45-fmfq5                                              1/1  Running       0    48m
kube-system     etcd-ip-10-0-1-67.ap-northeast-1.compute.internal                     1/1  Running       0    47m
kube-system     kube-apiserver-ip-10-0-1-67.ap-northeast-1.compute.internal           1/1  Running       0    47m
kube-system     kube-controller-manager-ip-10-0-1-67.ap-northeast-1.compute.internal  1/1  Running       0    47m
kube-system     kube-proxy-bpxmf                                                      1/1  Running       0    47m
kube-system     kube-proxy-ddp7s                                                      1/1  Running       0    48m
kube-system     kube-scheduler-ip-10-0-1-67.ap-northeast-1.compute.internal           1/1  Running       0    47m
vmware-system-tmc  agent-updater-7548c85d54-blvr4                                        1/1  Running    0  48m
vmware-system-tmc  agentupdater-workload-1615192020-lpm9c                                0/1  Completed  0  38s
vmware-system-tmc  cluster-auth-pinniped-6c5cd955d7-d5rld                                1/1  Running    0  47m
vmware-system-tmc  cluster-auth-pinniped-6c5cd955d7-pgm45                                1/1  Running    0  47m
vmware-system-tmc  cluster-auth-pinniped-kube-cert-agent-07807c98                        1/1  Running    0  46m
vmware-system-tmc  cluster-health-extension-7f68b956fd-dp98q                             1/1  Running    0  47m
vmware-system-tmc  extension-manager-5bd48fd785-hgwxt                                    1/1  Running    0  48m
vmware-system-tmc  extension-updater-79694bd56d-p4klj                                    1/1  Running    0  48m
vmware-system-tmc  gatekeeper-operator-manager-858fbc576f-wg87d                          1/1  Running    0  47m
vmware-system-tmc  inspection-extension-6c8cc856c5-vgbpg                                 1/1  Running    0  47m
vmware-system-tmc  intent-agent-5f89bd5b58-79qhs                                         1/1  Running    0  47m
vmware-system-tmc  logs-collector-cluster-auth-pinniped-20210308074139-bw4zj             0/1  Completed  0  46m
vmware-system-tmc  logs-collector-cluster-health-extension-20210308074139-2fqz2          0/1  Completed  0  46m
vmware-system-tmc  logs-collector-extension-manager-20210308074139-hgm58                 0/1  Completed  0  46m
vmware-system-tmc  logs-collector-gatekeeper-operator-20210308074139-xbmnb               0/1  Completed  0  46m
vmware-system-tmc  logs-collector-inspection-20210308074139-9phfz                        0/1  Completed  0  46m
vmware-system-tmc  logs-collector-policy-sync-extension-20210308074140-z77r8             0/1  Completed  0  46m
vmware-system-tmc  logs-collector-tmc-observer-20210308074140-9wsv2                      0/1  Completed  0  46m
vmware-system-tmc  policy-sync-extension-7dcf84f6f7-th4q4                                1/1  Running    0  47m
vmware-system-tmc  policy-webhook-64b748f5df-cdmm6                                       1/1  Running    0  47m
vmware-system-tmc  policy-webhook-64b748f5df-zhxsw                                       1/1  Running    0  47m
vmware-system-tmc  sync-agent-7fb6998d47-ljrrx                                           1/1  Running    0  47m
vmware-system-tmc  tmc-observer-76c7c9584c-58zcr                                         1/1  Running    0  47m

NetworkPolicy 利用の準備

TMC 上からKubernetes クラスタ内にPod やDeployment 等のWorkload リソースを作成する事は出来ませんが、Namespace を作成する事が出来ます。TMC からNamespace を作成し、Workspaces(複数Namespace をグルーピングして管理する論理的なTMC 内の仕組み)に紐付けます。











作成したnp-test というTKGm 内に、np-test-1, np-test-2 というNamespace を作成し、それぞれ、networkpolicy-1, networkpolicy-2 というWorkspace にアサインします。※本記事では、networkpolicy-1 というWorkspace のみを利用し、TMC から利用出来るNetworkpolicy のテストをしています。

サンプルアプリケーションのデプロイ

NetworkPolicy を確認するために以下のPod をデプロイします。

$ cat << EOF >> networkpolicy-pod-test.yaml
---
apiVersion: v1
kind: Pod
metadata:
  name: sample-pod-np1
  namespace: np-test-1
  labels:
    app: np1
spec:
  containers:
  - name: nginx-container
    image: nginx:1.18
---
apiVersion: v1
kind: Pod
metadata:
  name: sample-pod-np2
  namespace: np-test-1
  labels:
    app: np2
spec:
  containers:
  - name: nginx-container
    image: nginx:1.18
---
apiVersion: v1
kind: Pod
metadata:
  name: sample-pod-np3
  namespace: np-test-2
  labels:
    app: np3
spec:
  containers:
  - name: nginx-container
    image: nginx:1.18
---
apiVersion: v1
kind: Pod
metadata:
  name: sample-pod-np4
  namespace: np-test-2
  labels:
    app: np4
spec:
  containers:
  - name: nginx-container
    image: nginx:1.18
EOF
$ kubectl --kubeconfig=~/Downloads/kubeconfig-np-test.yml apply -f networkpolicy-pod-test.yaml
pod/sample-pod-np1 created
pod/sample-pod-np2 created
pod/sample-pod-np3 created
pod/sample-pod-np4 created

デプロイされたPod を確認します。
$ kubectl --kubeconfig=~/Downloads/kubeconfig-np-test.yml get pod -o wide -n np-test-1
NAME             READY   STATUS    RESTARTS   AGE   IP               NODE       NOMINATED NODE   READINESS GATES
sample-pod-np1   1/1     Running   0          47s   192.168.60.222   ip-10-0-1-195.xxx   <none>           <none>
sample-pod-np2   1/1     Running   0          47s   192.168.60.223   ip-10-0-1-195.xxx  <none>           <none>
$ kubectl --kubeconfig=~/Downloads/kubeconfig-np-test.yml get pod -o wide -n np-test-2
NAME             READY   STATUS    RESTARTS   AGE   IP               NODE       NOMINATED NODE   READINESS GATES
sample-pod-np3   1/1     Running   0          50s   192.168.60.224   ip-10-0-1-195.xxx  <none>           <none>
sample-pod-np4   1/1     Running   0          50s   192.168.60.225   ip-10-0-1-195.xxx   <none>           <none>

後ほどのテストの準備として以下を実行し、HTTP アクセスした際にPod 名が返る様にしておきます。sample-pod-np2,3,4 に関しても同様に設定しておきます。

$ kubectl --kubeconfig=~/Downloads/kubeconfig-np-test.yml exec -it sample-pod-np1 -n np-test-1 -- /bin/sh -c "cp /etc/hostname /usr/share/nginx/html/index.html"

NetworkPolicy の適用

TMC から適用するNetworkPolicy はCluster レベルでは適用出来ないため、先程作成したWorkspace 単位で適用していきます。Workspace networkpolicy-1 に対して、全てのIngressアクセスを許可しないNetworkPolicy を適用しています。





kubectl でも確認してみます。
$ kubectl --kubeconfig=~/Downloads/kubeconfig-np-test.yml describe networkpolicy tmc.wsp.np-test-1.np-1-deny-all -n np-test-1
Name:         tmc.wsp.np-test-1.np-1-deny-all
Namespace:    np-test-1
Created on:   2021-03-08 17:51:51 +0900 JST
Labels:       tmc.cloud.vmware.com/managed=true
Annotations:  <none>
Spec:
  PodSelector:     <none> (Allowing the specific traffic to all pods in this namespace)
  Allowing ingress traffic:
    <none> (Selected pods are isolated for ingress connectivity)
  Not affecting egress traffic
  Policy Types: Ingress

テスト用のPod を立てて確認してみます。アクセス出来ない状態が続いているので、別ターミナルからPod を削除しています。
$ kubectl --kubeconfig=~/Downloads/kubeconfig-np-test.yml run --image=centos --restart=Never --rm -it test-pod -n np-test-1 --command -- curl http://192.168.60.223
If you don't see a command prompt, try pressing enter.
pod "test-pod" deleted
pod np-test-1/test-pod terminated (Error)

Namespace np-test-1 からのアクセスは許可するNetworkPolicy を作成するために、Namespace np-test-1にラベルを作成します。
$ kubectl --kubeconfig=~/Downloads/kubeconfig-np-test.yml label namespace np-test-1 ns=np-test-1

TMC からNetworkpolicy を作成していきます。NetworkPolicy はこちらにある6つの中から種類を選択し、作成していきます。ここでは、 custom-ingress を指定し作成しています。










kubectl コマンドでも確認してみます。
$ kubectl --kubeconfig=~/Downloads/kubeconfig-np-test.yml describe networkpolicy tmc.wsp.np-test-1.allow-to-sample-pod-np2 -n np-test-1
Name:         tmc.wsp.np-test-1.allow-to-sample-pod-np2
Namespace:    np-test-1
Created on:   2021-03-09 23:52:08 +0900 JST
Labels:       tmc.cloud.vmware.com/managed=true
Annotations:  <none>
Spec:
  PodSelector:     app=np2
  Allowing ingress traffic:
    To Port: 80/TCP
    From:
      NamespaceSelector: ns=np-test-1
  Not affecting egress traffic
  Policy Types: Ingress

上と同じコマンドでテスト用Pod がsample-pod-np2 にアクセス出来ているか確認してみます。
$ kubectl --kubeconfig=~/Downloads/kubeconfig-np-test.yml run --image=centos --restart=Never --rm -it test-pod -n np-test-1 --command -- curl http://192.168.60.223
sample-pod-np2
pod "test-pod" deleted

無事アクセス出来ている事が確認出来ました。

まとめ

TMC から簡単にNetworkPolicy の設定が出来ました。TMCのWorkspaceに新たなにNamespace を追加すると、そのWorkspace に対して適用されているPolicy が自動でアサインされるため、複数Kubernetes クラスタを運用していく中では非常に便利です。

このブログの人気の投稿