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 的使用,我们先部署两个服务:
- NGINX Web Server
- 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 访问
掌握这些内容后,你可以轻松地将多个服务统一暴露到外部网络,提升系统的可维护性和可扩展性。