【k8s应用管理】kubernetes lngress资源管理

文章目录

  • 补充
    • [**Service 的作用**](#Service 的作用)
    • [**Kubernetes 外部访问方案**](#Kubernetes 外部访问方案)
  • [Kubernetes Ingress](#Kubernetes Ingress)
    • [Ingress 概述](#Ingress 概述)
      • [Kubernetes 外部访问方案对比](#Kubernetes 外部访问方案对比)
      • [Ingress 的组成](#Ingress 的组成)
      • [**Ingress-Nginx 工作原理**](#Ingress-Nginx 工作原理)
      • [Ingress 控制器的部署方式](#Ingress 控制器的部署方式)
        • [1. DaemonSet + Host 网络模式](#1. DaemonSet + Host 网络模式)
        • [2. Deployment + NodePort/LoadBalancer Service](#2. Deployment + NodePort/LoadBalancer Service)
      • [创建 Ingress 资源](#创建 Ingress 资源)
          • [部署 Ingress-Nginx](#部署 Ingress-Nginx)
        • 陈述式命令
        • [YAML 配置](#YAML 配置)
      • 高级功能
        • [1. 基于域名的代理转发](#1. 基于域名的代理转发)
        • [2. 基于路径的代理转发](#2. 基于路径的代理转发)
        • [3. HTTPS 支持](#3. HTTPS 支持)
        • [4. Basic Auth 认证](#4. Basic Auth 认证)
        • [5. 路径重写](#5. 路径重写)
        • [6. 金丝雀发布(Canary)](#6. 金丝雀发布(Canary))
    • [部署 nginx-ingress-controller](#部署 nginx-ingress-controller)
    • [部署 nginx-ingress-controller(二)](#部署 nginx-ingress-controller(二))
    • [Ingress HTTP 与 HTTPS 代理访问](#Ingress HTTP 与 HTTPS 代理访问)
      • [Ingress HTTP 代理访问配置](#Ingress HTTP 代理访问配置)
      • [Ingress HTTPS 代理访问配置](#Ingress HTTPS 代理访问配置)
    • [Nginx BasicAuth 配置](#Nginx BasicAuth 配置)
    • [Kubernetes Ingress-Nginx 重写功能](#Kubernetes Ingress-Nginx 重写功能)
    • [Traefik Ingress Controller](#Traefik Ingress Controller)
      • [Traefik 概述](#Traefik 概述)
      • [Traefik 部署方式](#Traefik 部署方式)
        • [1. DaemonSet](#1. DaemonSet)
        • [**2. Deployment**](#2. Deployment)
      • [部署 Traefik Ingress Controller](#部署 Traefik Ingress Controller)
      • [配置 Ingress HTTP 代理](#配置 Ingress HTTP 代理)
        • [1. 创建 Deployment 和 Service](#1. 创建 Deployment 和 Service)
        • [2. 应用配置](#2. 应用配置)
        • [3. 验证部署](#3. 验证部署)

补充

Service 的作用

  • 对集群内部
    • 跟踪 Pod 的变化,更新 Endpoint。
    • 提供服务发现机制,解决 Pod IP 动态变化的问题。
  • 对集群外部
    • 类似负载均衡器,支持集群内外访问 Pod。
    • 提供统一的访问入口。

Kubernetes 外部访问方案

  1. NodePort

    • 将 Service 暴露在节点网络上。
    • 通过节点的 IP 和端口访问服务。
    • 缺点
      • 端口范围有限(默认 30000-32767)。
      • 管理复杂,不适合大规模集群。
  2. LoadBalancer

    • 使用外部负载均衡器分发流量。
    • 需要云环境支持(如 AWS、GCP)。
    • 缺点
      • 依赖云服务商。
      • 成本较高。
  3. ExternalIPs

    • 为 Service 分配外部 IP。
    • 外部 IP 路由到集群节点,流量转发到 Service 的 Endpoint。
    • 缺点
      • 需要手动管理外部 IP。
  4. Ingress

    • 提供七层代理(HTTP/HTTPS)。
    • 基于域名或 URL 路径转发请求。
    • 优点
      • 只需少量公网 IP 和负载均衡器。
      • 支持多服务暴露,灵活配置。

Kubernetes Ingress

Ingress 概述

  • 作用:作为 Kubernetes 集群的接入层,接收外部请求并根据规则(域名或 URL 路径)将请求转发到相应的 Service 和 Pod。
  • 特点
    • 支持七层代理(HTTP/HTTPS)。
    • 提供灵活的流量管理(如基于域名、路径的转发)。
    • 支持 TLS 加密、认证、重写路径等高级功能。

Kubernetes 外部访问方案对比

方案 特点 适用场景
NodePort 通过节点端口暴露服务,仅支持四层代理。 简单测试环境
LoadBalancer 通过云服务商的负载均衡器暴露服务,支持四层代理。 云环境生产部署
ExternalIPs 通过指定节点的外部 IP 暴露服务,仅支持四层代理。 特定节点 IP 的场景
Ingress 支持七层代理,基于域名或路径转发请求,功能强大且灵活。 生产环境,复杂流量管理

Ingress 的组成

  1. Ingress 对象

    • 定义转发规则(如域名、路径)。
    • 告诉 Ingress 控制器如何将请求转发到后端 Service。
    • 功能
      • 提供外部 URL。
      • 支持负载均衡。
      • 提供 SSL/TLS 能力。
      • 实现基于域名的反向代理。
    • 配置方式:通过 YAML 文件定义。
  2. Ingress 控制器

    • 实际处理请求转发的组件。
    • 常见实现:Nginx Ingress Controller、Traefik、HAProxy 等。
    • 通常以 Pod 形式运行。
    • 功能
      • 监控集群变化,动态更新配置。
      • 根据 Ingress 规则生成代理配置(如 Nginx 配置)。
      • 应用配置并重载代理服务。

Ingress-Nginx 工作原理

  1. 监控集群变化

    • Ingress Controller 通过 Kubernetes API Server 动态感知 Ingress 规则的变化。
  2. 生成配置

    • 根据 Ingress 规则生成 Nginx 配置。
    • 配置包括域名、路径与 Service 的映射关系。
  3. 写入配置

    • 将生成的 Nginx 配置写入 /etc/nginx/nginx.conf
  4. 重载服务

    • 重载 Nginx 服务,使新配置生效。

Ingress 控制器的部署方式

1. DaemonSet + Host 网络模式
  • 特点

    • 每个节点运行一个 Ingress 控制器 Pod。
    • 使用节点的 80/443 端口直接接收外部请求。
  • 数据流

    复制代码
    客户端 -> 节点 -> 80/443 端口 -> Ingress 控制器 -> 后端 Pod
2. Deployment + NodePort/LoadBalancer Service
  • 特点

    • 集中部署 Ingress 控制器。
    • 通过 NodePort 或 LoadBalancer 暴露服务。
  • 数据流

    复制代码
    客户端 -> 节点 -> NodePort -> Ingress 控制器 -> 后端 Pod

创建 Ingress 资源

部署 Ingress-Nginx
陈述式命令
bash 复制代码
kubectl create ingress <ingress-name> \
  --rule=<域名>/<路径>=<service-name>:<service-port> \
  --class=<ingress-class>
YAML 配置
  • YAML 示例

    yaml 复制代码
    apiVersion: networking.k8s.io/v1
    kind: Ingress
    metadata:
      name: example-ingress
      annotations:
        nginx.ingress.kubernetes.io/rewrite-target: /
    spec:
      ingressClassName: nginx
      rules:
      - host: www.example.com
        http:
          paths:
          - path: /app
            pathType: Prefix
            backend:
              service:
                name: app-service
                port:
                  number: 80
      tls:
      - hosts:
        - www.example.com
        secretName: tls-secret

高级功能

1. 基于域名的代理转发
yaml 复制代码
rules:
- host: www.example.com
  http:
    paths:
    - path: /app
      backend:
        service:
          name: app-service
          port: 80
- host: api.example.com
  http:
    paths:
    - path: /api
      backend:
        service:
          name: api-service
          port: 8080
2. 基于路径的代理转发
yaml 复制代码
rules:
- host: www.example.com
  http:
    paths:
    - path: /app
      backend:
        service:
          name: app-service
          port: 80
    - path: /api
      backend:
        service:
          name: api-service
          port: 8080
3. HTTPS 支持
  • 创建 TLS Secret:

    bash 复制代码
    kubectl create secret tls tls-secret --cert=tls.crt --key=tls.key
  • 配置 Ingress:

    yaml 复制代码
    tls:
    - hosts:
      - www.example.com
      secretName: tls-secret
4. Basic Auth 认证
  • 创建认证文件:

    bash 复制代码
    htpasswd -c auth admin
  • 创建 Secret:

    bash 复制代码
    kubectl create secret generic basic-auth --from-file=auth
  • 配置 Ingress:

    yaml 复制代码
    metadata:
      annotations:
        nginx.ingress.kubernetes.io/auth-type: basic
        nginx.ingress.kubernetes.io/auth-secret: basic-auth
        nginx.ingress.kubernetes.io/auth-realm: 'Authentication Required'
5. 路径重写
yaml 复制代码
metadata:
  annotations:
    nginx.ingress.kubernetes.io/rewrite-target: /$1
spec:
  rules:
  - host: www.example.com
    http:
      paths:
      - path: /old/(.*)
        backend:
          service:
            name: new-service
            port: 80
6. 金丝雀发布(Canary)
yaml 复制代码
metadata:
  annotations:
    nginx.ingress.kubernetes.io/canary: "true"
    nginx.ingress.kubernetes.io/canary-weight: "50"
spec:
  rules:
  - host: www.example.com
    http:
      paths:
      - path: /
        backend:
          service:
            name: canary-service
            port: 80

部署 nginx-ingress-controller

  1. 创建目录并下载部署文件

    bash 复制代码
    mkdir /opt/ingress
    cd /opt/ingress
    wget https://gitee.com/mirrors/ingress-nginx/raw/controller-v1.3.0/deploy/static/provider/cloud/deploy.yaml
  2. 修改镜像地址
    编辑 deploy.yaml 文件,找到 image 字段,并将其修改为阿里云镜像仓库的地址:

    yaml 复制代码
    image: registry.cn-hangzhou.aliyuncs.com/google_containers/nginx-ingress-controller:v1.3.0@sha256:d1707ca76d3b044ab8a28277a2466a02100ee9f58a86af1535a3edf9323ea1b5
    image: registry.cn-hangzhou.aliyuncs.com/google_containers/kube-webhook-certgen:v1.1.1@sha256:64d8c73dca984af206adf9d6d7e46aa550362b1d7a01f3a0a91b20cc67868660
  3. 选择部署方式
    您选择了 DaemonSet+HostNetwork+nodeSelector 的方式部署 nginx-ingress-controller。这种方式适合大并发的生产环境,因为它直接将 Pod 的网络与宿主机网络打通,减少了 NAT 的性能损耗。

  4. 为节点打标签

    bash 复制代码
    kubectl label node node02 ingress=true
    kubectl get nodes --show-labels
  5. 修改 deploy.yaml 文件
    kindDeployment 修改为 DaemonSet,并添加 hostNetworknodeSelector 字段:

    yaml 复制代码
    apiVersion: apps/v1
    kind: DaemonSet
    # ... 其他配置 ...
    spec:
      template:
        spec:
          hostNetwork: true
          nodeSelector:
            ingress: "true"
  6. 部署 nginx-ingress-controller

    bash 复制代码
    kubectl apply -f deploy.yaml

    部署完成后,检查 Pod 是否已正确运行在 node02 节点上:

    bash 复制代码
    kubectl get pod -n ingress-nginx -o wide
  7. 创建 Ingress 规则
    首先,创建一个 nginx 应用及其服务:

    yaml 复制代码
    # service-nginx.yaml
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: nginx-app
    # ... 其他配置 ...
    ---
    apiVersion: v1
    kind: Service
    metadata:
      name: nginx-app-svc
    # ... 其他配置 ...

    然后,创建 Ingress 规则:

    yaml 复制代码
    # ingress-app.yaml
    apiVersion: networking.k8s.io/v1
    kind: Ingress
    metadata:
      name: nginx-app-ingress
    spec:
      ingressClassName: "nginx"
      rules:
      - host: www.xy101.com
        http:
          paths:
          - path: /
            pathType: Prefix
            backend:
              service:
                name: nginx-app-svc
                port:
                  number: 80

    应用这些配置:

    bash 复制代码
    kubectl apply -f service-nginx.yaml
    kubectl apply -f ingress-app.yaml
  8. 测试访问
    在本地 /etc/hosts 文件中添加域名解析:

    bash 复制代码
    192.168.80.12 www.xy101.com

    然后使用 curl 命令测试访问:

    bash 复制代码
    curl http://www.xy101.com

    如果一切正常,应该能够看到 nginx 的默认欢迎页面。

部署 nginx-ingress-controller(二)

准备工作

  • 创建目录

    bash 复制代码
    mkdir /opt/ingress-nodeport
    cd /opt/ingress-nodeport
  • 下载配置文件
    使用官方地址或国内镜像源下载deploy.yaml文件:

    bash 复制代码
    # 官方地址(可能因网络问题无法下载)
    wget https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-v1.3.0/deploy/static/provider/cloud/deploy.yaml
    
    # 国内镜像源(推荐)
    wget https://gitee.com/mirrors/ingress-nginx/raw/controller-v1.3.0/deploy/static/provider/cloud/deploy.yaml

修改镜像地址

为了在国内网络环境下顺利拉取镜像,需将镜像地址修改为阿里云镜像:

yaml 复制代码
# 修改以下两处镜像地址
image: registry.cn-hangzhou.aliyuncs.com/google_containers/nginx-ingress-controller:v1.3.0@sha256:d1707ca76d3b044ab8a28277a2466a02100ee9f58a86af1535a3edf9323ea1b5
image: registry.cn-hangzhou.aliyuncs.com/google_containers/kube-webhook-certgen:v1.1.1@sha256:64d8c73dca984af206adf9d6d7e46aa550362b1d7a01f3a0a91b20cc67868660

修改 Service 类型

编辑deploy.yaml文件,将Service类型设置为NodePort

yaml 复制代码
apiVersion: v1
kind: Service
metadata:
  labels:
    app.kubernetes.io/component: controller
    app.kubernetes.io/instance: ingress-nginx
    app.kubernetes.io/name: ingress-nginx
    app.kubernetes.io/part-of: ingress-nginx
    app.kubernetes.io/version: 1.3.0
  name: ingress-nginx-controller
  namespace: ingress-nginx
spec:
  ports:
    - port: 80
      targetPort: 80
      protocol: TCP
      name: http
    - port: 443
      targetPort: 443
      protocol: TCP
      name: https
  type: NodePort  # 设置为 NodePort 或 LoadBalancer
  # externalTrafficPolicy: Cluster  # 可选,控制流量策略

部署 nginx-ingress-controller

应用配置文件并验证部署状态:

bash 复制代码
kubectl apply -f deploy.yaml

# 查看 Pod 和 Service 状态
kubectl get pod,svc -n ingress-nginx

部署示例应用和 Ingress 资源

1. 创建 YAML 文件

创建并编辑ingress-nginx.yaml文件,定义Deployment、Service和Ingress资源:

yaml 复制代码
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-app
spec:
  replicas: 2
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
        - name: nginx
          image: nginx
          imagePullPolicy: IfNotPresent
          ports:
            - containerPort: 80
---
apiVersion: v1
kind: Service
metadata:
  name: nginx-svc
spec:
  ports:
    - port: 80
      targetPort: 80
      protocol: TCP
  selector:
    app: nginx
---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: nginx-test
spec:
  ingressClassName: "nginx"
  rules:
    - host: www.xy102.com
      http:
        paths:
          - path: /
            pathType: Prefix
            backend:
              service:
                name: nginx-svc
                port:
                  number: 80
应用配置并验证

应用YAML文件并查看资源状态:

bash 复制代码
kubectl apply -f ingress-nginx.yaml

# 查看 Service 和 Pod 状态
kubectl get svc,pods -o wide

测试访问

内部访问

进入其中一个Nginx Pod,修改index.html内容:

bash 复制代码
kubectl exec -it <pod-name> -- /bin/bash
# 例如:kubectl exec -it nginx-app-65d7b99f6b-l4g65 -- /bin/bash

cd /usr/share/nginx/html/
echo 'this is web1' > index.html
# 对另一个Pod执行类似操作,写入 'this is web2'

通过ClusterIP访问Service,验证负载均衡效果:

bash 复制代码
curl http://<nginx-svc-cluster-ip>
外部访问
  • 配置本地 /etc/hosts 文件
    添加域名解析,将 www.xy102.com 解析到集群节点的IP地址(例如 192.168.80.12):

    bash 复制代码
    vim /etc/hosts

    添加以下内容:

    复制代码
    192.168.80.10   master
    192.168.80.11   node01
    192.168.80.12   node02
    192.168.80.12   www.xy101.com
    192.168.80.12   www.xy102.com
  • 通过 NodePort 访问
    使用节点IP和NodePort端口访问服务:

    bash 复制代码
    curl http://192.168.80.12:32383
  • 通过域名访问
    配置完成后,可以直接使用域名进行访问:

    bash 复制代码
    curl http://www.xy102.com:32383

常见问题排查

  • Pod 无法启动
    检查Pod的日志,确认是否有镜像拉取失败或其他错误:

    bash 复制代码
    kubectl logs <pod-name> -n ingress-nginx
  • Service 无法访问
    确认Service的端口配置正确,并且后端Pod正常运行:

    bash 复制代码
    kubectl describe svc ingress-nginx-controller -n ingress-nginx
  • Ingress 规则不生效
    检查Ingress资源的配置,确保hostpath匹配正确,并且DNS解析正常。

Ingress HTTP 与 HTTPS 代理访问

Ingress HTTP 代理访问配置

  1. 创建虚拟主机资源

    • 虚拟主机1(deployment1.yaml)

      yaml 复制代码
      apiVersion: apps/v1
      kind: Deployment
      metadata:
        name: deployment1
      spec:
        replicas: 2
        selector:
          matchLabels:
            name: nginx1
        template:
          metadata:
            labels:
              name: nginx1
          spec:
            containers:
            - name: nginx1
              image: soscscs/myapp:v1
              imagePullPolicy: IfNotPresent
              ports:
              - containerPort: 80
      ---
      apiVersion: v1
      kind: Service
      metadata:
        name: svc-1
      spec:
        ports:
        - port: 80
          targetPort: 80
          protocol: TCP
        selector:
          name: nginx1
    • 虚拟主机2(deployment2.yaml)

      yaml 复制代码
      apiVersion: apps/v1
      kind: Deployment
      metadata:
        name: deployment2
      spec:
        replicas: 2
        selector:
          matchLabels:
            name: nginx2
        template:
          metadata:
            labels:
              name: nginx2
          spec:
            containers:
            - name: nginx2
              image: soscscs/myapp:v2
              imagePullPolicy: IfNotPresent
              ports:
              - containerPort: 80
      ---
      apiVersion: v1
      kind: Service
      metadata:
        name: svc-2
      spec:
        ports:
        - port: 80
          targetPort: 80
          protocol: TCP
        selector:
          name: nginx2
    • 应用配置:

      bash 复制代码
      kubectl apply -f deployment1.yaml
      kubectl apply -f deployment2.yaml
  2. 创建Ingress资源

    • ingress-nginx.yaml

      yaml 复制代码
      apiVersion: networking.k8s.io/v1
      kind: Ingress
      metadata:
        name: ingress1
      spec:
        ingressClassName: "nginx"
        rules:
        - host: www1.xy101.com
          http:
            paths:
            - path: /
              pathType: Prefix
              backend:
                service:
                  name: svc-1
                  port:
                    number: 80
      ---
      apiVersion: networking.k8s.io/v1
      kind: Ingress
      metadata:
        name: ingress2
      spec:
        ingressClassName: "nginx"
        rules:
        - host: www2.xy101.com
          http:
            paths:
            - path: /
              pathType: Prefix
              backend:
                service:
                  name: svc-2
                  port:
                    number: 80
    • 应用配置:

      bash 复制代码
      kubectl apply -f ingress-nginx.yaml
  3. 测试访问

    • 获取Ingress服务NodePort端口:

      bash 复制代码
      kubectl get svc -n ingress-nginx
    • 访问测试:

      bash 复制代码
      curl www1.xy101.com:<NodePort>
      curl www2.xy101.com:<NodePort>

Ingress HTTPS 代理访问配置

  1. 创建SSL证书

    • 生成自签名证书:

      bash 复制代码
      openssl req -x509 -sha256 -nodes -days 365 -newkey rsa:2048 -keyout tls.key -out tls.crt -subj "/CN=nginxsvc/O=nginxsvc"
  2. 创建Secret资源

    • 创建存储证书的Secret:

      bash 复制代码
      kubectl create secret tls tls-secret --key tls.key --cert tls.crt
  3. 创建Deployment、Service、Ingress资源

    • ingress-https.yaml

      yaml 复制代码
      apiVersion: apps/v1
      kind: Deployment
      metadata:
        name: nginx-app
      spec:
        replicas: 2
        selector:
          matchLabels:
            name: nginx
        template:
          metadata:
            labels:
              name: nginx
          spec:
            containers:
            - name: nginx
              image: nginx
              imagePullPolicy: IfNotPresent
              ports:
              - containerPort: 80
      ---
      apiVersion: v1
      kind: Service
      metadata:
        name: nginx-svc
      spec:
        ports:
        - port: 80
          targetPort: 80
          protocol: TCP
        selector:
          name: nginx
      ---
      apiVersion: networking.k8s.io/v1
      kind: Ingress
      metadata:
        name: nginx-https
      spec:
        ingressClassName: "nginx"
        tls:
        - hosts:
          - www3.xy101.com
          secretName: tls-secret
        rules:
        - host: www3.xy101.com
          http:
            paths:
            - path: /
              pathType: Prefix
              backend:
                service:
                  name: nginx-svc
                  port:
                    number: 80
    • 应用配置:

      bash 复制代码
      kubectl apply -f ingress-https.yaml
  4. 访问测试

    • 修改hosts文件,添加域名映射:

      复制代码
      192.168.80.10 www3.xy101.com
    • 使用浏览器访问:

      复制代码
      https://www3.xy101.com:<NodePort-443>

Nginx BasicAuth 配置

  1. 生成用户密码认证文件

    • 安装httpd-tools并生成认证文件:

      bash 复制代码
      yum -y install httpd-tools
      htpasswd -c auth zhangsan
  2. 创建Secret资源

    • 创建存储认证文件的Secret:

      bash 复制代码
      kubectl create secret generic basic-auth --from-file=auth
  3. 创建Ingress资源

    • ingress-auth.yaml

      yaml 复制代码
      apiVersion: networking.k8s.io/v1
      kind: Ingress
      metadata:
        name: ingress-auth
        annotations:
          nginx.ingress.kubernetes.io/auth-type: basic
          nginx.ingress.kubernetes.io/auth-secret: basic-auth
          nginx.ingress.kubernetes.io/auth-realm: 'Authentication Required - zhangsan'
      spec:
        ingressClassName: "nginx"
        rules:
        - host: auth.xy101.com
          http:
            paths:
            - path: /
              pathType: Prefix
              backend:
                service:
                  name: nginx-svc
                  port:
                    number: 80
    • 应用配置:

      bash 复制代码
      kubectl apply -f ingress-auth.yaml
  4. 访问测试

    • 修改hosts文件,添加域名映射:

      复制代码
      192.168.80.10 auth.xy101.com
    • 使用浏览器访问:

      复制代码
      http://auth.xy101.com:<NodePort>
    • 输入用户名和密码进行认证。


Kubernetes Ingress-Nginx 重写功能

核心注解(Annotations)

注解名称 功能说明 示例值
nginx.ingress.kubernetes.io/rewrite-target 定义重定向的目标 URI(支持正则捕获组) http://www1.xy101.com:32383
nginx.ingress.kubernetes.io/ssl-redirect 是否强制跳转 HTTPS(当 Ingress 配置 TLS 时默认为 true "true"
nginx.ingress.kubernetes.io/force-ssl-redirect 即使未启用 TLS 也强制跳转 HTTPS "false"
nginx.ingress.kubernetes.io/app-root 定义根路径(/)的重定向目标 "/app"
nginx.ingress.kubernetes.io/use-regex 是否启用正则表达式匹配路径 "true"

常见场景与配置

域名重定向

将请求重定向到指定域名(无需真实后端服务):

yaml 复制代码
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: nginx-rewrite
  annotations:
    nginx.ingress.kubernetes.io/rewrite-target: http://www1.xy101.com:32383
spec:
  ingressClassName: nginx
  rules:
  - host: re.xy101.com
    http:
      paths:
      - path: /
        pathType: Prefix
        backend:
          service:
            name: dummy-svc  # 任意名称(无需真实存在)
            port:
              number: 80

验证

bash 复制代码
curl -v http://re.xy101.com:32383
# 返回 302 跳转到 http://www1.xy101.com:32383

路径重写

使用正则表达式捕获路径并重写:

yaml 复制代码
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: http-ingress
  annotations:
    nginx.ingress.kubernetes.io/use-regex: "true"
    nginx.ingress.kubernetes.io/rewrite-target: /$2
spec:
  ingressClassName: nginx
  rules:
  - host: www.xy101.com
    http:
      paths:
      - pathType: Prefix
        path: /something(/|$)(.*)  # 正则匹配路径
        backend:
          service:
            name: myapp-svc
            port:
              number: 9090

效果

  • 请求 http://www.xy101.com/something/foo
  • 被重写为 http://myapp-svc:9090/foo

根路径重定向

将根路径 / 重定向到指定子路径:

yaml 复制代码
metadata:
  annotations:
    nginx.ingress.kubernetes.io/app-root: /app1

效果

  • 访问 http://www.xy101.com/
  • 自动跳转至 http://www.xy101.com/app1

场景 4:强制 HTTPS 跳转
yaml 复制代码
metadata:
  annotations:
    nginx.ingress.kubernetes.io/ssl-redirect: "true"
    nginx.ingress.kubernetes.io/force-ssl-redirect: "true"  # 强制所有流量跳转

完整示例

YAML 配置
yaml 复制代码
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: complex-ingress
  annotations:
    nginx.ingress.kubernetes.io/use-regex: "true"
    nginx.ingress.kubernetes.io/rewrite-target: /$2
    nginx.ingress.kubernetes.io/app-root: /dashboard
    nginx.ingress.kubernetes.io/ssl-redirect: "true"
spec:
  ingressClassName: nginx
  tls:
  - hosts:
    - www.xy101.com
    secretName: tls-secret
  rules:
  - host: www.xy101.com
    http:
      paths:
      - path: /api(/|$)(.*)
        pathType: Prefix
        backend:
          service:
            name: backend-api
            port:
              number: 8080
      - path: /
        pathType: Prefix
        backend:
          service:
            name: frontend
            port:
              number: 80

验证步骤

  1. 应用配置

    bash 复制代码
    kubectl apply -f ingress.yaml
  2. 检查 Ingress 状态

    bash 复制代码
    kubectl get ingress
  3. 测试访问

    bash 复制代码
    # 测试根路径跳转
    curl -L http://www.xy101.com
    
    # 测试路径重写
    curl http://www.xy101.com/api/v1/data

注意

  1. 正则表达式语法

    • 使用 (.*) 捕获路径片段,通过 $1$2 引用。
    • 启用 use-regex: "true" 后,路径匹配严格遵循正则规则。
  2. HTTPS 配置

    • 必须提前创建 TLS Secret:

      bash 复制代码
      kubectl create secret tls tls-secret --cert=tls.crt --key=tls.key
  3. 服务依赖

    • 重定向到其他域名时,无需关联真实 Service。
    • 路径重写时,目标 Service 必须存在且可访问。

Traefik Ingress Controller

Traefik 概述

  • 功能:现代 HTTP 反向代理和负载均衡工具,专为微服务架构设计。
  • 特点
    • 实时与 Kubernetes API 交互,自动感知后端 Service 和 Pod 的变化。
    • 支持自动服务发现和配置更新。
    • 提供 Web UI 界面,方便监控和管理。

Traefik 部署方式

1. DaemonSet
  • 特点
    • 每个节点运行一个 Traefik Pod。
    • 可以确定哪些节点运行 Traefik,适合外部流量接入。
  • 缺点
    • 伸缩性较差。
2. Deployment
  • 特点
    • 集中部署 Traefik Pod。
    • 方便伸缩,适合内部流量接入。
  • 缺点
    • 无法确定具体运行节点。

部署 Traefik Ingress Controller

准备工作
  • 创建目录并下载配置文件:

    bash 复制代码
    mkdir /opt/traefik
    cd /opt/traefik
    wget https://raw.githubusercontent.com/containous/traefik/v1.7/examples/k8s/traefik-rbac.yaml
    wget https://raw.githubusercontent.com/containous/traefik/v1.7/examples/k8s/traefik-deployment.yaml
    wget https://raw.githubusercontent.com/containous/traefik/v1.7/examples/k8s/traefik-ds.yaml
    wget https://raw.githubusercontent.com/containous/traefik/v1.7/examples/k8s/ui.yaml
2. 部署步骤
  1. 启用 RBAC

    bash 复制代码
    kubectl apply -f traefik-rbac.yaml
  2. 部署 Traefik

    bash 复制代码
    kubectl apply -f traefik-deployment.yaml
  3. 部署 Traefik Web UI

    bash 复制代码
    kubectl apply -f ui.yaml
  4. 验证部署

    bash 复制代码
    kubectl get svc -o wide -n kube-system | grep traefik
    • 输出示例:

      复制代码
      traefik-ingress-service   NodePort    10.96.241.13   <none>        80:32383/TCP,8080:32133/TCP   103m   k8s-apptraefik-ingress-lb
      traefik-web-ui            ClusterIP   10.96.67.119   <none>        80/TCP                        101m   k8s-apptraefik-ingress-lb
  5. 访问 Web UI

    • 浏览器访问:http://<NodeIP>:32133/dashboard/

配置 Ingress HTTP 代理

1. 创建 Deployment 和 Service
yaml 复制代码
# ingress-nginx.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-app
spec:
  replicas: 2
  selector:
    matchLabels:
      name: nginx
  template:
    metadata:
      labels:
        name: nginx
    spec:
      containers:
        - name: nginx
          image: nginx
          ports:
            - containerPort: 80
---
apiVersion: v1
kind: Service
metadata:
  name: nginx-svc
spec:
  ports:
    - port: 80
      targetPort: 80
  selector:
    name: nginx
---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: nginx-test
spec:
  rules:
    - host: www.benet.com
      http:
        paths:
        - path: /
          pathType: Prefix
          backend:
            service:
              name: nginx-svc
              port:
                number: 80
2. 应用配置
bash 复制代码
kubectl apply -f ingress-nginx.yaml
3. 验证部署
  1. 查看 Pod 和 Service

    bash 复制代码
    kubectl get svc,pods -o wide
  2. 修改 Pod 内容

    bash 复制代码
    kubectl exec -it pod/nginx-app-<pod-id> -- bash
    echo 'this is web1' > /usr/share/nginx/html/index.html
  3. 测试访问

    bash 复制代码
    curl http://www.benet.com:32383
  4. 查看 Traefik UI

    • 刷新 Web UI 界面,查看生成的集群信息。
  • Traefik 是一个强大的 Ingress Controller,支持自动服务发现和动态配置更新。
  • 部署方式
    • DaemonSet:适合外部流量接入。
    • Deployment:适合内部流量接入,便于伸缩。
  • 功能
    • 提供 Web UI 界面,方便监控和管理。
    • 支持 HTTP/HTTPS 代理、负载均衡等高级功能。

参考文档Traefik 官方文档

相关推荐
用户0328472220701 天前
如何搭建本地yum源(上)
运维
武子康1 天前
调查研究-183 Apple container:Mac 上用轻量 VM 跑 Linux 容器,Swift 会改写本地容器体验吗?
docker·容器·apple
秋播1 天前
国内本地WSL2编译rancher源码
云原生
小猿姐3 天前
MySQL Top 10 热点问题 AI 运维实战:从内核诊断到云原生运维
mysql·云原生·aiops
阿里云云原生4 天前
深入内核:拆解 OpenTelemetry eBPF 探针如何优雅地“透视”多语言微服务?
云原生
大树884 天前
金刚石散热越强,管路越先见顶
大数据·运维·服务器·人工智能·ai
摇滚侠4 天前
Linux CentOS7 rpm 安装 MySQL 5.7
linux·运维·mysql
霸道流氓气质4 天前
领域驱动设计(DDD)在 Spring Boot 微服务中的实践指南
运维·spring boot·微服务
Inhand陈工4 天前
基于台达PLC与映翰通IG502的智慧水产养殖精准投喂与远程运维解决方案
运维·人工智能·物联网·阿里云·信息与通信
Alsn864 天前
等待学习-学习目录:Docker 容器安全攻防
学习·安全·docker