【问题标题】:Linkerd traffic split with Nginx Ingress ControllerLinkerd 使用 Nginx 入口控制器拆分流量
【发布时间】:2021-04-08 17:21:10
【问题描述】:

我已经部署了一个 Linkerd 服务网格,并且我的 Kubernetes 集群配置了 Nginx 入口控制器作为 DaemonSet,并且所有入口在 Linkerd 上也可以正常工作。最近,我添加了流量拆分功能来运行我的蓝/绿设置,我可以通过单独的入口资源访问这些服务。我已经按照here 的描述创建了一个 apex-web 服务。如果我在内部与您联系此服务,它会完美运行。我创建了另一个入口资源,但无法在集群外部测试蓝/绿功能。我想提一下,我已经将(注入 Linkerd 代理)连接到我的所有 Nginx pod,但它正在从 Nginx 返回“503 Service Temporarily Unavailable”消息。

我浏览了文档并在this 之后创建了入口,我可以确认以下注释已添加到入口资源中。

annotations:
kubernetes.io/ingress.class: "nginx"
nginx.ingress.kubernetes.io/configuration-snippet: |
  proxy_set_header l5d-dst-override $service_name.$namespace.svc.cluster.local:$service_port;
  grpc_set_header l5d-dst-override $service_name.$namespace.svc.cluster.local:$service_port;

但集群外部仍然没有运气。

我正在使用给定的 emojivoto 应用程序进行测试,所有流量拆分和 apex-web 服务都在 this 培训存储库中。

我不太确定出了什么问题以及如何在集群外部解决此问题。如果有人帮助我解决这个 Linkerd,蓝/绿问题,我将不胜感激。

【问题讨论】:

    标签: nginx kubernetes kubernetes-ingress linkerd servicemesh


    【解决方案1】:

    tl;dr:nginx 入口 requiresService 资源具有 Endpoint 资源,以便被视为有效的流量目的地。 repo 中的架构创建了三个Service 资源,其中一个充当apex 并且没有Endpoint 资源,因为它没有选择器,因此nginx 入口不会向它发送流量,而@987654329 @services 不会因此获得流量。

    repo 中的示例遵循 SMI 规范,定义了一个 apex 服务和两个 leaf 服务。 web-apex 服务没有任何端点,所以 nginx 不会向它发送流量。

    根据SMI Spec,服务可以是自引用,这意味着一个服务既可以是apex,也可以是leaf服务,因此要在本例中使用 nginx 入口,您可以修改 TrafficSplit definition 以将 spec.service 值从 web-apex 更改为 web-svc

    apiVersion: split.smi-spec.io/v1alpha1
    kind: TrafficSplit
    metadata:
      name: web-svc-ts
      namespace: emojivoto
    spec:
      # The root service that clients use to connect to the destination application.
      service: web-svc
      # Services inside the namespace with their own selectors, endpoints and configuration.
      backends:
      - service: web-svc
        # Identical to resources, 1 = 1000m
        weight: 500m
      - service: web-svc-2
        weight: 500m
    

    【讨论】:

      【解决方案2】:

      我在 Linkerd Slack 频道中提出了这个问题,并在社区的大力支持下解决了这个问题。似乎 Nginx 不喜欢没有端点的服务。我的配置是正确的,并要求将流量拆分中指向的服务更改为具有端点的服务并解决了问题。

      简而言之,我的流量拆分配置了 web-svc 和 web-svc-2 服务。我已将流量拆分 spec.service 更改为相同的 web-svc 并且它有效

      这里是更新后的分流配置。

      apiVersion: split.smi-spec.io/v1alpha1
      kind: TrafficSplit
      metadata:
        name: web-svc-ts
        namespace: emojivoto
      spec:
        # The root service that clients use to connect to the destination application.
        service: web-svc
        # Services inside the namespace with their own selectors, endpoints and configuration.
        backends:
        - service: web-svc
          # Identical to resources, 1 = 1000m
          weight: 500m
        - service: web-svc-2
          weight: 500m
      

      感谢支持我解决此问题的 Linkerd 团队。它就像一个魅力。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-06-29
        • 2020-02-12
        • 2021-10-19
        • 2019-04-17
        • 2018-11-15
        相关资源
        最近更新 更多