天天看點

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個副本

K8S之StatefulSet有狀态服務

自動建立PV和PVC

K8S之StatefulSet有狀态服務
K8S之StatefulSet有狀态服務

​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

K8S之StatefulSet有狀态服務

啟動一個busybox的Pod

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

繼續閱讀