iT邦幫忙

第 12 屆 iT 邦幫忙鐵人賽

DAY 24
0
DevOps

從題目中學習k8s系列 第 24

【從題目中學習k8s】-【Day24】第十五題 - TroubleShooting 1


title: 【從題目中學習k8s】-【Day24】第十五題 - TroubleShooting 1
description: 以無比的恆毅力堅持30天鍊成鐵人--連續30天,一天發表一篇IT技術文章

【從題目中學習k8s】-【Day24】第十五題 - TroubleShooting 1

tags: DevOps CICD K8s Docker

Question

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


Trobleshooting過程

這題的環境題目圖片有說明了,但是我們還不知道到底有哪些物件,我們先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問題,是最基本的 PodService 和環境變數設定問題,都還算簡單的,一眼就能看出問題,也沒用到 ConfigMap 等的物件,主要是讓大家了解一下這類的問題。好啦,今天就到這囉~ 謝謝大家~

參考資料

Troubleshoot Clusters
[Kubernetes] Debug & Troubleshooting 簡介

Thank you!

You can find me on

  • george4908090@gmail.com

上一篇
【從題目中學習k8s】-【Day23】TrobleShooting 概念
下一篇
【從題目中學習k8s】-【Day25】第十六題 - TroubleShooting 2
系列文
從題目中學習k8s31

尚未有邦友留言

立即登入留言