iT邦幫忙

第 12 屆 iThome 鐵人賽

DAY 11
0
自我挑戰組

自我學習Docker的30天奇幻旅程系列 第 11

Day11 深入淺出Kubernetes(四)

  • 分享至 

  • xImage
  •  

不知不覺已經十一天了呢,看著自己訂下的標題果然是深入淺出呢,要學的東西還很深只能寫一些淺的東西,順手翻閱了一下kubernetes到底有哪些工具可以使用,畢竟不可能一直都使用minikube,瞬間資料多的琳琅滿目甚麼Kubelet、Kubeadm、Helm、Dashboard、Kops感受到了滿滿的惡意,不過也確信了自己的學習之路不會無聊,接下來就繼續讓自己經過官方文件的歷練才能接受更大的挑戰!

Scaling APP

擴展?為甚麼要擴展?擴展其實就是增加Pod的複製品,首先最直觀的就是,當應用程序運行發生錯誤或是崩潰的時候,我們還是要維持應用程序的運行,因此就需要替代品來讓錯誤或是崩潰發生的當下能夠立刻切換,而這整個過程就是擴展的價值,擴展可以分成直接使用ReplicaSet或是搭配Deployment使用,而官方是這麼說明ReplicaSet的

A ReplicaSet ensures that a specified number of pod replicas are running at any given time. However, a Deployment is a higher-level concept that manages ReplicaSets and provides declarative updates to Pods along with a lot of other useful features. Therefore, we recommend using Deployments instead of directly using ReplicaSets, unless you require custom update orchestration or don't require updates at all.

總的來說就是如果只單用ReplicaSet會錯失Deployments強大的功能,除非是不需要那就可以單用瞜。

ReplicaSet
簡單看個ReplicaSet的範例配置檔以及應用方法,建置Pod的方法也要包含在裡面的原因,是為了在不得不需要建立Pod的情況使用,也就是當所有Pod都壞光了。

apiVersion: apps/v1
kind: ReplicaSet
metadata:
  name: web
  labels:
	env: dev
	role: web
spec:
  #  要複製幾個,預設是1
  replicas: 4
  selector:
	matchLabels:
  	  role: web
  template:
	metadata:
  	  labels:
    	    role: web
	spec:
  	  containers:
  	  - name: nginx
    	    image: nginx

要使用也很簡單,apply就好

kubectl apply -f nginx_replicaset.yaml

要查看複製的Pod也很簡單使用get加上rs就可以了

kubectl get rs

搭配Deployment擴展
搭配Deployment跨展的方法,就延續前幾天的範例繼續了。
在Deployment且expose好應用程序之後,就可以使用scale指令來擴展我們的deployment,scale後面接著的是deploments type以及名稱

kubectl scale deployments/kubernetes-bootcamp --replicas=4

查看我們的pods可以發現pods從一個變四個了

PS ~\Users> kubectl get pods
NAME                                   READY   STATUS    RESTARTS   AGE
kubernetes-bootcamp-57978f5f5d-pdhn4   1/1     Running   0          2m20s
kubernetes-bootcamp-57978f5f5d-ppdvr   1/1     Running   0          2m20s
kubernetes-bootcamp-57978f5f5d-qq59m   1/1     Running   0          5m47s
kubernetes-bootcamp-57978f5f5d-vnv62   1/1     Running   0          2m20s

再describe看我們的service,可以看到Endpoints的地方就有了四個擴展Pod的IP address

PS ~\Users> kubectl describe services/kubernetes-bootcamp
Name:                     kubernetes-bootcamp
Namespace:                default
Labels:                   app=kubernetes-bootcamp
Annotations:              <none>
Selector:                 app=kubernetes-bootcamp
Type:                     NodePort
IP:                       10.101.106.157
Port:                     <unset>  8080/TCP
TargetPort:               8080/TCP
NodePort:                 <unset>  30384/TCP
Endpoints:                172.18.0.3:8080,172.18.0.4:8080,172.18.0.5:8080 + 1 more...
Session Affinity:         None
External Traffic Policy:  Cluster
Events:                   <none>

Rolling Update

Rolling Update的意思就是,像是我們剛剛上面創造了三個Pod的複製品,那當今天要更新的時候難道需要一個一個對應Pod name來更新嗎?所以就有了Rolling Update的方法,只要其中一個Pod更新其他的複製品也會隨著一起更新。
使用Rolling Update的好處不只是這些,由於Pod會依序更新,所以上線中的服務不需要停止也可以直接更新,只需要由kubernetes幫我們更換Pod就好了,而這些變動使用者都不會發覺,至於更新的條件就是要先有擴展拉。
那如果是負載平衡也不會因此亂套,服務會自動對剩餘可用的Pod進行負載平衡。

實作Rolling Update
接下來跟著官方文件將我們的應用程序的image更新至version2吧,再執行完之後查看pods可以看到正在更新的pod已經正要被刪除的pod

