"хост не найден в восходящем потоке ..." при использовании 'kubectl apply -f', но работает в 'docker-compose up'
У меня есть четыре изображения в докере, которые представляют собой две службы, интерфейс и обратный прокси.
Когда я использовал docker-compose up
, он работает, и службы работали.
Но когда я хочу использовать kubectl apply -f
запустить в стручке. Есть [Emerg] 1#1: хост не найден в восходящем "backend-user:8080" в /etc/nginx/nginx.conf:11 в журналах. Я понятия не имею об этом.
Вот мои изображения:
bmjlearntocode/reverseproxy latest
bmjlearntocode/udacity-frontend local
bmjlearntocode/udacity-restapi-user latest
bmjlearntocode/udacity-restapi-feed latest
Вот docker-compose.yaml
version: "3"
services:
reverseproxy:
image: bmjlearntocode/reverseproxy
ports:
- 8080:8080
restart: always
depends_on:
- backend-user
- backend-feed
backend-user:
image: bmjlearntocode/udacity-restapi-user
volumes:
- $HOME/.aws:/root/.aws
environment:
POSTGRESS_USERNAME: $POSTGRESS_USERNAME
POSTGRESS_PASSWORD: $POSTGRESS_PASSWORD
POSTGRESS_DB: $POSTGRESS_DB
POSTGRESS_HOST: $POSTGRESS_HOST
AWS_REGION: $AWS_REGION
AWS_PROFILE: $AWS_PROFILE
AWS_BUCKET: $AWS_BUCKET
JWT_SECRET: $JWT_SECRET
URL: "http://localhost:8100"
backend-feed:
image: bmjlearntocode/udacity-restapi-feed
volumes:
- $HOME/.aws:/root/.aws
environment:
POSTGRESS_USERNAME: $POSTGRESS_USERNAME
POSTGRESS_PASSWORD: $POSTGRESS_PASSWORD
POSTGRESS_DB: $POSTGRESS_DB
POSTGRESS_HOST: $POSTGRESS_HOST
AWS_REGION: $AWS_REGION
AWS_PROFILE: $AWS_PROFILE
AWS_BUCKET: $AWS_BUCKET
JWT_SECRET: $JWT_SECRET
URL: "http://localhost:8100"
frontend:
image: bmjlearntocode/udacity-frontend:local
ports:
- "8100:80"
Вот nginx.conf
worker_processes 1;
events { worker_connections 1024; }
error_log /dev/stdout debug;
http {
sendfile on;
upstream user {
server backend-user:8080;
}
upstream feed {
server backend-feed:8080;
}
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Host $server_name;
server {
listen 8080;
location /api/v0/feed {
proxy_pass http://feed;
}
location /api/v0/users {
proxy_pass http://user;
}
}
}
Когда я использую docker-compose up
, оно работает.
Вот файл reverseproxy-deployment.ymal
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
labels:
service: reverseproxy
name: reverseproxy
spec:
replicas: 2
template:
metadata:
labels:
service: reverseproxy
spec:
containers:
- image: bmjlearntocode/reverseproxy
name: reverseproxy
imagePullPolicy: Always
resources:
requests:
memory: "64Mi"
cpu: "250m"
limits:
memory: "1024Mi"
cpu: "500m"
ports:
- containerPort: 8080
restartPolicy: Always
Я не уверен, почему nginx не может найти "бэкэнд" при запуске модуля, но может работать в docker-compose up
2 ответа
Я думаю, это потому, что backend-user имеет значение только для сети докеров. Когда вы определяете службу в файле docker-compose, вы можете получить к нему доступ по имени. Очевидно, вы не можете получить доступ к backend-user:8080 в кластере kubernetes, потому что он не определен.
В кубернетах для такого доступа вам нужен сервисный ресурс. Кроме того, вам понадобится ресурс или служба Ingress, тип nodeport для доступа к приложениям извне кластера Kubernetes (например, из вашего браузера).
вы можете проверить эти ресурсы. они хорошо написаны.
https://kubernetes.io/docs/tasks/access-application-cluster/service-access-application-cluster/https://kubernetes.io/docs/tasks/access-application-cluster/ingress-minikube/
также вы можете поместить свой nginx и внутреннюю службу в один модуль и использовать localhost вместо hostname / servicename. чтобы nginx мог найти вышестоящий сервер.
Я думаю, что это было решено путем использования и в качестве имени службы вместо и ИЛИ измененияnginx.conf
и установите восходящие потоки для использования этих двухbackend-user-svc
иbackend-feed-svc
вместоbackend-user
иbackend-feed