Kubernetes Ingress 详解与实战教程:基于k8s-tutorials项目的网关配置指南
【免费下载链接】k8s-tutorials k8s tutorials | k8s 教程 项目地址: https://gitcode.com/gh_mirrors/k8s/k8s-tutorials
引言:为什么需要Ingress?
在现代微服务架构中,一个应用通常由多个服务组成,每个服务都有自己特定的端口和访问路径。如果直接通过Service的NodePort或LoadBalancer暴露服务,会导致:
- 端口管理复杂:需要记住多个端口号
- 缺乏统一入口:没有统一的API网关
- SSL/TLS配置繁琐:每个服务需要单独配置HTTPS
- 路由规则缺失:无法实现基于路径或域名的路由
Kubernetes Ingress(入口)正是为了解决这些问题而设计的统一流量入口解决方案。本文将基于k8s-tutorials项目,深入讲解Ingress的核心概念、配置方法和实战应用。
Ingress核心概念解析
什么是Ingress?
Ingress是Kubernetes API的标准资源对象,它提供了从集群外部到集群内部服务的HTTP和HTTPS路由。流量路由由Ingress资源上定义的规则控制。
Ingress vs Service:关键区别
| 特性 | Service | Ingress |
|---|---|---|
| 协议支持 | TCP/UDP/SCTP | HTTP/HTTPS |
| 路由能力 | 端口级别 | 路径/域名级别 |
| SSL终止 | 不支持 | 支持 |
| 负载均衡 | 基础轮询 | 高级算法 |
| 访问控制 | 有限 | 丰富 |
Ingress控制器(Ingress Controller)
Ingress资源本身不处理流量,需要配合Ingress控制器使用。常见的Ingress控制器包括:
- Nginx Ingress Controller:基于Nginx,功能丰富
- Traefik:云原生,动态配置
- HAProxy:高性能负载均衡
- Istio Ingress Gateway:服务网格集成
实战环境准备
项目结构概览
基于k8s-tutorials项目的Ingress示例包含以下关键文件:
ingress/
├── hellok8s.yaml # hellok8s应用的Deployment和Service
├── nginx.yaml # nginx应用的Deployment和Service
└── ingress.yaml # Ingress路由规则配置
启用Ingress控制器
在minikube环境中启用Ingress功能:
# 启用Ingress插件
minikube addons enable ingress
# 验证Ingress控制器状态
kubectl get pods -n ingress-nginx
Ingress配置详解
基础Ingress配置
让我们分析k8s-tutorials中的Ingress配置:
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: hello-ingress
annotations:
nginx.ingress.kubernetes.io/ssl-redirect: "false"
spec:
rules:
- http:
paths:
- path: /hello
pathType: Prefix
backend:
service:
name: service-hellok8s-clusterip
port:
number: 3000
- path: /
pathType: Prefix
backend:
service:
name: service-nginx-clusterip
port:
number: 4000
关键配置解析
1. 注解(Annotations)
annotations:
nginx.ingress.kubernetes.io/ssl-redirect: "false"
注解用于配置Ingress控制器的特定行为。常用注解包括:
nginx.ingress.kubernetes.io/rewrite-target: 路径重写nginx.ingress.kubernetes.io/ssl-redirect: SSL重定向nginx.ingress.kubernetes.io/proxy-body-size: 请求体大小限制
2. 路由规则(Rules)
rules:
- http:
paths:
- path: /hello
pathType: Prefix
backend:
service:
name: service-hellok8s-clusterip
port:
number: 3000
pathType支持的三种类型:
| pathType | 描述 | 示例匹配 |
|---|---|---|
| Prefix | 前缀匹配 | /hello 匹配 /hello, /hello/world |
| Exact | 精确匹配 | /hello 只匹配 /hello |
| ImplementationSpecific | 实现特定 | 依赖Ingress控制器实现 |
3. 后端服务(Backend)
backend:
service:
name: service-hellok8s-clusterip
port:
number: 3000
后端服务指向Kubernetes Service,确保流量正确路由到对应的Pod。
完整部署流程
步骤1:部署后端服务
首先部署hellok8s和nginx应用:
# 部署hellok8s应用
kubectl apply -f hellok8s.yaml
# 部署nginx应用
kubectl apply -f nginx.yaml
# 验证部署状态
kubectl get pods,services
hellok8s.yaml内容:
apiVersion: v1
kind: Service
metadata:
name: service-hellok8s-clusterip
spec:
type: ClusterIP
selector:
app: hellok8s
ports:
- port: 3000
targetPort: 3000
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: hellok8s-deployment
spec:
replicas: 3
selector:
matchLabels:
app: hellok8s
template:
metadata:
labels:
app: hellok8s
spec:
containers:
- image: guangzhengli/hellok8s:v3
name: hellok8s-container
步骤2:配置Ingress规则
应用Ingress配置:
# 部署Ingress
kubectl apply -f ingress.yaml
# 查看Ingress状态
kubectl get ingress
# 查看详细Ingress信息
kubectl describe ingress hello-ingress
步骤3:测试路由功能
# 获取访问地址(minikube环境)
minikube service ingress-nginx-controller -n ingress-nginx --url
# 测试路由规则
curl http://127.0.0.1:61691/hello
# 输出: [v3] Hello, Kubernetes!, From host: hellok8s-deployment-5d5545b69c-sn7mn
curl http://127.0.0.1:61691/
# 输出: nginx欢迎页面
高级Ingress配置
基于域名的虚拟主机
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: virtual-host-ingress
spec:
rules:
- host: api.example.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: api-service
port:
number: 80
- host: web.example.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: web-service
port:
number: 80
TLS/HTTPS配置
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: tls-ingress
spec:
tls:
- hosts:
- example.com
secretName: example-tls
rules:
- host: example.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: web-service
port:
number: 80
需要先创建TLS Secret:
# 生成TLS证书
openssl req -x509 -nodes -days 365 -newkey rsa:2048 \
-keyout tls.key -out tls.crt -subj "/CN=example.com"
# 创建Kubernetes Secret
kubectl create secret tls example-tls --cert=tls.crt --key=tls.key
路径重写与正则表达式
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: rewrite-ingress
annotations:
nginx.ingress.kubernetes.io/rewrite-target: /$2
spec:
rules:
- http:
paths:
- path: /api(/|$)(.*)
pathType: ImplementationSpecific
backend:
service:
name: api-service
port:
number: 8080
常见问题排查
1. Ingress控制器未就绪
# 检查Ingress控制器状态
kubectl get pods -n ingress-nginx
# 查看控制器日志
kubectl logs -n ingress-nginx deployment/ingress-nginx-controller
2. 路由规则不生效
# 查看Ingress详细配置
kubectl describe ingress hello-ingress
# 检查后端服务是否存在
kubectl get services
# 检查Endpoint是否正常
kubectl get endpoints
3. SSL证书问题
# 检查TLS Secret
kubectl describe secret example-tls
# 验证证书格式
kubectl get secret example-tls -o jsonpath='{.data.tls\.crt}' | base64 -d
性能优化与最佳实践
1. 连接池配置
annotations:
nginx.ingress.kubernetes.io/upstream-keepalive-connections: "100"
nginx.ingress.kubernetes.io/upstream-keepalive-timeout: "60"
nginx.ingress.kubernetes.io/upstream-keepalive-requests: "1000"
2. 缓冲区优化
annotations:
nginx.ingress.kubernetes.io/proxy-body-size: "20m"
nginx.ingress.kubernetes.io/proxy-buffer-size: "16k"
nginx.ingress.kubernetes.io/proxy-buffers-number: "4"
3. 超时设置
annotations:
nginx.ingress.kubernetes.io/proxy-connect-timeout: "30"
nginx.ingress.kubernetes.io/proxy-send-timeout: "30"
nginx.ingress.kubernetes.io/proxy-read-timeout: "30"
监控与日志
Ingress监控指标
访问日志配置
annotations:
nginx.ingress.kubernetes.io/enable-access-log: "true"
nginx.ingress.kubernetes.io/configuration-snippet: |
access_log /var/log/nginx/access.log main;
error_log /var/log/nginx/error.log;
总结与展望
通过本文的实战教程,我们深入掌握了Kubernetes Ingress的核心概念和配置方法。Ingress作为Kubernetes集群的流量入口网关,提供了强大的路由能力、SSL终止和负载均衡功能。
关键收获:
- 理解了Ingress与Service的区别和适用场景
- 掌握了基于路径和域名的路由配置
- 学会了TLS证书配置和HTTPS启用
- 了解了高级功能如路径重写、连接池优化
- 掌握了常见问题的排查方法
下一步学习方向:
- Canary发布:使用注解实现灰度发布
- 速率限制:配置请求限流和防刷机制
- 认证鉴权:集成OAuth、JWT等认证方式
- WAF集成:添加Web应用防火墙保护
- 多集群Ingress:实现跨集群流量管理
Ingress是Kubernetes生态中不可或缺的组件,掌握其使用方法和最佳实践,对于构建稳定、安全的云原生应用至关重要。通过k8s-tutorials项目的实践,相信你已经具备了在生产环境中使用Ingress的能力。
【免费下载链接】k8s-tutorials k8s tutorials | k8s 教程 项目地址: https://gitcode.com/gh_mirrors/k8s/k8s-tutorials
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考



