问题描述
我有一个简单的CDK堆栈,用于通过ApplicationLoadBalancedEc2Servic
部署docker容器。部署效果很好。但是当我升级时通过将docker容器设置为hasura/graphql-engine:v1.3.1-beta.1
,更新将永久进行,最后输出如下:
12:23:01 | UPDATE_IN_PROGRESS | AWS::CloudFormation::Stack
| HasuraStack
12:23:32 | UPDATE_IN_PROGRESS | AWS::ECS::Service
| Hasura/Service/Service
我认为这与将CapacityCapacity和minCapacity设置为1有关。一旦我进入AWS控制台并将其手动设置为0,更新就可以工作了。我尝试了不同的minCapacity / maxCapacity / desiredCapacity配置,但没有成功。
最好的结果是让2个实例运行,旧实例缓慢消耗掉,新实例将所有新流量重定向到。有什么简单的方法可以实现相同目标并获得更新吗?短暂的停机时间也是可以接受的。
代码如下:
const cluster = new Cluster(this,'Cluster',{
vpc: props.vpc,});
cluster.addCapacity('ASGroupCapacity',{
instanceType: new InstanceType(props.instanceType || 't3.micro'),});
this.service = new ApplicationLoadBalancedEc2Service(this,'Hasura',{
publicLoadBalancer: true,cluster,// assignPublicIp: props.hasuraServiceProps?.assignPublicIp || true,domainName: `${props.subDomain}.${props.zone.zoneName}`,domainZone: props.zone,protocol: ApplicationProtocol.HTTPS,memoryReservationMiB: 512,desiredCount: 1,taskImageOptions: {
image: ContainerImage.fromregistry('hasura/graphql-engine:v1.3.0'),containerPort: 8080,environment: {
HASURA_GRAPHQL_DATABASE_URL: props.connectionString,HASURA_GRAPHQL_ENABLE_TELEMETRY: 'true',HASURA_GRAPHQL_ENABLE_CONSOLE: 'true',HASURA_GRAPHQL_JWT_SECRET: `{"type": "HS256","key": "${this.jwtSecret.secretValue.toString()}"}`,},secrets: {
HASURA_GRAPHQL_ADMIN_SECRET: Secret.fromSecretsManager(this.secret),});
解决方法
分享一下,我遇到了类似的情况。
对于群集容量,我设置了以下内容:
cluster.addCapacity("my-scaling-group",{
instanceType: ec2.InstanceType.of(
ec2.InstanceClass.T3A,ec2.InstanceSize.SMALL
),minCapacity: 1,maxCapacity: 3
});
我发现最重要的一点是与注销延迟有关,默认值为5分钟(= 300秒)。
service.targetGroup.setAttribute("deregistration_delay.timeout_seconds","30")
整个重新部署大约需要10分钟