1. 程式人生 > 其它 >六、k8s入門系列----StatefulSet、Headless Services、LoadBalancer Services

六、k8s入門系列----StatefulSet、Headless Services、LoadBalancer Services

  這節講下 有狀態服務應用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 ~]#