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

Ingress无地址且无法访问:Django应用K8s部署问题求助

Django应用Kubernetes Ingress无地址且无法访问问题排查

问题背景

我有一个运行在8000端口的容器化Django应用,对应镜像为test-karpenter-manager:latest,已部署为Deployment且日志显示启动成功。参考Kubernetes官方Ingress教程操作时,教程示例可正常运行,但替换为自身应用后出现问题。

配置文件

apiVersion: apps/v1
kind: Deployment
metadata:
  name: my-deployment
  labels:
    app: my-app
spec:
  replicas: 1
  selector:
    matchLabels:
      app: my-app
  template:
    metadata:
      labels:
        app: my-app
    spec:
      containers:
      - name: karpenter-test-manager
        image: test-karpenter-manager:latest
        imagePullPolicy: Never
        ports:
        - containerPort: 8000   # port the pod runs on
---
apiVersion: v1
kind: Service
metadata:
  name: my-service
spec:
  selector:
    app: my-app
  ports:
    - protocol: TCP
      port: 8080         # the port the service runs on
      targetPort: 8000   # the port the service points to
---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: my-ingress
  annotations:
    nginx.ingress.kubernetes.io/rewrite-target: /
spec:
  ingressClassName: nginx-example
  rules:
  - host: hello-world.info
    http:
      paths:
      - path: /api
        pathType: Prefix
        backend:
          service:
            name: my-service
            port:
              number: 8080     # points to the service port

当前现象

执行配置后,Ingress处于运行状态但未获取到地址:

$ kubectl get ingress
NAME         CLASS           HOSTS              ADDRESS   PORTS   AGE
my-ingress   nginx-example   hello-world.info             80      9m28s

尝试访问http://hello-world.info/api和http://hello-world.info:80/api均失败。

补充信息

  • /etc/hosts已配置将hello-world.info映射到minikube IP:
$ minikube ip
192.168.49.2
$ cat /etc/hosts | grep $(minikube ip)
192.168.49.2    hello-world.info
  • minikube配置(未使用无root Docker):
$ minikube config view
- driver: docker
- memory: 6000
- rootless: false
- cache: map[localhost/test-karpenter-job:latest:<nil>]
- container-runtime: containerd
- cpus: 4
  • 已安装Ingress控制器且相关Pod状态:
$ minikube addons enable ingress
💡  ingress is an addon maintained by Kubernetes. For any concerns contact minikube on GitHub.
You can view the list of minikube maintainers at: https://github.com/kubernetes/minikube/blob/master/OWNERS
    ▪ Using image registry.k8s.io/ingress-nginx/kube-webhook-certgen:v20231011-8b53cabe0
    ▪ Using image registry.k8s.io/ingress-nginx/kube-webhook-certgen:v20231011-8b53cabe0
    ▪ Using image registry.k8s.io/ingress-nginx/controller:v1.9.4
🔎  Verifying ingress addon...
🌟  The 'ingress' addon is enabled

$ kubectl get pods -n ingress-nginx
NAME                                        READY   STATUS      RESTARTS   AGE
ingress-nginx-admission-create-pf5bl        0/1     Completed   0          21s
ingress-nginx-admission-patch-q57jm         0/1     Completed   1          21s
ingress-nginx-controller-7c6974c4d8-lmdf7   0/1     Running     0          21s

排查与解决方案

1. 修正Ingress Class名称

minikube默认启用的Ingress控制器对应的ingressClassName是nginx,而你的Ingress配置中写的是nginx-example,这会导致控制器无法识别该Ingress资源,因此不会分配地址。

  • 先确认集群中的IngressClass:
kubectl get ingressclass
  • 将Ingress配置中的ingressClassName: nginx-example修改为ingressClassName: nginx,重新应用配置:
kubectl apply -f your-config.yaml

2. 等待Ingress控制器就绪

从Pod状态可见,ingress-nginx-controller-7c6974c4d8-lmdf7处于0/1 Running状态,说明控制器尚未完成启动。等待数分钟后再次检查状态:

kubectl get pods -n ingress-nginx

只有当控制器Pod状态变为1/1 Ready后,才会处理Ingress资源并分配地址。

3. 验证Service与Pod的连通性

确认Service能正确转发请求到Pod:

  • 创建临时测试Pod并访问Service:
kubectl run -it --rm busybox --image=busybox:1.28 -- wget -O- http://my-service:8080

如果能返回Django应用的响应,说明Service与Pod的连通性正常;若失败,检查Deployment的Pod是否正常运行(kubectl get pods),以及Service的selector是否与Pod的labels完全匹配。

4. 调整Ingress路径重写规则

当前配置中rewrite-target: /会将/api路径重写为根路径/转发给Service。如果你的Django应用的API端点本身就在/api下,需要调整重写规则:

  • 修改Ingress的annotations和路径:
metadata:
  annotations:
    nginx.ingress.kubernetes.io/rewrite-target: /$2
spec:
  rules:
  - host: hello-world.info
    http:
      paths:
      - path: /api(/|$)(.*)
        pathType: Prefix
        backend:
          service:
            name: my-service
            port:
              number: 8080

这样访问/api/xxx会被转发到Service的/xxx,或根据你的应用实际路由需求调整。

5. 启用minikube隧道暴露Ingress

对于Docker驱动的minikube,可能需要通过minikube tunnel命令来暴露Ingress的外部地址:

minikube tunnel

保持该命令运行,再次检查Ingress的ADDRESS字段是否已被分配。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.29 22:12:07