六、k8s入門系列----StatefulSet、Headless Services、LoadBalancer Services
阿新 • • 發佈:2021-07-21
這節講下 有狀態服務應用StatefulSet 和另外兩種 Service:Headless 和LoadBalancer 。
應用的狀態有如下定義:
-
- 無狀態應用(Stateless Application)是指應用不會在會話中儲存下次會話所需要的客戶端資料。每一個會話都像首次執行一樣,不會依賴之前的資料進行響應
- 有狀態的應用(Stateful Application)是指應用會在會話中儲存客戶端的資料,並在客戶端下一次的請求中來使用那些資料
有狀態應用關鍵點是可以複用原來的資料,而無狀態應用每次都是新的狀態。
Deployment 和StatefulSet 分別應用於無狀態服務應用和有狀態服務應用,StatefulSet 常見的應用場景:
-
- 穩定的持久化儲存,即POD重新排程後還是能訪問到相同的持久化資料,基於PVC來實現
- 穩定的網路標識,即POD重新排程後其PodName 和 HostName 不變,基於 HeadlessService 來實現
- 有序部署,有序擴充套件,即 POD 是有順序的,在部署或者擴充套件的時候要依據定義的順序依次進行(即使從0 到 N-1,在下一個Pod 執行之前所有之前的Pod必須都是Running Man和Ready狀態),基於init contas來實現
- 有序收縮,有序刪除(即從 N-1 到 0)
編寫statefulset 資源配置檔案,其中serviceName 為必填欄位,關聯一個Headless Service,其他配置跟deployment大同小異:
[root@ylserver10686071 ~]# cat statefulset.yml
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: stateapp
namespace: prod
spec:
serviceName: stateapp-svc
selector:
matchLabels:
k8s-app: stateapp
replicas: 3
template:
metadata:
labels:
k8s-app: stateapp
spec:
containers:
- name: stateapp
image: tomcat:8.0
ports:
- name: stateapp-8080
containerPort: 8080
protocol: TCP
建立statefulset資源,並檢視相關資訊,可以看到 Pod 的名稱是按照順序命名的,不是隨機生成的:
[root@ylserver10686071 ~]# kubectl apply -f statefulset.yml statefulset.apps/stateapp created [root@ylserver10686071 ~]# kubectl get statefulset -n prod -o wide NAME READY AGE CONTAINERS IMAGES stateapp 3/3 63s stateapp tomcat:8.0 [root@ylserver10686071 ~]# kubectl get pods -n prod -o wide |grep stateapp stateapp-0 1/1 Running 0 60s 10.233.72.43 ylserver10686073 <none> <none> stateapp-1 1/1 Running 0 48s 10.233.67.38 ylserver10686072 <none> <none> stateapp-2 1/1 Running 0 33s 10.233.75.66 ylserver10686071 <none> <none> [root@ylserver10686071 ~]#