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

##有待补充

相关推荐
张忠琳16 小时前
【NVIDIA】 NVIDIA Container Toolkit v1.19.1 — OCI 模块超深度分析之三
云原生·容器·架构·kubernetes·nvidia
阿里云云原生17 小时前
让 AI Agent 看见正在发生的业务,阿里云 EventHouse 正式商业化
云原生
Elastic 中国社区官方博客17 小时前
将你的 Grafana Kubernetes 仪表板迁移到 Elastic Observability:相同的 PromQL,30 倍更快的查询
大数据·人工智能·elasticsearch·搜索引擎·容器·kubernetes·grafana
AOwhisky18 小时前
Python 学习笔记(第十五期)——运维自动化(下·后篇):堡垒机实战——paramiko高阶篇
运维·python·学习·云原生·自动化·运维开发
微三云 - 廖会灵 (私域系统开发)21 小时前
电商系统从单体到微服务拆分实践:拆什么、怎么拆、拆完后怎么办
微服务·云原生·架构
前端Baymax1 天前
K8s PodCrashLoopBackOff假阳性排查
云原生·容器·kubernetes
spider_xcxc1 天前
K8s 部署学习笔记
docker·容器·kubernetes·云计算·k8s
guslegend1 天前
领域驱动设计,微服务设计为什么要选择DDD?
微服务·云原生·架构
AOwhisky1 天前
云原生 DevOps 工具链从入门到实战(第一期)——DevOps概述与GitLab部署——从理念到工具落地
运维·ci/cd·云原生·gitlab·开发·devops
BIGmustang1 天前
ACK的集群日志接入及ARMS的应用性能监控及主机监控(云监控)
阿里云·云原生