K8s 流量入口管理|Ingress 核心原理 + ingress-nginx 部署 + 生产实战案例合集

K8s 流量入口管理|Ingress 核心原理 + ingress-nginx 部署 + 生产实战案例合集

  • [Kubernetes Ingress](#Kubernetes Ingress)
    • 环境准备
    • [Ingress 介绍](#Ingress 介绍)
    • [Ingress 控制器](#Ingress 控制器)
    • [ingress-nginx 工作流程](#ingress-nginx 工作流程)
    • [ingress-nginx 部署前提](#ingress-nginx 部署前提)
    • [ingress-nginx 版本](#ingress-nginx 版本)
    • [ingress-nginx 部署](#ingress-nginx 部署)
    • [Ingress 规则实践](#Ingress 规则实践)
      • [Ingress 规则说明](#Ingress 规则说明)
      • [Ingress 规则实践](#Ingress 规则实践)
        • 环境准备
          • [站点 webapp01](#站点 webapp01)
          • [站点 webapp02](#站点 webapp02)
        • 一、基础通用规则
          • [1. 多域名虚拟主机(多 host 路由)](#1. 多域名虚拟主机(多 host 路由))
          • [2. 同一域名多路径路由(path 分流)](#2. 同一域名多路径路由(path 分流))
        • 二、生产核心:路径重写
          • [3. 路径裁剪(等价 Nginx `proxy_pass /`)](#3. 路径裁剪(等价 Nginx proxy_pass /))
        • [三、HTTPS 强制 & TLS 证书](#三、HTTPS 强制 & TLS 证书)
          • [4. 绑定 TLS 证书 + 强制 HTTPS](#4. 绑定 TLS 证书 + 强制 HTTPS)
        • 四、限流、防刷、超时优化
          • [5. 连接数限流、单IP限速](#5. 连接数限流、单IP限速)
          • [6. 自定义超时时间](#6. 自定义超时时间)
        • 五、跨域配置(前后端分离必备)
          • [7. 全局跨域放行](#7. 全局跨域放行)
        • [六、白名单访问控制(内网 / 后台系统)](#六、白名单访问控制(内网 / 后台系统))
          • [8. 限制指定IP段访问](#8. 限制指定IP段访问)
        • 七、静态资源缓存、请求头透传
          • [9. 透传真实客户端IP](#9. 透传真实客户端IP)
          • [10. 静态资源缓存优化](#10. 静态资源缓存优化)
        • [八、灰度 / 权重分流(金丝雀发布)](#八、灰度 / 权重分流(金丝雀发布))
          • [11. 权重流量拆分](#11. 权重流量拆分)
        • 九、错误页面、自定义配置
          • [12. 自定义后端错误页、关闭目录浏览](#12. 自定义后端错误页、关闭目录浏览)
        • [十、生产高频注解 速查表](#十、生产高频注解 速查表)
    • 环境清理

Kubernetes Ingress

学习参考:Ingress
文章摘要:本文全面介绍了 Kubernetes Ingress 的概念、工作原理及生产环境实践。首先讲解了 Ingress 的基本概念、控制器选择以及 ingress-nginx 的工作流程和部署方法。然后详细解析了 Ingress 规则配置,包括路径匹配、主机名匹配等核心机制。重点通过 12 个生产级实践案例,涵盖了多域名路由、路径重写、HTTPS/TLS 配置、限流防刷、跨域配置、IP 白名单、缓存优化、灰度发布等关键场景,每个案例都提供了完整的 YAML 配置和验证步骤。最后总结了生产环境常用的 Ingress 注解速查表,为 Kubernetes 网络入口管理提供了完整的实战指南。

环境准备

bash 复制代码
root@master30:~# kubectl create ns ingress
root@master30:~# kubectl config set-context --current --namespace ingress

Ingress 介绍

Ingress 可为 Service 提供外部可访问的 URL、对其流量作负载均衡、 终止 SSL/TLS,以及基于名称的虚拟托管等能力。 Ingress 控制器 负责完成 Ingress 的工作,通常会使用某个负载均衡器、边缘路由器或其他前端来帮助处理流量。

下面是 Ingress 的一个简单示例,可将所有流量都发送到同一 Service:

Ingress 不会随意公开端口或协议, 将 HTTP 和 HTTPS 以外的服务开放到 Internet 时,通常使用 Service.Type=NodePortService.Type=LoadBalancer 类型的 Service。

Ingress 控制器

为了让 Ingress 资源工作,集群必须有一个正在运行的 Ingress 控制器。

与作为 kube-controller-manager 可执行文件的一部分运行的其他类型的控制器不同, Ingress 控制器不是随集群自动启动的。 基于此页面,你可选择最适合你的集群的 ingress 控制器实现。

Kubernetes 作为一个项目,目前支持和维护 AWSGCENginx Ingress 控制器。

ingress-nginx 工作流程

本次实验使用 ingress-nginx 控制器。

项目地址:ingress-nginx

ingress-nginx 工作流程:

  1. 先部署 Ingress Controller 实体(相当于前端--Nginx)
  2. 然后再创建 Ingress (k8s 资源--相当于 Nginx 配置)
  3. Ingress Controller 与 kubernetes apiserver交互,动态的获取集群中的ingress规则。解析ingress规则,生成proxy服务的配置,比如nginx配置。
  4. 再写到 ingress proxy 的pod中,如果pod运行的是nginx服务,就生成nginx配置,并放到/etc/nginx/nginx.conf中。
  5. 然后reload服务。

Ingress 本质是7层http/https代理。

ingress-nginx 部署前提

项目地址: kubernetes/ingress-nginx

  1. 本次环境使用负载均衡器处理流量,提前部署好 LoadBalancer,例如 metallb。

  2. 你必须部署一个 Ingress 控制器 才能满足 Ingress 的要求,例如 ingress-nginx

ingress-nginx 版本

Supported Ingress-NGINX version k8s supported version Alpine Version Nginx Version Helm Chart Version
🔄 v1.11.2 1.30, 1.29, 1.28, 1.27, 1.26 3.20.0 1.25.5 4.11.2
🔄 v1.11.1 1.30, 1.29, 1.28, 1.27, 1.26 3.20.0 1.25.5 4.11.1
🔄 v1.11.0 1.30, 1.29, 1.28, 1.27, 1.26 3.20.0 1.25.5 4.11.0
🔄 v1.10.2 1.30, 1.29, 1.28, 1.27, 1.26 3.20.0 1.25.5 4.10.2
🔄 v1.10.1 1.30, 1.29, 1.28, 1.27, 1.26 3.19.1 1.25.3 4.10.1
🔄 v1.10.0 1.29, 1.28, 1.27, 1.26 3.19.1 1.25.3 4.10.0
...

ingress-nginx 部署

部署方法参考:https://kubernetes.github.io/ingress-nginx/deploy/

bash 复制代码
root@master30:~# wget http://192.168.46.200/class/course-materials/softwares/stage03/ingress-nginx-controller-v1.11.2.tar.gz
root@master30:~# tar -xf ingress-nginx-controller-v1.11.2.tar.gz

# 查看资源使用的镜像
root@master30:~# grep image: ingress-nginx-controller-v1.11.2/deploy/static/provider/cloud/deploy.yaml|uniq
        image: registry.k8s.io/ingress-nginx/controller:v1.11.2@sha256:d5f8217feeac4887cb1ed21f27c2674e58be06bd8f5184cacea2a69abaf78dce
        image: registry.k8s.io/ingress-nginx/kube-webhook-certgen:v1.4.3@sha256:a320a50cc91bd15fd2d6fa6de58bd98c1bd64b9a6f926ce23a600d87043455a3

# 替换镜像
root@master30:~# sed -ir 's#@sha256.*##;s/registry.k8s.io/hub.laoma.cloud/' ingress-nginx-controller-v1.11.2/deploy/static/provider/cloud/deploy.yaml

# 创建 Ingress
root@master30:~# kubectl apply -f ingress-nginx-controller-v1.11.2/deploy/static/provider/cloud/deploy.yaml

ingress-nginx 部署文件 deploy.yaml文件包涵4个部分:

  1. 创建一个独立的命名空间 ingress-nginx

  2. 创建 ConfigMap

    ConfigMap是存储通用的配置变量的,类似于配置文件,使用户可以将分布式系统中用于不同模块的环境变量统一到一个对象中管理;而它与配置文件的区别在于它是存在集群的"环境"中的,并且支持K8S集群中所有通用的操作调用方式。

    创建pod时,对configmap进行绑定,pod内的应用可以直接引用ConfigMap的配置。相当于configmap为应用/运行环境封装配置。

    pod使用ConfigMap,通常用于:设置环境变量的值、设置命令行参数、创建配置文件。

  3. Ingress的RBAC授权的控制,其创建了Ingress用到的ServiceAccount、ClusterRole、Role、RoleBinding、ClusterRoleBinding

  4. 创建ingress-controller。前面提到过,ingress-controller的作用是将新加入的Ingress进行转化为httpd的配置

查看部署的资源

bash 复制代码
root@master30:~# kubectl get all -n ingress-nginx 
NAME                                           READY   STATUS      RESTARTS   AGE
pod/ingress-nginx-admission-create-xhvp9       0/1     Completed   0          8m14s
pod/ingress-nginx-admission-patch-j47tm        0/1     Completed   2          8m14s
pod/ingress-nginx-controller-596db54d7-cgbdd   1/1     Running     0          8m14s

NAME                                         TYPE           CLUSTER-IP      EXTERNAL-IP   PORT(S)                      AGE
service/ingress-nginx-controller             LoadBalancer   10.107.255.83   10.1.8.40     80:30973/TCP,443:32344/TCP   14s
service/ingress-nginx-controller-admission   ClusterIP      10.106.37.158   <none>        443/TCP                      8m15s

NAME                                       READY   UP-TO-DATE   AVAILABLE   AGE
deployment.apps/ingress-nginx-controller   1/1     1            1           8m14s

NAME                                                 DESIRED   CURRENT   READY   AGE
replicaset.apps/ingress-nginx-controller-596db54d7   1         1         1       8m14s

NAME                                       COMPLETIONS   DURATION   AGE
job.batch/ingress-nginx-admission-create   1/1           2m26s      8m14s
job.batch/ingress-nginx-admission-patch    1/1           2m28s      8m14s

Ingress 规则实践

Ingress 规则说明

规则示例
  • 示例1: 没有rule的Ingress规则

    指定一个没有rule的defaultBackend的方式,所有发送给该IP的流量都被转发到了defaultBackend 所列的Kubernetes service上。

    yaml 复制代码
    apiVersion: networking.k8s.io/v1
    kind: Ingress
    metadata:
      name: test-ingress
    spec:
      defaultBackend: 
        service: 
          name: testsvc
          port: 
            number: 80
  • 示例2: 虚拟主机,一个域名对应一个path

    yaml 复制代码
    apiVersion: networking.k8s.io/v1
    kind: Ingress
    metadata:
      name: myingress
    spec:
      ingressClassName: nginx
      rules:
      - host: www.laoma.cloud
        http:
          paths:
          - path: /
            pathType: Prefix
            backend:
              service: 
                name: www
                port: 
                  number: 80
      - host: web.laoma.cloud
        http:
          paths:
          - path: /
            pathType: Prefix
            backend:
              service: 
                name: web
                port: 
                  number: 80
  • 示例3: 一个域名对应对多个path

    yaml 复制代码
    apiVersion: networking.k8s.io/v1
    kind: Ingress
    metadata:
      name: myingress
    spec:
      ingressClassName: nginx
      rules:
      - host: www.laoma.cloud
        http:
          paths:
          - path: /
            pathType: Prefix
            backend:
              service: 
                name: web
                port: 
                  number: 80
          - path: /laoma
            pathType: Prefix
            backend:
              service: 
                name: laoma
                port: 
                  number: 80
  • 示例4: https 透传

    如果后端的svc是https流量,系统ingress直接转发https流量给后端service,则需要配置透传 TLS。

    yaml 复制代码
    apiVersion: networking.k8s.io/v1
    kind: Ingress
    metadata:
      name: myingress
      annotations:
        # 关键:透传 TLS,Ingress 不解密
        nginx.ingress.kubernetes.io/ssl-passthrough: "true"
        nginx.ingress.kubernetes.io/backend-protocol: "HTTPS"
    spec:
      ingressClassName: nginx
      rules:
      - host: www.laoma.cloud
        http:
          paths:
          - path: /
            pathType: Prefix
            backend:
              service: 
                name: web
                port: 
                  number: 443

配置说明

  • 跟Kubernetes的其他配置一样,ingress的配置也需要apiVersionkindmetadata字段。

  • Ingress spec 中包含配置一个loadbalancer或proxy server的所有信息。最重要的是,它包含了一个匹配所有入站请求的规则列表。目前ingress只支持http规则。

  • 每条http规则包含以下信息:

    • 一个host配置项(比如www.laoma.cloud,默认是*)
    • paths列表(比如:/laoma),每个path都关联一个backendservice:port的组合,比如web:80。在loadbalancer将流量转发到backend之前,所有的入站请求都要先匹配host和path。
IngressClass

Ingress 可以由不同的控制器实现,通常使用不同的配置。 每个 Ingress 应当指定一个类,也就是一个对 IngressClass 资源的引用。 IngressClass 资源包含额外的配置,其中包括应当实现该类的控制器名称。

你可以将一个特定的 IngressClass 标记为集群默认 Ingress 类。 将某个 IngressClass 资源的 ingressclass.kubernetes.io/is-default-class 注解设置为 true 将确保新的未指定 ingressClassName 字段的 Ingress 能够被赋予这一默认 IngressClass.

路径匹配

Ingress 中的每个路径都需要有对应的路径类型(Path Type)。未明确设置 pathType 的路径无法通过合法性检查。

当前支持的路径类型有三种:

  • Prefix :基于以 / 分隔的 URL 路径前缀匹配。匹配区分大小写, 并且对路径中各个元素逐个执行匹配操作。 路径元素指的是由 / 分隔符分隔的路径中的标签列表。 如果每个 p 都是请求路径 p 的元素前缀,则请求与路径 p 匹配。
  • Exact:精确匹配 URL 路径,且区分大小写。
  • ImplementationSpecific :对于这种路径类型,匹配方法取决于 IngressClass。 具体实现可以将其作为单独的 pathType 处理或者作与 PrefixExact 类型相同的处理。

示例

类型 路径 请求路径 匹配与否?
Prefix / (所有路径)
Exact /foo /foo
Exact /foo /bar
Exact /foo /foo/
Exact /foo/ /foo
Prefix /foo /foo, /foo/
Prefix /foo/ /foo, /foo/
Prefix /aaa/bb /aaa/bbb
Prefix /aaa/bbb /aaa/bbb
Prefix /aaa/bbb/ /aaa/bbb 是,忽略尾部斜线
Prefix /aaa/bbb /aaa/bbb/ 是,匹配尾部斜线
Prefix /aaa/bbb /aaa/bbb/ccc 是,匹配子路径
Prefix /aaa/bbb /aaa/bbbxyz 否,字符串前缀不匹配
Prefix /, /aaa /aaa/ccc 是,匹配 /aaa 前缀
Prefix /, /aaa, /aaa/bbb /aaa/bbb 是,匹配 /aaa/bbb 前缀
Prefix /, /aaa, /aaa/bbb /ccc 是,匹配 / 前缀
Prefix /aaa /ccc 否,使用默认后端
混合 /foo (Prefix), /foo (Exact) /foo 是,优选 Exact 类型

多重匹配

在某些情况下,Ingress 中会有多条路径与同一个请求匹配。这时匹配路径最长者优先。 如果仍然有两条同等的匹配路径,则精确路径类型优先于前缀路径类型。

主机名匹配

主机名可以是精确匹配 (例如 "foo.bar.com")或者使用通配符匹配 (例如 "*.foo.com")。 精确匹配要求 HTTP host 头部字段与 host 字段值完全匹配。 通配符匹配则要求 HTTP host 头部字段与通配符规则中的后缀部分相同。

主机 host 头部 匹配与否?
*.foo.com bar.foo.com 基于相同的后缀匹配
*.foo.com baz.bar.foo.com 不匹配,通配符仅覆盖了一个 DNS 标签
*.foo.com foo.com 不匹配,通配符仅覆盖了一个 DNS 标签

Ingress 规则实践

以下主要讲解生产环境 Ingress-Nginx 常用规则。

环境准备
站点 webapp01
bash 复制代码
# 创建Deployment
root@master30:~# kubectl create deployment webapp01 --image=hub.laoma.cloud/library/httpd --replicas=2

# 查看pod标签
root@master30:~# kubectl get pod -L app 
NAME                        READY   STATUS    RESTARTS   AGE
webapp01-57b8567f7c-kq56c   1/1     Running   0          18s
webapp01-57b8567f7c-vzqj7   1/1     Running   0          18s

# 准备pod主页内容
root@master30:~# kubectl exec -it webapp01-57b8567f7c-kq56c -- bash -c "echo hello webapp01 pod1 > htdocs/index.html"

root@master30:~# kubectl exec -it webapp01-57b8567f7c-vzqj7 -- bash -c "echo hello webapp01 pod2 > htdocs/index.html"

root@master30:~# kubectl expose deployment webapp01 --port=80 --target-port=80
站点 webapp02
bash 复制代码
# 创建Deployment
root@master30:~# kubectl create deployment webapp02 --image=hub.laoma.cloud/library/httpd --replicas=2

# 查看pod标签
root@master30:~# kubectl get pod |grep webapp02
webapp02-598c447b5b-4j76n   1/1     Running   0          18s
webapp02-598c447b5b-dddwh   1/1     Running   0          18s

# 准备pod主页内容
root@master30:~# kubectl exec -it webapp02-598c447b5b-4j76n -- bash -c "
echo hello webapp02 pod1 > htdocs/index.html
mkdir htdocs/games
echo hello webapp02 game1 > htdocs/games/index.html"

root@master30:~# kubectl exec -it webapp02-598c447b5b-dddwh -- bash -c "
echo hello webapp02 pod2 > htdocs/index.html
mkdir htdocs/games
echo hello webapp02 game2 > htdocs/games/index.html"

root@master30:~# kubectl expose deployment webapp02 --port=80 --target-port=80
一、基础通用规则
1. 多域名虚拟主机(多 host 路由)

场景:多个域名转发不同业务

bash 复制代码
root@master30:~# vim multi-host-ingress.yaml
yaml 复制代码
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: multi-host-ingress
spec:
  # 这里一定要指定ingressClassName为nginx
  ingressClassName: nginx
  rules:
  - host: webapp01.laoma.cloud
    http:
      paths:
      - path: /
        pathType: Prefix
        backend:
          service: 
            name: webapp01
            port: 
              number: 80
  - host: webapp02.laoma.cloud
    http:
      paths:
      - path: /
        pathType: Prefix
        backend:
          service: 
            name: webapp02
            port: 
              number: 80
bash 复制代码
root@master30:~# kubectl apply -f multi-host-ingress.yaml
root@master30:~# kubectl describe ingress multi-host-ingress 
Name:             multi-host-ingress
Labels:           <none>
Namespace:        ingress
Address:          10.1.8.40
Ingress Class:    nginx
Default backend:  <default>
Rules:
  Host                  Path  Backends
  ----                  ----  --------
  webapp01.laoma.cloud  
                        /   webapp01:80 (10.224.113.173:80,10.224.19.36:80)
  webapp02.laoma.cloud  
                        /   webapp02:80 (10.224.113.174:80,10.224.19.44:80)
Annotations:            <none>
Events:
  Type    Reason  Age              From                      Message
  ----    ------  ----             ----                      -------
  Normal  Sync    2s (x2 over 8s)  nginx-ingress-controller  Scheduled for sync

访问验证

bash 复制代码
# 修改www.laoma.cloud解析,确保客户端能解析该名称
# 如果有多个域名,建议使用配置DNS-wild匹配
[root@client ~]# echo '10.1.8.40 webapp01.laoma.cloud' >> /etc/hosts
[root@client ~]# echo '10.1.8.40 webapp02.laoma.cloud' >> /etc/hosts

# 注意: 这里我们直接访问域名,没有加端口号
[root@client ~]# curl webapp01.laoma.cloud
hello webapp01 pod1
[root@client ~]# curl webapp01.laoma.cloud
hello webapp01 pod2
[root@client ~]# curl webapp02.laoma.cloud
hello webapp02 pod1
[root@client ~]# curl webapp02.laoma.cloud
hello webapp02 pod2

删除 ingress

bash 复制代码
root@master30:~# kubectl delete ingress multi-host-ingress 
2. 同一域名多路径路由(path 分流)

场景:一个域名,不同路径转发给不同微服务

bash 复制代码
root@master30:~# vim multi-path-ingress.yaml
yaml 复制代码
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: multi-path-ingress
spec:
  ingressClassName: nginx
  rules:
  - host: www.laoma.cloud
    http:
      paths:
      - path: /
        pathType: Prefix
        backend:
          service: 
            name: webapp01
            port: 
              number: 80
      - path: /games
        pathType: Prefix
        backend:
          service: 
            name: webapp02
            port: 
              number: 80
bash 复制代码
root@master30:~# kubectl apply -f multi-path-ingress.yaml
root@master30:~# kubectl describe ingress multi-path-ingress 
Name:             myingress-3
Labels:           <none>
Namespace:        ingress
Address:          10.1.8.40
Ingress Class:    nginx
Default backend:  <default>
Rules:
  Host             Path  Backends
  ----             ----  --------
  www.laoma.cloud  
                   /        webapp01:80 (10.224.113.173:80,10.224.19.36:80)
                   /games   webapp02:80 (10.224.113.174:80,10.224.19.44:80)
Annotations:       <none>
Events:
  Type    Reason  Age              From                      Message
  ----    ------  ----             ----                      -------
  Normal  Sync    2s (x2 over 8s)  nginx-ingress-controller  Scheduled for sync

访问验证

bash 复制代码
# 修改www.laoma.cloud解析,确保客户端能解析该名称
# 如果有多个域名,建议使用配置DNS-wild匹配
[root@client ~]# echo '10.1.8.40 www.laoma.cloud' >> /etc/hosts

# 注意: 这里我们直接访问域名,没有加端口号
[root@client ~]# curl www.laoma.cloud
hello webapp01 pod1
[root@client ~]# curl www.laoma.cloud
hello webapp01 pod2
[root@client ~]# curl www.laoma.cloud/games/
hello webapp02 game1
[root@client ~]# curl www.laoma.cloud/games/
hello webapp02 game2

删除 ingress

bash 复制代码
root@master30:~# kubectl delete ingress multi-path-ingress 
二、生产核心:路径重写
3. 路径裁剪(等价 Nginx proxy_pass /

场景 :前端访问 /api/xxx,后端实际只识别 /xxx,剥离 /api 前缀

bash 复制代码
root@master30:~# vim path-trimming-ingress.yaml
yaml 复制代码
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: path-trimming-ingress
  annotations:
    nginx.ingress.kubernetes.io/use-regex: "true"
    nginx.ingress.kubernetes.io/rewrite-target: /$1
spec:
  ingressClassName: nginx
  rules:
  - host: www.laoma.cloud
    http:
      paths:
      - path: /webapp01/(.*)
        pathType: ImplementationSpecific
        backend:
          service: 
            name: webapp01
            port: 
              number: 80
      - path: /webapp02/(.*)
        pathType: ImplementationSpecific
        backend:
          service: 
            name: webapp02
            port: 
              number: 80
bash 复制代码
root@master30:~# kubectl apply -f path-trimming-ingress.yaml
root@master30:~# kubectl describe ingress path-trimming-ingress
Name:             path-trimming-ingress
Labels:           <none>
Namespace:        ingress
Address:          10.1.8.40
Ingress Class:    nginx
Default backend:  <default>
Rules:
  Host             Path  Backends
  ----             ----  --------
  www.laoma.cloud  
                   /webapp01/(.*)   webapp01:80 (10.224.113.173:80,10.224.19.36:80)
                   /webapp02/(.*)   webapp02:80 (10.224.113.174:80,10.224.19.44:80)
Annotations:       nginx.ingress.kubernetes.io/rewrite-target: /$1
                   nginx.ingress.kubernetes.io/use-regex: true
Events:
  Type    Reason  Age               From                      Message
  ----    ------  ----              ----                      -------
  Normal  Sync    0s (x4 over 13m)  nginx-ingress-controller  Scheduled for sync

访问验证

bash 复制代码
[root@client ~]# curl www.laoma.cloud/webapp01/
hello webapp01 pod1
[root@client ~]# curl www.laoma.cloud/webapp01/
hello webapp01 pod1
[root@client ~]# curl www.laoma.cloud/webapp02/
hello webapp02 pod1
[root@client ~]# curl www.laoma.cloud/webapp02/
hello webapp02 pod1

删除 ingress

bash 复制代码
root@master30:~# kubectl delete ingress path-trimming-ingress
三、HTTPS 强制 & TLS 证书
4. 绑定 TLS 证书 + 强制 HTTPS

环境准备

bash 复制代码
root@master30:~# openssl genrsa -out www.key 2048  
root@master30:~# openssl req -new -key www.key -out www.csr -subj "/C=CN/ST=JS/L=NJ/O=LM/OU=DEVOPS/CN=www.laoma.cloud/emailAddress=webadmin@laoma.cloud" 
root@master30:~# openssl x509 -req -days 3650 -in www.csr -signkey www.key -out www.crt
root@master30:~# kubectl create secret tls www-tls --cert=./www.crt --key=./www.key

生产标配:https访问, 80 端口也会自动跳转 443

bash 复制代码
root@master30:~# vim tls-ingress.yaml
yaml 复制代码
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: tls-ingress
  annotations:
    nginx.ingress.kubernetes.io/ssl-redirect: "true"
    nginx.ingress.kubernetes.io/force-ssl-redirect: "true"
spec:
  ingressClassName: nginx
  tls:
  - hosts:
      - www.laoma.cloud
    secretName: www-tls
  rules:
  - host: www.laoma.cloud
    http:
      paths:
      - path: /
        pathType: Prefix
        backend:
          service:
            name: webapp01
            port: 
              number: 80
bash 复制代码
root@master30:~# kubectl apply -f tls-ingress.yaml
root@master30:~# kubectl describe ingress tls-ingress 
Name:             tls-ingress
Labels:           <none>
Namespace:        ingress
Address:          
Ingress Class:    nginx
Default backend:  <default>
TLS:
  www-tls terminates www.laoma.cloud
Rules:
  Host             Path  Backends
  ----             ----  --------
  www.laoma.cloud  
                   /   webapp01:80 (10.224.19.54:80,10.224.19.56:80)
Annotations:       nginx.ingress.kubernetes.io/force-ssl-redirect: true
                   nginx.ingress.kubernetes.io/ssl-redirect: true
Events:
  Type    Reason  Age   From                      Message
  ----    ------  ----  ----                      -------
  Normal  Sync    11s   nginx-ingress-controller  Scheduled for sync

访问验证

bash 复制代码
# 使用 -L 跟随 301/302/307/308 所有重定向
[root@client ~]# curl -Lk http://www.laoma.cloud/
hello webapp01 pod1
[root@client ~]# curl -Lk http://www.laoma.cloud/
hello webapp01 pod2

# 访问https站点
[root@client ~]# curl -k https://www.laoma.cloud/
hello webapp01 pod1
[root@client ~]# curl -k https://www.laoma.cloud/
hello webapp01 pod2

删除 ingress

bash 复制代码
root@master30:~# kubectl delete ingress tls-ingress
四、限流、防刷、超时优化
5. 连接数限流、单IP限速
yaml 复制代码
annotations:
  # 单IP最大并发连接
  nginx.ingress.kubernetes.io/limit-connections: "50"
  # 单IP每秒请求数
  nginx.ingress.kubernetes.io/limit-rps: "20"
6. 自定义超时时间
yaml 复制代码
annotations:
  nginx.ingress.kubernetes.io/proxy-connect-timeout: "10"
  nginx.ingress.kubernetes.io/proxy-read-timeout: "60"
  nginx.ingress.kubernetes.io/proxy-send-timeout: "60"
五、跨域配置(前后端分离必备)
7. 全局跨域放行
yaml 复制代码
annotations:
  nginx.ingress.kubernetes.io/enable-cors: "true"
  nginx.ingress.kubernetes.io/cors-allow-origin: "*"
  nginx.ingress.kubernetes.io/cors-allow-methods: "GET,POST,PUT,DELETE,OPTIONS"
六、白名单访问控制(内网 / 后台系统)
8. 限制指定IP段访问

场景:管理后台、内部系统,只允许公司内网IP

yaml 复制代码
annotations:
  # 只放行 10.1.8.0/24 网段
  nginx.ingress.kubernetes.io/whitelist-source-range: "10.1.8.0/24,127.0.0.1/32"
七、静态资源缓存、请求头透传
9. 透传真实客户端IP
yaml 复制代码
annotations:
  nginx.ingress.kubernetes.io/x-forwarded-for: "true"
  nginx.ingress.kubernetes.io/proxy-real-ip-cidr: "10.0.0.0/8"
10. 静态资源缓存优化
yaml 复制代码
annotations:
  nginx.ingress.kubernetes.io/proxy-cache: "true"
  nginx.ingress.kubernetes.io/proxy-cache-valid: "200 302 10m"
八、灰度 / 权重分流(金丝雀发布)
11. 权重流量拆分

场景:线上灰度,90%流量走稳定版,10%走测试版

yaml 复制代码
annotations:
  nginx.ingress.kubernetes.io/canary: "true"
  nginx.ingress.kubernetes.io/canary-weight: "10"
九、错误页面、自定义配置
12. 自定义后端错误页、关闭目录浏览
yaml 复制代码
annotations:
  nginx.ingress.kubernetes.io/custom-http-errors: "404,500,502,503"
十、生产高频注解 速查表
注解 作用
force-ssl-redirect: true 80 强制跳转 HTTPS
rewrite-target 路径重写、裁剪路由前缀
whitelist-source-range IP白名单
limit-rps / limit-connections 防CC、限流
enable-cors 前后端跨域
proxy-read-timeout 解决接口超时断开
x-forwarded-for 后端获取真实客户端IP

环境清理

bash 复制代码
root@master30:~# kubectl delete ns ingress
相关推荐
GlueNa2SiO310 小时前
10-Docker生产环境部署与K8s入门
笔记·学习·docker·容器·kubernetes
蜀道山老天师11 小时前
Zabbix监控Docker容器应用实践完整指南
linux·运维·docker·容器·zabbix
星空11 小时前
WordPress在docker中部署
运维·docker·容器
怦怦蓝12 小时前
Windows 安装 Docker Desktop 踩坑完整实战指南(WSL2 故障排错实录)
windows·docker·容器
SLD_Allen13 小时前
基于 eBPF + Cilium 的 Kubernetes 网络可观测与安全治理实践
网络·安全·kubernetes
康娜喵13 小时前
在Ubuntu26上使用Docker部署Gitea
docker·容器·gitea
CDN36013 小时前
俄语区跨境站点优化实战:CDN+Nginx 解决 H5 白屏、交互延迟、链路卡顿问题
运维·nginx·交互·h5 加速·nginx 轻交互调优
东宇科技13 小时前
我用docker创建了一个springboot4项目
阿里云·docker·容器
難釋懷13 小时前
Nginx重试机制
运维·nginx