K8S學(xué)習(xí)系列(一)之 Rabbitmq集群部署&有狀態(tài)副本集無頭服務(wù)理解

一、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)

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容