攻克Kubernetes流量入口难题:Ingress控制器实战部署指南
在手动部署的Kubernetes集群中(如通过kubernetes-the-hard-way项目构建),服务暴露始终是运维人员面临的棘手问题。NodePort方式需要管理大量端口,端口转发只能临时调试,而Ingress控制器(Ingress Controller)作为集群的"智能流量网关",能通过域名路由、SSL终止等能力简化服务暴露流程。本文将基于手动部署的K8s集群,详解如何从零构建生产级Ingress解决方案。
Ingress控制器工作原理
Ingress控制器是实现Kubernetes Ingress资源的核心组件,它通过监听API Server的Ingress资源变化,动态生成反向代理配置。其工作流程如下:
核心优势:统一入口管理、SSL终结、路径路由、负载均衡。对比直接使用NodePort服务,可减少80%的端口管理开销。
环境准备与前置检查
集群状态验证
确保集群已完成基础网络配置,所有节点处于Ready状态:
kubectl get nodes
预期输出:
NAME STATUS ROLES AGE VERSION
node-0 Ready <none> 10m v1.32.3
node-1 Ready <none> 10m v1.32.3
若节点状态异常,需先检查Pod网络路由配置及kube-proxy服务状态。
必要工具安装
在jumpbox节点安装kubectl:
# 确保kubectl配置正确
kubectl config view
验证输出应包含集群信息:
clusters:
- cluster:
certificate-authority-data: DATA+OMITTED
server: https://server.kubernetes.local:6443
name: kubernetes-the-hard-way
nginx-ingress控制器部署
1. 创建基础命名空间
kubectl create namespace ingress-nginx
2. 部署控制器组件
使用官方Deployment部署nginx-ingress控制器:
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-ingress-controller
namespace: ingress-nginx
spec:
replicas: 2
selector:
matchLabels:
app: nginx-ingress
template:
metadata:
labels:
app: nginx-ingress
spec:
containers:
- name: nginx-ingress-controller
image: nginx/nginx-ingress:1.10.1
ports:
- containerPort: 80
- containerPort: 443
args:
- /nginx-ingress-controller
- --default-backend-service=ingress-nginx/default-http-backend
生产环境建议使用DaemonSet部署模式,确保每个节点都运行控制器实例。
3. 暴露控制器服务
创建NodePort类型服务,将80/443端口映射到集群节点:
apiVersion: v1
kind: Service
metadata:
name: nginx-ingress-controller
namespace: ingress-nginx
spec:
type: NodePort
ports:
- port: 80
nodePort: 30080
name: http
- port: 443
nodePort: 30443
name: https
selector:
app: nginx-ingress
应用配置后检查服务状态:
kubectl get svc -n ingress-nginx
基础路由规则配置
测试应用部署
部署一个简单的nginx应用作为路由目标:
kubectl create deployment nginx-test --image=nginx:latest
kubectl expose deployment nginx-test --port=80
创建Ingress规则
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: nginx-test-ingress
spec:
rules:
- host: nginx.example.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: nginx-test
port:
number: 80
本地测试访问
修改本地网络配置或DNS解析后测试:
curl -H "Host: nginx.example.com" http://<node-ip>:30080
预期返回nginx欢迎页面,表明Ingress规则已生效。
高级配置:SSL终结与路径路由
SSL证书准备
使用项目中的CA配置创建自签名证书:
# 使用ca.conf生成证书
openssl req -new -newkey rsa:2048 -nodes -keyout tls.key -out tls.csr -config ca.conf
openssl x509 -req -days 365 -in tls.csr -CA ca.crt -CAkey ca.key -CAcreateserial -out tls.crt
创建Secret存储证书:
kubectl create secret tls example-tls --cert=tls.crt --key=tls.key
配置HTTPS Ingress
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: secure-nginx-ingress
spec:
tls:
- hosts:
- nginx.example.com
secretName: example-tls
rules:
- host: nginx.example.com
http:
paths:
- path: /app1
pathType: Prefix
backend:
service:
name: app1-service
port:
number: 80
- path: /app2
pathType: Prefix
backend:
service:
name: app2-service
port:
number: 80
完整配置示例可参考加密配置文件模板的密钥管理方式。
监控与故障排查
控制器日志查看
kubectl logs -n ingress-nginx deployment/nginx-ingress-controller
关键错误排查点:
- 404路由问题:检查Ingress规则与Service标签匹配
- 503服务不可用:验证后端Pod健康状态
- SSL握手失败:确认tls secret挂载正确
性能监控建议
部署Prometheus监控Ingress指标:
# 参考manifests/prometheus/prometheus-configmap.yaml添加以下job
- job_name: 'ingress-nginx'
static_configs:
- targets: ['nginx-ingress-controller.ingress-nginx:10254']
核心监控指标:
nginx_ingress_controller_requests_total: 请求总量nginx_ingress_controller_response_duration_seconds: 响应延迟nginx_ingress_controller_ssl_handshakes_total: SSL握手数
生产环境优化建议
-
高可用配置:
- 部署至少2个控制器实例(反亲和性配置)
- 使用MetalLB提供VIP
-
性能调优:
- 调整worker进程数:
--worker-processes=auto - 启用连接复用:
keep-alive-requests: 1000
- 调整worker进程数:
-
安全加固:
- 限制kube-apiserver访问权限
- 定期轮换CA证书ca.conf
总结与后续步骤
通过本文步骤,你已在手动部署的Kubernetes集群中成功构建Ingress解决方案,实现了基于域名的流量路由与SSL终结。后续可深入探索:
- 自定义Ingress控制器配置
- 实现灰度发布与A/B测试
- 集成WAF防护层
实践作业:尝试基于Grafana监控面板创建Ingress流量可视化仪表盘。
收藏本文,关注项目贡献指南获取更多K8s深度实践技巧!
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考



