kubernetes学习笔记 (二):k8s初体验
本文采用本地k8s v1.10.3版本開發(fā),如果還沒有搭建可參照 kubernetes學(xué)習(xí)筆記 (一):搭建本地k8s開發(fā)環(huán)境進(jìn)行搭建
搭建本地Docker鏡像倉庫
準(zhǔn)備一個Docker鏡像
最后你會看到localhost:5000/gateapp:0.0.1的鏡像已經(jīng)在你的機器中啦,下面會用到
Kubernetes中的重要概念
創(chuàng)建Deployment部署應(yīng)用
通過kubectl apply -f xxx.yaml就可以部署上面的Deployment的了,也可以打開Kubernetes的Dashboard點擊創(chuàng)建,輸入yaml文件中的內(nèi)容進(jìn)行創(chuàng)建。經(jīng)過一段時間后,在Dashboard面板中可以看到,1個部署 gate-deployment-dev,一個副本集 gate-deployment-dev-775d556ffb,兩個容器組 gate-deployment-dev-775d556ffb-2tlgn、gate-deployment-dev-775d556ffb-sfqrq,可以點擊查看每個資源的信息,大部分內(nèi)容都是自解釋的。
在部署Deployment后,Kubernetes大致執(zhí)行了以下幾個過程:
- 用戶創(chuàng)建Deployment
- Deployment創(chuàng)建了一個副本集(ReplicaSet)gate-deployment-dev-775d556ffb
- ReplicaSet創(chuàng)建了兩個Pod,與我們定義的replicas: 2 一致
創(chuàng)建Service
此時上面的鏡像提供的接口還不能供外界訪問,需要創(chuàng)建一個對應(yīng)的Service
kubectl apply -f xxx.yaml 或者在Dashboard中創(chuàng)建
觀察Dashboard面板,會發(fā)現(xiàn)多了一個名字叫g(shù)ate-svc-dev的服務(wù),提供了監(jiān)聽了30000端口
curl http://localhost:30000/whoami 可以看到接口已經(jīng)可以訪問了
需要注意的是:
-
為什么需要Service?
Deployment等其他Controller動態(tài)創(chuàng)建和銷毀Pod來保證應(yīng)用的健壯性,也就是Pod是脆弱的,應(yīng)用是健壯的,我們不該期望Pod的健壯性。每個Pod都有自己的ClusterIp地址,當(dāng)Pod發(fā)生故障被新的Pod替代時,ClusterIp很有可能發(fā)生變化,所以如果直接讓外界訪問Pod就有問題了。
-
Service和Pod如何映射?
通過上面的yaml定義可以看出,Service通過 label標(biāo)簽選擇器選擇對應(yīng)的一堆Pod。當(dāng)請求被發(fā)送到Service上時,Service采用了某種分配策略把流量轉(zhuǎn)發(fā)到了某一個Pod上面進(jìn)行處理。
-
Service有哪些類型?
- ClusterIp:Service通過Cluster內(nèi)部的IP對外提供服務(wù),只有Cluster內(nèi)的節(jié)點和Pod可以訪問,這是默認(rèn)的類型。
- NodePort: Service通過Cluster節(jié)點的靜態(tài)端口對外提供服務(wù)。Cluster外部可以通過<NodeIp>:<NodePort>訪問Service
- LoadBalancer: cloud provider特有的對外提供服務(wù),后續(xù)線上部署時會講到
滾動更新
滾動更新是一次只更新一小部分副本,成功后再更新更多的副本,最終完成所有副本的更新。滾動更新最大的好處就是零停機,保證了業(yè)務(wù)的連續(xù)性。
這時候可以看到有0.0.1 和 0.0.2兩個版本的鏡像
在Dashboard中編輯Deployment,把image: localhost:5000/gateapp:0.0.1改成image: localhost:5000/gateapp:0.0.2,點擊更新
等待一段時間,再觀察所有的Pod都被更新成0.0.2版本的了,是不是很方便!
反復(fù)執(zhí)行上面的步驟,不難發(fā)現(xiàn)更新過程中Kubernets都做了什么:
- Deployment的鏡像被更新為0.0.2版本
- 新創(chuàng)建了一個名稱為gate-deployment-dev-594468997c的ReplicaSet副本集,鏡像為0.0.2
- 新的ReplicaSet增加了一個Pod
- 舊的ReplicaSet減少了一個Pod
- 逐漸的新的ReplicaSet接管了所有舊ReplicaSet的Pod,滾動更新完成
自定義滾動更新行為
那如果更新過程出錯了怎么辦?請接著往下看
健康檢查
Kubernetes有很強大的自愈能力,默認(rèn)的實現(xiàn)方式是重啟發(fā)生故障的容器,此外用戶可以使用Liveness、 Readiness的探測機制設(shè)置更為精細(xì)的健康檢查,進(jìn)而真正實現(xiàn)零停機部署、避免部署無效的鏡像、更加安全的滾動升級
-
readinessProbe即是使用Readiness健康探測機制,當(dāng)檢查不通過時(例如接口返回的狀態(tài)碼不是200-400之間),Kubernetes就不會把容器添加到Service中供外界訪問,觀察Pod的狀態(tài)為Not Ready。 initialDelaySeconds是決定容器啟動多久后開始檢查,通常要比啟動時間再長一些;periodSecods是多久檢查一次,連續(xù)3次探測失敗后,Ready將變成不可用,Kubernets把這個Pod從Service中下線
-
LiveNess的配置項和Readiness的一樣,不同之處在于探測失敗后的行為。前者會重啟容器,后者會設(shè)置Pod不可用,并從Service中下線。
-
LiveNess和Readiness的探測是獨立使用的,二者沒有依賴,可以單獨使用也可以同時使用。一般情況下使用LiveNess判斷容器是否需要重啟實現(xiàn)自愈;Readiness判斷容器是否已經(jīng)準(zhǔn)備好對外提供服務(wù)。
一起來學(xué)習(xí)Kubernetes
相信看完以上的文章,你也會認(rèn)為Kubernetes真的非常強大,是非常值得學(xué)習(xí)的。筆者也是小白一個,從0開始學(xué)習(xí)的,如果你也想一起,可以加入我們的群。
總結(jié)
以上是生活随笔為你收集整理的kubernetes学习笔记 (二):k8s初体验的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 26.Android Studio下Nd
- 下一篇: 小牛带你nginx反向代理中神奇的斜线