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

##有待补充

相关推荐
AIMath~1 天前
雪花算法+ZooKeeper解决方案+RPC是什么
分布式·zookeeper·云原生
gwjcloud2 天前
Kubernetes从入门到精通(进阶篇)03
云原生·容器·kubernetes
日取其半万世不竭2 天前
PeerTube 部署指南:自建视频托管平台
云原生·eureka·音视频
小义_2 天前
【Kubernetes】(十二)配置存储卷
云原生·容器·kubernetes
AI攻城狮2 天前
AI的"平庸之恶":当机器正确地做了灾难性的事
云原生
薪火铺子2 天前
微服务认证方案对比与选型
微服务·云原生·架构
运维全栈笔记2 天前
K8S部署Redis高可用全攻略:1主2从3哨兵架构实战
redis·docker·云原生·容器·架构·kubernetes·bootstrap
尘世壹俗人2 天前
使用K8s部署模型
kubernetes
AI攻城狮2 天前
AI Agent 从上线到删库跑路始末
云原生