kubernetes 集群中 django 应用程序的 Nginx 配置

dav*_*idb 2 django nginx kubernetes

我在为 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
Run Code Online (Sandbox Code Playgroud)

和 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
Run Code Online (Sandbox Code Playgroud)

我可以访问应用程序本身(不提供静态文件),但是当我尝试访问 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;
     }
}
Run Code Online (Sandbox Code Playgroud)

我尝试用容器名称(网站)和 localhost:8000 替换 127.0.0.1:8000 但没有任何改变。我究竟做错了什么?

Con*_*nst 9

对于您的特定问题:

  • 只有当它们是同一个 pod 上的两个容器时,容器才能通过 localhost 引用(127.0.0.1)相互通信,这不是你的情况 - 因此是 503。
  • 位于不同 pod 中(如您的示例中)但共享相同命名空间(例如,默认)的容器可以使用服务名称(在您的情况下:网站)相互通信
  • 位于不同命名空间中的容器可以使用 FQDN 进行通信,如 service-name.namespace-name.svc.cluster.local(在您的情况下为 website.default.svc.cluster.local)。

现在,k8s 的理念是 pod 是部署单位,而容器是包装单位。如果您的 nginx 和网站总是一起扩展,那么将它们放在同一个 pod 中并通过 localhost 进行通信,就好像它们是同一台机器上的两个进程一样。如果您的前端要处理多个网站并且它们分别扩展,那么选项 2 或 3(通过服务名称或 FQDN 进行通信)就可以了。