Ingress无地址且无法访问:Django应用K8s部署问题求助
问题背景
我有一个运行在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

