【问题标题】:AWS ECS unable to place a task because no container instance met all of its requirementsAWS ECS 无法放置任务,因为没有容器实例满足其所有要求
【发布时间】:2019-08-02 20:15:54
【问题描述】:

我正在使用 .NET Core WEBAPI 及以下 Dockerfile

FROM microsoft/dotnet:sdk AS build-env
WORKDIR /app

# Copy csproj and restore as distinct layers
COPY *.csproj ./
RUN dotnet restore

# Copy everything else and build
COPY . ./
RUN dotnet publish -c Release -o out

# Build runtime image
FROM microsoft/dotnet:aspnetcore-runtime
WORKDIR /app
COPY --from=build-env /app/out .
ENTRYPOINT ["dotnet", "DummyService.dll"]

在我的 cloudformation 模板中,ECS 部分是这样的

  dummyWebApiEcsTaskDefinition:
Type: AWS::ECS::TaskDefinition
Properties:
  Family: !Ref AWS::StackName
  TaskRoleArn: !GetAtt dummyWebApiIamRole.Arn
  ContainerDefinitions:
    - Name: !Ref AWS::StackName
      Image: MY IMAGE URL
      DnsSearchDomains:
        - !Join [".", [{"Fn::ImportValue": !Sub "${accountStackName}-${AWS::Region}-envName"}, "connected", !If [chinaPartition, "TEST", "CORP"], "cloud"]]
      LogConfiguration:
        LogDriver: splunk
        Options:
          splunk-token: {"Fn::ImportValue": !Sub "${splunkHECStackName}-${AWS::Region}-SplunkHECToken"}
          splunk-url: "http://splunk-forwarder:8088"
          splunk-insecureskipverify: True
          tag: !Ref AWS::StackName
          splunk-format: json
          splunk-source: !Ref AWS::StackName
          splunk-sourcetype: AWS:ECS
      EntryPoint: []
      PortMappings:
        - ContainerPort: 5000
      Command: []
      Cpu: 0
      Environment:
        - Name: BindAddress
          Value: http://0.0.0.0:5000
        - Name: MinLogLevel
          Value: !If [isProduction, "Information", "Debug"]
      Ulimits: []
      DnsServers: []
      MountPoints: []
      DockerSecurityOptions: []
      Memory: 512
      VolumesFrom: []
      Essential: true
      ExtraHosts: []
      ReadonlyRootFilesystem: false
      DockerLabels: {}
      Privileged: false

  dummyEcsService:
Type: AWS::ECS::Service
DependsOn:
  - dummyWebApiIamRole
  - dummyInternalAlb
  - dummyAlbTargetGroup
Properties:
  Cluster:
    Fn::ImportValue: !Sub "cld-core-ecs-${AWS::Region}-ECSCluster"
  DeploymentConfiguration:
    MaximumPercent: 200
    MinimumHealthyPercent: 50
  DesiredCount: 2
  LoadBalancers:
    - ContainerName: !Ref AWS::StackName
      ContainerPort: 5000
      TargetGroupArn: !Ref dummyAlbTargetGroup
  PlacementStrategies:
    - Type: spread
      Field: attribute:ecs.availability-zone
  TaskDefinition: !Ref dummyWebApiEcsTaskDefinition
  ServiceName: !Ref AWS::StackName
  Role: !Sub "arn:${AWS::Partition}:iam::${AWS::AccountId}:role/aws-service-role/ecs.amazonaws.com/AWSServiceRoleForECS"

部署无法完成,我可以在 ECS 服务事件选项卡中看到此错误

service cld-dummy-test 无法放置任务,因为没有容器实例满足其所有要求。原因:在您的集群中没有找到容器实例。

【问题讨论】:

  • 您正在为日志使用 Splunk 驱动程序。你确定你的/etc/ecs.config 有包含ECS_AVAILABLE_LOGGING_DRIVERS=["splunk","awslogs"]. 的条目吗?。
  • @Imran 谢谢伊姆兰。您的观点不是对这个问题的直接回答,而是针对我在解决这个问题后面临的下一个问题。我将在下面发布答案。

标签: amazon-web-services docker .net-core amazon-ecs


【解决方案1】:

我最终明白了这一点。下面的错误消息表明该集群中没有 EC2,因此无法启动任何容器。我们没有使用 Fargate。

service cld-dummy-test 无法放置任务,因为没有容器实例满足其所有要求。原因:在您的集群中没有找到容器实例。

要将 EC2 注册到集群,您需要遵循这篇 AWS 文章。 https://docs.aws.amazon.com/AmazonECS/latest/developerguide/launch_container_instance.html

请注意,您启动的 EC2 需要具有以下用户数据才能注册。

#!/bin/bash
echo ECS_CLUSTER=your_cluster_name >> /etc/ecs/ecs.config

完成上述操作后,您应该不会看到有关“无容器”的错误。但是,如果您像我一样,在模板中有 splunk 日志记录部分。你会遇到一个不同的问题,它说没有容器可以用于任务,因为它缺少一个属性。这是一条非常模糊的消息,属性可以是任务定义页面底部列出的任何内容。

就我而言,它是 splunk 日志记录。需要将 splunk 驱动程序添加到 EC2 实例中。因为后来我发现我们不再需要 splunk,所以我删除了 splunk 部分。但是,如果您想这样做,您可能需要将以下行添加到您的用户数据中。

ECS_AVAILABLE_LOGGING_DRIVERS=["splunk","awslogs"]

我希望这对某人有所帮助。

【讨论】:

    【解决方案2】:

    AWS ECS 有两种启动类型配置:

    • 法盖特
    • Fargate + EC2

    在这两种情况下,您都无法访问底层资源。

    所以在启动类型配置中可能导致您无法启动任务,否则您可以从 ecs 仪表板选择启动类型并选择任务定义。

    【讨论】:

    • 你的意思是 Fargate 还是 EC2?说到底层资源,Fargate 是一个无服务器的解决方案,所以没有底层资源可以访问,这是真的。但在 EC2 的情况下并非如此。在这种情况下,您的任务正在运行实际的 EC2 机器,因此您实际上可以通过 SSH 或使用 SSM 访问它们。
    【解决方案3】:

    我也遇到了同样的错误,但是我使用 ecs-cli 创建集群、任务和服务,因此手动将 EC2 实例注册到集群已经完成(如sheepinwild 的回答所建议的那样)。

    为我们解决问题的是确保分配给实例的 IAM 角色具有 AWS 托管策略 AmazonEC2ContainerServiceforEC2Role。我发现这一点是因为我们有另一个成功运行的 ECS 实例进行比较。如果您使用的是 ecs-cli,这就是您传递的角色,就像 ecs-cli up --instance-role HERE。或者,您也可以传递 --capability-iam,这将创建一个具有正确策略的新角色,并将其分配给您的实例。有关AWS KB for ecs-cli 的更多信息。

    【讨论】:

      猜你喜欢
      • 2019-04-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-11-20
      • 1970-01-01
      • 2020-12-25
      • 1970-01-01
      • 2019-10-15
      相关资源
      最近更新 更多