Kubernetes Ingress

Kubernetes Ingress

一、Ingress 基础概念

1. 什么是 Ingress

Ingress 是 K8s 的7层HTTP/HTTPS代理资源,为Service提供外部访问能力:

  • 提供外部可访问URL
  • 负载均衡HTTP/HTTPS流量
  • SSL/TLS证书终止
  • 基于域名虚拟主机

⚠️ Ingress本身不会处理流量 ,需要Ingress控制器 实际完成代理工作;Ingress只是规则配置。 非HTTP/HTTPS协议对外暴露,使用 NodePort / LoadBalancer 类型Service。

2. Ingress 控制器

Ingress控制器不会随集群自动部署,需要单独安装。

主流控制器:

  • ingress‑nginx(实验使用)
  • AWS‑load‑balancer‑controller
  • GCE Ingress
ingress‑nginx 工作流程
  1. 部署 Ingress‑nginx Controller Pod(实际Nginx代理服务)
  2. 创建 Ingress K8s资源(定义代理规则,等价Nginx配置文件)
  3. Controller监听APIServer,动态获取Ingress规则
  4. 将Ingress规则翻译成Nginx配置,写入/etc/nginx/nginx.conf
  5. reload nginx,使配置生效

3. 部署前置条件

  1. 集群有LoadBalancer实现(如metallb),给ingress‑nginx控制器分配外部IP
  2. 部署ingress‑nginx控制器组件

二、Ingress核心资源详解

1. PathType 路径匹配类型(v1版本强制必填)

PathType 说明
Prefix 前缀匹配,按/分割路径元素匹配,区分大小写
Exact 完全精确匹配整个url路径,区分大小写
ImplementationSpecific 交给Ingress控制器自行实现匹配逻辑

匹配优先级:最长路径优先;同等长度Exact > Prefix

三、Ingress常用实战案例

案例1:多域名虚拟主机(多host)

不同域名转发不同后端服务

yaml 复制代码
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: multi-host-ingress
spec:
  ingressClassName: nginx
  rules:
  - host: webapp01.laoma.cloud
    http:
      paths:
      - path: /
        pathType: Prefix
        backend:
          service:
            name: webapp01
            port:
              number: 80
  - host: webapp02.laoma.cloud
    http:
      paths:
      - path: /
        pathType: Prefix
        backend:
          service:
            name: webapp02
            port:
              number: 80

案例2:同一域名,多path路径分流

同一个域名不同url路径转发不同服务

yaml 复制代码
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: multi-path-ingress
spec:
  ingressClassName: nginx
  rules:
  - host: www.laoma.cloud
    http:
      paths:
      - path: /
        pathType: Prefix
        backend:
          service:
            name: webapp01
            port:
              number: 80
      - path: /games
        pathType: Prefix
        backend:
          service:
            name: webapp02
            port:
              number: 80

案例3:路径重写(路径裁剪)

场景:访问/webapp01/xxx,后端接收/xxx,剥离前缀,等价nginx proxy_pass /

yaml 复制代码
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: path-trimming-ingress
  annotations:
    nginx.ingress.kubernetes.io/use-regex: "true"
    nginx.ingress.kubernetes.io/rewrite-target: /$1
spec:
  ingressClassName: nginx
  rules:
  - host: www.laoma.cloud
    http:
      paths:
      - path: /webapp01/(.*)
        pathType: ImplementationSpecific
        backend:
          service:
            name: webapp01
            port:
              number: 80
      - path: /webapp02/(.*)
        pathType: ImplementationSpecific
        backend:
          service:
            name: webapp02
            port:
              number: 80

案例4:TLS证书 + 强制https跳转

  1. 创建自签名证书secret(老三条)
  2. Ingress配置tls和强制跳转
yaml 复制代码
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: tls-ingress
  annotations:
    nginx.ingress.kubernetes.io/ssl-redirect: "true"
    nginx.ingress.kubernetes.io/force-ssl-redirect: "true"
spec:
  ingressClassName: nginx
  tls:
  - hosts:
      - www.laoma.cloud
    secretName: www-tls
  rules:
  - host: www.laoma.cloud
    http:
      paths:
      - path: /
        pathType: Prefix
        backend:
          service:
            name: webapp01
            port:
              number: 80
相关推荐
L0208241 小时前
Kubernetes Service 与 kube‑proxy 深度详解
运维·算法·云原生·容器·贪心算法·kubernetes
SatanII1 小时前
kubernetes service && proxy
云原生·容器·kubernetes
艾伦_耶格宇2 小时前
【kubernetes - 1.28版本】-1 kubernetes基础
云原生·容器·kubernetes
Initialize-le2 小时前
PVC 一直 Pending?五步排查存储绑定
云原生·容器·kubernetes
9624562 小时前
一次 Kubernetes 临时存储压力引发的小程序授权雪崩:从 Pod 驱逐到定时任务漏执行
容器·小程序·kubernetes
SatanII2 小时前
Kubernetes 网络
网络·容器·kubernetes
闲云野鹤在人间17 小时前
Kubernetes Service 与 kube-proxy 详解
云原生·容器·kubernetes
我不会起名字32217 小时前
节点 NotReady:kubelet 与容器运行时的 4 步排查
云原生·kubernetes·kubelet·排查
闲云自留地19 小时前
K8s Service 全解:服务发现、四种类型、会话保持、金丝雀发布一篇通
容器·kubernetes·服务发现