1. 简介

Kubernetes Ingress 是一种强大的资源,允许我们对外暴露集群内部服务的访问。通过定义 HTTP/HTTPS 请求的路由规则,Ingress 提供了统一的入口点来访问多个服务,避免了使用多个 NodePort 或 LoadBalancer 的复杂性。在生产环境中,这种统一管理方式尤为重要。

在本教程中,我们将一步步演示如何在 Kubernetes 集群中部署 Ingress 控制器、配置 Ingress 资源,并最终获取 Ingress 的外部访问地址(IP 或域名)。无论你使用的是裸金属环境还是云厂商服务,本文都适用于你。

2. 部署 Kubernetes Ingress 控制器

Ingress 是 Kubernetes 中用于管理外部访问的核心 API 对象,它在七层(应用层)充当负载均衡器,支持将来自集群外部的 HTTP/HTTPS 请求路由到内部服务。

使用 Ingress 的优势包括:

  • 基于 URL 的路由:根据请求路径将流量分发到不同服务
  • SSL/TLS 终止:由 Ingress 统一处理加密,减轻后端压力
  • 虚拟主机:一个 IP 上可托管多个域名
  • 负载均衡:请求可被分发到多个后端服务实例

Ingress 控制器是实际处理这些规则的组件。目前主流的控制器包括:

  • NGINX Ingress Controller:功能全面、社区活跃,适合大多数场景
  • GCE Ingress Controller:专为 Google Kubernetes Engine 设计
  • Traefik Ingress Controller:支持动态配置,适合现代云原生架构

本教程以 NGINX Ingress Controller 为例进行说明。

2.1 安装 NGINX Ingress Controller

NGINX 官方提供了标准部署方式,我们可以通过以下命令部署:

$ kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/main/deploy/static/provider/cloud/deploy.yaml

该命令会创建 ingress-nginx 命名空间,并部署相关资源,包括 Deployment、Service、ConfigMap 等。

部署完成后,查看 Pod 状态确认控制器是否运行正常:

$ kubectl get pods -n ingress-nginx
NAME                                        READY   STATUS    RESTARTS   AGE
ingress-nginx-controller-7f9bcb7ccf-hjksm   1/1     Running   0          2m

确保 Pod 状态为 Running

2.2 在裸金属环境中配置 LoadBalancer

在云厂商环境中,Ingress 会自动分配 LoadBalancer 类型的 Service。但在裸金属集群中,我们需要手动配置。

首先下载 NodePort 类型的 Service 模板:

$ curl https://raw.githubusercontent.com/kubernetes/ingress-nginx/main/deploy/static/provider/baremetal/service-nodeport.yaml -o svc-ingress-nginx-lb.yaml

修改文件内容,将类型改为 LoadBalancer,并添加 externalIPs:

spec:
  type: LoadBalancer
  externalIPs:
    - 192.168.121.110
    - 192.168.121.111
    - 192.168.121.112
  externalTrafficPolicy: Local

externalIPs 表示外部访问的 IP 地址;externalTrafficPolicy: Local 可保留客户端源 IP。

2.3 应用配置并验证

保存修改后,应用配置:

$ kubectl apply -f svc-ingress-nginx-lb.yaml

然后查看 Service 状态:

$ kubectl get svc -n ingress-nginx
NAME                   TYPE           CLUSTER-IP     EXTERNAL-IP            PORT(S)                      AGE
ingress-nginx-lb       LoadBalancer   10.96.105.34   192.168.121.110,...   80:31213/TCP,443:31813/TCP   1m

确认 EXTERNAL-IP 已正确配置,表示 Ingress 可以通过这些 IP 被外部访问。

3. 配置 Ingress 资源

Ingress 控制器部署完成后,下一步是创建 Ingress 资源,定义路由规则。

3.1 部署示例服务

为了演示 Ingress 的使用,我们先部署两个服务:

  1. NGINX Web Server
  2. EchoServer(用于测试)

创建 Deployment:

$ kubectl create deployment nginx --image=nginx --port=80
$ kubectl create deployment echoserver --image=gcr.io/google_containers/echoserver:1.4 --port=8080

暴露为 Service:

$ kubectl expose deployment nginx --port=80 --type=NodePort
$ kubectl expose deployment echoserver --port=8080 --type=NodePort

查看服务状态:

$ kubectl get services
NAME         TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)          AGE
echoserver   NodePort    10.100.200.45    <none>        8080:31250/TCP   30s
nginx        NodePort    10.100.200.75    <none>        80:32018/TCP     45s

3.2 创建 Ingress 资源

创建一个 YAML 文件,定义路由规则:

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: fanout-nginx-ingress
spec:
  rules:
  - http:
      paths:
      - path: /nginx
        pathType: Prefix
        backend:
          service:
            name: nginx
            port:
              number: 80
      - path: /echo
        pathType: Prefix
        backend:
          service:
            name: echoserver
            port:
              number: 8080

应用配置:

$ kubectl apply -f ingress.yaml

检查 Ingress 状态:

$ kubectl describe ing fanout-nginx-ingress
Name:             fanout-nginx-ingress
Namespace:        default
Address:          192.168.121.110
Rules:
  Host        Path  Backends
  ----        ----  --------
  *           /nginx nginx:80 (10.244.1.5:80)
              /echo  echoserver:8080 (10.244.1.6:8080)

可以看到,Ingress 已经绑定了外部 IP,并将请求路径 /nginx/echo 分别指向了对应的后端服务。

4. 获取 Ingress 接口地址/IP

4.1 使用 kubectl 获取 Ingress 地址

最简单的方式是使用 kubectl get ing 命令:

$ kubectl get ing
NAME                    CLASS    HOSTS   ADDRESS          PORTS   AGE
fanout-nginx-ingress    <none>   *       192.168.121.110  80      5m

ADDRESS 列显示的 IP 就是外部访问入口地址。

4.2 验证服务是否可通过 Ingress 访问

使用 curl 验证:

$ curl http://192.168.121.110/nginx
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
...
</body>
</html>

再测试 EchoServer:

$ curl http://192.168.121.110/echo
{
  "host": "echoserver-6df5b57bdc-b2msl",
  "uri": "/echo",
  "headers": {
    "host": "192.168.121.110",
    "user-agent": "curl/7.68.0",
    "accept": "*/*"
  }
}

✅ 两个服务均能正常访问,说明 Ingress 路由配置成功。

5. 总结

本文我们完整演示了如何在 Kubernetes 集群中部署 NGINX Ingress 控制器、配置 Ingress 资源,并最终获取 Ingress 的外部访问地址。

Ingress 是 Kubernetes 网络架构中非常关键的一环,它提供了统一的入口管理方式,极大简化了服务对外暴露的过程。无论你是使用云服务还是自建集群,掌握如何配置和获取 Ingress 地址都是必不可少的技能。

关键点总结:

  • 使用官方 YAML 部署 NGINX Ingress 控制器
  • 裸金属环境需手动配置 LoadBalancer Service
  • Ingress 资源定义基于路径的路由规则
  • 使用 kubectl get ing 获取 Ingress 地址
  • 通过 curl 验证服务是否可通过 Ingress 访问

掌握这些内容后,你可以轻松地将多个服务统一暴露到外部网络,提升系统的可维护性和可扩展性。


原始标题:How to Get a Kubernetes Ingress Endpoint/IP Address