Как настроить несколько сервисов / контейнеров в Kubernetes?

#docker #asp.net-core #kubernetes #microservices #docker-for-windows

#docker #asp.net-ядро #kubernetes #микросервисы #docker для Windows

Вопрос:

Я новичок в Docker и Kubernetes. Используемые технологии:

  • Ядро Dotnet 2.2
  • Asp.NET Основной WebAPI 2.2
  • Docker для Windows (Edge) с включенной поддержкой Kubernetes
  • Код

У меня есть две службы, размещенные в двух контейнерах docker container1 и container2.

Ниже приведен мой deploy.yaml

 apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  name: webapi-dockerkube
spec:
  replicas: 1
  template:
    metadata:
      labels:
        app: webapi-dockerkube
    spec:
      containers:
      - name: webapi-dockerkube
        image: "webapidocker:latest"
        imagePullPolicy: IfNotPresent
        ports:
        - containerPort: 80
        livenessProbe:
          httpGet:
            path: /api/values
            port: 80
        readinessProbe:
          httpGet:
            path: /api/values
            port: 80
      - name: webapi-dockerkube2
        image: "webapidocker2:latest"
        imagePullPolicy: IfNotPresent
        ports:
        - containerPort: 80
        livenessProbe:
          httpGet:
            path: /api/other/values
            port: 80
        readinessProbe:
          httpGet:
            path: /api/other/values
            port: 80
 

Когда я запускаю command:

 kubectl create -f .deploy.yaml
 

Я получаю статус как CrashLoopBackOff .

Но то же самое работает нормально, когда у меня настроен только один контейнер. При проверке журналов я получаю следующую ошибку: Error from server (BadRequest): a container name must be specified for pod webapi-dockerkube-8658586998-9f8mk, choose one of: [webapi-dockerkube webapi-dockerkube2]

Комментарии:

1. Можете ли вы опубликовать последние строки «kubectl logs -p POD_NAME» модуля crashlooping?

2. Ошибка сервера (неверный запрос): необходимо указать имя контейнера для pod webapi-dockerkube-8658586998-9f8mk, выберите один из: [webapi-dockerkube webapi-dockerkube2]

3. хорошо, вам нужно указать один из контейнеров: «kubectl logs -p POD_NAME webapi-dockerkube» или «kubectl logs -p POD_NAME webapi-dockerkube2»

4. для обоих ошибка с сервера (не найдена): модули «POD_NAME» не найдены

5. вы можете получить имена своих модулей, запустив kubectl get po там, вы увидите имя модуля, похожее на webapi-dockerkube-xxxx. Замените POD_NAME на это имя.

Ответ №1:

Вы запускаете два контейнера в одном модуле, которые привязывают оба к порту 80. Это невозможно в одном модуле. Представьте модуль как «сервер», и вы не можете привязать два процесса к одному и тому же порту.

Решение в вашей ситуации: используйте разные порты внутри модуля или используйте отдельные модули. Из вашего развертывания, похоже, нет общих ресурсов, таких как файловая система, поэтому было бы легко разделить контейнеры на отдельные модули.

Обратите внимание, что недостаточно изменить определение модуля, если вы хотите, чтобы оба контейнера работали в одном модуле с разными портами. Приложение в контейнере также должно привязываться к другому порту.

Комментарии:

1. Я думаю, что то же самое обсуждение уже идет в комментариях, пожалуйста, прочтите это и оставьте свой отзыв

Ответ №2:

 apiVersion: v1
kind: Pod
metadata:
  name: two-containers
spec:

  restartPolicy: Never

  volumes:
  - name: shared-data
    emptyDir: {}

  containers:

  - name: nginx-container
    image: nginx
    volumeMounts:
    - name: shared-data
      mountPath: /usr/share/nginx/html

  - name: debian-container
    image: debian
    volumeMounts:
    - name: shared-data
      mountPath: /pod-data
    command: ["/bin/sh"]
    args: ["-c", "echo Hello from the debian container > /pod-data/index.html"] 
 

здесь вы можете использовать этот шаблон для совместного использования нескольких контейнеров

Также вы можете проверить журналы использования

Журналы Kubectl

Проверьте причину возврата к сбою