DevOps
CICD
K8s
Docker
The same 2 tier application is deployed in the test namespace. It must display a right web page on success. It is currently failed. Troubleshoot and fix the issue.
Hint: totally has 2 bugs in the cluster
這題的環境題目圖片有說明了,但是我們還不知道到底有哪些物件,我們先overview一下:
master $ kubectl get all -n test
NAME READY STATUS RESTARTS AGE
pod/mysql 1/1 Running 0 7m30s
pod/webapp-mysql-5fb9ccd54d-9fv25 1/1 Running 0 7m29s
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
service/mysql-service ClusterIP 10.111.102.167 <none> 3306/TCP 7m29s
service/web-service NodePort 10.104.81.123 <none> 8080:30088/TCP 7m29s
NAME READY UP-TO-DATE AVAILABLE AGE
deployment.apps/webapp-mysql 1/1 1 1 7m29s
NAME DESIRED CURRENT READY AGE
replicaset.apps/webapp-mysql-5fb9ccd54d 1 1 1 7m29s
可以看出和題目描述一致,共有一個Deployment
、兩個 Pod
和兩個 Service
,而且都處於Running STATUS,看起來Image pull和Pod Scheduling都沒什麼問題,那有可能是port mapping沒設定好,我們檢查一下 Pod
的Port
$ kubectl edit -n test po mysql
...
ports:
- containerPort: 3306
protocol: TCP
...
$ kubectl edit -n test po webapp-mysql-5fb9ccd54d-9fv25
...
ports:
- containerPort: 8080
protocol: TCP
...
看起來 Pod
都很正常,檢查一下 Service
$ kubectl edit -n test svc mysql-service
...
spec:
clusterIP: 10.111.102.167
ports:
- port: 3306
protocol: TCP
targetPort: 3306
...
很好,第一個 Service
沒問題,再來檢查第二個
$ kubectl edit -n test svc web-service
...
spec:
clusterIP: 10.104.81.123
ports:
- port: 8080
protocol: TCP
targetPort: 8080
nodePort: 30088
...
這邊我們找到了一個bug,那就是nodePort
為30088而非題目的30081,我們將它修改為30081
$ kubectl edit -n test svc web-service
...
spec:
clusterIP: 10.104.81.123
ports:
- port: 8080
protocol: TCP
targetPort: 8080
nodePort: 30081
...
再來檢查一下Service
是否有正確圈選到 Pod
,若沒選到自然不可能expose出來囉。透過檢查 Service
的Selector和 Pod
的Label,看看它們有沒有mapping到
$ kubectl describe po -n test | grep -i label
Labels: name=mysql
Labels: name=webapp-mysql
$ kubectl describe svc -n test | grep -i selector
Selector: name: mysql
Selector: name: webapp-mysql
看起來Label和Selector都很正常。再來檢查Container的環境變數:帳號密碼是否和題目相符
因為Container是由Deployment創建的,因此我們檢查Deployment的設定
kubectl -n test edit deploy webapp-mysql
...
spec:
containers:
- env:
- name: DB_Host
value: mysql-service
- name: DB_User
value: sql-user
- name: DB_Password
value: paswrd
...
這邊讓我們找到第二個bug了,那就是 DB_User: sql-user 的設定錯誤。我們將DB_User 改為 root :
kubectl -n test edit deploy webapp-mysql
...
spec:
containers:
- env:
- name: DB_Host
value: mysql-service
- name: DB_User
value: root
- name: DB_Password
value: paswrd
...
這樣一來兩個bug都找到了,大功告成!
一般題目不會提示有幾個bug待修,但是這邊為了方便說明所以筆者直接將它列出,畢竟讀者們沒辦法驗證這個Application是否正常work
今天介紹的是簡單的Trobleshooting問題,是最基本的 Pod
、Service
和環境變數設定問題,都還算簡單的,一眼就能看出問題,也沒用到 ConfigMap
等的物件,主要是讓大家了解一下這類的問題。好啦,今天就到這囉~ 謝謝大家~
Troubleshoot Clusters
[Kubernetes] Debug & Troubleshooting 簡介
You can find me on
想請教一個問題,我在題目中並沒有看到nodePort要使用30081,另外是如何知道DB_User 要使用root?