--- tags: Kubernetes, mTLS, Security --- # Kubernetes如何使用mTLS mTLS為pod與pod之間溝通時,使用憑證的一種做法 **service mesh、network policy、ingress是不同的功能** **本文不包含linkerd安裝** * istio, linkerd為service mesh所用套件,非原生K8S就包含 **參考資料:** 1. [Securing a Cluster](https://kubernetes.io/docs/tasks/administer-cluster/securing-a-cluster/ "Securing a Cluster") 2. [Manage TLS Certificates in a Cluster](https://kubernetes.io/docs/tasks/tls/managing-tls-in-a-cluster/ "Manage TLS Certificates in a Cluster") 3. [Certificate Signing Requests](https://kubernetes.io/docs/reference/access-authn-authz/certificate-signing-requests/ "CSR") 4. [11 Ways (Not) to Get Hacked ](https://kubernetes.io/blog/2018/07/18/11-ways-not-to-get-hacked/ "11 Ways (Not) to Get Hacked ") 5. [Automatic mTLS](https://linkerd.io/2/features/automatic-mtls/ "Automatic mTLS") 6. [Securing Your Application with mTLS](https://linkerd.io/2/tasks/securing-your-service/ "Securing Your Application with mTLS") :::info 1. linkerd的sample有些出入,可參考底下內容 2. 本例現階段使用linkerd進行 ::: ## 建立 inwin@master:~$ wget https://run.linkerd.io/emojivoto.yml `抓任何東西回來後,都要先看一下內容,再決定要不要使用` ``` inwin@master:~$ cat emojivoto.yml |linkerd inject --enable-debug-sidecar - |kubectl create -f - namespace "emojivoto" injected serviceaccount "emoji" skipped serviceaccount "voting" skipped serviceaccount "web" skipped service "emoji-svc" skipped service "voting-svc" skipped service "web-svc" skipped deployment "emoji" injected deployment "vote-bot" injected deployment "voting" injected deployment "web" injected namespace/emojivoto created serviceaccount/emoji created serviceaccount/voting created serviceaccount/web created service/emoji-svc created service/voting-svc created service/web-svc created deployment.apps/emoji created deployment.apps/vote-bot created deployment.apps/voting created deployment.apps/web created inwin@master:~$ kubectl get -n emojivoto deploy,po NAME READY UP-TO-DATE AVAILABLE AGE deployment.apps/emoji 0/1 1 0 40s deployment.apps/vote-bot 0/1 1 0 40s deployment.apps/voting 0/1 1 0 40s deployment.apps/web 0/1 1 0 40s NAME READY STATUS RESTARTS AGE pod/emoji-5cc85dbbdd-qffn2 0/3 PodInitializing 0 40s pod/vote-bot-5b78d54d9-zzlcw 0/3 PodInitializing 0 40s pod/voting-57659b8c87-lkq9p 0/3 PodInitializing 0 40s pod/web-6f4fdf6bc9-6qhnj 0/3 PodInitializing 0 40s ... ... ... inwin@master:~$ kubectl get -n emojivoto deploy,po NAME READY UP-TO-DATE AVAILABLE AGE deployment.apps/emoji 1/1 1 1 2m29s deployment.apps/vote-bot 1/1 1 1 2m29s deployment.apps/voting 1/1 1 1 2m29s deployment.apps/web 1/1 1 1 2m29s NAME READY STATUS RESTARTS AGE pod/emoji-5cc85dbbdd-qffn2 3/3 Running 0 2m29s pod/vote-bot-5b78d54d9-zzlcw 3/3 Running 0 2m29s pod/voting-57659b8c87-lkq9p 3/3 Running 0 2m29s pod/web-6f4fdf6bc9-6qhnj 3/3 Running 0 2m29s ``` ## 使用linkerd確認 **注意tls=true即是** ``` inwin@master:~$ linkerd -n emojivoto tap deploy vote-bot req id=0:0 proxy=out src=10.6.235.166:53974 dst=10.6.235.165:8080 tls=true :method=GET :authority=web-svc.emojivoto:80 :path=/api/list rsp id=0:0 proxy=out src=10.6.235.166:53974 dst=10.6.235.165:8080 tls=true :status=200 latency=105505µs end id=0:0 proxy=out src=10.6.235.166:53974 dst=10.6.235.165:8080 tls=true duration=45µs response-length=4513B req id=0:1 proxy=out src=10.6.235.166:53974 dst=10.6.235.165:8080 tls=true :method=GET :authority=web-svc.emojivoto:80 :path=/api/vote ``` ## 其他常見狀況 1. 如果是已經建立的deploy是否可套用service mesh? **可,主要行為是加上side-car,需要使用replace重建** ``` inwin@master:~$ kubectl create deployment alreadydeploy --image=nginx --replicas=2 deployment.apps/alreadydeploy created inwin@master:~$ kubectl get deploy,po NAME READY UP-TO-DATE AVAILABLE AGE deployment.apps/alreadydeploy 2/2 2 2 16s NAME READY STATUS RESTARTS AGE pod/alreadydeploy-6656f65957-tdccr 1/1 Running 0 16s pod/alreadydeploy-6656f65957-wnk9k 1/1 Running 0 16s inwin@master:~$ kubectl get deployments.apps alreadydeploy -o yaml |linkerd inject - |kubectl replace -f - deployment "alreadydeploy" injected deployment.apps/alreadydeploy replaced inwin@master:~$ kubectl get deploy,pod NAME READY UP-TO-DATE AVAILABLE AGE deployment.apps/alreadydeploy 2/2 2 2 2m42s NAME READY STATUS RESTARTS AGE pod/alreadydeploy-6656f65957-wnk9k 1/1 Terminating 0 2m42s pod/alreadydeploy-dd556b4d6-b22xq 2/2 Running 0 58s pod/alreadydeploy-dd556b4d6-qfsfp 2/2 Running 0 34s ``` 2. 使用run建出來的pod不支援此功能