前面通過deployment結(jié)合service來部署無狀態(tài)的應(yīng)用,下面來講解通過satefulSet結(jié)合service來部署有狀態(tài)的應(yīng)用
一.StatefulSet詳解
1.有狀態(tài)和無狀態(tài)區(qū)別
- 無狀態(tài): 無狀態(tài)(stateless)、牲畜(cattle)、無名(nameless)、可丟棄(disposable)
- 有狀態(tài): 有狀態(tài)(stateful)、寵物(pet)、具有名(haviing name)、不可丟棄(non-disposable)
- StatefulSet是用來管理有狀態(tài)的應(yīng)用,例如數(shù)據(jù)庫
- 前面部署的應(yīng)用,都是不需要存儲數(shù)據(jù),不需要記住狀態(tài)的,可以隨意擴(kuò)充副本,每個副本都是一樣的,可替代的,這時候可以通過deployment結(jié)合service來部署
- 而像數(shù)據(jù)庫、Redis這類有狀態(tài)的,并且有數(shù)據(jù)的應(yīng)用,則不能隨意擴(kuò)充副本,這時候就需要通過statefulSet結(jié)合service來部署
- StatefulSet 會固定每個 Pod 的名字
2.statefulset的組成
- headless service 用于定義網(wǎng)絡(luò)標(biāo)識(DNS)
- StatefulSet 控制器,用于定義具體應(yīng)用
- volumeClaimTemplate 存儲卷申請模板,用于創(chuàng)建PV,保證數(shù)據(jù)庫的持久化操作
下面就來通過statefulSet結(jié)合service部署一個Mongodb
3.創(chuàng)建 Service部署StatefulSet類型的Mongodb
定義一個mongo.yaml,這個yaml和deployment.yaml類似,如下:
- 下面yaml中的?--- 表示:把多個配置文件放在一個yaml中,下面就是把kind為StatefulSet類型的mongo.yaml和service.yaml放在同一個文件中,當(dāng)然也可以拆分開來
apiVersion: apps/v1
#類型statefulSet
kind: StatefulSet
metadata:
#部署的名字
name: mongodb
spec:
serviceName: mongodb #必須設(shè)置,和下面的name保持一致
#創(chuàng)建Pod的副本數(shù)
replicas: 2
#定義標(biāo)簽選擇器:定義Deployment如何找到要管理的Pod,與template的label(標(biāo)簽)對應(yīng)
selector:
matchLabels:
app: mongodb #需要和下面的labels統(tǒng)一,進(jìn)行關(guān)聯(lián)
#定義 Pod 相關(guān)數(shù)據(jù)
template:
metadata:
labels:
app: mongodb
#指定該資源的內(nèi)容
spec:
# 定義容器,可以多個
containers:
- name: mongo # 容器名字
image: mongo # 鏡像
# [Always | Never | IfNotPresent] #獲取鏡像的策略 Alawys表示下載鏡像 IfnotPresent表示優(yōu)先使用本地鏡像,否則下載鏡像,Nerver表示僅使用本地鏡像
imagePullPolicy: IfNotPresent
---
apiVersion: v1
#類型Service
kind: Service
metadata:
#部署的服務(wù)名字,這個可以隨意
name: mongodb
spec:
selector:
app: mongodb #需要mongdb.yaml中,也就是上面的pod中的template中定義的metadata.labels.app名稱統(tǒng)一,這樣mongodb和service才能相互找到
type: ClusterIP #默認(rèn)類型,自動分配一個僅Cluster內(nèi)部可以訪問的虛擬IP,當(dāng)外部訪問項目時,自動分配一個虛擬的pod ip,達(dá)到負(fù)載均衡操作,下面詳細(xì)講解
#HeadLess: 不分配IP地址
clusterIP: None
ports:
- port: 27017 #本 Service 的端口
targetPort: 27017 # 容器端口
?拆分開來的文件如下:
mongo.yaml
apiVersion: apps/v1
#類型statefulSet
kind: StatefulSet
metadata:
#部署的名字
name: mongodb
spec:
serviceName: mongodb #必須設(shè)置,和下面的name保持一致
#創(chuàng)建Pod的副本數(shù)
replicas: 2
#定義標(biāo)簽選擇器:定義Deployment如何找到要管理的Pod,與template的label(標(biāo)簽)對應(yīng)
selector:
matchLabels:
app: mongodb #需要和下面的labels統(tǒng)一,進(jìn)行關(guān)聯(lián)
#定義 Pod 相關(guān)數(shù)據(jù)
template:
metadata:
labels:
app: mongodb
#指定該資源的內(nèi)容
spec:
# 定義容器,可以多個
containers:
- name: mongo # 容器名字
image: mongo # 鏡像
# [Always | Never | IfNotPresent] #獲取鏡像的策略 Alawys表示下載鏡像 IfnotPresent表示優(yōu)先使用本地鏡像,否則下載鏡像,Nerver表示僅使用本地鏡像
imagePullPolicy: IfNotPresent
service.yaml
apiVersion: v1
#類型Service
kind: Service
metadata:
#部署的服務(wù)名字,這個可以隨意
name: mongodb
spec:
selector:
app: mongodb #需要mongdb.yaml中,也就是上面的pod中的template中定義的metadata.labels.app名稱統(tǒng)一,這樣mongodb和service才能相互找到
type: ClusterIP #默認(rèn)類型,自動分配一個僅Cluster內(nèi)部可以訪問的虛擬IP,當(dāng)外部訪問項目時,自動分配一個虛擬的pod ip,達(dá)到負(fù)載均衡操作,下面詳細(xì)講解
#HeadLess: 不分配IP地址
clusterIP: None
ports:
- port: 27017 # 本 Service 的端口
targetPort: 27017 # 容器端口
mongo.yaml和deployment.yaml的區(qū)別
- kind不同:deployment.yaml的kind為Deployment,mongo.yaml的kind為StatefulSet
- mongo.yaml的spec的serverName必須配置,必須和service名字統(tǒng)一起來,這樣才能關(guān)聯(lián)
- mongo.yaml的service.yaml的type必須是ClusterIP(集群內(nèi)部訪問),訪問的時候是沒有IP地址的,故需設(shè)置ClusterIP:none.當(dāng)然,type類型也可以是NodePort,這樣就可以在外部進(jìn)行端口映射訪問操作
4.部署mongo.yaml
(1).先刪除其他無用的配置
該操作可以執(zhí)行,也可以不執(zhí)行
文章來源:http://www.zghlxwxcb.cn/news/detail-788593.html
(2).創(chuàng)建mongo.yaml?
vi .mongo.yaml,然后把上面的配置復(fù)制進(jìn)入即可文章來源地址http://www.zghlxwxcb.cn/news/detail-788593.html
[root@node1 ~]# cat mongo.yaml
apiVersion: apps/v1
#類型statefulSet
kind: StatefulSet
metadata:
#部署的名字
name: mongodb
spec:
serviceName: mongodb #必須設(shè)置,和下面的name保持一致
#創(chuàng)建Pod的副本數(shù)
replicas: 2
#定義標(biāo)簽選擇器:定義Deployment如何找到要管理的Pod,與template的label(標(biāo)簽)對應(yīng)
selector:
matchLabels:
app: mongodb #需要和下面的labels統(tǒng)一,進(jìn)行關(guān)聯(lián)
#定義 Pod 相關(guān)數(shù)據(jù)
template:
metadata:
labels:
app: mongodb
#指定該資源的內(nèi)容
spec:
# 定義容器,可以多個
containers:
- name: mongo # 容器名字
image: mongo # 鏡像
# [Always | Never | IfNotPresent] #獲取鏡像的策略 Alawys表示下載鏡像 IfnotPresent表示優(yōu)先使用本地鏡像,否則下載鏡像,Nerver表示僅使用本地鏡像
imagePullPolicy: IfNotPresent
---
apiVersion: v1
#類型Service
kind: Service
metadata
到了這里,關(guān)于[Kubernetes]5. k8s集群StatefulSet詳解,以及數(shù)據(jù)持久化(SC PV PVC)的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!