1. 程式人生 > >《Linkerd官方文件》在ECS中執行Linkerd

《Linkerd官方文件》在ECS中執行Linkerd

在ECS中執行

是一個容器管理服務。本指南將演示使用ECS中的Linkerd進行路由和監控您的服務。

概觀

本指南將演示如何將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例項上執行

需要注意的是linkerdconsul-agentconsul-registrator每個ECS節點上執行。在編寫本指南時,ECS排程程式沒有明確支援這一點。相反,我們使用AWS啟動配置來引導這三個基礎服務的每個ECS節點。我們仍然通過aws ecs start-task

命令啟動這些基礎服務,因此它們將作為執行ECS容器可見。

初始設定

設定一個你將用來訪問你的例項的金鑰對,或者省略引數來放棄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}]

安全組還開啟節點之間的每個埠。有關節點內通訊所需的所有埠的完整列表,請參閱的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

建立啟動配置

這一步定義了啟動配置。在 檔案指示 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

注意 檔案為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,即

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的更多資訊,請參閱 頁面。