【Kubernetes】K8s 集群 Ingress 入口规则

Ingress 是管理从集群外部访问集群内部服务的入口规则(HTTP 和 HTTPS)的 API 对象,核心功能是将外部到达集群的 HTTP/HTTPS 请求,根据主机名(host)和路径(path)转发到不同的后端 Service,一起来看看如何使用吧!

1、概念

1.1、Ingress(资源)

  • 在 K8s 中创建的 YAML 文件,只是一份规则声明,定义 "当访问 a.example.com 时,将流量转发给 service-a" 之类的规则

1.2、Ingress Controller(控制器)

  • 这是规则的实际执行者,是一个独立的 Pod,负责监听集群中的 Ingress 资源变化,并根据规则配置底层的负载均衡器(如 Nginx、Envoy、Traefik 等)
  • 常见的 Ingress Controller 有Nginx Ingress Controller、Traefik、HAProxy Ingress、Istio Ingress Gateway 等
  • 必须先部署一个 Ingress Controller,创建的 Ingress 才能生效

2、示例

**2.1、**基于主机名路由

  • 需求: 通过不同的主机名访问不同的服务

  • frontend.local -> 前端,api.local -> 后端

  • 部署:kubectl apply -f ingress-simple-host.yaml

bash 复制代码
# ingress-simple-host.yaml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: simple-host-ingress
  annotations:
    kubernetes.io/ingress.class: "nginx"
spec:
  rules:
  - host: frontend.local
    http:
      paths:
      - path: /
        pathType: Prefix
        backend:
          service:
            name: frontend-service
            port:
              number: 80
  - host: api.local
    http:
      paths:
      - path: /
        pathType: Prefix
        backend:
          service:
            name: backend-service
            port:
              number: 8080

2.2、基于路径路由

  • 需求: 使用同一个域名,根据 URL 路径将流量分发到不同的微服务
  • myapp.com/web -> 用户UI,myapp.com/api -> API网关,myapp.com/static -> 静态文件
  • 部署:kubectl apply -f ingress-path-based.yaml
bash 复制代码
# ingress-path-based.yaml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: path-based-ingress
  annotations:
    kubernetes.io/ingress.class: "nginx"
    # 若需路径重写,可取消下方注释
    # nginx.ingress.kubernetes.io/rewrite-target: /
spec:
  rules:
  - host: myapp.com
    http:
      paths:
      - path: /web
        pathType: Prefix
        backend:
          service:
            name: web-ui-service
            port:
              number: 3000
      - path: /api
        pathType: Prefix
        backend:
          service:
            name: api-gateway-service
            port:
              number: 8080
      - path: /static
        pathType: Prefix
        backend:
          service:
            name: static-file-service
            port:
              number: 80

2.3、基于主机名路由 TLS

  • 需求: 为 myapp.example.com 提供 HTTPS 服务,将所有流量转发到 my-web-service

  • 部署:kubectl apply -f ingress-tls-simple.yaml

  • 将域名 myapp.example.com 解析到 Ingress Controller 服务的外部 IP(若是云厂商的 LoadBalancer,会自动分配一个外部 IP)

  • 访问 https://myapp.example.com,浏览器会显示安全的 HTTPS 连接

bash 复制代码
# ingress-tls-simple.yaml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: simple-tls-ingress
  annotations:
    kubernetes.io/ingress.class: "nginx"
spec:
  tls:
  - hosts:
      - myapp.example.com         # 指定需要使用 TLS 的域名
    secretName: my-tls-secret     # 指定存储证书的 Secret
  rules:
  - host: myapp.example.com       # 基于主机名的路由规则
    http:
      paths:
      - path: /
        pathType: Prefix
        backend:
          service:
            name: my-web-service  # 后端服务名
            port:
              number: 80          # 后端服务端口

2.4、基于路径路由 TLS

  • 需求:使用 HTTPS,同一个域名下,根据 URL 路径将流量路由到不同的服务
  • 访问 www.myapp.com/web 进入前端 Web 界面
  • 访问 www.myapp.com/api 进入后端 API
bash 复制代码
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: path-based-ingress
spec:
  tls:
  - hosts:
    - www.myapp.com
    secretName: myapp-tls-secret
  rules:
  - host: www.mycompany.com
    http:
      paths:
      - path: /web
        pathType: Prefix
        backend:
          service:
            name: frontend-web-service
            port:
              number: 80
      - path: /api
        pathType: Prefix
        backend:
          service:
            name: backend-api-service
            port:
              number: 8080

2.5、重定向 HTTP -> HTTPS

  • 需求:用户访问 http://myapp.com 会被 301 重定向到 https://myapp.com
  • 强制将所有 HTTP 流量重定向到 HTTPS,提升安全性,通过 Ingress Controller 的特定注解Annotation 实现
bash 复制代码
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: redirect-https-ingress
  annotations:
    kubernetes.io/ingress.class: "nginx"
    nginx.ingress.kubernetes.io/ssl-redirect: "true"        # 强制SSL重定向
    nginx.ingress.kubernetes.io/force-ssl-redirect: "true"  # 即使没有 TLS 规则也重定向
spec:
  tls:
  - hosts:
    - myapp.com
    secretName: myapp-tls-secret
  rules:
  - host: myapp.com
    http:
      paths:
      - path: /
        pathType: Prefix
        backend:
          service:
            name: myapp-service
            port:
              number: 80
相关推荐
人间打气筒(Ada)17 小时前
k8s:CNI网络插件flannel与calico
linux·云原生·容器·kubernetes·云计算·k8s
江畔何人初18 小时前
pod的内部结构
linux·运维·云原生·容器·kubernetes
苦逼IT运维21 小时前
从 0 到 1 理解 Kubernetes:一次“破坏式”学习实践(一)
linux·学习·docker·容器·kubernetes
腾讯云开发者21 小时前
言出法随 -- Chaterm如何通过ASR精准操作K8S
云原生·容器·kubernetes
伟大的大威1 天前
NVIDIA DGX Spark (ARM64/Blackwell) Kubernetes 集群 + GPU Operator 完整部署指南
大数据·spark·kubernetes
only_Klein1 天前
kubernetes Pod 通信过程演示
网络·kubernetes·tcpdump
为什么不问问神奇的海螺呢丶1 天前
n9e categraf k8s监控配置 -cadvisor
云原生·容器·kubernetes
炸裂狸花猫1 天前
开源域名代理与流量限制方案 - Cloudflare + Ingress + 自签名证书
运维·云原生·容器·kubernetes·cloudflare·waf·免费域名证书
only_Klein1 天前
jenkins流水线报错:Connection reset by peer
ci/cd·kubernetes·gitlab·jenkins·ssl
南宫乘风1 天前
Kubernetes 网络问题排查:在宿主机对 Pod 抓包(nsenter + tcpdump 实战)
网络·kubernetes·tcpdump