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

##有待补充

相关推荐
大大大大晴天️12 小时前
用 Helm、CRD 与 Operator 管大数据:声明式运维如何替代脚本化部署
大数据·云原生
LRL_14 小时前
深入浅出 Kubernetes 控制器:Deployment 与 StatefulSet 核心区别全景图
云原生·容器·kubernetes
MrSYJ15 小时前
Network Namespace 到底是个啥,别人再问你告诉他
docker·云原生·kubernetes
彬冷的心17 小时前
K8s 部署若依项目 + Harbor 私有仓库(双节点版)
云原生·容器·kubernetes
convee_ai18 小时前
Agent 执行为什么需要独立 Sandbox:拆解 Hullwork 的 gVisor 隔离
架构·kubernetes
想要成为老金高手18 小时前
Kubernetes Service 深度实践:从 ClusterIP 到 Ingress 七层代理
云原生·容器·kubernetes
IT大白鼠18 小时前
Kubernetes 持久化存储:PV、PVC、StorageClass 存储体系
云原生·容器·kubernetes
GGG76619 小时前
K8s1.28 全栈落地|Jenkins+GitLab+Harbor DevOps 流水线封神实战
kubernetes·gitlab·jenkins
名字还没想好☜1 天前
用 systemd 托管后台服务:Restart 策略、日志接管、资源限制与开机自启全踩一遍
运维·docker·kubernetes
野熊佩骑1 天前
Kubernetes实战系列文章(三) 之 K8S运维常用命令
linux·运维·docker·微服务·云原生·容器·kubernetes