1

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

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

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 服务都在这个培训存储库中。

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

4

2 回答 2

2

tl;dr:nginx 入口需要Service资源Endpoint才能被视为有效的流量目的地。repo 中的架构创建了三个Service资源,其中一个充当 anapex并且没有Endpoint资源,因为它没有选择器,因此 nginx 入口不会向它发送流量,因此leaf服务不会获得流量。

存储库中的示例遵循 SMI 规范,定义了一个顶点服务和两个服务。该web-apex服务没有任何端点,因此 nginx 不会向它发送流量。

根据SMI Spec services can be self-referential,这意味着一个服务既可以是apex也可以是叶子服务,所以要在这个例子中使用 nginx 入口,你可以修改TrafficSplit 定义,将spec.service值从更改web-apexweb-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
于 2021-01-05T17:26:42.807 回答
1

我在 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 团队。它就像一个魅力。

于 2021-01-05T15:39:18.370 回答