K8s-Ingress

Kubernetes 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

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。

pathType: Prefix   #前缀匹配路径,表示以这个 path 开头的请求都会命中。

还有其他两种:Exact、ImplementationSpecific(不推荐)

2、基于路径的路由

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

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

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 访问

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-podfrontend-svc80
后端 (API)backend-podbackend-svc8080

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

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

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

1、部署前端 Deployment + Service

Deployment (frontend-deployment.yaml)

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)

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)

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)

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)

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
 

##有待补充

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值