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

补充

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
陈述式命令
kubectl create ingress <ingress-name> \
  --rule=<域名>/<路径>=<service-name>:<service-port> \
  --class=<ingress-class>
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. 基于域名的代理转发
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. 基于路径的代理转发
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:
    kubectl create secret tls tls-secret --cert=tls.crt --key=tls.key
    
  • 配置 Ingress:
    tls:
    - hosts:
      - www.example.com
      secretName: tls-secret
    
4. Basic Auth 认证
  • 创建认证文件:
    htpasswd -c auth admin
    
  • 创建 Secret:
    kubectl create secret generic basic-auth --from-file=auth
    
  • 配置 Ingress:
    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. 路径重写
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)
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. 创建目录并下载部署文件
    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 字段,并将其修改为阿里云镜像
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值