Tanzu Mission Control(TMC) は、マルチKubernetes クラスタを一元的に管理出来るSaaS ソリューションです。TMC からIaaS 環境に対して、Kubernetes クラスタをデプロイ出来たり、任意のKubernetes クラスタをTMC にAttach して一元的に管理する事が可能です。
TMC の管理機能の一つである、NetworkPolicy に機能について試してみたので、そのメモです。
環境
- TMC Advanced(TMC Standalone)が利用出来ること
- TMC は2つのバージョンがあり、Network Policy の機能はTMC Advanced でのみ利用可能になります。
- AWS
手順
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 --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 クラスタを運用していく中では非常に便利です。