在 AWS EC2 Advanced 上运行 DC/OS

使用 AWS CloudFormation 模板创建和扩展 DC/OS 群集

可以使用 AWS CloudFormation 模板创建和扩展 DC/OS 群集。高级模板包括:

  • 高度可自定义
  • 可堆叠;例如,您可以将多个代理池部署到同一个群集
  • 复杂;需要更多设置工作

高级 AWS CloudFormation 模板为创建和扩展 DC/OS 群集带来了优势和灵活性。通过这些模板,您可以从一整套 DC/OS 配置选项中进行选择。

  • 在现有的 VPC/子网组合上实例化完整的 DC/OS 群集。
  • 通过添加更多的 代理 节点来扩展和更新现有的 DC/OS 群集。

模板一起用于创建 DC/OS 群集。驱动这些模板的是 AWS CloudFormation 用于创建每个堆栈的参数。

重要信息:此安装方法不支持升级。

先决条件

硬件

您必须有 AWS EC2 m3.xlarge 实例。建议不要选择较小的 VM,而选择较少的 VM 可能会导致某些资源密集型服务(如分布式数据存储)无法正常工作。

软件

  • dcos_generate_config 文件:
  • 带根 IAM 权限的 Amazon Web Services 帐户。安装高级模板需要高级权限。如需更多信息,请联系 AWS 管理员。

  • 与群集相同分域的 AWS EC2 密钥对。密钥对不能跨分域共享。AWS 密钥对使用公钥加密功能提供对 AWS 群集的安全登录。有关创建 AWS EC2 密钥对的详细信息,请参阅 文档

  • AWS 命令行界面

  • CLI JSON 处理器 jq

  • 符合 bootstrap 节点 系统要求 的节点。

  • 具有读写访问权限的 AWS s3 bucket。

  • S3 bucket 必须具备 bucket 策略,以便让启动的 AWS 实例从 s3 bucket下载文件。以下是任何人均可下载的示例政策:

    {
      "Version":"2012-10-17",
      "Statement":[
        {
          "Sid":"AddPerm",
          "Effect":"Allow",
          "Principal": "*",
          "Action":["s3:GetObject"],
          "Resource":["arn:aws:s3:::<bucket_name>/<bucket_path>/*"]
        }
      ]
    }
    

有关 S3 bucket 策略的详细信息,请参阅 AWS 文档

创建模板

  1. 在节点的主目录中创建名为 genconf 的目录,然后导航到该目录。

    mkdir -p genconf
    
  2. genconf 目录中创建配置文件并另存为 config.yaml。此配置文件指定您的 AWS 凭据以及用于存储生成的原图的 S3 位置。

    企业和开源用户所需的参数为:

    Enterprise

    aws_template_storage_bucket: <your-bucket>
    aws_template_storage_bucket_path: <path-to-directory>
    aws_template_upload: true
    aws_template_storage_access_key_id: <your-access-key-id>
    aws_template_storage_secret_access_key: <your-secret-access_key>
    cluster_name: <cluster-name>
    安全:[宽容|严格]
    superuser_password_hash: <hashed-password>
    superuser_username: <username>
    zk_super_credentials: <userid>:<password>
    zk_master_credentials: <userid>:<password>
    zk_agent_credentials: <userid>:<password>
    

    Open Source

    aws_template_storage_bucket: <your-bucket>
    aws_template_storage_bucket_path: <path-to-directory>
    aws_template_upload: true
    aws_template_storage_access_key_id: <your-access-key-id>
    aws_template_storage_secret_access_key: <your-secret-access_key>
    

    有关参数描述和配置示例,请参阅 文档

  3. 使用指定的 AWS 参数运行 DC/OS 安装工具脚本。此命令创建 DC/OS 物件和模板的自定义版本并将其上传到指定的 s3 bucket。

    Enterprise

    sudo bash dcos_generate_config.ee.sh --aws-cloudformation
    

    Open Source

    sudo bash dcos_generate_config.sh --aws-cloudformation
    

    此 bucket 位置的根 URL 位于本步骤的末尾。您将看到以下消息:

    AWS CloudFormation templates now available at: https://<amazon-web-endpoint>/<path-to-directory>
    
  4. 转到 S3 并导航至上述 <path-to-directory> 中所示的 s3 bucket。

    1. 选择 cloudformation,然后选择管理节点所需数量的 zen 模板。例如,为单个管理配置选择 el7-zen-1.json
    2. 右键单击并选择 属性,然后复制 AWS S3 模板 URL。
  5. 转到 CloudFormation 并单击 创建堆栈

  6. 选择模板 页面指定 Zen 模板的 AWS S3 模板 URL 路径。例如:

    https://s3-us-west-2.amazonaws.com/user-aws/templates/config_id/14222z9104081387447be59e178438749d154w3g/cloudformation/ee.el7-zen-1.json
    

创建模板依赖关系

