麦斯科技 · 2023年04月23日 · 四川

使用Linkerd和基于Arm的Kubernetes集群管理分布式服务

https://community.arm.com/arm-community-blogs/b/infrastructure-solutions-blog/posts/service-mesh-with-linkerd-and-arm-based-k8s

作者:Pranay Bakre 2023年4月14日

GettyImages_2D00_1025155222.jpg_2D00_900x506x2.jpg

边缘计算的兴起给云原生架构的世界带来了新的挑战。由于应用程序同时在边缘和云上运行,管理和保护这些分布式环境可能是一项复杂的任务。服务网格(Service meshes)已经成为这一挑战的解决方案,它提供了先进的流量管理、安全性和可观察性功能,这些功能对于分布式环境中的有效应用程序管理至关重要。

Linkerd提供了一个高效的服务网格解决方案,可以有效地管理和保护边缘或云中的集群。它通过在每个服务实例旁边注入一个轻量级代理(sidecar)来处理服务之间的通信。该代理具有非常低的CPU和RAM占用空间,为流量提供了安全且最小的延迟开销。由于项目维护人员和社区的贡献和支持,Linkerd自2.9版起就可以在Arm64上使用。

Linkerd提供了一个称为多集群的功能,它可以实现不同Kubernetes集群中运行的服务之间的无缝通信。这些集群可以跨越多个云、数据中心或边缘位置。在多集群设置中,Linkerd在每个集群中部署一个控制平面,使其能够管理该集群中运行的服务。这种多集群设置通过在集群之间镜像服务信息来工作。远程服务作为Kubernetes服务工作,因此所有的可观察性、安全性和路由特性都适用于所有这些集群。现在让我们来看一个用例。

用例:在基于Arm的Kubernetes集群上使用Linkerd管理分布式服务

在这里,我们描述了如何在云到边缘场景中跨多集群服务网格连接应用程序。我们在云端和边缘部署了运行在基于Arm的Kubernetes集群上的Linkerd多集群设置。我们还展示了边缘到云场景中的流量管理、安全、应用程序实时监控、全局可观察性、流量拆分等功能。用例的高层流程如下:
. 部署两个基于Arm的Kubernetes集群——一个在边缘/本地,另一个在云中(带有Graviton2节点的Amazon EKS)
. 两个集群上的Linkerd多集群设置和配置
. 在边缘集群和云集群上部署服务并建立通信
. 确保两个集群的服务之间的通信安全
. 展示具有流量拆分的故障切换场景

配置:

先决条件:

. 两个Kubernetes集群——

   . 在树莓派或Arm供电笔记本电脑(M1等)上运行的K3s/K3d集群
   . 带有基于AWS Graviton2的工作节点的Amazon EKS集群

