攻克Kubernetes流量入口难题:Ingress控制器实战部署指南

攻克Kubernetes流量入口难题:Ingress控制器实战部署指南

【免费下载链接】kubernetes-the-hard-way 该项目提供了一种从零开始手动部署Kubernetes集群的方法,通过详细步骤教授运维人员深入理解K8s的核心概念和技术细节。 【免费下载链接】kubernetes-the-hard-way 项目地址: https://gitcode.com/GitHub_Trending/ku/kubernetes-the-hard-way

在手动部署的Kubernetes集群中(如通过kubernetes-the-hard-way项目构建),服务暴露始终是运维人员面临的棘手问题。NodePort方式需要管理大量端口,端口转发只能临时调试,而Ingress控制器(Ingress Controller)作为集群的"智能流量网关",能通过域名路由、SSL终止等能力简化服务暴露流程。本文将基于手动部署的K8s集群,详解如何从零构建生产级Ingress解决方案。

Ingress控制器工作原理

Ingress控制器是实现Kubernetes Ingress资源的核心组件,它通过监听API Server的Ingress资源变化,动态生成反向代理配置。其工作流程如下:

mermaid

核心优势:统一入口管理、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握手数

生产环境优化建议

  1. 高可用配置

    • 部署至少2个控制器实例(反亲和性配置)
    • 使用MetalLB提供VIP
  2. 性能调优

    • 调整worker进程数:--worker-processes=auto
    • 启用连接复用:keep-alive-requests: 1000
  3. 安全加固

总结与后续步骤

通过本文步骤,你已在手动部署的Kubernetes集群中成功构建Ingress解决方案,实现了基于域名的流量路由与SSL终结。后续可深入探索:

实践作业:尝试基于Grafana监控面板创建Ingress流量可视化仪表盘。

收藏本文,关注项目贡献指南获取更多K8s深度实践技巧!

【免费下载链接】kubernetes-the-hard-way 该项目提供了一种从零开始手动部署Kubernetes集群的方法,通过详细步骤教授运维人员深入理解K8s的核心概念和技术细节。 【免费下载链接】kubernetes-the-hard-way 项目地址: https://gitcode.com/GitHub_Trending/ku/kubernetes-the-hard-way

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值