Как получить согласованные имена для подов в Kubernetes - PullRequest
0 голосов
/ 10 июля 2020

Я хочу запустить этот docker образ в кубернетах: https://hub.docker.com/_/rabbitmq

Это не проблема, и он работает. Проблема в том, что мне нужно отправить через коммутаторы, выполните команду «docker run». Для этого изображения при запуске контейнера в docker вы должны запустить это:

docker run -d --hostname my-rabbit --name some-rabbit rabbitmq:3

Файл yaml будет выглядеть примерно так:

apiVersion: apps/v1
kind: Deployment
metadata:  
  name: rb
  namespace: rabbittest
spec:
  selector:
    matchLabels:
        app: rb
  replicas: 1
  template:
    metadata:
      labels:
        app: rb
    spec:
      containers:
      - name: rb-container
        env:                    
          - name: HOSTNAME
            value: "rbnode001"
        image: rabbitmq:3-management        
        resources:
          requests:
            cpu: 100m
            memory: 128Mi
          limits:
            cpu: 250m
            memory: 256Mi
        volumeMounts:
          - name: azure
            mountPath: /mnt/azure
        ports:
          - containerPort: 5672
      volumes:
      - name: azure
        azureFile:
          secretName: azure-secret
          shareName: rabbittest
          readOnly: false

Мой вопрос, как заставить кубернетес применять --name и --hostname, когда кубернетес выполняет команды "docker run"?

Ответы [ 2 ]

2 голосов
/ 10 июля 2020

Прежде всего, вам нужно создать StatefulSets в RabbitMQ.

В вашем StatefulSet добавьте это ENV.

env:
  - name: POD_NAME
    valueFrom:
      fieldRef:
        apiVersion: v1
        fieldPath: metadata.name
  - name: POD_NAMESPACE
    valueFrom:
      fieldRef:
        apiVersion: v1
        fieldPath: metadata.namespace
  - name: K8S_SERVICE_NAME
    value: rabbitmq-headless
  - name: RABBITMQ_NODENAME
    value: $(POD_NAME).$(K8S_SERVICE_NAME).$(POD_NAMESPACE).svc.cluster.local

Здесь K8S_SERVICE_NAME это безголовая служба, требуемая statefulset.

Наконец, RABBITMQ_NODENAME будет содержать HOSTNAME.

1 голос
/ 10 июля 2020
Параметры

Kubernetes просто отличаются от параметров Docker. Многие параметры имеют эквиваленты в: pod spe c object ; некоторые параметры не имеют прямых эквивалентов или разделены на несколько уровней (крепления томов, опубликованные порты).

Для двух упомянутых вами параметров:

  • docker run --name задает имя контейнера. В Kubernetes вы обычно напрямую не взаимодействуете с контейнерами, поэтому вы не можете установить их имена. metadata: {name: } задает имя развертывания, и сгенерированные модули имеют имена, производные от этого; у контейнеров внутри модуля также есть имена, но они используются очень редко.

  • docker run --hostname задает имя, которое контейнер считает своим именем хоста. Эта опция вам почти никогда не понадобится; RabbitMQ - заметное исключение. Pod spe c имеет параметр hostname:, который может установить это.

    spec:
      template:
        spec:
          hostname: my-rabbit
          containers: [...]
    

Как @ Ответ Шахриара предполагает, StatefulSet лучше подходит для развертываний, которым требуется некоторое постоянное резервное состояние. В этом случае StatefulSet автоматически устанавливает имя хоста на основе идентификатора модуля , поэтому вам не нужно ничего делать.

(Важная деталь для RabbitMQ заключается в том, что имя хоста должно быть согласованно при воссоздании контейнера, и если имя хоста всегда rb-0 из StatefulSet, удовлетворяющего этому правилу. Автоматически сгенерированный идентификатор контейнера Docker или переменное имя модуля развертывания Kubernetes будет отличаться при каждом перезапуске, и Rabbit потеряет отслеживать его состояние.)

...