Statefulset實戰(zhàn) 2
上一部分我們分享到,Statefulset 部署應(yīng)用,我們需要完成這些資源的創(chuàng)建:
制作應(yīng)用程序和鏡像
編寫 Service
編寫 Statefulset 指定 pod 模板及掛載
我們已經(jīng)完成前面 2 部分,若還有疑問的可以看上上一部分的文章

編寫 ?Statefulset 清單
現(xiàn)在可以來專注的編寫 Statefulset ?資源了
編寫 Statefulset 資源其實也比較簡單,注意三大部分:
Statefulset 自身的基本信息
指定好 serviceName 及 pod 的模板,且配置好掛載路徑
指定好持久化卷聲明的模板
statefulset.yaml
apiVersion:?apps/v1
kind:?StatefulSet
metadata:
??name:?sta-kubia
spec:
??serviceName:?sta-kubia
??replicas:?2
??selector:
????matchLabels:
??????app:?sta-kubia
??template:
????metadata:
??????labels:
????????app:?sta-kubia
????spec:
??????containers:
??????-?name:?sta-kubia
????????image:?xiaomotong888/sta-kubia
????????ports:
????????-?name:?http
??????????containerPort:?8080
????????volumeMounts:
????????-?name:?data
??????????mountPath:?/var/data
??volumeClaimTemplates:
??-?metadata:
??????name:?data
????spec:
??????resources:
????????requests:
??????????storage:?1Mi
??????accessModes:
??????-?ReadWriteOnce
設(shè)置 statefulset 自身的名稱為 sta-kubia,設(shè)置 2 個副本數(shù),管理的 pod 標簽為 sta-kubia
設(shè)置容器模板,鏡像為 xiaomotong888/sta-kubia,容器端口為 8080 ,掛載路徑為 /var/data
設(shè)置持久化卷聲明模板,請求的資源內(nèi)存為 1M,訪問模式為 ReadWriteOnce
還是老規(guī)矩,通過 kubectl create -f statefulset.yaml 的方式部署 statefulset ?,我們來分別查看一下 pod,持久化卷聲明 pvc ,持久化卷 pv
查看 pod 狀態(tài)
通過指令 kubectl get po 查看 pod 的情況

我們可以查看到 sta-kubia-1 是在 sta-kubia-0 完全啟動好,狀態(tài)變成 Running 狀態(tài)的時候才開始創(chuàng)建容器的
這是 statefulset ?自身的機制,會去一個一個的創(chuàng)建 pod,創(chuàng)建 pod 后會準確的確認該 pod 運行 ok,才會進行創(chuàng)建下一個
這樣也是保證安全性的一個設(shè)計
任意查看一個 pod 的詳情
kubectl?describe?po?sta-kubia-0

可以看到該 pod 會正確的對應(yīng)上一個卷的聲明,且索引和自己 pod 的索引一致
查看 持久化卷聲明 pvc 和 查看 持久化卷 pv
kubectl?get?pvc
kubectl?get?pv

我們可以看到 查看 持久化卷聲明 pvc 和 查看 持久化卷 pv,總共分別有 2 個,且互相正確對應(yīng)上的
如何與我們的 pod 進行通信
之前我們知道,我們是通過 Service 與 pod 進行通信,客戶端只需要訪問 節(jié)點的地址和 Service 的端口就可以了****(前提是我們暴露了 Service 的端口)
還有一種方式就是進入到其中一個 pod 的內(nèi)部,去訪問集群中 Service 的地址和端口
xdm 還記得其實我們還可以使用一種簡單的方式,那就是訪問通過 API 服務(wù)器的方式來訪問我們的 pod 元數(shù)據(jù),不記得細節(jié)的 xdm 可以看看我之前分享的文章 【k8s 系列】k8s 學(xué)習二十四,如何訪問 pod 元數(shù)據(jù)
訪問 k8s 的 API Server
直接運行代理
kubectl?proxy

我們可以看到咱開啟的代理是通過 8001 端口與 Api Server 進行交互的
訪問具體的 pod 接口
這個時候,我們就可以通過訪問這樣的 url 通過代理來請求 ApiServer 了,這算是一個正向代理
還記得,我們鏡像中寫的應(yīng)用嗎,應(yīng)用是一個 http 服務(wù)器,提供 GET 和 POST 請求?
GET 是用來讀取指定文件的內(nèi)容
POST 請求是用來將請求內(nèi)容寫入到指定文件中
由于 pod 創(chuàng)建出來,指定的文件還沒有,我們可以先使用 POST 請求我們的 pod,然后再使用 GET 請求 pod
POST 請求 pod
curl??-X?POST?-d?'helloworld?sta-kubia-0'?localhost:8001/api/v1/namespaces/default/pods/sta-kubia-0/proxy/

此處我們 POST 請求 sta-kubia-0 ,并帶上數(shù)據(jù) helloworld sta-kubia-0
字符串,請求成功,http 服務(wù)器會給我們返回寫入成功的內(nèi)容
GET 請求 pod
curl?localhost:8001/api/v1/namespaces/default/pods/sta-kubia-0/proxy/

GET 請求數(shù)據(jù),會將指定文件中的內(nèi)容打印出來
請千萬記住結(jié)尾是 ?proxy/ 而不是 proxy ,否則你是會收到一個空白回應(yīng)的, k8s 自身也是通過 url 拼接的方式來組裝請求地址的
我們可以知道這個 url 是這樣來組裝的:
地址:端口/api版本/命名空間/pod名稱/proxy

如上我們看到,GET 請求和 POST 請求都被正常處理了,那么我們來用圖解的方式,看看我們的 curl 請求是怎樣到達實際的 ApiServer 的
我們先來看看 ApiServer 的地址和我們訪問的 pod 的地址:
ApiServer 的地址

sta-kubia-0 地址

從 curl 請求到 pod sta-kubia-0 的請求過程如下:

從最初發(fā)出 curl 請求之后,會經(jīng)過 kubectl proxy 進行代理,kubectl proxy 會去代理到 8001 端口繼續(xù)向下訪問
kubectl 又會將請求代理到 ApiServer 上,此時請求的是 Apiserver 的地址:8443 端口,看到這里,整個請求實際上是經(jīng)過了 2 個代理
ApiServer 收到請求后,會去請求實際的 pod ?sta-kubia-0 地址(172.17.0.1)和端口(8080)
最終 pod 中的容器響應(yīng)后,數(shù)據(jù)怎么來,請求就順利請求路徑一層一層的相應(yīng),最終,我們在界面上就看到了 pod sta-kubia 的相應(yīng)結(jié)果了
今天就到這里,學(xué)習所得,若有偏差,還請斧正
歡迎點贊,關(guān)注,收藏
朋友們,你的支持和鼓勵,是我堅持分享,提高質(zhì)量的動力

好了,本次就到這里
技術(shù)是開放的,我們的心態(tài),更應(yīng)是開放的。擁抱變化,向陽而生,努力向前行。
我是阿兵云原生,歡迎點贊關(guān)注收藏,下次見~