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 存在,并且类型为 LoadBalancerNodePort

✅ 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 环境。


原始标题:Troubleshooting Empty ADDRESS in Kubernetes Ingress