PS ~\Users> kubectl set image deployments/kubernetes-bootcamp kubernetes-bootcamp=jocatalin/kubernetes-bootcamp:v2
deployment.apps/kubernetes-bootcamp image updated
PS ~\Users> kubectl get pods
NAME                                   READY   STATUS              RESTARTS   AGE
kubernetes-bootcamp-57978f5f5d-6qc7h   1/1     Running             0          17m
kubernetes-bootcamp-57978f5f5d-dhgfp   1/1     Running             0          17m
kubernetes-bootcamp-57978f5f5d-mcphx   1/1     Terminating         0          17m
kubernetes-bootcamp-57978f5f5d-qq59m   1/1     Running             0          33m
kubernetes-bootcamp-769746fd4-4glvb    0/1     ContainerCreating   0          2s
kubernetes-bootcamp-769746fd4-fc829    0/1     ContainerCreating   0          2s

再查看一次

PS ~\Users> kubectl get pods
NAME                                  READY   STATUS    RESTARTS   AGE
kubernetes-bootcamp-769746fd4-4glvb   1/1     Running   0          3m59s
kubernetes-bootcamp-769746fd4-548g9   1/1     Running   0          3m37s
kubernetes-bootcamp-769746fd4-fc829   1/1     Running   0          3m59s
kubernetes-bootcamp-769746fd4-s9jkp   1/1     Running   0          3m44s

基本上這個時候就更新完成拉,接下來讓我們訪問程序吧,理論上是透過describe指令找到service的port,不過我們是VM所以要使用minikube service建立VM與我們的通道,最後使用curl訪問應用程序可以看到response的content已經變成v=2就代表升級成功拉。

PS ~\Users> minikube service kubernetes-bootcamp --url
?  Starting tunnel for service kubernetes-bootcamp.
|-----------|---------------------|-------------|------------------------|
| NAMESPACE |        NAME         | TARGET PORT |          URL           |
|-----------|---------------------|-------------|------------------------|
| default   | kubernetes-bootcamp |             | http://127.0.0.1:51818 |
|-----------|---------------------|-------------|------------------------|
http://127.0.0.1:51818
❗  Because you are using a Docker driver on windows, the terminal needs to be open to run it.
PS ~\Users> curl "http://localhost:51818"


StatusCode        : 200
StatusDescription : OK
Content           : Hello Kubernetes bootcamp! |
                    Running on: kubernetes-bootcamp-769
                    746fd4-fc829 | v=2

...(省略)

如何退版
當更新失敗或是錯誤的時候自然需要退回到穩定的版本,接下來實際演練退版的方法
更新至一個會錯誤的版本v=10

kubectl set image deployments/kubernetes-bootcamp kubernetes-bootcamp=gcr.io/google-samples/kubernetes-bootcamp:v10

透過查看deployments以及pods可以發現有些問題,Pod的狀態提示我們要退回一版

PS ~\Users> kubectl get deployments              NAME                  READY   UP-TO-DATE   AVAILABLE   AGE
kubernetes-bootcamp   3/4     2            3           57m
PS ~\Users> kubectl get pods
NAME                                  READY   STATUS             RESTARTS   AGE
kubernetes-bootcamp-597654dbd-h9pv6   0/1     ImagePullBackOff   0          80s
kubernetes-bootcamp-597654dbd-pmbfw   0/1     ImagePullBackOff   0          81s
kubernetes-bootcamp-769746fd4-4glvb   1/1     Running            0          24m
kubernetes-bootcamp-769746fd4-fc829   1/1     Running            0          24m
kubernetes-bootcamp-769746fd4-s9jkp   1/1     Running            0          24m

既然如此就來退版吧,通過使用rollout指令來指定我們的deloyment undo回上一版

PS ~\Users> kubectl rollout undo deployments/kubernetes-bootcamp
deployment.apps/kubernetes-bootcamp rolled back
PS ~\Users> kubectl get pods
NAME                                  READY   STATUS              RESTARTS   AGE
kubernetes-bootcamp-769746fd4-4glvb   1/1     Running             0          30m
kubernetes-bootcamp-769746fd4-fc829   1/1     Running             0          30m
kubernetes-bootcamp-769746fd4-kfxqh   0/1     ContainerCreating   0          2s
kubernetes-bootcamp-769746fd4-s9jkp   1/1     Running             0          29m
kubernetes-bootcamp-597654dbd-h9pv6   0/1     Terminating         0          2m10s
kubernetes-bootcamp-597654dbd-pmbfw   0/1     Terminating         0          2m11s

可以看到錯誤的Pod正在被移除,而退版也會跟著Rolling Update機制將所有Pod還原回去

總結:

今天很開心又到了下一個階段,因為將k8s的官方basic教學學完了。接下來為了不脫離主題也算是為之後要實作項目做努力,要先回去鑽研Docker了,先來預告明天的目標,明天就要來研究該如何寫Dockerfile。

參考文獻:
Kubernetes官方文件


上一篇
Day10 深入淺出Kubernetes(三)
下一篇
Day12 Dockerfile指令大集(一)
系列文
自我學習Docker的30天奇幻旅程24
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言