一、RabbitMQ集群K8S部署
1.1 文件結(jié)構(gòu)和說明
分別對(duì)應(yīng)文件如下
- rabbitmq-cluster-statefulset.yaml
- rabbitmq-configmap.yaml
- rabbitmq-dashboard-service.yaml
- rabbitmq-headless-service.yaml
- rabbitmq-public-namespace.yaml
- rabbitmq-pv-hostpath.yaml
- rabbitmq-pv-hostpath.yaml
- rabbitmq-rbac.yaml
- rabbitmq-secret.yaml
1.2 部署步驟
1.2.1 創(chuàng)建namespace和rbac
(1) 創(chuàng)建namespace
kubectl create namespace public-service
如果不使用public-service,同步以下yaml文件中修改即可。一鍵修改如下:
sed -i "s#public-service#YOUR_NAMESPACE#g" *.yaml
(2) 創(chuàng)建rbac
創(chuàng)建rbac主要包含以下幾個(gè)文件
1.2.2 創(chuàng)建持久化存儲(chǔ)卷PV(運(yùn)維人員創(chuàng)建)
PV通常由運(yùn)維人員創(chuàng)建,可以有hostpath方式和使用nfs方式,如果是開發(fā)環(huán)境,使用宿主機(jī)的hostpath方式即可。
(1)hostpath方式
## 預(yù)定義有狀態(tài)副本集的三個(gè)PV存儲(chǔ)快
## 注意有狀態(tài)副本集使用哪個(gè)PV,按照名次+編號(hào)找的
## 注意此處使用的宿主機(jī)hostPath模式,因此需要配置affinity每個(gè)節(jié)點(diǎn)最多只能配置一個(gè)該有狀態(tài)副本集的POD,而使用nfs等指定IP則不需要
apiVersion: v1
kind: PersistentVolume
metadata:
name: pv-rmq-1
spec:
capacity:
storage: 4Gi
accessModes:
- ReadWriteMany
volumeMode: Filesystem
persistentVolumeReclaimPolicy: Recycle
storageClassName: "rmq-storage-class"
##定義存儲(chǔ)路徑,如果為nfs網(wǎng)絡(luò)存儲(chǔ),則為server
hostPath:
path: /opt/dockerdata/mq-system/rabbitmq2/data
---
apiVersion: v1
kind: PersistentVolume
metadata:
name: pv-rmq-2
spec:
capacity:
storage: 4Gi
accessModes:
- ReadWriteMany
volumeMode: Filesystem
persistentVolumeReclaimPolicy: Recycle
storageClassName: "rmq-storage-class"
hostPath:
path: /opt/dockerdata/mq-system/rabbitmq2/data
---
apiVersion: v1
kind: PersistentVolume
metadata:
name: pv-rmq-3
spec:
capacity:
storage: 4Gi
accessModes:
- ReadWriteMany
volumeMode: Filesystem
persistentVolumeReclaimPolicy: Recycle
storageClassName: "rmq-storage-class"
hostPath:
path: /opt/dockerdata/mq-system/rabbitmq2/data
(2)nfs方式
apiVersion: v1
kind: PersistentVolume
metadata:
name: pv-rmq-1
spec:
capacity:
storage: 4Gi
accessModes:
- ReadWriteMany
volumeMode: Filesystem
persistentVolumeReclaimPolicy: Recycle
storageClassName: "rmq-storage-class"
nfs:
# real share directory
path: /k8s/rmq-cluster/rabbitmq-cluster-1
# nfs real ip
server: 192.168.147.220
---
apiVersion: v1
kind: PersistentVolume
metadata:
name: pv-rmq-2
spec:
capacity:
storage: 4Gi
accessModes:
- ReadWriteMany
volumeMode: Filesystem
persistentVolumeReclaimPolicy: Recycle
storageClassName: "rmq-storage-class"
nfs:
# real share directory
path: /k8s/rmq-cluster/rabbitmq-cluster-2
# nfs real ip
server: 192.168.147.220
---
apiVersion: v1
kind: PersistentVolume
metadata:
name: pv-rmq-3
spec:
capacity:
storage: 4Gi
accessModes:
- ReadWriteMany
volumeMode: Filesystem
persistentVolumeReclaimPolicy: Recycle
storageClassName: "rmq-storage-class"
nfs:
# real share directory
path: /k8s/rmq-cluster/rabbitmq-cluster-3
# nfs real ip
server: 192.168.147.220
1.3 創(chuàng)建持久化聲明PVC
講到創(chuàng)建持久化存儲(chǔ)卷聲明時(shí),不一定需要單獨(dú)寫一個(gè)聲明文件,依據(jù)部署文件的不同可以選擇不單獨(dú)聲明,直接在部署文件中聲明即可,見下文使用PV方式二。
(1)使用PV方式一
方式一為部署模板時(shí),定義容器存儲(chǔ)卷volumes時(shí)通過persistentVolumeClaim字段指明PVC名稱。
比如下面:
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: rabbitmq
namespace: mq-system
spec:
serviceName: rabbitmq-headless # 必須與headless service的name相同,用于hostname傳播訪問pod
selector:
matchLabels:
app: rabbitmq # 在apps/v1中,需與 .spec.template.metadata.label 相同,用于hostname傳播訪問pod,而在apps/v1beta中無需這樣做
replicas: 1
template:
metadata:
labels:
app: rabbitmq # 在apps/v1中,需與 .spec.selector.matchLabels 相同
spec:
serviceAccountName: rabbitmq
terminationGracePeriodSeconds: 10
## 設(shè)置Affinity
affinity:
#如果某個(gè)maste節(jié)點(diǎn)上已有rabbitmq pod,則不在這個(gè)master節(jié)點(diǎn)上建rabbitmq pod。確保3個(gè)rabbitmq pod分別在3個(gè)master節(jié)點(diǎn)上創(chuàng)建
podAntiAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
- labelSelector:
matchExpressions:
- key: app
operator: In
values:
- rabbitmq
topologyKey: kubernetes.io/hostname
## 選擇在master上部署
nodeSelector:
role: master
containers:
- name: rabbitmq
image: rabbitmq:3.7.12
# 定義拉取策略為本地不存在才拉取
imagePullPolicy: IfNotPresent
# 定義容器環(huán)境變量
env:
- name: HOSTNAME
valueFrom:
fieldRef:
fieldPath: metadata.name
- name: RABBITMQ_USE_LONGNAME
value: "true"
# 若在ConfigMap中設(shè)置了service_name,則此處無需再次設(shè)置,注意環(huán)境變量聲名的順序
- name: K8S_SERVICE_NAME
value: "rabbitmq-headless"
- name: RABBITMQ_NODENAME
value: "rabbit@$(HOSTNAME).$(K8S_SERVICE_NAME)"
- name: K8S_HOSTNAME_SUFFIX
value: ".$(K8S_SERVICE_NAME)"
# 將Rabbitmq的集群ErlangCookie環(huán)境變量必須一致,設(shè)置相同,此處直接明文,建議使用secret的Opaque類型密文形式
- name: RABBITMQ_ERLANG_COOKIE
value: "mycookie"
# - name: RABBITMQ_LOGS
# value: "/var/log/rabbitmq/node@$(HOSTNAME).log"
# - name: RABBITMQ_UPGRADE_LOG
# value: "/var/log/rabbitmq/node@$(HOSTNAME).log"
ports:
- name: http
protocol: TCP
containerPort: 15672
- name: amqp
protocol: TCP
containerPort: 5672
livenessProbe:
exec:
command: ["rabbitmqctl", "status"]
initialDelaySeconds: 60
periodSeconds: 60
timeoutSeconds: 5
readinessProbe:
exec:
command: ["rabbitmqctl", "status"]
initialDelaySeconds: 20
periodSeconds: 60
timeoutSeconds: 5
# 配置容器中掛載卷
volumeMounts:
- name: config-volume
mountPath: /etc/rabbitmq
- name: timezone
mountPath: /etc/localtime
- name: log
mountPath: /var/log/rabbitmq
- name: rabbitmq-data
mountPath: /var/lib/rabbitmq/mnesia
## 定義存儲(chǔ)卷,分別對(duì)應(yīng)上述volimeMounts
volumes:
## 定義rabbitmq配置文件為指定config-map的文件
- name: config-volume
configMap:
name: rabbitmq-config
items:
- key: rabbitmq.conf
path: rabbitmq.conf
- key: enabled_plugins
path: enabled_plugins
## 定義rabbitmq的數(shù)據(jù)文件,為采用PVC關(guān)聯(lián)的PV的存儲(chǔ)卷,即使用名為XXX的PVC指定的PV存儲(chǔ)空間
- name: rabbitmq-data
persistentVolumeClaim:
claimName: rabbitmq-data-claim
## 定義時(shí)區(qū)映射文件為宿主機(jī)路徑
- name: timezone
hostPath:
path: /etc/localtime
## 定義日志文件對(duì)應(yīng)宿主機(jī)路徑
- name: log
hostPath:
path: /opt/dockerdata/mq-system/rabbitmq/log
上面部署文件指定的PVC如下:
## PVC 描述的,則是 Pod 所希望使用的持久化存儲(chǔ)的屬性。比如,Volume 存儲(chǔ)的大小、可讀寫權(quán)限等等
## PVC 可以理解為持久化存儲(chǔ)的“接口”,它提供了對(duì)某種持久化存儲(chǔ)的描述,但不提供具體的實(shí)現(xiàn)
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
## 聲名一個(gè)名為rabbitmq-data-claim的PVC
name: rabbitmq-data-claim
namespace: mq-system
spec:
accessModes:
- ReadWriteMany
storageClassName: rabbitmq-storageClass
resources:
requests:
storage: 10Gi
selector:
## 其關(guān)聯(lián)PV的字段為release,內(nèi)容為rabbitmq-data
matchLabels:
release: rabbitmq-data
(2)使用PV方式二(不單獨(dú)寫PVC文件)
方式二為部署模板時(shí),直接通過volumeClaimTemplates指定方式一中聲明的PVC相關(guān)參數(shù),包括存儲(chǔ)大小、寫入模式、存儲(chǔ)類名稱等。
kind: StatefulSet
apiVersion: apps/v1
metadata:
labels:
app: rmq-cluster
name: rmq-cluster
namespace: public-service
spec:
replicas: 2
selector:
matchLabels:
app: rmq-cluster
## 定義無頭服務(wù)名稱
serviceName: rabbitmq-headless # 必須與headless 服務(wù)的name相同,用于hostname傳播訪問pod,且注意有狀態(tài)副本集為了互相感知節(jié)點(diǎn)存在RABBITMQ_NODENAME名稱也會(huì)使用無頭服務(wù)的DNS
template:
metadata:
labels:
app: rmq-cluster
spec:
serviceAccountName: rmq-cluster
terminationGracePeriodSeconds: 30
## 設(shè)置Affinity
affinity:
#如果某個(gè)maste節(jié)點(diǎn)上已有rabbitmq pod,則不在這個(gè)master節(jié)點(diǎn)上建rabbitmq pod。確保3個(gè)rabbitmq pod分別在3個(gè)master節(jié)點(diǎn)上創(chuàng)建
podAntiAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
- labelSelector:
matchExpressions:
- key: app
operator: In
values:
- rmq-cluster
topologyKey: kubernetes.io/hostname
containers:
- args:
- -c
- cp -v /etc/rabbitmq/rabbitmq.conf ${RABBITMQ_CONFIG_FILE}; exec docker-entrypoint.sh
rabbitmq-server
command:
- sh
env:
## 用戶名,從密件文件中讀取
- name: RABBITMQ_DEFAULT_USER
valueFrom:
secretKeyRef:
key: username
name: rmq-cluster-secret
## 密碼,從密件文件中讀取
- name: RABBITMQ_DEFAULT_PASS
valueFrom:
secretKeyRef:
key: password
name: rmq-cluster-secret
## ERlang Cookie,從密件文件中讀取
- name: RABBITMQ_ERLANG_COOKIE
valueFrom:
secretKeyRef:
key: cookie
name: rmq-cluster-secret
## POD IP
- name: POD_IP
valueFrom:
fieldRef:
fieldPath: status.podIP
## POD 名稱
- name: POD_NAME
valueFrom:
fieldRef:
fieldPath: metadata.name
## POD 命名空間
- name: POD_NAMESPACE
valueFrom:
fieldRef:
fieldPath: metadata.namespace
## 是否使用長(zhǎng)節(jié)點(diǎn)名稱,有點(diǎn)的就是長(zhǎng)節(jié)點(diǎn)名稱,必須配置
- name: RABBITMQ_USE_LONGNAME
value: "true"
# 若在ConfigMap中設(shè)置了service_name,則此處無需再次設(shè)置,注意環(huán)境變量聲名的順序
- name: K8S_SERVICE_NAME
value: rabbitmq-headless
## 節(jié)點(diǎn)名稱命名規(guī)則,注意此處節(jié)點(diǎn)名稱必須符合無頭服務(wù)的命名規(guī)則,比如此處為rmq-cluster.rabbitmq
## 注意之前隨意改變了有狀態(tài)副本集的名稱serviceName,并且同步修改了無頭服務(wù)的對(duì)應(yīng)字段,但是沒有修改此處的$(K8S_SERVICE_NAME)名稱,造成提示
## "ERROR: epmd error for host rmq-cluster-0.rmq-cluster.public-service.svc.cluster.local: nxdomain (non-existing domain)"錯(cuò)誤
- name: RABBITMQ_NODENAME
value: rabbit@$(POD_NAME).$(K8S_SERVICE_NAME).$(POD_NAMESPACE).svc.cluster.local
- name: RABBITMQ_CONFIG_FILE
value: /var/lib/rabbitmq/rabbitmq.conf
image: rabbitmq:3.7-management
imagePullPolicy: IfNotPresent
## 配置探針
livenessProbe:
exec:
command:
- rabbitmqctl
- status
initialDelaySeconds: 30
timeoutSeconds: 10
## 容器組名稱
name: rabbitmq
ports:
- containerPort: 15672
name: http
protocol: TCP
- containerPort: 5672
name: amqp
protocol: TCP
## 探針
readinessProbe:
exec:
command:
- rabbitmqctl
- status
initialDelaySeconds: 10
timeoutSeconds: 10
## 容器存儲(chǔ)聲明,此處兩個(gè)容器存儲(chǔ)都必須通過volumes或者volumeClaimTemplates指定
volumeMounts:
## 定義配置文件,容器內(nèi)映射路徑為XXX
- name: config-volume
mountPath: /etc/rabbitmq
readOnly: false
## 定義數(shù)據(jù)存儲(chǔ),容器內(nèi)映射路徑為XXX
- name: rabbitmq-storage
mountPath: /var/lib/rabbitmq
readOnly: false
## 外部存儲(chǔ)綁定
volumes:
- name: config-volume ## 名稱和volumeMounts中某個(gè)name相同
configMap:
name: rmq-cluster-config ## 名稱需和對(duì)應(yīng)的configMap名稱相同
items:
- key: rabbitmq.conf
path: rabbitmq.conf
- key: enabled_plugins
path: enabled_plugins
volumeClaimTemplates:
- metadata:
## 名稱需和volumeMounts中某個(gè)name相同
name: rabbitmq-storage
spec:
accessModes:
- ReadWriteMany
storageClassName: "rmq-storage-class"
resources:
requests:
storage: 4Gi
1.4 創(chuàng)建configMap(根據(jù)需求)
通常容器部署過程中,部分文件不喜歡寫死,因此通過configMap方式動(dòng)態(tài)配置是大多數(shù)人的選擇,如果是用戶名、密碼這種,建議使用secret這種加密存儲(chǔ)方式。
如下,動(dòng)態(tài)指定開啟的插件,以及rabbitmq服務(wù)端的配置(比如配置集群信息等)。
kind: ConfigMap
apiVersion: v1
metadata:
name: rmq-cluster-config
namespace: public-service
labels:
addonmanager.kubernetes.io/mode: Reconcile
data:
enabled_plugins: |
[rabbitmq_management,rabbitmq_peer_discovery_k8s].
rabbitmq.conf: |
loopback_users.guest = false
## Clustering
cluster_formation.peer_discovery_backend = rabbit_peer_discovery_k8s
cluster_formation.k8s.host = kubernetes.default.svc.cluster.local
cluster_formation.k8s.address_type = hostname
#################################################
# public-service is rabbitmq-cluster's namespace#
#################################################
cluster_formation.k8s.hostname_suffix = .rmq-cluster.public-service.svc.cluster.local
cluster_formation.node_cleanup.interval = 10
cluster_formation.node_cleanup.only_log_warning = true
cluster_partition_handling = autoheal
## queue master locator
queue_master_locator=min-masters
1.5 Secret創(chuàng)建Erlang對(duì)應(yīng)的Cookie
Erlang對(duì)應(yīng)的Cookie信息比較敏感,因此需通過Secret方式創(chuàng)建如下:
kind: Secret
apiVersion: v1
metadata:
name: rmq-cluster-secret
namespace: public-service
stringData:
cookie: ERLANG_COOKIE
password: RABBITMQ_PASS
url: amqp://RABBITMQ_USER:RABBITMQ_PASS@rmq-cluster-balancer
username: RABBITMQ_USER
type: Opaque ## 模糊
1.6 創(chuàng)建部署文件
部署文件在1.3中使用PVC已經(jīng)寫明,不再重復(fù)說明。
1.7 定義headless服務(wù)
定義headless(又稱無頭)服務(wù)前,須明白無頭服務(wù)的作用,見第三章節(jié)。
## 注意無頭服務(wù)必須創(chuàng)建在有狀態(tài)副本集前面,否則無法利用無頭服務(wù)的DNS特性
## 詳細(xì)參考文章說明http://www.itdecent.cn/p/a6d8b28c88a2
kind: Service
apiVersion: v1
metadata:
labels:
app: rmq-cluster
name: rabbitmq-headless ## 必須與有狀態(tài)副本集的的serviceName相同,用于hostname傳播訪問pod
namespace: public-service
spec:
clusterIP: None
ports:
- name: amqp
port: 5672
targetPort: 5672
selector:
app: rmq-cluster
1.8 定義對(duì)外暴露服務(wù)
用戶根據(jù)需求對(duì)外暴露部分服務(wù),比如dashboard服務(wù)端口,或者直接暴露rabbitmq的broker端口。
# 用于暴露dashboard到外網(wǎng)
kind: Service
apiVersion: v1
metadata:
labels:
app: rmq-cluster
type: LoadBalancer
name: rabbitmq-service
namespace: public-service
spec:
type: NodePort # 注意如果你想在外網(wǎng)下訪問mq,需要增配nodeport
ports:
- name: http
port: 15672
protocol: TCP
targetPort: 15672 # 注意k8s默認(rèn)情況下,nodeport要在30000~32767之間,可以自行修改
- name: amqp
port: 5672
protocol: TCP
targetPort: 5672
selector:
app: rmq-cluster
二、有狀態(tài)副本集作用和組成
2.1 statefulset作用
在k8s中,statefulset主要管理一下特效的應(yīng)用:
? a)、每一個(gè)Pod穩(wěn)定且有唯一的網(wǎng)絡(luò)標(biāo)識(shí)符;--------- 即Pod重新調(diào)度后其PodName和HostName不變,基于Headless Service(即沒有Cluster IP的Service)來實(shí)現(xiàn)
? b)、穩(wěn)定且持久的存儲(chǔ)設(shè)備; ---------即Pod重新調(diào)度后還是能訪問到相同的持久化數(shù)據(jù),基于PVC來實(shí)現(xiàn)
? c)、要求有序、平滑的部署和擴(kuò)展; ------- (即從0到N-1)
? d)、要求有序、平滑的終止和刪除; ------- (即從N-1到0)
? e)、有序的滾動(dòng)更新,應(yīng)該先更新從節(jié)點(diǎn),再更新主節(jié)點(diǎn);
2.2 statefulset三要素
statefulset由三個(gè)組件組成
? a) headless service(無頭的服務(wù),即沒名字);-------- 用于定義網(wǎng)絡(luò)標(biāo)志(DNS domain)
? b) statefulset控制器 ; -------- 定義具體應(yīng)用
? c) volumeClaimTemplate(存儲(chǔ)卷申請(qǐng)模板,因?yàn)槊總€(gè)pod要有專用存儲(chǔ)卷,而不能共用存儲(chǔ)卷) --- 用于創(chuàng)建PersistentVolumes
如何理解無頭服務(wù)和普通服務(wù)的區(qū)別
2.3 statefulSet中DNS格式什么樣子
StatefulSet中每個(gè)Pod的DNS格式為statefulSetName-{0..N-1}.serviceName.namespace.svc.cluster.local,其中
-
statefulSetName為StatefulSet的名字 -
0..N-1為Pod所在的序號(hào),從0開始到N-1 -
serviceName為Headless Service的名字 -
namespace為服務(wù)所在的namespace,Headless Servic和StatefulSet必須在相同的namespace -
.cluster.local為Cluster Domain
三、 關(guān)于headless服務(wù)
3.1 headless服務(wù)概念
headless service
headless service是一個(gè)特殊的ClusterIP類service,這種service創(chuàng)建時(shí)不指定clusterIP(--cluster-ip=None),因?yàn)檫@點(diǎn),kube-proxy不會(huì)管這種service,于是node上不會(huì)有相關(guān)的iptables規(guī)則。
當(dāng)headless service有配置selector時(shí),其對(duì)應(yīng)的所有后端節(jié)點(diǎn),會(huì)被記錄到dns中,在訪問service domain時(shí)kube-dns會(huì)將所有endpoints返回,選擇哪個(gè)進(jìn)行訪問則是系統(tǒng)自己決定;
3.2 nslookup理解無頭服務(wù)
關(guān)于無頭服務(wù)理解,可以閱讀下面這篇文章,普通服務(wù)DNS查詢時(shí)只能獲取服務(wù)ClusterIP,而headless服務(wù)可以獲取pod的真實(shí)IP地址。即
參考文章K8S容器編排之Headless淺談 -- 用nslookup實(shí)戰(zhàn)說明無頭服務(wù)到底提供了什么功能
1、
dns查詢普通clusterIP類型的服務(wù)時(shí)只會(huì)返回Service的地址。具體client訪問的是哪個(gè)Real Server,是由iptables來決定的2、
dns查詢headless服務(wù)時(shí)會(huì)如實(shí)的返回2個(gè)真實(shí)的endpoint
3.3 Headless Service有什么使用場(chǎng)景呢?
參考如下理解:
Headless Service就是沒頭的Service。有什么使用場(chǎng)景呢?
- 第一種:自主選擇權(quán),有時(shí)候
client想自己來決定使用哪個(gè)Real Server,可以通過查詢DNS來獲取Real Server的信息。- 第二種:
Headless Services還有一個(gè)用處(PS:也就是我們需要的那個(gè)特性)。Headless Service的對(duì)應(yīng)的每一個(gè)Endpoints,即每一個(gè)Pod,都會(huì)有對(duì)應(yīng)的DNS域名;這樣Pod之間就可以互相訪問。我們還是看上面的這個(gè)例子。
3.4 無頭服務(wù)聲明注意事項(xiàng)
最后強(qiáng)調(diào)一點(diǎn)就是,無頭服務(wù)名稱需與有狀態(tài)副本集的的serviceName相同,用于hostname傳播訪問pod
且如果有狀態(tài)副本集不同節(jié)點(diǎn)需要互通時(shí),需要使用當(dāng)headless service有配置selector時(shí),其對(duì)應(yīng)的所有后端節(jié)點(diǎn),會(huì)被記錄到dns中特性,因此其無頭服務(wù)必須聲明。
以上文中環(huán)境變量為例
# 若在ConfigMap中設(shè)置了service_name,則此處無需再次設(shè)置,注意環(huán)境變量聲名的順序
- name: K8S_SERVICE_NAME
value: rabbitmq-headless
## 節(jié)點(diǎn)名稱命名規(guī)則,注意此處節(jié)點(diǎn)名稱必須符合無頭服務(wù)的命名規(guī)則,比如此處為rmq-cluster.rabbitmq
## 注意之前隨意改變了有狀態(tài)副本集的名稱serviceName,并且同步修改了無頭服務(wù)的對(duì)應(yīng)字段,但是沒有修改此處的$(K8S_SERVICE_NAME)名稱,造成提示
## "ERROR: epmd error for host rmq-cluster-0.rmq-cluster.public-service.svc.cluster.local: nxdomain (non-existing domain)"錯(cuò)誤
- name: RABBITMQ_NODENAME
value: rabbit@$(POD_NAME).$(K8S_SERVICE_NAME).$(POD_NAMESPACE).svc.cluster.local
即以下幾個(gè)變量名稱必須相同:
1、無頭服務(wù)的name字段
2、有狀態(tài)副本集的serviceName字段
3、有狀態(tài)副本集中容器對(duì)應(yīng)的K8S_SERVICE_NAME環(huán)境變量
本文到底結(jié)束,如有描述不當(dāng),還望諒解指正!
源文件對(duì)應(yīng)github地址待整理更新。
附 參考文獻(xiàn)
- 淺析k8s service的應(yīng)用---說明K8S服務(wù)類型和區(qū)別
- K8S容器編排之Headless淺談 -- 用nslookup說明無頭服務(wù)
- k8s部署kafka集群 -- 描述了Kafka集群K8S部署文件和有狀態(tài)副本集的應(yīng)用場(chǎng)景和組成