1. 引言
Kubernetes Ingress 是实现集群外部访问服务的关键组件,它为 HTTP/HTTPS 请求提供路由规则。但在实际使用中,我们常常会遇到 Ingress 资源的 ADDRESS 字段为空的问题,导致外部无法正常访问服务。
本文将围绕这个常见问题展开,逐步介绍 Kubernetes Ingress 的核心概念、部署配置流程、常见问题排查方法,并结合实际示例代码进行说明。目标是帮助有经验的开发者快速定位并解决 ADDRESS 为空的问题。
2. Kubernetes Ingress 概述
Kubernetes Ingress 是集群内外通信的桥梁,负责将外部 HTTP/HTTPS 流量路由到集群内部的 Service。
它由两个核心部分组成:
- Ingress Controller:负责实现具体的路由逻辑,通常是一个负载均衡器,例如 NGINX、Traefik、HAProxy。
- Ingress Resource:定义路由规则的 Kubernetes 资源对象,描述了主机名、路径与后端 Service 的映射关系。
理解这两个组件的协同工作机制,是排查 ADDRESS 为空问题的前提。
2.1. Ingress Controller
Ingress Controller 是 Ingress 实现的核心组件,它监听 Kubernetes API,根据 Ingress Resource 的定义动态更新自身的路由配置。
常见实现包括:
- NGINX Ingress Controller
- Traefik
- HAProxy Ingress
其核心功能包括:
✅ 动态更新路由规则
✅ 支持基于 Host 和 Path 的路由
✅ 支持 TLS 终止
✅ 支持自定义注解配置
Ingress Controller 通常以 Pod 的形式部署在集群中,并对外暴露一个 Service(通常是 LoadBalancer 或 NodePort 类型),用于接收外部流量。
2.2. Ingress Resource
Ingress Resource 是一个 Kubernetes API 对象,用于定义具体的路由规则。通常通过 YAML 文件创建,包含以下关键字段:
host
:请求的域名path
:路径匹配规则backend
:对应的服务和端口annotations
:控制器特定的配置项tls
:可选的 TLS 配置
示例:
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: example-ingress
annotations:
nginx.ingress.kubernetes.io/rewrite-target: /
spec:
rules:
- host: example.k8s.io
http:
paths:
- path: /service
pathType: Prefix
backend:
service:
name: example-service
port:
number: 80
该资源表示所有访问 example.k8s.io/service
的 HTTP 请求将被转发到名为 example-service
的服务,端口为 80。
3. 部署 Ingress Controller
要使用 Ingress,必须先部署一个 Ingress Controller。
3.1. 安装 ingress-nginx
推荐使用官方的 ingress-nginx
控制器:
kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/main/deploy/static/provider/baremetal/deploy.yaml
该命令会创建以下资源:
- Namespace:
ingress-nginx
- ServiceAccount、ConfigMap、Role、RoleBinding
- Deployment:
ingress-nginx-controller
- Service:
ingress-nginx-controller
3.2. 检查 Pod 状态
部署完成后,检查控制器是否正常运行:
kubectl get pods -n ingress-nginx
输出示例:
NAME READY STATUS RESTARTS AGE
ingress-nginx-controller-6d8bc4c7d5-9l6r8 1/1 Running 0 2m
确保 Pod 状态为 Running
,且 RESTARTS
为 0。
3.3. Minikube 用户注意事项
如果你使用的是 Minikube,需要手动启用 ingress 插件:
minikube addons enable ingress
4. 创建和配置 Ingress 资源
部署完控制器后,就可以创建 Ingress 资源来定义路由规则。
4.1. 示例 Ingress 资源
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: example-ingress
annotations:
nginx.ingress.kubernetes.io/rewrite-target: /
spec:
rules:
- host: example.k8s.io
http:
paths:
- path: /service
pathType: Prefix
backend:
service:
name: example-service
port:
number: 80
保存为 example-ingress.yaml
并应用:
kubectl apply -f example-ingress.yaml
输出:
ingress.networking.k8s.io/example-ingress created
5. 常见问题排查:ADDRESS 为空
5.1. 问题现象
执行以下命令查看 Ingress 状态:
kubectl get ingress
输出示例:
NAME CLASS HOSTS ADDRESS PORTS AGE
example-ingress <none> example.k8s.io 80 10m
⚠️ ADDRESS
字段为空,说明 Ingress 没有被控制器正确识别或配置。
5.2. 排查步骤
✅ 1. 检查 Ingress Controller 状态
kubectl get pods -n ingress-nginx
确保控制器 Pod 处于 Running
状态。
✅ 2. 检查 Ingress Controller Service
kubectl get svc -n ingress-nginx
确保 ingress-nginx-controller
Service 存在,并且类型为 LoadBalancer
或 NodePort
。
✅ 3. 查看 Ingress 资源描述信息
kubectl describe ingress example-ingress
关注输出中的 Events
字段,查看是否有错误提示,例如:
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Warning Sync 10m (x5 over 10m) nginx-ingress-controller Error during sync: error connecting to backend
✅ 4. 查看控制器日志
kubectl logs -n ingress-nginx <controller-pod-name>
查找类似以下错误:
[error] connect() failed (111: Connection refused) while connecting to upstream
这说明 Ingress Controller 无法访问后端服务。
✅ 5. 检查后端服务状态
确保后端服务正常运行,并且有可用的 Endpoints:
kubectl get endpoints example-service
如果 ENDPOINTS
为空,说明服务没有对应的 Pod。
6. 验证 Ingress 配置是否生效
6.1. 使用 curl 测试访问
curl http://example.k8s.io/service
预期输出:
<!DOCTYPE html>
<html>
<head>
<title>Welcome to example-service!</title>
</head>
<body>
<h1>Success! The example-service is running.</h1>
</body>
</html>
6.2. 查看 Ingress Controller 日志
kubectl logs -n ingress-nginx <controller-pod-name>
确认日志中没有错误信息,并能看到类似以下内容:
I0515 10:15:30.123456 6 main.go:99] "Validated ingress-nginx configuration"
I0515 10:15:30.123456 6 main.go:99] "Starting Ingress controller"
7. 总结
本文围绕 Kubernetes Ingress 中 ADDRESS 为空这一常见问题展开,详细介绍了:
- Ingress 的基本概念和组成
- 如何部署和配置 Ingress Controller
- 如何创建和配置 Ingress 资源
- 常见问题排查方法,包括日志查看、资源描述、Pod 状态检查等
- 如何通过 curl 和日志验证 Ingress 是否正常工作
📌 关键点总结:
- ADDRESS 为空通常表示 Ingress Controller 未正确识别或配置 Ingress 资源
- 确保控制器 Pod 和 Service 正常运行
- 检查 Ingress 资源是否配置正确,特别是 annotations 和 backend
- 查看控制器日志和 Ingress 描述信息有助于快速定位问题
定期监控 Ingress 状态,遵循最佳实践,能帮助你维护一个稳定、高效的 Kubernetes 环境。