1. 程式人生 > 其它 >k8s 無狀態,有狀態部署應用概述

k8s 無狀態,有狀態部署應用概述

Deployment

概念概述

用於部署無狀態的服務,這個最常用的控制器。一般用於管理維護企業內部無狀態的微服務,比如configserver、zuul、springboot。他可以管理多個副本的Pod實現無縫遷移、自動擴容縮容、自動災難恢復、一鍵回滾等功能。

Deployment建立

手動建立:kubectl create deployment nginx --image=nginx:1.15.2

匯出yaml 檔案

kubectl get deployment nginx -oyaml > nginx-deploy.yaml

檔案內容改動後可以replace 操作相當於重啟

kubectl replace -f nginx-deploy.yaml

也可以直接線上編輯改動,用edit

kubectl edit deployment nginx
deployment 的更新

更改deployment 的映象並記錄:

kubectl set image deployment nginx nginx=nginx:1.15.3 --record
deployment 擴容與伸縮
#擴容
kubectl scale --replicas=3 deploy nginx
#縮容
kubectl scale --replicas=2 deploy nginx

StatefulSet有狀態應該用管理
StatefulSet(有狀態集,縮寫為sts)常用於部署有狀態的且需要有序啟動的應用程式,比如在進行SpringCloud專案容器化時,Eureka的部署是比較適合用StatefulSet部署方式的,可以給每個Eureka例項建立一個唯一且固定的識別符號,並且每個Eureka例項無需配置多餘的Service,其餘Spring Boot應用可以直接通過Eureka的Headless Service即可進行註冊。

Eureka的statefulset的資源名稱是eureka,eureka-0 eureka-1 eureka-2

Service:headless service,沒有ClusterIP eureka-svc

Eureka-0.eureka-svc.NAMESPACE_NAME eureka-1.eureka-svc …

statefulset

基本概念

StatefulSet主要用於管理有狀態應用程式的工作負載API物件。比如在生產環境中,可以部署ElasticSearch叢集、MongoDB叢集或者需要持久化的RabbitMQ叢集、Redis叢集、Kafka叢集和ZooKeeper叢集等。

和Deployment類似,一個StatefulSet也同樣管理著基於相同容器規範的Pod。不同的是,StatefulSet為每個Pod維護了一個粘性標識。這些Pod是根據相同的規範建立的,但是不可互換,每個Pod都有一個持久的識別符號,在重新排程時也會保留,一般格式為StatefulSetName-Number。比如定義一個名字是Redis-Sentinel的StatefulSet,指定建立三個Pod,那麼創建出來的Pod名字就為Redis-Sentinel-0、Redis-Sentinel-1、Redis-Sentinel-2。而StatefulSet建立的Pod一般使用Headless Service(無頭服務)進行通訊,和普通的Service的區別在於Headless Service沒有ClusterIP,它使用的是Endpoint進行互相通訊,

Headless一般的格式為:

statefulSetName-{0..N-1}.serviceName.namespace.svc.cluster.local

statefulset 注意事項
一般StatefulSet用於有以下一個或者多個需求的應用程式:
需要穩定的獨一無二的網路識別符號。
需要持久化資料。
需要有序的、優雅的部署和擴充套件。
需要有序的自動滾動更新。
如果應用程式不需要任何穩定的識別符號或者有序的部署、刪除或者擴充套件,應該使用無狀態的控制器部署應用程式,比如Deployment或者ReplicaSet。

StatefulSet是Kubernetes 1.9版本之前的beta資源,在1.5版本之前的任何Kubernetes版本都沒有。
Pod所用的儲存必須由PersistentVolume Provisioner(持久化卷配置器)根據請求配置StorageClass,或者由管理員預先配置,當然也可以不配置儲存。
為了確保資料安全,刪除和縮放StatefulSet不會刪除與StatefulSet關聯的卷,可以手動選擇性地刪除PVC和PV(關於PV和PVC請參考2.2.12節)。
StatefulSet目前使用Headless Service(無頭服務)負責Pod的網路身份和通訊,需要提前建立此服務。
刪除一個StatefulSet時,不保證對Pod的終止,要在StatefulSet中實現Pod的有序和正常終止,可以在刪除之前將StatefulSet的副本縮減為0。

DaemonSet

daemonset 是什麼?

DaemonSet:守護程序集,縮寫為ds,在所有節點或者是匹配的節點上都部署一個Pod。

使用DaemonSet的場景

Ø 執行叢集儲存的daemon,比如ceph或者glusterd

Ø 節點的CNI網路外掛,calico

Ø 節點日誌的收集:fluentd或者是filebeat

Ø 節點的監控:node exporter

Ø 服務暴露:部署一個ingress nginx