我在为部署在 kubernetes 中的 django 应用程序创建 nginx 配置文件时遇到困难。
Nginx 和 app 是同一集群中的两个独立容器。据我了解,容器可以通过 127.0.0.1:XX 和主机名相互通信。我为此使用 minikube。
我的应用程序容器是从此文件构建的:
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;
}
}
我尝试用容器名称(网站)和 localhost:8000 替换 127.0.0.1:8000 但没有任何改变。我究竟做错了什么?
对于您的具体问题:
- 仅当容器是同一 Pod 上的两个容器时,容器才可以通过本地主机引用 (127.0.0.1) 相互通信,这不是您的情况 - 因此是 503。
- 位于不同 Pod 中(如您的示例中)但共享相同命名空间(例如默认)的容器可以使用服务名称(在您的情况下:网站)相互通信
- 位于不同命名空间中的容器可以使用 FQDN 进行通信,如 service-name.namespace-name.svc.cluster.local (在您的情况下为 website.default.svc.cluster.local)。
现在,k8s 的理念是 pod 是部署单元,container 是打包单元。如果您的 nginx 和网站始终一起扩展,那么就有理由将它们放在同一个 pod 中并通过 localhost 进行通信,就好像它们是同一台计算机上的两个进程一样。如果您的前端要处理多个网站并且它们分别扩展,则适合选择选项 2 或 3(通过服务名称或 FQDN 进行通信)。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)