![](/img/trans.png)
[英]NGINX docker-compose - Host not found in upstream nuxt:3000
[英]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
,以下值對我有用:
api-gunicorn:8000
)。 這是最好的方法(以及我在上面的 docker-compose 文件中是如何做到的),因為我不需要將8000
端口暴露給主機。MY_IP_ADDRESS:8000
。 這種方法需要我暴露8000
端口,不太理想。 對於api-deployment.yaml
,只有以下值對我有用:
localhost:8000
。 在 pod 內部,所有容器都可以使用 localhost 進行通信。 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.