簡體   English   中英

使用 docker-compose 和 ZB76E98AF9AAA680979ZBF5A65B2D5A105 服務 API 時的 Nginx 上游服務器值

[英]Nginx upstream server values when serving an API using docker-compose and kubernetes

I'm trying to use docker-compose and kubernetes as two different solutions to setup a Django API served by Gunicorn (as the web server) and Nginx (as the reverse proxy). 以下是關鍵文件:

default.tmpl (nginx) - 填入環境變量時轉換為 default.conf:

upstream api {
    server ${UPSTREAM_SERVER};
}

server {
    listen 80;

    location / {
        proxy_pass http://api;
    }

    location /staticfiles {
        alias /app/static/;
    }
}

docker-compose.yaml:

version: '3'
services:
  api-gunicorn:
    build: ./api
    command: gunicorn --bind=0.0.0.0:8000 api.wsgi:application
    volumes:
      - ./api:/app

  api-proxy:
    build: ./api-proxy
    command: /bin/bash -c "envsubst < /etc/nginx/conf.d/default.tmpl > /etc/nginx/conf.d/default.conf && exec nginx -g 'daemon off;'"
    environment:
      - UPSTREAM_SERVER=api-gunicorn:8000
    ports:
      - 80:80
    volumes:
      - ./api/static:/app/static
    depends_on:
      - api-gunicorn

api-deployment.yaml(kubernetes):

apiVersion: apps/v1
kind: Deployment
metadata:
  name: release-name-myapp-api-proxy
spec:
  replicas: 1
  selector:
    matchLabels:
      app.kubernetes.io/name: myapp-api-proxy
  template:
    metadata:
      labels:
        app.kubernetes.io/name: myapp-api-proxy
    spec:
      containers:
        - name: myapp-api-gunicorn
          image: "helm-django_api-gunicorn:latest"
          imagePullPolicy: Never
          command:
            - "/bin/bash"
          args:
            - "-c"
            - "gunicorn --bind=0.0.0.0:8000 api.wsgi:application"
        - name: myapp-api-proxy
          image: "helm-django_api-proxy:latest"
          imagePullPolicy: Never
          command:
            - "/bin/bash"
          args:
            - "-c"
            - "envsubst < /etc/nginx/conf.d/default.tmpl > /etc/nginx/conf.d/default.conf && exec nginx -g 'daemon off;'"
          env:
            - name: UPSTREAM_SERVER
              value: 127.0.0.1:8000
          volumeMounts:
            - mountPath: /app/static
              name: api-static-assets-on-host-mount
      volumes:
        - name: api-static-assets-on-host-mount
          hostPath:
            path: /Users/jonathan.metz/repos/personal/code-demos/kubernetes-demo/helm-django/api/static

我的問題涉及UPSTREAM_SERVER環境變量。

對於docker-compose.yaml ,以下值對我有用:

  • 將其設置為 gunicorn 服務的名稱及其運行的端口(在本例中api-gunicorn:8000 )。 這是最好的方法(以及我在上面的 docker-compose 文件中是如何做到的),因為我不需要將8000端口暴露給主機。
  • 本文所述,將其設置為MY_IP_ADDRESS:8000 這種方法需要我暴露8000端口,不太理想。

對於api-deployment.yaml ,只有以下值對我有用:

UPSTREAM_SERVER是否還有其他適用於此的值,尤其是在 kubernetes 文件中? 我覺得我應該能夠指向容器的名稱,並且應該可以。

您可以創建一個服務來定位容器myapp-api-gunicorn ,但這會將其暴露在pod之外:

apiVersion: v1
kind: Service
metadata:
  name: api-gunicorn-service
spec:
  selector:
    app.kubernetes.io/name: myapp-api-proxy
  ports:
    - protocol: TCP
      port: 8000
      targetPort: 8000

您還可以在pod中使用主機名和子域字段來利用 FQDN。

當前,當創建 Pod 時,其主機名是 Pod 的metadata.name值。

Pod 規范有一個可選的hostname段,可用於指定 Pod 的主機名。 指定時,它優先於 Pod 的名稱成為 pod 的主機名。 例如,給定一個hostname設置為“ my-host ”的 Pod,該 Pod 的主機名將設置為“ my-host ”。

Pod 規范還有一個可選的subdomain字段,可用於指定其子域。 例如,在命名空間“ my-namespace ”中, hostname設置為“ foo ”, subdomain設置為“ bar ”的 Pod 將具有完全限定域名(FQDN)“ foo.bar.my-namespace.svc.cluster-domain.example ”。

這里還有一篇來自Mirantis的好文章,它談到了在一個 pod 中暴露多個容器

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM