k8s之statefulset控制器


operator:

 

statefulset:有狀態副本集

特點

運行在: 1,穩定且唯一的網絡標識符

2,穩定且持久的存儲

3,有序,平滑地部署和擴展

4,有序,平滑地刪除和終止

5,有序的滾動更新

 

三個組件:headless service(無頭服務), statefuleset,volumeClaimTemplate(存儲卷申請模板)

先准備pv

apiVersion: v1

kind: PersistentVolume

metadata:

  name: pv001

  labels:

    name: pv001

    polity: fast

spec:

  nfs:

    path: /data/volumes/v1

    server: node2

  accessModes: ["ReadWriteMany","ReadWriteOnce"]

  capacity:

    storage: 5Gi

---

apiVersion: v1

kind: PersistentVolume

metadata:

  name: pv002

  labels:

    name: pv002

    polity: fast

spec:

  nfs:

    path: /data/volumes/v2

    server: node2

  accessModes: ["ReadWriteOnce"]

  capacity:

    storage: 5Gi

---

 

apiVersion: v1

kind: PersistentVolume

metadata:

  name: pv003

  labels:

    name: pv003

    polity: fast

spec:

  nfs:

    path: /data/volumes/v3

    server: node2

  accessModes: ["ReadWriteMany","ReadWriteOnce"]

  capacity:

    storage: 5Gi

---

 

apiVersion: v1

kind: PersistentVolume

metadata:

  name: pv004

  labels:

    name: pv004

    polity: fast

spec:

  nfs:

    path: /data/volumes/v4

    server: node2

  accessModes: ["ReadWriteMany","ReadWriteOnce"]

  capacity:

    storage: 10Gi

---

 

apiVersion: v1

kind: PersistentVolume

metadata:

  name: pv005

  labels:

    name: pv005

    polity: fast

spec:

  nfs:

    path: /data/volumes/v5

    server: node2

  accessModes: ["ReadWriteMany","ReadWriteOnce"]

  capacity:

    storage: 10Gi

 

 

kubectl apply -f pv-demo.yaml

kubectl get pv

 

 

實例

apiVersion: v1

kind: Service

metadata:

  name: myapp-svc  service

  labels:

    app: myapp

spec:

  ports:

  - port: 80  service端口

   name: web  service端口名

  clusterIP: None  statefulset要求無頭服務

  selector:  pod關聯的標簽

    app: myapp-pod

---

apiVersion: apps/v1

kind: StatefulSet

metadata:

  name: myapp  statefulset控制器名 創建的pod名也為這個

spec:

  serviceName: myapp-svc 關聯的service服務名,必須是無頭服務

  replicas: 2

  selector:  管理哪些pod,關聯podlabel

    matchLabels:

      app: myapp-pod

  template: 定義pod模板

    metadata:

      labels:  定義的pod的標簽label

        app: myapp-pod

   spec:

     containers:

     - name: myapp  pod中容器名

      image: ikubernetes/myapp:v1

      ports:

      - containerPort: 80

       name: web

      volumeMounts:

       - name: myappdata 掛載myappdata存儲卷

         mountPath: /usr/share/nginx/html 容器中掛載的路徑

  volumeClaimTemplates:   pvc模板 為每個pod定義volume 自動創建pvc

  - metadata:

      name: myappdata   定義的pvc

    spec:

      accessModes: ["ReadWriteOnce"]  單路讀寫

      resources:   資源

        requests: 請求

          storage: 5Gi 大小5Gi存儲空間

 

 

創建

kubectl explain sts

kubectl apply -f stateful-demo.yaml

 

 

驗證:

kubectl get sts

kubectl get pvc

kubectl get svc

kubectl get pv

kubectl get pods

 

刪除sts

逆向刪除pod

kubectl delete -f stateful-demo.yaml

刪除時pvc還在,且一直保留給固定的pod

 

statefulset支持滾動更新,規模擴展

逆向更新

 

dns解析

kubectl exec -it myapp-0 -- /bin/sh

nslookup  myapp-3.myapp-svc.default.svc.cluster.local

域名構成   podservice名 命名空間 集群域名svc.cluster.local        

域名 pod_name.service_name.namaspace_name.svc.cluster.local

nslookup  myapp-3.myapp-svc

 

 

擴容宿容

kubectl scale sts myapp --replicas=3

kubectl patch sts myapp -p '{"spec":{"replicas":2}}'

 

 

更新策略

kubectl explain sts.spec.updateStrategy

kubectl explain sts.spec.updateStrategy.rollingUpdate

 

 

分區更新

kubectl explain sts.spec.updateStrategy.rollingUpdate.partition

myapp-0

myapp-1

myapp-2

myapp-3

myapp-4

 

partition:N

N>=3

即更新34,即myapp-3,myapp-4 這叫金絲雀發布

驗證

方法一

kubectl patch sts myapp -p '{"spec":{"replicas":5}}'

kubectl patch sts myapp -p '{"spec":{"updateStrategy":{"rollingUpdate":{"partition":4}}}}' 打上補丁 partition>=4

kubectl describe sts myapp 查看更新策略

kubectl set image sts/myapp myapp=ikubernetes/myapp:v2 改變鏡像就會更新了

kubectl get sts -o wide

 

方法二

vim stateful-demo.yaml

kind: StatefulSet

   ...

spec:

  updateStrategy:

    rollingUpdate:

      partition: 3

 

 kubectl apply -f stateful-demo.yaml

 

如果版本沒問題,就全部更新

vim stateful-demo.yaml

kind: StatefulSet

   ...

spec:

  updateStrategy:

    rollingUpdate:

      partition: 0

 

kubectl apply -f stateful-demo.yaml 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM