Как выполнить команду на 2-м и 3-м модулях в кубернетах - PullRequest
0 голосов
/ 05 августа 2020

Мой сценарий: я создаю файл развертывания кластера rabbmitmq, в котором я устанавливаю набор реплик 3, потому что я создаю кластер из 3 узлов. цель состоит в том, чтобы создать модуль 1, а затем после создания второго и третьего модулей выполнить команду только для модулей 2 и 3. это команда "rabbitmqctl join_cluster command rabbit@pod1.svc" для соединения с модулем 1. Я не понимаю, как я могу этого добиться.

Я прикрепил свой yaml-файл с набором состояний. Пожалуйста, помогите мне, поскольку я новичок в Kubernetes.

apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: rabbitmq
spec:
  serviceName: rabbitmq-internal
  revisionHistoryLimit: 3
  updateStrategy:
    type: RollingUpdate
  replicas: 3
  selector: 
    matchLabels:
       app: rabbitmq
  template:
    metadata:
      name: rabbitmq
      labels:
        app: rabbitmq
    spec:
      imagePullSecrets:
      - name: dockerhublogin
      - name: rabbitmq
      serviceAccountName: rabbitmq
      terminationGracePeriodSeconds: 10
      containers:        
      - name: rabbitmq
        image: constellationdealer/ptlids:rabbitmq
        lifecycle:
          postStart:
            exec:
              command:             
                - /bin/sh
                - -c
                - >
                  until rabbitmqctl --erlang-cookie ${RABBITMQ_ERLANG_COOKIE} await_startup; do sleep 1; done;
                  rabbitmqctl --erlang-cookie ${RABBITMQ_ERLANG_COOKIE} set_policy ha-two "" '{"ha-mode":"exactly", "ha-params": 2, "ha-sync-mode": "automatic"}'
                  #rabbitmqctl stop_app  &&  join_cluster rabbit@(HOSTNAME}.rabbitmq-internal.default.svc.cluster.local  && rabbitmqctl start_app

        ports:
        - containerPort: 4369
        - containerPort: 5672
        - containerPort: 25672
        - containerPort: 15672
        resources:
          requests:
            memory: "300Mi"
            cpu: "0.4"
          limits:
            memory: "500Mi"
            cpu: "0.6"
        livenessProbe:
          exec:
            command: ["rabbitmq-diagnostics", "status", "--erlang-cookie", "$(RABBITMQ_ERLANG_COOKIE)"]
          initialDelaySeconds: 60
          periodSeconds: 60
          timeoutSeconds: 15
        readinessProbe:
          exec:
            command: ["rabbitmq-diagnostics", "status", "--erlang-cookie", "$(RABBITMQ_ERLANG_COOKIE)"]
            # command: ["rabbitmq-diagnostics", "check_port_connectivity", "--erlang-cookie", "$(RABBITMQ_ERLANG_COOKIE)"]
          initialDelaySeconds: 20
          periodSeconds: 60
          timeoutSeconds: 10
        envFrom:
         - configMapRef:
             name: rabbitmq-cfg
        env:
          - name: HOSTNAME
            valueFrom:
              fieldRef:
                fieldPath: metadata.name
          - name: NAMESPACE
            valueFrom:
              fieldRef:
                fieldPath: metadata.namespace
          - name: RABBITMQ_USE_LONGNAME
            value: "true"
          - name: RABBITMQ_NODENAME
            value: "rabbit@$(HOSTNAME).rabbitmq-internal.$(NAMESPACE).svc.cluster.local"
          - name: K8S_SERVICE_NAME
            value: "rabbitmq-internal"
          - name: RABBITMQ_DEFAULT_USER
            value: admin
          - name: RABBITMQ_DEFAULT_PASS
            value: password
          - name: RABBITMQ_ERLANG_COOKIE
            value: secret_cookie
          - name: NODE_NAME
            valueFrom:
              fieldRef:
                fieldPath: metadata.name

1 Ответ

0 голосов
/ 06 августа 2020

, то есть я не понимаю, как я могу этого достичь.

Хотя можно сформировать кластер Вручную с rabbitmqctl, Официальная документация RabbitMQ говорит, что «кластер RabbitMQ может быть сформирован несколькими способами», один из которых декларативно использует обнаружение Kubernetes (K8s) (через плагин).

В случае K8s это предпочтительный.

Обнаружение одноранговых узлов на K8s объясняется здесь .

Кроме того, существует концепция Контейнер инициализации в K8s. Это контейнер, который выполняется до завершения до запуска контейнера приложения. Он может создавать все, что впоследствии может использоваться «основным» контейнером. Даже набор команд, запускаемых основным контейнером.

...