1. 程式人生 > 其它 >(十四)Kubernetes資源管理StatefulSet

(十四)Kubernetes資源管理StatefulSet

一、Kubernetes SatefulSet(有狀態應用部署)

Statefulset(有狀態集,縮寫為sts)常用於部署有狀態的且需要有序啟動的應用程式,比如在進行SpringCloud專案容器化時,Eureka的部署是比較適用StatefulSet部署方式的,可一個每個Eureka例項建立一個唯一且固定的識別符號,並且每個Eurkeka例項無需配置多餘的Service,其餘SpringCloud應用可以直接通過Eureka的Headless即可進行註冊。
Eurake的statefulset的資源名稱是eureka,eureka-0,eureka-1,eureka-2
Service是headless service,沒有Cluster IP, eureka-svc
Eureka-0.eureka-svc.NAMESPACE_NAME

1.1 部署有狀態應用

  • 解決Pod獨立生命週期,保持Pod啟動順序和唯一性
    • 穩定,唯一的網路識別符號,持久儲存
    • 有序,優雅的部署和擴充套件、刪除和終止
    • 有序,滾動更新

1.2 應用場景:資料庫

說明
常規的service
service:一組pod訪問策略,提供負載均衡和服務發現
其他:service 會分配一個 CLUSTER-IP 虛擬IP 使整個容器進行通訊。
headless service:無頭服務
headless service:與service類似,不同點在於clusterIP為None
需要部署一個dns伺服器
https://www.cnblogs.com/xiangsikai/p/11413970.html

1.3 案例

1、建立有狀態應用

vim sts.yaml

apiVersion: v1
kind: Service
metadata:
  name: nginx
  labels:
    app: nginx
spec:
  ports:
  - port: 80
    name: web
  clusterIP: None
  selector:
    app: nginx
---
apiVersion: apps/v1beta1
kind: StatefulSet
metadata:
  name: nginx-statefulset
  namespace: default
spec:
  # 指定使用的service
  serviceName: nginx
  replicas: 3
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:latest
        ports:
        - containerPort: 80

2、建立容器

kubectl create -f sts.yaml

3、檢視建立容器以及service、通過dns名稱,保證每個固定的身份(pod/nginx-statefulset-x)標識。

kubectl get pods,svc
NAME READY STATUS RESTARTS AGE
# statefulset-x 為身份標識
pod/nginx-statefulset-0 1/1 Running 0 16s
pod/nginx-statefulset-1 1/1 Running 0 13s
pod/nginx-statefulset-2 1/1 Running 0 10s
pod/sh-77649dbd59-ppfbx 1/1 Running 0 21m
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
service/kubernetes ClusterIP 10.0.0.1 <none> 443/TCP 5d16h
service/nginx ClusterIP None <none> 80/TCP 26s

4、臨時啟動程式測試解析,通過dns解析唯一標識的容器

kubectl run --image=busybox:1.28.4 -it sh
/ # nslookup nginx-statefulset-0
Server:    10.0.0.2
Address 1: 10.0.0.2 kube-dns.kube-system.svc.cluster.local
nslookup: can't resolve 'nginx-statefulset-0'

如此可以比對出效果
StatefulSet與Deployment區別:有身份的!
身份三要素:

  • 域名
  • 主機名
  • 儲存(PVC)
ClusterIP A記錄格式:<service-name>.<namespace-name>.svc.cluster.local
ClusterIP=None A記錄格式:<statefulsetName-index>.<service-name>.svc.cluster.local
示例:web-0.nginx.default.svc.cluster.local

二、statsfulset更新策略

建立從第一個開始,更新從最後一個開始,刪除也是從最後一個開始。
預設為:RollingUpdate #滾動式更新
OnDelete
Partition: 3 #只更新大於等3的pod,來實現簡單的灰度釋出。(statefulset實現分段更新)

三、statsfulset刪除策略

級聯刪除:kuebctl delete sts nginx(刪除statefulset同時刪除Pod)
非級聯刪除:kubectl delete sts nginx --cascade=false(刪除statefulset不刪除pod,此時Pod變成孤兒Pod,刪除之後惠被建立)