"хост не найден в восходящем потоке ..." при использовании '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

Другие вопросы по тегам