使用 zen.sh 脚本创建模板依赖关系。这些依赖关系将用作在 CloudFormation 中创建堆栈的输入信息。

  1. 将此脚本另存为 zen.sh

    #!/bin/bash
    export AWS_DEFAULT_OUTPUT="json"
    set -o errexit -o nounset -o pipefail
    
    if [ -z "${1:-}" ]
    then
      echo Usage: $(basename "$0") STACK_NAME
      exit 1
    fi
    
    STACK_NAME="$1"
    VPC_CIDR=10.0.0.0/16
    PRIVATE_SUBNET_CIDR=10.0.0.0/17
    PUBLIC_SUBNET_CIDR=10.0.128.0/20
    
    echo "Creating Zen Template Dependencies"
    
    vpc=$(aws ec2 create-vpc --cidr-block "$VPC_CIDR" --instance-tenancy default | jq -r .Vpc.VpcId)
    aws ec2 wait vpc-available --vpc-ids "$vpc"
    aws ec2 create-tags --resources "$vpc" --tags Key=Name,Value="$STACK_NAME"
    echo "VpcId: $vpc"
    
    ig=$(aws ec2 create-internet-gateway | jq -r .InternetGateway.InternetGatewayId)
    aws ec2 attach-internet-gateway --internet-gateway-id "$ig" --vpc-id "$vpc"
    aws ec2 create-tags --resources "$ig" --tags Key=Name,Value="$STACK_NAME"
    echo "InternetGatewayId: $ig"
    
    private_subnet=$(aws ec2 create-subnet --vpc-id "$vpc" --cidr-block "$PRIVATE_SUBNET_CIDR" | jq -r .Subnet.SubnetId)
    aws ec2 wait subnet-available --subnet-ids "$private_subnet"
    aws ec2 create-tags --resources "$private_subnet" --tags Key=Name,Value="${STACK_NAME}-private"
    echo "Private SubnetId: $private_subnet"
    
    public_subnet=$(aws ec2 create-subnet --vpc-id "$vpc" --cidr-block "$PUBLIC_SUBNET_CIDR" | jq -r .Subnet.SubnetId)
    aws ec2 wait subnet-available --subnet-ids "$public_subnet"
    aws ec2 create-tags --resources "$public_subnet" --tags Key=Name,Value="${STACK_NAME}-public"
    echo "Public SubnetId: $public_subnet"
    
  2. 运行 zen.sh 脚本,为指定 DC/OS 堆栈(STACK_NAME)设置可选标签值,或使用默认值 dcos。此值将用于在 AWS 中标记 DC/OS 群集。

    bash ./zen.sh <STACK_NAME>
    

    输出应如下所示:

    Creating Zen Template Dependencies
    VpcId: vpc-e0bd2c84
    InternetGatewayID: igw-38071a5d
    Private SubnetId: subnet-b32c82c5
    Public SubnetId: subnet-b02c55c4
    

使用这些依赖值作为输入,在后续步骤中创建您在 CloudFormation 中的堆栈。

在 CloudFormation 上启动模板

  1. 转到 CloudFormation 并单击 创建堆栈

    • 选择模板 页面,从您的工作站上传 Zen 模板,然后单击 下一步

      模板示例:

    • https://s3-us-west-2.amazonaws.com/dcos/templates/dcos/config_id/6a7451f6dec/cloudformation/ee.el7-zen-1.json Enterprise

    • https://s3-us-west-2.amazonaws.com/dcos/templates/dcos/config_id/6a7451f6dec/cloudformation/el7-zen-1.json Open Source

  2. 指定详情页面指定这些值,然后单击 下一步

    AWS UI

    图 1. AWS Advanced Web 界面

    • 堆栈名称 指定群集名称。
    • CustomAMI 可选:指定 AMI ID。如需更多信息,请参阅 使用自定义 AMI 进行安装
    • InternetGateway 指定 InternetGatewayID 脚本的 zen.sh 输出值。互联网网关 ID 必须附加于 VPC。该互联网网关用于所有节点向外互联网访问。
    • KeyName 指定 AWS EC2 密钥对。
    • MasterInstancEtype 指定 AWS EC2 实例类型。推荐 m3.xlarge 实例类型。
    • PrivateAgentInstancEcount 指定专用代理的数量。
    • PrivateAgentInstancEtype 指定专用代理节点的 AWS EC2 实例类型。推荐 m3.xlarge 实例类型。
    • PrivateSubnet 指定 zen.sh 脚本的 Private SubnetId 输出值。所有专用代理都将使用该子网 ID。
    • PublicAgentInstanceCount 指定公共代理的数量。
    • PublicAgentInstanceType 指定公共代理节点的 AWS EC2 实例类型。推荐 m3.xlarge 实例类型。
    • PublicSubnet 指定 Public SubnetId 脚本的 zen.sh 输出值。所有公共代理都将使用该子网 ID。
    • Vpc 指定 VpcId 脚本的 zen.sh 输出值。所有节点都将使用该 VPC 项下的子网和互联网网关启动。
  3. 选项 页面,接受默认值,然后单击 下一步

    注意: 您可以选择是否在有故障时退回。默认情况下,此选项设置为

  4. 查看 页面,选中确认框,然后单击 创建

    注意: 如果显示 创建新堆栈 页面,要么是 AWS 仍在处理您的请求,要么就是您查看的是其他分域。导航至正确的分域并刷新页面以查看您的堆栈。

