#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
Проверьте причину возврата к сбою