k8s给多个外部(非容器)静态IP作负载均衡、反向代理

在 Kubernetes (K8s) 中,Ingress、Endpoints 和 Service 是三个重要的概念,它们协作实现了集群内部和外部应用程序的访问和服务发现。

Ingress:

  • Ingress 用于提供集群外部到集群内部服务的 HTTP/HTTPS 路由。
  • Ingress 定义了访问集群内部服务的规则,如路径映射、虚拟主机等。
  • Ingress 通常需要搭配 Ingress Controller 来实现实际的流量转发和负载均衡。
  • Ingress 位于应用程序的前端,处理七层(HTTP/HTTPS)流量。

Endpoints:

  • Endpoints 用于记录提供某个 Service 的 Pod 的 IP 地址和端口信息。
  • Endpoints 由 Kubernetes 根据 Pod 的变化自动创建和管理,生命周期与 Pod 相关。
  • Endpoints 位于应用程序的后端,主要用于服务发现,记录提供服务的 Pod 信息。
  • Endpoints 通过 Pod 的 IP 地址和容器端口直接提供访问。

Service:

  • Service 用于对外暴露应用程序的访问入口,提供四层(TCP/UDP)的负载均衡功能。
  • Service 由用户通过 YAML 文件进行配置,生命周期独立于 Pod。
  • Service 位于应用程序的前端,处理四层(TCP/UDP)流量。
  • Service 通过 ClusterIP、NodePort 或 LoadBalancer 方式提供访问。

Ingress、Endpoints 和 Service 的关系:

  • Ingress 定义了从集群外部到集群内部服务的 HTTP/HTTPS 路由规则。
  • Service 根据 Endpoints 信息提供四层负载均衡,Endpoints 记录了提供服务的 Pod或 IP信息。
  • Ingress 将流量转发到对应的 Service,Service 再根据 Endpoints 信息进行负载均衡和流量分发。

总的来说,Ingress、Endpoints 和 Service 在 K8s 中协作完成了应用程序的访问和服务发现。Ingress 负责处理集群外部到集群内部的 HTTP/HTTPS 流量路由,Service 提供了应用程序的访问入口和四层负载均衡功能,Endpoints 则记录了提供服务的 Pod或 IP信息。它们共同实现了 K8s 中应用程序的访问和部署。

以下是给多个外部静态IP作负载均衡、反向代理,先创建 Service+Endpoints:

apiVersion: v1
kind: Service
metadata:
  name: zl-lb
  namespace: wetwin
spec:
  #type: ExternalName # 可用于单IP
  #externalName: "10.254.18.46" 
  type: ClusterIP
  ports:
  - port: 80
    protocol: TCP
    targetPort: 80
 
---
apiVersion: v1
kind: Endpoints
metadata:
  name: zl-lb
  namespace: wetwin
subsets:
- addresses: #单机IP时不需要
  - ip: 10.254.18.46
  - ip: 10.254.18.47
  ports:
  - port: 80
    protocol: TCP

 

再创建 Ingress:

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  annotations:
    kubernetes.io/ingress.class: nginx
    nginx.ingress.kubernetes.io/proxy-body-size: 500M
    nginx.ingress.kubernetes.io/rewrite-target: /$1
    nginx.ingress.kubernetes.io/server-snippet: | #防爬
      if ($http_user_agent ~* (Scrapy|Go-http-client|HttpClient|curl)) {
        return 403;
      }
    # 配置负载均衡策略为 round-robin
    nginx.ingress.kubernetes.io/load-balancing-scheme: round-robin
    # 在响应头中添加真实的客户端 IP 地址
    nginx.ingress.kubernetes.io/real-ip-header: X-Real-IP
    # 在响应头中添加后端 Pod 名称
    nginx.ingress.kubernetes.io/service-name-header: Backend-Pod
  name: xxx.your-domain.com
  namespace: wetwin #自定义

spec:
  ingressClassName: nginx
  rules:
  - host: xxx.your-domain.com #自定义
    http:
      paths:
      - backend:
          service:
            name: zl-lb
            port:
              number: 80
        path: /lb/(zl/.*) #自定义
        pathType: Prefix
  tls: #可选
  - hosts:
    - xxx.your-domain.com
    secretName: xxx.com
status:
  loadBalancer:
    ingress:
    - ip: 10.254.18.55 #出口IP

 

在这个示例中:

  1. nginx.ingress.kubernetes.io/rewrite-target: /$1 注解告诉 Ingress 控制器将匹配到的 URL 路径中的捕获组 $1 重写到后端服务的实际路径。
  2. path: /xxx/(.*) 定义了一个前缀匹配路径 /xxx/,并使用一个捕获组 (.*) 来捕获后面的任意路径。
  3. 当用户访问 /xxx/anything 时,Ingress 控制器会将请求重写为 /anything,并转发到后端的服务。
  4. nginx.ingress.kubernetes.io/load-balancing-scheme: round-robin 注解配置了 Ingress 使用轮询(round-robin)的负载均衡策略。
  5. nginx.ingress.kubernetes.io/real-ip-header: X-Real-IP 注解告诉 Ingress 控制器在响应头中添加名为 X-Real-IP 的键,其值为真实的客户端 IP 地址。
  6. nginx.ingress.kubernetes.io/service-name-header: Backend-Pod 注解告诉 Ingress 控制器在响应头中添加名为 Backend-Pod 的键,其值为后端 Pod 的名称。

通过这种方式,您可以灵活地将传入的 URL 路径映射到后端服务的正确路径,而无需在后端服务中硬编码这些路径。这对于迁移或重构现有应用程序非常有用。

除了 rewrite-target 注解,Ingress 还支持其他一些路径重写相关的注解,如 nginx.ingress.kubernetes.io/app-rootnginx.ingress.kubernetes.io/use-regex 等,您可以根据需求进行配置。

 

然后模拟后台服务返回:

while true; do nc -lp 80 -c "echo -e 'HTTP/1.1 200 ok\nX-Real-IP: 10.254.18.47\n\nOK'" ;done

 

访问效果如下 :

 

大功告成!

 

posted @ 2024-08-27 11:21  sunsky303  阅读(54)  评论(0编辑  收藏  举报
显示搜索