《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
+linkerd
+consul-agent
基礎構造中單獨部署,由hello
,world
和world-v2
服務組成linkerd-viz
:ECS任務與基礎ECS
+linkerd
+consul-agent
配置分開部署,為所有服務流量提供監控儀表板consul-server
:服務發現後端,在單個EC2例項上執行
需要注意的是linkerd
,consul-agent
和consul-registrator
在每個ECS節點上執行。在編寫本指南時,ECS排程程式沒有明確支援這一點。相反,我們使用AWS啟動配置來引導這三個基礎服務的每個ECS節點。我們仍然通過aws ecs start-task
初始設定
設定一個你將用來訪問你的例項的金鑰對,或者省略引數來放棄ssh訪問。
KEY_PAIR=<MY KEY PAIR NAME>
建立一個安全組,允許外部訪問以下內容:
- ssh:22
linkerd
路由:4140linkerd
管理使用者介面:9990linkerd-viz
:3000consul-agent
和consul-server
UI:8500GROUP_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容器,hello
, world
,和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配置和引導linkerd
, consul-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
注意 檔案為linkerd
,consul-agent
以及consul-registrator
中的每個動態生成配置檔案,使用具體到其上執行的ECS例項資料。
建立Auto Scaling組
此步驟實際上基於上面定義的啟動配置建立EC2例項。完成後,我們應該有兩個ECS節點,每個節點執行 linkerd
,consul-agent
和consul-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動態路線運往從world
到world-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的更多資訊,請參閱 頁面。