K8s-Ingress

Ingress 不会直接访问 Pod,它必须先访问 Service,再由 Service 转发给 Pod。

外部请求 (浏览器)


Ingress Controller (Nginx)
│ 根据域名/路径匹配

Service (ClusterIP / NodePort)


Pod (应用容器)

一、Ingress

Ingress 是 Kubernetes 中的 七层(HTTP/HTTPS)路由规则,主要用来把 集群外的流量 引入到集群内部的 Service。

它不是单独工作的,必须依赖一个 Ingress Controller(常见的有 Nginx Ingress Controller、Traefik、HAProxy 等)。

有了 Ingress,就可以通过 域名 / 路径 来访问不同的 Service,而不用记 NodePort 或配置外部负载均衡。

二、实例说明

1、基于域名的路由

访问 frontend.example.com → 转发到 frontend-svc

访问 backend.example.com → 转发到 backend-svc

bash 复制代码
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: domain-based-ingress
spec:
  rules:
  - host: frontend.example.com
    http:
      paths:
      - path: /
        pathType: Prefix
        backend:
          service:
            name: frontend-svc
            port:
              number: 80
  - host: backend.example.com
    http:
      paths:
      - path: /
        pathType: Prefix
        backend:
          service:
            name: backend-svc
            port:
              number: 8080

根据请求的 域名 转发到不同的 Service。

2、基于路径的路由

http://mall.example.com/ → 前端服务

http://mall.example.com/api → 后端服务

bash 复制代码
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: path-based-ingress
spec:
  rules:
  - host: mall.example.com
    http:
      paths:
      - path: /
        pathType: Prefix
        backend:
          service:
            name: frontend-svc
            port:
              number: 80
      - path: /api
        pathType: Prefix
        backend:
          service:
            name: backend-svc
            port:
              number: 8080

同一个域名,根据不同路径转发

3、启用 HTTPS (TLS)

你有一个证书 mall-tls(由 Secret 存储),希望通过 HTTPS 访问

bash 复制代码
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: tls-ingress
spec:
  tls:
  - hosts:
    - mall.example.com
    secretName: mall-tls   # 这里的 mall-tls 是存放证书的 Secret
  rules:
  - host: mall.example.com
    http:
      paths:
      - path: /
        pathType: Prefix
        backend:
          service:
            name: frontend-svc
            port:
              number: 80

mall-tls 是通过 kubectl create secret tls mall-tls --cert=mall.crt --key=mall.key 创建的。

用户访问时就是 https://mall.example.com

三、组合案例

部署一个 前后端分离商城

服务 Pod 名称 Service 名称 端口
前端 (React) frontend-pod frontend-svc 80
后端 (API) backend-pod backend-svc 8080

用户访问 http://mall.example.com/ → 访问前端

用户访问 http://mall.example.com/api → 访问后端

通过 Ingress 实现统一入口,无需直接访问 NodePort 或 ClusterIP

1、部署前端 Deployment + Service

Deployment (frontend-deployment.yaml)

bash 复制代码
apiVersion: apps/v1
kind: Deployment
metadata:
  name: frontend-deployment
spec:
  replicas: 2
  selector:
    matchLabels:
      app: frontend
  template:
    metadata:
      labels:
        app: frontend
    spec:
      containers:
      - name: frontend
        image: nginx:alpine   # 假设前端打包后放在 Nginx 中
        ports:
        - containerPort: 80

Service (frontend-svc.yaml)

bash 复制代码
apiVersion: v1
kind: Service
metadata:
  name: frontend-svc
spec:
  selector:
    app: frontend
  ports:
  - port: 80
    targetPort: 80
  type: ClusterIP

2、部署后端 Deployment + Service

Deployment (backend-deployment.yaml)

bash 复制代码
apiVersion: apps/v1
kind: Deployment
metadata:
  name: backend-deployment
spec:
  replicas: 2
  selector:
    matchLabels:
      app: backend
  template:
    metadata:
      labels:
        app: backend
    spec:
      containers:
      - name: backend
        image: my-backend:latest
        ports:
        - containerPort: 8080

Service (backend-svc.yaml)

bash 复制代码
apiVersion: v1
kind: Service
metadata:
  name: backend-svc
spec:
  selector:
    app: backend
  ports:
  - port: 8080
    targetPort: 8080
  type: ClusterIP

3、创建 Ingress

Ingress (mall-ingress.yaml)

bash 复制代码
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: mall-ingress
spec:
  rules:
  - host: mall.example.com
    http:
      paths:
      - path: /
        pathType: Prefix
        backend:
          service:
            name: frontend-svc   #前端的service
            port:
              number: 80
      - path: /api
        pathType: Prefix
        backend:
          service:
            name: backend-svc    #后端的service
            port:
              number: 8080

浏览器访问 http://mall.example.com/api ###后端的路径

Ingress Controller (Nginx)

│ 根据规则匹配路径 /api

Service: backend-svc ###后端的service

│ 转发请求到对应 Pod

Pod: backend-pod

##有待补充

相关推荐
mounter6256 小时前
MACsec 全景解析:从技术演进、核心架构到 DPU 硬件卸载与 K8s 大规模调度实战
linux·kubernetes·linux kernel·kernel·macsec
阿里云云原生6 小时前
当拨测遇上 APM:STAROps Agent 如何区分网络问题与后端问题
云原生
皮皮蟹虾饺10 小时前
NCCL 源码解析:通信器从出生到消亡的完整一生
linux·人工智能·ubuntu·语言模型·kubernetes
云烟成雨TD16 小时前
Micrometer 系列【68】统一观测:基于 Spring Boot 的生产级演示案例 | 跨进程场景
spring boot·云原生·链路追踪
云烟成雨TD16 小时前
Micrometer 系列【67】统一观测:基于 Spring Boot 的生产级演示案例 | 跨线程场景
spring boot·云原生·链路追踪
2401_8346369916 小时前
保姆级 K8s 运维:RBAC 认证 + Dashboard+Local/NFS 动态卷实战
运维·容器·kubernetes
爱莉希雅&&&17 小时前
Kubernetes Service 完整学习笔记
笔记·学习·kubernetes
lang2015092817 小时前
从 J2EE 到云原生:Spring Framework 的设计哲学与演进之路
spring·云原生·java-ee
Henry-SAP1 天前
SAP引领ERP智能化转型
人工智能·云原生·sap·erp
流烟默1 天前
Kubernetes 调度器完全指南:从原理到生产实战
云原生·容器·kubernetes