Kubernetes Ingress 详解与实战教程:基于k8s-tutorials项目的网关配置指南

Kubernetes Ingress 详解与实战教程:基于k8s-tutorials项目的网关配置指南

【免费下载链接】k8s-tutorials k8s tutorials | k8s 教程 【免费下载链接】k8s-tutorials 项目地址: 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资源上定义的规则控制。

mermaid

Ingress vs Service:关键区别

特性ServiceIngress
协议支持TCP/UDP/SCTPHTTP/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监控指标

mermaid

访问日志配置

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启用
  • 了解了高级功能如路径重写、连接池优化
  • 掌握了常见问题的排查方法

下一步学习方向:

  1. Canary发布:使用注解实现灰度发布
  2. 速率限制:配置请求限流和防刷机制
  3. 认证鉴权:集成OAuth、JWT等认证方式
  4. WAF集成:添加Web应用防火墙保护
  5. 多集群Ingress:实现跨集群流量管理

Ingress是Kubernetes生态中不可或缺的组件,掌握其使用方法和最佳实践,对于构建稳定、安全的云原生应用至关重要。通过k8s-tutorials项目的实践,相信你已经具备了在生产环境中使用Ingress的能力。

【免费下载链接】k8s-tutorials k8s tutorials | k8s 教程 【免费下载链接】k8s-tutorials 项目地址: https://gitcode.com/gh_mirrors/k8s/k8s-tutorials

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

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

抵扣说明:

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

余额充值