首頁 > 軟體

K8S之StatefulSet有狀態服務詳解

2022-07-01 14:00:04

一、概念

1.1.無狀態和有狀態的區別

主要從網路和儲存來對比

無狀態不考慮儲存和網路,可以任意漂移,每個副本是一樣的,如Nginx

有狀態應用需要考慮儲存和網路,每個副本是不對等的,具有唯一的ID,如etcd、mysql

1.2.StatefulSet的特點

專為部署有狀態服務而生

解決Pod獨立生命週期,保持Pod啟動順序和唯一性

應用場景:分散式應用、資料庫叢集

穩定,唯一的網路識別符號,持久儲存
有序,優雅的部署和擴充套件、刪除、終止
有序,捲動更新

1.3.Headless Service

也是一種Service,但不需要Cluster IP,需要設定clusterIP: None

1.4.serviceName

告訴StatefulSet要使用serviceName指定的headless service來保證Pod的身份

1.5.穩定的儲存

儲存卷使用volumeClaimTemplates建立,稱為卷申請模板;當建立一個PV時,同樣會為每個Pod分配並且建立一個編號PVC

二、範例

拿Nginx測試,主要演示yaml的寫法,實際應用中需用有狀態服務

2.1.statefulset.yaml

apiVersion: apps/v1
kind: StatefulSet
metadata:
  labels:
    app: web
  name: web
spec:
  replicas: 3
  selector:
    matchLabels:
      app: web
  serviceName: "headless-web"
  template:
    metadata:
      labels:
        app: web
    spec:
      containers:
      - image: nginx
        imagePullPolicy: IfNotPresent
        name: web
        ports:
        - containerPort: 8080
        volumeMounts:
          - name: www
            mountPath: /usr/share/nginx/html
  volumeClaimTemplates:
  - metadata:
      name: www
    spec:
      storageClassName: "managed-nfs-storage"
      accessModes: [ "ReadWriteOnce" ]
      resources:
        requests:
          storage: 1Gi

設定了3個副本,從0開始標號,建立3個副本

自動建立PV和PVC

2.2.headless-svc.yaml

apiVersion: v1
kind: Service
metadata:
  name: headless-web
spec:
  clusterIP: None
  ports:
  - port: 80
    protocol: TCP
  selector:
    app: web

CLUSTER-IP為None

啟動一個busybox的Pod

kubectl run test -it --rm --image=busybox -- sh
nslookup headless-web

域名解析結果

在容器裡可以通過<Pod Name>.<Headless Service>存取

curl web-0.headless-web

參考視訊:https://ke.qq.com/user/index/index.html

到此這篇關於K8S之StatefulSet有狀態服務詳解的文章就介紹到這了,更多相關K8S StatefulSet有狀態服務內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!


IT145.com E-mail:sddin#qq.com