美文网首页
SKIL/安装/Amazon ECS

SKIL/安装/Amazon ECS

作者: hello风一样的男子 | 来源:发表于2019-04-22 17:37 被阅读0次

    Amazon ECS

    ECS(弹性容器服务)是一个AWS集群协调平台。ECS允许你部署和运行容器化的Docker应用程序,使用ECS命令行界面(ecs cli),通过几个简单的cli命令对它们进行缩放,以创建微服务。你也可以使用AWS Web UI控制台来管理你的ECS集群,而无需使用CLI。
    本文档将演示如何使用Fargate启动类型在ECS上设置SKIL集群。使用Fargate,不需要提供任何EC2实例,也不必担心在AWS中设置虚拟机的底层基础结构。

    ECS 概念

    任务定义
    任务定义包含指定如何运行容器的所有元数据。你可以在这里了解更多关于任务定义的信息。你可以从任务定义创建任务,任务定义是运行容器的主要执行点。任务可以在其中运行多个容器。如果需要使用卷共享资源,或者需要使用“localhost”访问彼此,最好在单个任务定义中指定多个容器。

    集群
    群集包含应用程序设置中要具有的所有相关任务。它可以包含多个任务定义、多个用于缩放和维护任务日志的实例化任务。

    先决条件
    确保你已经处理了以下先决条件。

    Docker

    要安装Docker,请参阅以下Mac说明或以下Windows说明。对于Linux,可以使用以下命令安装Docker。

    Shell

    sudo yum -y update
    sudo yum install -y docker 
    sudo systemctl start docker 
    sudo systemctl status docker
    sudo systemctl enable docker
    
    image.gif

    AWS CLI

    AWS CLI将用于创建安全组、打开端口、创建IAM角色以及将角色策略附加到创建的角色。按照此链接在系统中安装AWS CLI。或者可以在Linux环境中执行以下命令

    Shell

    curl "https://bootstrap.pypa.io/get-pip.py" -o "get-pip.py" # Installing pip if necessary
    sudo python get-pip.py
    
    pip install awscli --upgrade --user
    
    
    image.gif

    配置 AWS CLI

    通过执行aws configure,你可以使用cli配置你的aws帐户。主要设置配置为:

    1. IAM Access Key
    2. IAM Secret Key
    3. Default region (us-east-1 推荐)

    Shell

    aws configure
    
    image.gif

    ECS CLI

    ECS CLI用于ECS集群配置、部署任务定义、在集群内运行任务、管理和查看任务内运行容器的状态和日志。
    要安装ECS CLI,请访问此处
    对于Linux系统,可以使用以下命令。

    Shell

    sudo curl -o /usr/local/bin/ecs-cli https://s3.amazonaws.com/amazon-ecs-cli/ecs-cli-linux-amd64-latest
    sudo chmod +x /usr/local/bin/ecs-cli
    ecs-cli --version
    
    image.gif

    配置ECS CLI

    Amazon ECS需要权限,这样你的Fargate任务就可以将日志存储在CloudWatch中。任务执行IAM角色包含此权限。
    你需要在创建的IAM角色上附加AmazoneCastaskeExecutionRolePolicy策略。确保你拥有iam:CreateRole权限,能够使用你的iam帐户创建角色。
    使用ECS CLI使用你的凭据登录(分别用iam访问密钥和密钥替换<access_key>和<secret_key>)。

    Shell

    ecs-cli configure profile --profile-name my-ecs-profile --access-key <ACCESS_KEY> --secret-key <SECRET_KEY> # Provide with your ACCESS_KEY and SECRET_KEY
    
    image.gif

    创建一个名为“execution-assume-role.json”的文件,并将以下内容放入其中。

    JSON

    {
      "Version": "2012-10-17",
      "Statement": [
        {
          "Sid": "",
          "Effect": "Allow",
          "Principal": {
            "Service": "ecs-tasks.amazonaws.com"
          },
          "Action": "sts:AssumeRole"
        }
      ]
    }
    
    image.gif

    保存文件并以“ecseExecutionRole”的名称创建任务执行角色,将AmazonECSTaskExecutionRolePolicy附加到该文件。

    Shell

    aws iam --region us-east-1 create-role --role-name ecsExecutionRole --assume-role-policy-document file://execution-assume-role.json
    aws iam --region us-east-1 attach-role-policy --role-name ecsExecutionRole --policy-arn arn:aws:iam::aws:policy/service-role/AmazonECSTaskExecutionRolePolicy
    
    image.gif

    集群设置

    部署模式使用两个任务定义,一个指定zookeeper和mysql实例的配置,SKIL实例将连接到该配置,另一个任务定义具有SKIL实例的配置。这种分离的原因是可以轻松地缩放集群中的SKIL实例。如果我们在同一个任务定义中定义了所有容器实例,那么我们将不得不按比例缩放所有容器。但是对于SKIL集群的设置,我们只需要扩展SKIL实例,所有实例都将连接到同一个zookeeper和mysql任务。
    按如下方式配置集群名称、区域并指定集群配置的名称:

    Shell

    ecs-cli configure --cluster <CLUSTER_NAME> --region <REGION> --default-launch-type FARGATE --config-name <CLUSTER_CONFIG_NAME>
    
    ecs-cli up # Starting the cluster using the cluster configuration
    
    image.gif

    VPC 与子网配置

    由于SKIL实例需要连接到同一个专用网络,因此需要在同一个虚拟专用云中配置所有任务,并在任务定义中指定子网。
    可以在这里创建专有网络,并在这里为专有网络配置子网。确保在该区域中创建它们作为ECS集群。
    创建安全组和端口配置
    你需要打开入站流量所需的端口(2181、3306、8080、9008),以便稍后在任务运行时从远程Web浏览器访问SKIL UI。

    Shell

    aws ec2 create-security-group --group-name "<security_group_name>" --description "Security group for ECS (Shams)" --vpc-id "<vpc_id>"
    # You'll get the security group id after successfully executing the above command
    aws ec2 authorize-security-group-ingress --group-id "<security_group_id>" --protocol tcp --port 2181 --cidr 0.0.0.0/0
    aws ec2 authorize-security-group-ingress --group-id "<security_group_id>" --protocol tcp --port 3306 --cidr 0.0.0.0/0
    aws ec2 authorize-security-group-ingress --group-id "<security_group_id>" --protocol tcp --port 9008 --cidr 0.0.0.0/0
    aws ec2 authorize-security-group-ingress --group-id "<security_group_id>" --protocol tcp --port 8080 --cidr 0.0.0.0/0
    
    image.gif

    为任务定义编写文件和ECS配置
    容器在 docker-compose文件中定义,而ECS配置则在另一个文件中指定。ECS配置将包含任务执行角色名称、网络配置、网络模式、CPU和内存资源配置。
    将以下内容放入文件名docker-compose.yml中,用于zookeeper和mysql:

    YAML

    version: '2'
    services:
      zookeeper:
        image: zookeeper
        cpu_shares: 2048
        mem_limit: 4194304000
        ports:
          - "2181:2181"
        logging:
          driver: awslogs
          options: 
            awslogs-group: tutorial-zookeeper
            awslogs-region: us-east-1
            awslogs-stream-prefix: zookeeper
      mysql:
        image: mysql:5.5
        cpu_shares: 2048
        mem_limit: 4194304000
        ports:
          - "3306:3306"
        environment:
          - MYSQL_ALLOW_EMPTY_PASSWORD=true
          - MYSQL_DATABASE=skil_migrations
        logging:
          driver: awslogs
          options: 
            awslogs-group: tutorial-mysql
            awslogs-region: us-east-1
            awslogs-stream-prefix: mysql
    
    image.gif

    对于ECS配置,将以下脚本放在ecs-params.yml中。将<subnet_id>和<security_group_id>替换为你创建的子网ID和安全组ID。

    YAML

    version: 1
    task_definition:
      task_execution_role: ecsExecutionRole
      ecs_network_mode: awsvpc
      task_size:
        mem_limit: 8GB
        cpu_limit: 4096
    run_params:
      network_configuration:
        awsvpc_configuration:
          subnets:
            - "<subnet_id>"
          security_groups:
            - "<security_group_id>"
          assign_public_ip: ENABLED
    
    image.gif

    首先运行zookeeper和mysql服务,并注意正在运行的任务的私有IP地址。可以在这里找到ECS集群详细信息。

    Shell

    ecs-cli compose --project-name zksql-td service up --create-log-groups
    
    image.gif

    注意私有IP地址,如下图所示:

    Private ip address of the task image.gif ​

    任务的专有IP地址
    对于SKIL配置,你需要首先对Docker Hub上可用的skil-ce镜像进行一些修改。为此,请将以下内容粘贴到start-skil.sh中。

    Shell

    #!/usr/bin/env bash
    
    export SKIL_HOME=/opt/skil
    #export SKIL_CLASS_PATH=/opt/skil/lib/*:/opt/skil/native/*:/opt/skil/jackson-2.5.1/*
    export SKIL_LOG_DIR=/var/log/skil
    export SKIL_PID_FILE=/run/skil/skil.pid
    
    export SKIL_BACKEND=cpu
    export SKIL_LICENSE_PATH=/etc/skil/license.txt
    export SKIL_PUBLIC_KEY_PATH=/etc/skil/publickey.txt
    
    bash /opt/skil/sbin/pre-start.sh
    bash /opt/skil/sbin/start-skil-daemon
    
    echo "Waiting for all SKIL Services to start..."
    while [ $(jps | wc -l) != 5 ]
    do
        sleep 1s
    done
    
    until [ "grep join /var/log/skil/zeppelin-*.log" ]
    do
        sleep 1s
    done
    
    echo "SKIL Ready"
    
    tail -f /var/log/skil/*.log
    
    bash /opt/skil/sbin/stop-skil-daemon
    
    image.gif

    现在,用下面的脚本创建一个“Dockerfile”。

    Text

    FROM skymind/skil
    
    USER root
    
    ADD start-skil.sh /start-skil.sh
    RUN cat /start-skil.sh
    RUN chmod 755 /start-skil.sh
    
    RUN yum install -y mysql-connector-java && ln -s /usr/share/java/mysql-connector-java.jar /opt/skil/lib/mysql-connector-java.jar
    
    # PLD
    EXPOSE 9008
    # File Server
    EXPOSE 9508
    # Zeppelin
    EXPOSE 8080
    # DL4J UI first port
    EXPOSE 9002
    # ModelHistoryServer port
    EXPOSE 9100
    
    CMD ["/start-skil.sh"]
    
    image.gif

    现在你需要构建一个Docker镜像并将其上传到ECR仓库。确保你拥有ecr:DescribeRepositories权限来管理你在ECS上的ecr仓库。
    你可以在此处创建ECR仓库时获取仓库服务器的URI。为仓库命名为skymind/skil

    Creating ECR repository image.gif ​

    创建ECR仓库

    创建仓库后,执行以下命令来构建和推送修改后的SKIL镜像。

    Shell

    sudo `aws ecr get-login --no-include-email --region <REGION>` # 运行从执行backticks中的命令返回的命令
    sudo docker build -t skymind/skil:jdbc .
    sudo docker tag skymind/skil:jdbc <repo_server_uri>/skymind/skil:jdbc
    sudo docker push <repo_server_uri>/skymind/skil:jdbc
    
    image.gif

    现在,通过将下面的脚本粘贴到“skil-ce.yml”中,为SKIL实例创建另一个任务定义。用包含zookeeper和mysql实例的任务的私有IP地址替换`<task_private_ip>。

    YAML

    version: '2'
    services:
      skil:
        image: <repo_server_uri>/skymind/skil:jdbc
        cpu_shares: 4096
        mem_limit: 8388608000
        ports:
          - "9008:9008"
          - "8080:8080"
        environment:
          - SKIL_USE_EMBEDDED_DB=false
          - SKIL_DB_NAME=skil_migrations
          - SKIL_DB_DRIVER=com.mysql.jdbc.Driver
          - SKIL_DB_URL=jdbc:mysql://<task_private_ip>:3306/skil_migrations
          - SKIL_DB_USER=root
          - MODEL_HISTORY_SERVER_LAUNCH_DEFAULT=false  
          - ZEPPELIN_LAUNCH_DEFAULT=false  
          - ZOOKEEPER_HOST=<task_private_ip>
          - ZOOKEEPER_PORT=2181
          - ZOOKEEPER_EMBEDDED=false
        logging:
          driver: awslogs
          options: 
            awslogs-group: tutorial-skil
            awslogs-region: us-east-1
            awslogs-stream-prefix: skil
    
    image.gif

    现在,你可以运行SKIL服务并通过执行以下操作将它们连接到zookeeper和mysql进程:

    Shell

    ecs-cli compose --project-name skil-td --file skil-ce.yml service up --create-log-groups
    
    image.gif

    通过指定任务定义的名称,可以看到正在运行的容器进程:

    Shell

    ecs-cli compose --project-name zksql-td service ps
    ecs-cli compose --project-name skil-td service ps
    
    image.gif

    你可以使用下面的ecs-cli命令查看任务ID日志:

    Shell

    ecs-cli logs --task-id <task_id> --follow
    
    image.gif

    使用scale子命令增加所需任务的数量,并指定要从刚才定义的skil-td任务定义创建的SKIL实例的数量。

    Shell

    ecs-cli compose --project-name skil-td service scale 2
    ecs-cli compose --project-name skil-td service ps
    
    image.gif

    要删除你创建的正在运行的服务,请执行以下操作。

    Shell

    ecs-cli compose --project-name zksql-td service down
    ecs-cli compose --project-name skil-td service down
    ecs-cli down --force
    
    image.gif

    相关文章

      网友评论

          本文标题:SKIL/安装/Amazon ECS

          本文链接:https://www.haomeiwen.com/subject/ereugqtx.html