《Linkerd官方文档》在ECS中运行Linkerd

在ECS中运行

Amazon ECS是一个容器管理服务。本指南将演示使用ECS中的Linkerd进行路由和监控您的服务。

本指南中引用的所有命令和配置文件都可以在 linkerd-examples repo中找到

概观

本指南将演示如何将Linkerd设置为服务网格,用于服务发现的Consul,hello-world示例应用程序以及用于监控的linkerd-viz,这些都位于全新的ECS集群上。

以下组件构成系统:

  • ECS:Docker容器管理。每个ECS实例都运行以下Docker容器:
    • linkerd:代理请求 hello-world
    • consul-agent:本地服务发现代理
    • consul-registrator:Docker和Consul之间的桥梁,自动向consul注册服务
  • hello-world:示例ECS任务从ECS+ linkerd+ consul-agent基础构造中单独部署,由helloworldworld-v2服务组成
  • linkerd-viz:ECS任务与基础ECS+ linkerd+ consul-agent配置分开部署,为所有服务流量提供监控仪表板
  • consul-server:服务发现后端,在单个EC2实例上运行

《Linkerd官方文档》在ECS中运行Linkerd

需要注意的是linkerdconsul-agentconsul-registrator每个ECS节点上运行。在编写本指南时,ECS调度程序没有明确支持这一点。相反,我们使用AWS启动配置来引导这三个基础服务的每个ECS节点。我们仍然通过aws ecs start-task命令启动这些基础服务,因此它们将作为运行ECS容器可见。

初始设置

本指南假定您已经为AWS配置了适当的IAM,密钥对和VPC。欲了解更多信息,请点击此处:http : //docs.aws.amazon.com/AmazonECS/latest/developerguide/get-set-up-for-amazon-ecs.html

设置一个你将用来访问你的实例的密钥对,或者省略参数来放弃ssh访问。

KEY_PAIR=<MY KEY PAIR NAME>

创建一个安全组,允许外部访问以下内容:

  • ssh:22
  • linkerd 路由:4140
  • linkerd 管理用户界面:9990
  • linkerd-viz:3000
  • consul-agentconsul-serverUI:8500
    GROUP_ID=$(aws ec2 create-security-group --group-name l5d-demo-sg --description "Linkerd Demo" | jq -r .GroupId)
        aws ec2 authorize-security-group-ingress --group-id $GROUP_ID /
          --ip-permissions /
          FromPort=22,IpProtocol=tcp,ToPort=22,IpRanges=[{CidrIp="0.0.0.0/0"}] /
          FromPort=4140,IpProtocol=tcp,ToPort=4140,IpRanges=[{CidrIp="0.0.0.0/0"}] /
          FromPort=9990,IpProtocol=tcp,ToPort=9990,IpRanges=[{CidrIp="0.0.0.0/0"}] /
          FromPort=3000,IpProtocol=tcp,ToPort=3000,IpRanges=[{CidrIp="0.0.0.0/0"}] /
          FromPort=8500,IpProtocol=tcp,ToPort=8500,IpRanges=[{CidrIp="0.0.0.0/0"}] /
          IpProtocol=-1,UserIdGroupPairs=[{GroupId=$GROUP_ID}]

安全组还打开节点之间的每个端口。有关节点内通信所需的所有端口的完整列表,请参阅linkerd-examples repo的ECS任务定义文件

Consul服务器

出于演示目的,我们在ECS集群外运行一个Consul服务器。

aws ec2 run-instances --image-id ami-7d664a1d /
  --instance-type m4.xlarge /
  --user-data file://consul-server-user-data.txt /
  --placement AvailabilityZone=us-west-1a /
  --tag-specifications "ResourceType=instance,Tags=[{Key=Name,Value=l5d-demo-consul-server}]" /
  --key-name $KEY_PAIR --security-group-ids $GROUP_ID

我们用l5d-demo-consul-server来标记这个实例。然后,我们将在每个ECS节点上运行的consul-agent配置中引用此标记。这使得 consul-agent找到consul-server

ECS集群

创建一个名为l5d-demo的新ECS集群

aws ecs create-cluster --cluster-name l5d-demo

我们可以参考l5d-demo在引导我们的ECS节点时,以指示他们加入我们刚刚创建的ECS群集。

角色策略

创建角色策略以允许ECS实例启动任务并描述实例。

aws iam put-role-policy --role-name ecsInstanceRole --policy-name l5dDemoPolicy --policy-document file://ecs-role-policy.json

我们需要这种ecs:StartTask能力,因为我们的启动配置将在每个ECS节点上启动我们的三项基础任务。我们需要这种 ec2:DescribeInstances能力,因为consul-agent需要通过l5d-demo-consul-server实例标签来查找consul-server

注册任务定义

这些任务定义描述了我们如何配置和引导所有五个应用程序,需要注意的是hello-world介绍了三种独立的Docker容器,helloworld,和world-v2

