我有多個,containers/images例如admin(django)nginx(httpserver)
我的系統在下面。
port80-> nginx -> port8011 -> admin
我想將這些部署在fargate.
但是我仍然很困惑。
兩個影像,兩個容器,兩個任務定義,兩個負載均衡器就可以了。
但是只有 nginx 的一個公共 IP?
如何在容器之間連接?
目前我的源代碼如下所示。
我熟悉 docker-compose,但不熟悉 aws fargate。
任何幫助表示贊賞。
const VPCID='vpc-0867d6797e62XXXXX';
const vpc = ec2.Vpc.fromLookup(this, "VPC", {
vpcId:VPCID
//isDefault: true,
});
const cluster = new ecs.Cluster(this, "SampleCluster", {
vpc:vpc,
clusterName: "StAdminNginxCluster"
});
const adminRepo = ecr.Repository.fromRepositoryArn(this, 'AdminRepository', 'arn:aws:ecr:ap-northeast-1:678100XXXXXX:repository/st_admin_site');
const nginxRepo = ecr.Repository.fromRepositoryArn(this, 'NginxRepository', 'arn:aws:ecr:ap-northeast-1:678100XXXXXX:repository/st_nginx');
const adminImage = ecs.ContainerImage.fromEcrRepository(adminRepo,"latest");
const nginxImage = ecs.ContainerImage.fromEcrRepository(nginxRepo,"latest");
//make task definition
const taskDefinitionAdmin = new ecs.FargateTaskDefinition(this, "TaskDefAdmin",{
memoryLimitMiB: 512,
cpu: 256,
});
const taskDefinitionNginx = new ecs.FargateTaskDefinition(this, "TaskDefNginx",{
memoryLimitMiB: 512,
cpu: 256,
});
const adminContainer = taskDefinitionAdmin.addContainer("AdminContainer", {
image: adminImage,
});
const nginxContainer = taskDefinitionNginx.addContainer("NginxContainer", {
image: nginxImage,
});
adminContainer.addPortMappings({
containerPort: 8011
});
nginxContainer.addPortMappings({
containerPort: 80
})
const ecsServiceAdmin = new ecs.FargateService(this, "ServiceAdmin", {
cluster,
taskDefinition:taskDefinitionAdmin,
desiredCount: 2
});
const ecsServiceNginx = new ecs.FargateService(this, "ServiceNginx", {
cluster,
taskDefinition:taskDefinitionNginx,
desiredCount: 2
});
const lbAdmin = new elb.ApplicationLoadBalancer(this, "LBAdmin", {
vpc: cluster.vpc,
internetFacing: true
});
const listenerAdmin = lbAdmin.addListener("Listener", { port: 8011 });
const targetGroupAdmin = listenerAdmin.addTargets("ECSAdmin", {
protocol: elb.ApplicationProtocol.HTTP,
port: 8011,
targets: [ecsServiceAdmin]
});
const lbNginx = new elb.ApplicationLoadBalancer(this, "LBNginx", {
vpc: cluster.vpc,
internetFacing: true
});
const listenerNginx = lbNginx.addListener("Listener", { port: 80 });
const targetGroupNginx = listenerNginx.addTargets("ECS", {
protocol: elb.ApplicationProtocol.HTTP,
port: 80,
targets: [ecsServiceNginx]
});
這個 docker-compose 有效。
version: "3.9"
services:
admindjango:
image: 678100XXXXXX.dkr.ecr.ap-northeast-1.amazonaws.com/st_admin_site:latest
ports:
- "8011:8011"
restart: always
nginx:
image: 678100XXXXXX.dkr.ecr.ap-northeast-1.amazonaws.com/st_nginx:latest
ports:
- '80:80'
depends_on:
- admindjango
更新
我使用兩個容器和一個任務定義。
我只是打addContainer了兩次電話taskDifinition。
(暫時忽略loadbalancer)
您也可以通過 127.0.0.1:XXX 訪問每個容器。
它很適合我的目的。謝謝@Mark B
const taskDefinitionAdmin = new ecs.FargateTaskDefinition(this, "TaskDefAdmin",{
memoryLimitMiB: 512,
cpu: 256,
});
const adminContainer = taskDefinitionAdmin.addContainer("AdminContainer", {
image: adminImage,
});
adminContainer.addPortMappings({
containerPort: 8011,
hostPort: 8011
});
const nginxContainer = taskDefinitionAdmin.addContainer("NginxContainer", {
image: nginxImage,
});
nginxContainer.addPortMappings({
containerPort: 80,
hostPort: 80
})
const adminSG = new ec2.SecurityGroup(this, 'admin-server-sg', {
vpc,
allowAllOutbound: true,
description: 'security group for a web server',
});
adminSG.addIngressRule(
ec2.Peer.anyIpv4(),
ec2.Port.tcp(80),
'allow SSH access from anywhere',
);
const ecsAdminService = new ecs.FargateService(this, "AdminService", {
cluster,
taskDefinition:taskDefinitionAdmin,
desiredCount: 2,
vpcSubnets: {subnetType: ec2.SubnetType.PUBLIC },
assignPublicIp: true,
securityGroups:[adminSG]
});
uj5u.com熱心網友回復:
如何在容器之間連接?
在您當前的配置中,您無法在容器之間直接連接。您必須讓 Nginx 連接到連接到 Django 任務的內部負載均衡器。
Web 瀏覽器 -> 公共 Nginx 負載均衡器 -> Nginx 容器 -> 私有 Django 負載均衡器 -> Django 容器。
我建議考慮在同一個 ECS 任務中運行這兩個容器。只有一個負載均衡器和一半的 Fargate 實體,您可能會節省一大筆錢。流量將如下所示:
Web 瀏覽器 -> 公共負載均衡器 -> 埠 80 上的 Nginx 容器 -> 埠 8011 上的 Django 容器。
在這種情況下,您可以將 Nginx 配置為將請求代理到127.0.0.1:8011. 127.0.0.1同一任務中的所有容器都可以在 Fargate 實體內相互連接。請參閱此處的 Fargate 網路檔案。
更高級的設定是讓每個容器作為單獨的任務運行,并使用AWS App Mesh進行內部容器通信,而不是內部負載均衡器。對于您的情況,這可能有點矯枉過正,更適合在具有許多獨立部署的微服務的大型環境中。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/430423.html