.Kuectl安装在您的本地机器上,用于与集群交互
.本地计算机上安装的Linkerd(https://linkerd.io/2.12/getting-started/) cli

确保这两个集群都可以通过kubectl访问。下图显示了EKS集群和kubectl命令的结果。

Linkerd_Blog_Arm_Image1.png-1265x0.png

Linkerd_Blog_Arm_Image2.png-1265x0.png

我们现在已经准备好在两个集群上安装Linkerd了。Linkerd需要在多集群设置中的两个集群之间存在共享信任锚点。这会对集群之间的流量进行加密,使其受到保护,不会对互联网开放。按照此链接中给出的说明安装步骤cli。使用以下命令为我们的两个集群生成根证书。

step certificate create root.linkerd.cluster.local root.crt root.key \

--profile root-ca --no-password --insecure

这将在我们的集群之间形成一种共同的信任关系。现在,使用这个信任锚点,让我们为集群生成证书

step certificate create identity.linkerd.cluster.local issuer.crt issuer.key \

  --profile intermediate-ca --not-after 8760h --no-password --insecure \

  --ca root.crt --ca-key root.key

现在,让我们在两个集群上安装Linkerd。为了简单起见,我们将我们的EKS集群称为云,将我们的边缘/本地集群称为边缘。运行以下命令在两个集群上安装linkerd CRD

linkerd install --crds |

  | tee \

    >(kubectl --context=edge apply -f -) \

    >(kubectl --context=cloud apply -f -)

现在,在两个集群中安装Linkerd控制平面

linkerd install \

  --identity-trust-anchors-file root.crt \

  --identity-issuer-certificate-file issuer.crt \

  --identity-issuer-key-file issuer.key \

  | tee \

    >(kubectl --context=edge apply -f -) \

    >(kubectl --context=cloud apply -f -)

我们还将安装Linkerd-viz扩展,该扩展安装集群上的度量堆栈(on-cluster metric stack)和仪表板(dashboard)

for ctx in edge cloud; do

  linkerd --context=${ctx} viz install | \

    kubectl --context=${ctx} apply -f - || break
    
    done

安装完成后,我们现在需要安装多集群组件

for ctx in edge cloud; do

  echo "Installing on cluster: ${ctx} ........."

  linkerd --context=${ctx} multicluster install | \

    kubectl --context=${ctx} apply -f - || break

  echo "-------------"
  
  done

我们还需要激活Kubernetes命名空间中的网关组件——linkerd multicluster。这是一个注入了linkerd代理的简单容器。使用以下命令

for ctx in edge cloud; do

  echo "Checking gateway on cluster: ${ctx} ........."

  kubectl --context=${ctx} -n linkerd-multicluster \

    rollout status deploy/linkerd-gateway || break

  echo "-------------"
  
  done

现在,两个集群中都安装了linkerd控制平面,我们现在可以链接集群并开始镜像服务。若要将边缘簇链接到云,请运行以下命令:

linkerd --context=cloud multicluster link --cluster-name cloud |

  kubectl --context=edge apply -f –

运行以下命令检查边缘集群是否可以访问云集群及其服务

linkerd --context=west multicluster check

一旦成功完成,我们将添加一些可以在两个集群中镜像的服务。执行以下操作,在“test”命名空间中的两个集群中添加两个部署——frontend和podinfo

 for ctx in edge cloud; do
 
  echo "Adding test services on cluster: ${ctx} ........."

  kubectl --context=${ctx} apply \

    -n test -k "github.com/linkerd/website/multicluster/${ctx}/"

  kubectl --context=${ctx} -n test \

    rollout status deploy/podinfo || break

  echo "-------------"

done

在边缘集群上运行以下命令以检查其状态:

kubectl --context=edge -n test port-forward svc/frontend 8080

访问上的URLhttp://localhost:8080并检查它在边缘集群上的外观。

现在,默认情况下,所有的请求都是通过互联网发送的。使用Linkerd,我们可以在两个集群中扩展mTLS功能,确保流量得到加密。运行以下命令进行验证:

linkerd --context=edge -n test viz tap deploy/frontend | \

  grep "$(kubectl --context=cloud -n linkerd-multicluster get svc linkerd-gateway \

    -o "custom-columns=GATEWAY_IP:.status.loadBalancer.ingress[*].ip")"

tls=true表示请求正在被加密。

Linkerd还允许在多集群设置中进行故障切换。我们可以通过使用TrafficSplit来实现这一点。它允许我们定义多个服务之间的权重,并在它们之间分配流量。对于我们的集群,让我们将podinfo服务分为边缘和云。运行以下命令在两个服务之间划分流量。对podinfo的新请求将有50%的时间转发到podinfo云集群,另50%转发到本地podinfo。

kubectl --context=edge apply -f - <<EOF

apiVersion: split.smi-spec.io/v1alpha1

kind: TrafficSplit

metadata:

  name: podinfo

  namespace: test

spec:

  service: podinfo

  backends:

  - service: podinfo

    weight: 50

  - service: podinfo-cloud

    weight: 50

EOF

现在,刷新URL几次http://localhost:8080,应该显示来自两个集群的信息。

要查看trafficsplit的指标,请使用以下命令启动仪表板

linkerd viz dashboard

单击以下URL查看仪表板–http://localhost:50750.我们应该看到如下回应

Linkerd_Blog_Arm_Image3.png-1265x0.png

结论

在分布式计算环境中,管理和保护服务之间的通信可能具有挑战性。有了服务网格,我们可以通过为在云中或边缘基于Arm的Kubernetes集群上运行的各种云原生工作负载提供可见性、安全性、弹性和可扩展性等来应对这些挑战。Linkerd提供了一个轻量级、高效的服务网格,它专注于跨集群通信,而不更改应用程序。

加入我们在Kubecon EU 2023的Linkerd Day(https://events.linuxfoundation.org/kubecon-cloudnativecon-europe/co-located-events/linkerd-day/),了解更多关于此类用例的信息!

Arm生态系统开发高级总监Cheryl Hung也将于2023年4月19日星期三在KubeCon发表关于“从头开始的多架构基础设施”(https://sched.co/1HyaY)的演讲。欢迎加入,了解开发人员在为其运行工作负载的性价比需求选择最佳硬件解决方案时所面临的挑战。

推荐阅读
关注数
5760
内容数
525
定期发布Arm相关软件信息,微信公众号 ArmSWDevs,欢迎关注~
目录
极术微信服务号
关注极术微信号
实时接收点赞提醒和评论通知
安谋科技学堂公众号
关注安谋科技学堂
实时获取安谋科技及 Arm 教学资源
安谋科技招聘公众号
关注安谋科技招聘
实时获取安谋科技中国职位信息