当前位置: 首页 > 知识库问答 >
问题:

Linkerd流量分配与Nginx入口控制器

周和歌
2023-03-14

我已经部署了一个Linkerd服务网格,我的库伯内特斯集群配置了Nginx入口html" target="_blank">控制器作为DaemonSet,所有入口也可以在Linkerd上正常工作。最近,我添加了一个流量拆分功能来运行我的蓝色/绿色设置,我可以使用单独的入口资源访问这些服务。我创建了一个顶点Web服务,如下所述。如果我在内部联系到您此服务,它会完美运行。我创建了另一个入口资源,我无法在集群之外测试蓝色/绿色功能。我想提一下,我已经将(注入Linkerd代理)啮合到我的所有Nginx pod,但它正在从Nginx返回“503 Service Temporally Un可用性”消息。

我通过留档,并在此之后创建了入口,我可以确认以下注释已添加到入口资源。

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,蓝色/绿色问题,我将不胜感激。

共有2个答案

方鸿振
2023-03-14

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

repo中的示例遵循SMI规范,定义了一个apex服务和两个leaf服务。< code>web-apex服务没有任何endpoint,因此nginx不会向其发送流量。

根据SMI Spec服务可以是自引用的,这意味着服务可以是顶点服务和叶服务,因此要在本例中使用nginx入口,您可以修改Tra0014 Split定义以将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
宗晟
2023-03-14

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

简而言之,我的流量拆分配置了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团队。它非常有效。

 类似资料:
  • 我正在AWS EKS上设置NGINX入口控制器。 我浏览了k8s入口资源,它非常有助于理解我们将LB端口映射到k8s服务端口,例如file Def。我安装了nginx控制器,直到必要的步骤。然后教程指示我创建一个入口资源。 我错过了什么?

  • 操作系统:RHEL7|k8s版本:1.12/13|kubes祈祷|裸机 我部署了一个标准的kubespray裸机集群,我正在尝试了解部署nginx ingress controller的最简单推荐方法是什么,它将允许我部署简单的服务。没有提供负载平衡器。我希望我的主公共IP作为我的服务的endpoint。 Github k8s ingress nginx建议将节点端口服务作为“强制”步骤,这似乎不

  • 我在RedHat EC2实例上安装了Minikube v1.3.1以进行一些测试。 由于nginx-ingress-控制器默认使用的端口已经在使用中,我正在尝试在部署中更改它们,但没有结果。有人能建议如何做吗? 如何知道端口已在使用? 当我使用命令kubectl-n kube system get deployment | grep nginx列出系统吊舱时,我得到: nginx入口控制器0/1

  • 以下是我遵循的步骤- kubectl apply-f https://raw.githubusercontent.com/kubernetes/ingress-nginx/master/deploy/static/mandatory.yaml kubectl apply-f https://raw.githubusercontent.com/kubernetes/ingress-nginx/mas

  • 我试图创建一个入口控制器,它指向我通过Nodeport公开的服务。 以下是入口控制器的yaml文件(摘自https://kubernetes.io/docs/tasks/access-application-cluster/ingress-minikube/):

  • 我创建了一个EKS集群,并部署了一个带有应用程序负载平衡器的NGINX入口控制器。我部署了一个示例应用程序,并将其绑定到我的域名。这是入口文件- 当我打开测试时。美国广播公司。在我的浏览器中,它返回一个404 but测试。美国广播公司。xyz工作正常。我错过什么了吗?我想要测试。美国广播公司。xyz/游戏工作和测试。美国广播公司。xyz返回404。 更新-我按照本教程部署应用程序-https://