K8S之StatefulSet有狀態服務詳解

一、概念

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#/plan/cid=1709963&term_id=102815140

到此這篇關於K8S之StatefulSet有狀態服務詳解的文章就介紹到這瞭,更多相關K8S StatefulSet有狀態服務內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!

推薦閱讀: