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访问方式错误:你创建的
webService默认类型是ClusterIP,只能在集群内部访问,直接在节点上访问localhost:8000本来就无法连通。
修复步骤
- 修改Deployment中Nginx容器的端口配置,将
containerPort从8000改为镜像默认的80,同时调整Nginx配置,将反向代理的Django地址指向127.0.0.1:8000。 - 给Django容器新增环境变量,覆盖Celery/Redis的连接地址为
127.0.0.1:6379,不要使用redis这个主机名。 - 补全NetworkPolicy的出站规则,至少放通回环网卡访问、DNS解析流量、以及访问PostgreSQL数据库的流量。
- 本地测试访问时,要么执行
kubectl port-forward service/web 8000:8000后再访问本地8000端口,要么将Service类型改为NodePort,通过节点IP+NodePort端口访问。 - 确认集群中存在名为
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
相关产品推荐
相关产品推荐

