You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Kubernetes同一Pod内nginx/redis/Django容器无法通信排查

问题排查结论

你的配置存在4个核心问题,直接导致容器通信失败、访问无响应:

  • 同Pod容器访问地址错误:Docker Compose会自动为服务注册redis这类服务名DNS,但Kubernetes同Pod内的多个容器共享网络命名空间,不存在这个DNS记录。同Pod容器间通信直接用127.0.0.1+目标端口即可,你当前Django配置连接redis:6379必然会报连接拒绝,需要把Redis连接串改成redis://127.0.0.1:6379/0。
  • 端口冲突:同Pod共享网络栈,同一个端口不能被两个进程同时监听。你给Nginx容器和Django容器都配置了containerPort: 8000,且官方nginx:alpine镜像默认监听的是80端口而非8000,既不符合镜像默认配置,又和Django的服务端口冲突,直接导致Nginx无法正常接收集群流量。
  • NetworkPolicy规则不全:当前NetworkPolicy只配置了入站(ingress)放行规则,没有配置出站(egress)规则,只要集群启用了网络策略插件,会默认拦截该Pod所有对外访问流量,后续连接PostgreSQL数据库也会被拦截。
  • Service访问方式错误:你创建的web Service默认类型是ClusterIP,只能在集群内部访问,直接在节点上访问localhost:8000本来就无法连通。
修复步骤
  1. 修改Deployment中Nginx容器的端口配置,将containerPort从8000改为镜像默认的80,同时调整Nginx配置,将反向代理的Django地址指向127.0.0.1:8000。
  2. 给Django容器新增环境变量,覆盖Celery/Redis的连接地址为127.0.0.1:6379,不要使用redis这个主机名。
  3. 补全NetworkPolicy的出站规则,至少放通回环网卡访问、DNS解析流量、以及访问PostgreSQL数据库的流量。
  4. 本地测试访问时,要么执行kubectl port-forward service/web 8000:8000后再访问本地8000端口,要么将Service类型改为NodePort,通过节点IP+NodePort端口访问。
  5. 确认集群中存在名为db的Service对应PostgreSQL实例,否则ConfigMap中配置的DB_HOST: db无法解析,Django连数据库也会失败。
核心配置修正片段
# Deployment 容器配置修正片段
containers:
  - image: nginx:alpine
    name: nginxcontainer
    ports:
      - containerPort: 80 # 修正为Nginx默认监听端口,避免和Django的8000冲突
  - image: redis:alpine
    name: rediscontainer
    ports:
      - containerPort: 6379
    resources: {}
  - env:
      - name: DB_HOST
        valueFrom:
          configMapKeyRef:
            key: DB_HOST
            name: envs--django
      - name: DB_NAME
        valueFrom:
          configMapKeyRef:
            key: DB_NAME
            name: envs--django
      - name: DB_PASSWORD
        valueFrom:
          configMapKeyRef:
            key: DB_PASSWORD
            name: envs--django
      - name: DB_PORT
        valueFrom:
          configMapKeyRef:
            key: DB_PORT
            name: envs--django
      - name: DB_USER
        valueFrom:
          configMapKeyRef:
            key: DB_USER
            name: envs--django
      # 新增Redis地址环境变量,根据你Django/Celery的实际配置调整变量名
      - name: REDIS_HOST
        value: "127.0.0.1"
    image: localhost:5000/integration/web:latest
    name: djangocontainer
    ports:
      - containerPort: 8000
    resources: {}
# NetworkPolicy 修正片段,补全出站规则
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: djangonetwork
spec:
  podSelector:
    matchLabels:
      io.kompose.network/djangonetwork: "true"
  policyTypes:
  - Ingress
  - Egress
  ingress:
    - from:
        - podSelector:
            matchLabels:
              io.kompose.network/djangonetwork: "true"
  egress:
    # 放通DNS解析
    - to:
        - namespaceSelector: {}
          podSelector:
            matchLabels:
              k8s-app: kube-dns
      ports:
        - protocol: UDP
          port: 53
        - protocol: TCP
          port: 53
    # 放通同Pod内回环访问
    - to:
        - ipBlock:
            cidr: 127.0.0.1/32
    # 放通访问PostgreSQL数据库的流量,根据实际db服务地址调整
    - to:
        - podSelector:
            matchLabels:
              io.kompose.service: db
      ports:
        - protocol: TCP
          port: 5432

内容的提问来源于stack exchange,提问作者Johnny Pastrami

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.29 13:36:22