Конфигурация Nginx для приложения django в кластере kubernetes - PullRequest
0 голосов
/ 30 апреля 2018

У меня проблемы с созданием файла конфигурации nginx для приложения django, развернутого в kubernetes. Nginx и приложение - это два отдельных контейнера в одном кластере. Из того, что я понимаю, контейнеры могут общаться друг с другом через 127.0.0.1:XX и через имена хостов. Я использую миникуб для этого. Контейнер моего приложения построен из этого файла:

apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  name: website
  labels:
    name: website
spec:
  template:
    metadata:
      labels:
        name: website
    spec:
      containers:
        - name: website
          image: killabien/web
          ports:
            - containerPort: 8000
---
apiVersion: v1
kind: Service
metadata:
  name: website
  labels:
    name: website
spec:
  type: LoadBalancer
  ports:
    - port: 8000
      targetPort: 8000
  selector:
    name: website

И nginx из этого:

apiVersion: v1
kind: Service
metadata:
  name: frontend
spec:
  ports:
    - protocol: TCP
      port: 80
      targetPort: 80
  selector:
    app: website
    tier: frontend
  type: LoadBalancer
---
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  name: frontend
spec:
  template:
    metadata:
      labels:
        app: website
        tier: frontend
    spec:
      containers:
        - image: killabien/nginx
          name: nginx

Я могу получить доступ к самому приложению (обслуживаемому без статических файлов), но когда я пытаюсь связаться с nginx, я получаю ошибку 502 Bad Gateway. Вот файл конфигурации nginx:

upstream website {
    server 127.0.0.1:8000;

}
server {
    listen 80;
    location /static {
        alias /www/davidbien/static;
    }

   location / {
        proxy_pass http://website;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
     }
}

Я попытался заменить 127.0.0.1:8000 на имя контейнера (веб-сайт) и localhost: 8000, но ничего не изменилось. Что я делаю не так?

1 Ответ

0 голосов
/ 01 мая 2018

Для вашего конкретного вопроса:

  • контейнеры могут связываться друг с другом через ссылку на локальный хост (127.0.0.1), только если они являются двумя контейнерами в одном модуле, что не соответствует вашему случаю - следовательно, 503.
  • контейнеры, которые находятся в разных модулях (как в вашем примере), но совместно используют одно и то же пространство имен (скажем, по умолчанию), могут взаимодействовать друг с другом, используя имя службы (в вашем случае: веб-сайт)
  • контейнеры, которые находятся в разных пространствах имен, могут обмениваться данными с использованием полного доменного имени, как в service-name.namespace-name.svc.cluster.local (в вашем случае website.default.svc.cluster.local).

Теперь философия k8s заключается в том, что контейнер - это единица развертывания, а контейнер - единица упаковки. Если ваш nginx и веб-сайт всегда масштабируются вместе, то становится разумным поместить их обоих в один модуль и обмениваться данными через localhost, как если бы они были двумя процессами на одной машине. Если ваш веб-интерфейс будет работать с несколькими веб-сайтами, и они будут масштабироваться по отдельности, тогда вариант 2 или 3 (связь через имя службы или полное доменное имя) будет в порядке.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...