iT邦幫忙

2019 iT 邦幫忙鐵人賽

DAY 18
1
Kubernetes

在地端建置Angular+ASP.NET Core的DevOps環境系列 第 18

day18_k8s04_kubectl,pod state,deployment,label&selector,health checks

前言

接下來的幾天就是介紹各種k8s元件囉
不過都只po比較簡單的

而且我都沒實際跑過(拍細拍細)

只是一些學習筆記,後面幾天甚至還有沒頭沒尾的主題
所以還是建議看官網文件喔~

kubectl指令再複習

中文的話推薦先看這2篇喔:

# 列出元件
$ kubectl get nodes
$ kubectl get pods
$ kubectl get pod [pod name]
$ kubectl describe pod tomcat-deployment-3392291-33388

# 將 deployment、pod等資源,Expose 一個 port (TCP/UDP)
$ kubectl expose deployment tomcat-deployment --type=NodePort service "tomcat-deployment" exposed

# 把1~n個127.0.0.1 local的port,forward到1個pod
$ kubectl port-forward <pod Name> LOCAL_PORT : REMOTE_PORT
$ kubectl port-forward tomcat-deployment-3392291-33388 5000:6000 

# 連接到pod的container
# 獲取container的output
$ kubectl attach <pod name> -c <container>
$ kubectl attach 123456-7890 -c ruby-container

# 進到 ruby-container 的 bash
$ kubectl attach 123456-7890 -c ruby-container -i -t
# 在container執行command

# 跑command,必須用two dashes (--)分隔command
$ kubectl exec 123456-7890 -i -t -- ls -t /usr

# 切到bash
$ kubectl exec 123456-7890 -c ruby-container -i -t -- bash -il

# 假設有個database 的 container (跑mysql),還蠻實用的
$ kubectl exec database -i -t -- mysql -u root -p
Enter password:
mysql> show database;
mysql> \q
Bye~啾咪

# 更新pod的label,label就像docker image裡的tag一樣,非常重要
$ kubectl label pods foo unhealthy=true

# 在pod把container跑起來
$ kubectl run nginx 
--image=nginx 
--replicas=1 # 維持container的instance數量
--labels="fun=webserver,env=prod" # 設定labels,很重要
--env="DNS_DOMAIN=cluster" --env="POD_NAMESPACE=default" # 給環境變數
--port=8080 # 讓這個container expose port 5701
                     #  --replicas=2以上我不知道--port要怎麼指定??

===

Pod State

$ kubectl get pods -n kube-system

會有一個STATUS欄位

  • running
  • starting
  • restating
  • pending:
    (1)pod已被accepted,但還沒running (可能還在下載image)
    (2)因為資源問題,pod還不能被scheduled(調度?)
  • succeeded
    在這個pod裡的所有containers都功德圓滿、功成身退(都已經結束,且不會被restarted)
  • failed
    在這個pod裡的所有containers都已經結束,且有1個以上的container傳回failure code(process的exit code)
  • unknow
    pod無法被determined(無法確定),例如:網路發出問題

PodConditions

  • PodScheduled:pod曾被調用過(has been scheduled)
  • ready:可以上工,可以加入service
  • initialized:container已啟用成功
  • unschedulable
    containers ready:所有pod裡的container都是ready的

===

Deployment

補一下deployment相關的指令

  • 列出deployments
$ kubectl get deployments
  • 看資源狀態
$ kubectl rollout status deployment nginx-deployment
  • 設定deployment的nginx container image為nginx:1.9.1,以及busybox container image為busybox
$ kubectl set image deployment/nginx busybox=busybox nginx=nginx:1.9.1
  • 看rollout的歷史
$ kubectl rollout history

===

Labels跟Selectors

幾乎大部分的資源都能設labels(可以設很多),設的labels方便filter出來(selectors)
例如:

  • Deployment
  • Services
  • Nodes
    簡單練習:(1)先設label,(2)在yaml用nodeSelector找看看

(1)先設label

我們要對node設label

$ kubectl get nodes

# minikube
$ kubectl label node minikube nodeType=localTest # 可以用指令設,也可以寫在yaml檔
$ kubectl describe node minikube

(2)在yaml用nodeSelector找看看

  • nginx-deployment.yaml
    spec:
      containers:
      - name: nginx
        image: nginx:1.15.4
        ports:
        - containerPort: 80
				nodeSelector: # here!!
					 nodeType=localTest

  • 然後這個pod就會跑在minikube上
$ kubectl apply -f ./nginx-deployment.yaml

另一個範例:

# 對一個node加label
$ kubectl label nodes node1 hardware=high-spec

# 可以在pod的yaml檔指定要跑在哪個node上~
nodeSelector:
	hardware:high-spec

# 列出nodes的labels
$ kubectl get nodes --show-labels

===

狀態檢查 Health checks

判斷一個pod的服務是不是正常運作,k8s一些方式可檢查
服務掛掉的話,可以再自動化補救
這個很重要喔,以後不用等客戶打來罵,工程師再手動重啟伺服器

  • 定期的跑tcp request
  • 定期的跑http (例如:http get 一個 url)
  • 定期的對pod下command

可以定義在Deployment或Pod

  template:
    metadata:
      labels:
        app: nginx # 非唯一、1個object可設很多個labels
    spec:
      replicas:3
      containers:
      - name: nginx
        image: nginx:1.15.4
        ports:
        - containerPort: 80
# livenessProbe:看是不是running
# 如果check fail,container會被restarted
# 使用時機,container三不五時會出錯
        livenessProbe:
          failureThreshold:3 # 連續失敗3次就刪掉重開一個新的
          httpGet:
            path: /
            port:80
          initialDelaySeconds:30
          periodSeconds:30
          successThreshold:1 
          timeoutSeconds:30
# readinessProb:服務是已ready,只有在startup時測試,測試成功後才會有負載
# 如果check fail:
# 1、container「不會」被restarted
# 2、pod's IP 會從service中刪除  # 這個我不確定,以後有用到再試了
        readinessProb:
          httpGet:
            path: /
            port:80
          initialDelaySeconds:15
          periodSeconds:5
  • 跑看看
$ kubectl create -f ./nginx-deployment.yaml
$ kubectl get pods # 應該會跑3個pod
$ kubectl describe deployment pod nginx-22342342-o234a # 就可以看到一直送出的httpGet 成功、失敗的次數

# 就可以看到這個pod裡的container,有liveness,及相關probe的資訊
# watch -n 1 每隔1秒重複執行kubectl get pods指令
$ watch -n 1 kubectl get pods

其他指令

  • 列出所有components的status
$ kubectl get componentstatuses

上一篇
day17_k8s03_利用ansible建k8s cluster
下一篇
day19_k8s05_儲存篇_上集_Volumes(Storage)
系列文
在地端建置Angular+ASP.NET Core的DevOps環境31

尚未有邦友留言

立即登入留言