aws ecs register-task-definition --cli-input-json file://linkerd-task-definition.json
aws ecs register-task-definition --cli-input-json file://linkerd-viz-task-definition.json
aws ecs register-task-definition --cli-input-json file://consul-agent-task-definition.json
aws ecs register-task-definition --cli-input-json file://consul-registrator-task-definition.json
aws ecs register-task-definition --cli-input-json file://hello-world-task-definition.json

创建启动配置

这一步定义了启动配置。在 ecs-user-data.txt 文件指示 Launch Configuration配置和引导linkerdconsul-agent以及consul-registrator每个ECS节点上。

aws autoscaling create-launch-configuration /
  --launch-configuration-name l5d-demo-lc /
  --image-id ami-7d664a1d /
  --instance-type m4.xlarge /
  --user-data file://ecs-user-data.txt /
  --iam-instance-profile ecsInstanceRole /
  --security-groups $GROUP_ID /
  --key-name $KEY_PAIR

注意 ecs-user-data.txt 文件为linkerdconsul-agent以及consul-registrator中的每个动态生成配置文件,使用具体到其上运行的ECS实例数据。

创建Auto Scaling组

此步骤实际上基于上面定义的启动配置创建EC2实例。完成后,我们应该有两个ECS节点,每个节点运行 linkerdconsul-agentconsul-registrator

aws autoscaling create-auto-scaling-group /
  --auto-scaling-group-name l5d-demo-asg /
  --launch-configuration-name l5d-demo-lc /
  --min-size 1 --max-size 3 --desired-capacity 2 /
  --tags ResourceId=l5d-demo-asg,ResourceType=auto-scaling-group,Key=Name,Value=l5d-demo-ecs,PropagateAtLaunch=true /
  --availability-zones us-west-1a

我们用l5d-demo-ecs命名实例,以便稍后以编程方式查找它们。

部署hello-world

现在我们已经部署了所有的基础服务,我们可以部署一个示例应用程序。该hello-world任务由hello服务,world服务和world-v2服务组成。为了演示服务间通信,我们通过linkerd配置hello服务来调用world服务。

aws ecs run-task --cluster l5d-demo --task-definition hello-world --count 2

请注意,我们已经部署了hello-worldd两个实例,这导致了两个 hello容器,两个world容器和两个world-v2容器。

测试一切正常

我们通过l5d-demo-ecs名称选择一个任意的ECS节点,然后通过Linkerd curlhello服务:

# Select an ECS node
ECS_NODE=$( /
  aws ec2 describe-instances /
    --filters Name=instance-state-name,Values=running Name=tag:Name,Values=l5d-demo-ecs /
    --query Reservations[*].Instances[0].PublicDnsName --output text /
)

# test routing via Linkerd
http_proxy=$ECS_NODE:4140 curl hello
Hello (172.31.20.160) World (172.31.19.35)!!

# view Linkerd and Consul UIs (osx)
open http://$ECS_NODE:9990
open http://$ECS_NODE:8500


我们刚测试过的请求流程:

curl– > linkerd– > hello– > linkerd– >world

测试动态请求路由

由于我们的hello-world任务还包括一项world-v2服务,我们来测试每个请求路由:

http_proxy=$ECS_NODE:4140 curl -H 'l5d-dtab: /svc/world => /svc/world-v2' hello
Hello (172.31.20.160) World-V2 (172.31.19.35)!!

通过设置l5d-dtab,我们指示Linkerd动态路线运往从worldworld-v2 的所有请求。

《Linkerd官方文档》在ECS中运行Linkerd

有关更多信息,请查看 动态请求路由

linkerd,即

linkerd-viz收集并显示所有linkerd在集群中运行的指标。在部署之前,让我们通过我们的系统加载一些负载:

while true; do http_proxy=$ECS_NODE:4140 curl -s -o /dev/null hello; done

现在部署一个linkerd-viz实例:

aws ecs run-task --cluster l5d-demo --task-definition linkerd-viz --count 1

# find the ECS node running linkerd-viz
TASK_ID=$(aws ecs list-tasks --cluster l5d-demo --family linkerd-viz --desired-status RUNNING --query taskArns[0] --output text)
CONTAINER_INSTANCE=$(aws ecs describe-tasks --cluster l5d-demo --tasks $TASK_ID --query tasks[0].containerInstanceArn --output text)
INSTANCE_ID=$(aws ecs describe-container-instances --cluster l5d-demo --container-instances $CONTAINER_INSTANCE --query containerInstances[0].ec2InstanceId --output text)
ECS_NODE=$(aws ec2 describe-instances --instance-ids $INSTANCE_ID --query Reservations[*].Instances[0].PublicDnsName --output text)

# view linkerd-viz (osx)
open http://$ECS_NODE:3000

如果一切正常,我们应该看到像这样的仪表板:

《Linkerd官方文档》在ECS中运行Linkerd

进一步阅读

有关配置Linkerd的更多信息,请参阅 Linkerd配置页面。

有关linkerd-viz的更多信息,请参阅 linkerd-viz GitHub repo

原创文章,作者:ItWorker,如若转载,请注明出处:https://blog.ytso.com/93953.html

(0)
上一篇 2021年8月16日 11:57
下一篇 2021年8月16日

相关推荐

发表回复

登录后才能评论