监控 DC/OS 群集聚合过程

在 CloudFormation 中,您会看到:

  • 群集堆栈启动需要 15 到 20 分钟时间。您将为它们逐个创建堆栈,其中 <stack-name> 是您为堆栈名称指定的值,<stack-id> 是自动生成的 ID。

    AWS UI

    图 2. AWS 堆栈详细信息

    • Zen 模板:<stack-name>
    • 公共代理:<stack-name>-PublicAgentStack-<stack-id>
    • 专用代理:<stack-name>-PrivateAgentStack-<stack-id>
    • 管理节点:<stack-name>-MasterStack-<stack-id>
    • 基础架构 <stack-name>-Infrastructure-<stack-id>
  • 状态从 CREATE_IN_PROGRESS 变为 CREATE_COMPLETE

重要信息:ROLLBACK_COMPLETE 状态表示部署失败。如需实用故障信息,请参阅“事件”选项卡。

启动 DC/OS

可以通过输入管理节点主机名启动 DC/OS Web 界面。按照以下说明查找 Mesos 管理节点主机名。

  1. AWS CloudFormation 管理 页面,单击选中堆栈旁边的复选框。

  2. 单击 输出选项卡,复制/粘贴 Mesos 管理节点主机名,打开 DC/OS Web 界面。该界面在标准 HTTP 端口 80 上运行,因此无需在主机名后指定端口号。

    注意: 可能需要调整窗口大小以查看此选项卡。可以随时在 AWS CloudFormation 管理页面找到 DC / OS 主机名。

    Monitor stack creation

    图 3. Mesos 管理节点主机名

  3. 单击 登录到 DC/OS

    重要信息:单击“登录到 DC/OS”,浏览器就会显示您的连接不安全的警告。这是因为 DC/OS 使用自签名证书。可以忽略该错误,然后单击以继续。

    UI installer success

    图 4. 操作成功的画面

  4. 输入超级用户帐户的用户名和密码。

    注意: 默认用户名为 bootstrapuser,默认密码为 deleteme

    alt text

    图 5. 登录画面

成功了!

UI dashboard

图 6. DC/OS 仪表板

后续步骤

您的高级模板 DC/OS 安装已启动并运行,您可以添加更多代理节点。

添加更多代理节点

可以通过创建新的堆栈来添加更多代理节点。使用 advanced-priv-agent.jsonadvanced-pub-agent.json 模板。这些模板创建代理,然后作为 AutoScalingGroup 的一部分附加到 PrivateAgentStackPublicAgentStack

使用 zen.sh 脚本以及管理节点和基础架构堆栈的输出值。这些新的代理节点将自动添加到您的 DC/OS 群集。

专用代理:

  • InternalMasterLoadBalancerDnsName 指定主栈 (<stack-name>-MasterStack-<stack-id>)的 InternalMasterLoadBalancerDnsName 值。可以在 输出 选项卡中找到此值。
  • KeyName 指定 AWS EC2 密钥对。
  • PrivateAgentInstanceCount 指定专用代理的数量。
  • PrivateAgentInstanceType 指定专用代理节点的 AWS EC2 实例类型。推荐 m3.xlarge 实例类型。
  • PrivateAgentSecurityGroup 指定专用代理的安全组 ID。该组具备有限的外部访问权限。可以在基础架构堆栈 (<stack-name>-Infrastructure-<stack-id>) 的 输出 选项卡中找到此值。
  • PrivateSubnet 指定 zen.sh 脚本的 Private SubnetId 输出值。所有专用代理都将使用该子网 ID。

公共代理:

  • InternalMasterLoadBalancerDnsName 指定主栈 (<stack-name>-MasterStack-<stack-id>)的 InternalMasterLoadBalancerDnsName 值。可以在 输出 选项卡中找到此值。
  • KeyName 指定 AWS EC2 密钥对。
  • PublicAgentInstanceCount 指定公共代理的数量。
  • PublicAgentInstanceType 指定公共代理节点的 AWS EC2 实例类型。推荐 m3.xlarge 实例类型。
  • PublicAgentSecurityGroup 指定公共代理的安全组 ID。该组具备有限的外部访问权限。可以在基础架构堆栈 (<stack-name>-Infrastructure-<stack-id>) 的 输出 选项卡中找到此值。
  • PublicSubnet 指定 zen.sh 脚本的 Public SubnetId 输出值。所有公共代理都将使用该子网 ID。

对于所有高级配置选项,请参阅模板参考 文档

限制

  • 经过修改的模板不支持升级。
  • 不支持添加代理和任务隔离。
  • 无法扩展管理节点大小。
  • 您必须处于扁平网络空间(由我们的基础架构模板控制)。如果无法使用我们的基础架构模板,您可以更改我们的模板且需自行承担风险。我们可能会更改基础架构模板,您必须支持此类后续变更。

模板参考

如需完整的高级配置选项,请参阅模板参考 文档