【问题标题】:Kubernetes Ingress - Load balancer traffic splitKubernetes Ingress - 负载均衡器流量拆分
【发布时间】:2021-01-19 16:20:27
【问题描述】:

我有一个 nginx 类的 kubernetes 入口和两个负载均衡器。在 GKE v1.17 上运行。

示例入口 yaml:

apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
  name: my-ingress
  annotations:
    nginx.ingress.kubernetes.io/rewrite-target: /$1
    nginx.ingress.kubernetes.io/backend-protocol: "HTTPS"
    kubernetes.io/ingress.class: "nginx"
    # Enable client certificate authentication
    nginx.ingress.kubernetes.io/auth-tls-verify-client: "on"
    # Create the secret containing the trusted ca certificates
    nginx.ingress.kubernetes.io/auth-tls-secret: "production/client-cert-secret"
    # Specify the verification depth in the client certificates chain
    nginx.ingress.kubernetes.io/auth-tls-verify-depth: "1"
    # Automatically redirect http to https
    nginx.ingress.kubernetes.io/force-ssl-redirect: "true"
    # Use regex in paths
    nginx.ingress.kubernetes.io/use-regex: "true"
    # Allow larger request body
    nginx.ingress.kubernetes.io/proxy-body-size: 30m
    # For notifications we add the proxy headers
    nginx.ingress.kubernetes.io/configuration-snippet: |  
      proxy_set_header Upgrade $http_upgrade;
      proxy_set_header Connection "upgrade";
spec:
  tls:
    - hosts:
      - my-domain.com
      secretName: my-tls-certificate
  rules:
  - host: my-domain.com
    http:
      paths:
      - path: /(.*)
        backend:
          serviceName: load-balancer-1
          servicePort: 443

我希望在两个负载均衡器之间拆分到达入口的流量。 例如:

load-balancer-1 将获得 90% 的流量

load-balancer-2 将获得 10% 的流量

如何使用 Kubernetes 入口来做到这一点?

【问题讨论】:

    标签: nginx kubernetes kubernetes-ingress nginx-ingress


    【解决方案1】:

    nginx 入口控制器通过Canary Annotations 支持金丝雀部署

    在某些情况下,您可能希望“金丝雀”一组新的更改 向不同的服务发送少量请求而不是 生产服务。 canary 注释使 Ingress 规范能够 充当路由请求的替代服务,具体取决于 适用的规则。配置canary的以下注解可以 在设置nginx.ingress.kubernetes.io/canary: "true" 后启用:

    • nginx.ingress.kubernetes.io/canary-weight: 基于整数 (0 - 100) 应路由到服务的随机请求的百分比 在金丝雀 Ingress 中指定。权重为 0 意味着没有 请求将通过此发送到 Canary 入口中的服务 金丝雀规则。权重为 100 意味着将发送所有请求 到 Ingress 中指定的替代服务。

    请注意,当您将入口标记为金丝雀时,所有其他 非金丝雀注释将被忽略(继承自 对应的主要入口)除了 nginx.ingress.kubernetes.io/load-balance 和 nginx.ingress.kubernetes.io/upstream-hash-by.

    已知限制

    目前每个 Ingress 最多可以应用一个 Canary Ingress 规则。

    换句话说,你可以在你设置注解的地方引入一个新的 Ingress Object my-ingress-canary

    • nginx.ingress.kubernetes.io/canary: "true"(告诉 Nginx Ingress 将此标记为“Canary”,并通过匹配主机和路径将此入口与主入口相关联。

    • nginx.ingress.kubernetes.io/canary-weight: "10"(将 10% 的流量路由到 load-balancer-2)

    apiVersion: networking.k8s.io/v1beta1
    kind: Ingress
    metadata:
      name: my-ingress-canary
      annotations:
        nginx.ingress.kubernetes.io/canary: "true"
        nginx.ingress.kubernetes.io/canary-weight: "10"
    spec:
      rules:
      - host: my-domain.com
        http:
          paths:
          - path: /(.*)
            backend:
              serviceName: load-balancer-2
              servicePort: 443
    
    

    【讨论】:

    • 非常好的答案,我不明白他们为什么不统一 ingresses 如何实现金丝雀版本。Traefik 有更好的 conf : .... name: my-ingress annotations: traefik.ingress.kubernetes.io /服务权重:| lb-1:50% lb-2:50% 规范:规则:-主机:my-domain.com http:路径:-路径:/后端:服务名称:lb-1 服务端口:443-路径:/后端:服务名称: lb-2 服务端口:443
    • 是的,有很多事情可以用 L7 组件完成,而这些组件不在 ingress 的原生规范中。粘性会话和基于标头的路由是另外两个示例。我猜他们想保持规范的简洁和通用,但是当像金丝雀部署这样的核心内容无法原生规范时,人们将自己锁定在像 nginx och Traeffic 这样的产品中
    猜你喜欢
    • 2019-06-06
    • 2019-06-23
    • 2019-05-27
    • 1970-01-01
    • 2019-04-23
    • 1970-01-01
    • 1970-01-01
    • 2021-12-07
    • 2012-08-27
    相关资源
    最近更新 更多