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!
推薦閱讀:
- kubernetes之statefulset搭建MySQL集群
- 在K8s上部署Redis集群的方法步驟
- K8S 中 kubectl 命令詳解
- grpc-java k8s下的負載均衡處理方法
- k8s中job與cronjob使用實例詳解