文档

部署和运维包含容器资源的私有部署服务

更新时间:

创建包含容器资源的私有部署服务时,在模板中除了定义创建服务需要的云资源外,还需要定义ACK集群类型的K8s容器资源。在服务和服务实例运维的过程中,也可以对容器资源进行更新操作。本文介绍在计算巢中如何部署和运维含有容器资源的私有部署服务。

背景信息

在创建包含容器资源的私有部署服务时,你需要了解如下信息:

  • ROS模板是用于定义所需的云计算资源(例如:ECS实例、RDS数据库实例)、资源间的依赖关系等。ROS的编排引擎将根据模板自动完成所有资源的创建和配置,实现自动化部署及运维。更多信息,请参见录入模板

  • ACK集群是用于管理容器化应用和服务。更多信息,请参见ACK集群概述

创建包含容器部署的私有部署服务

  1. 创建ROS模板。

    创建模板时,除了定义需要的云资源外,还需要在模板中定义中控机的UserData或者单独的RunCommand。关于创建模板,请参见录入模板

    编写服务ROS模板时,至少需要包含容器服务的两个资源。结构示例

    根据架构图创建一个名为ManagedKubernetesCluster的ACK容器服务集群和EcsInstanceJumpBox的中控机。

    1. ACK容器服务集群(ManagedKubernetesCluster),用于部署容器资源。

    2. 中控机 (EcsInstanceJumpBox),用于访问容器服务集群。容器服务部署和运维时,可以在中控机上应用或更新容器模板。

    模板中定义容器部署流程时,至少包含以下步骤:

    1. 安装需要的容器资源管理客户端(helm/kubectl)。

    2. 保存ACK集群的kubeconfig信息。

    3. 应用定义的容器模板,在集群中创建容器资源。

    示例中只展示了创建一个nginx的Pod的内容,完整的ROS模板内容,请参见参考模板

    说明

    如果您要运行该示例,需要开放VPC公网访问权限,否则可能会运行失败。

          UserData:
            Fn::Sub:
              - |
                #!/bin/bash
                yum install -y kubernetes-client.x86_64
                mkdir -p ~/.kube
                echo '${KubeConfig}' >> ~/.kube/config
                echo '${ApplicationYaml}' > ~/application.yaml
                sleep 10
                kubectl --kubeconfig ~/.kube/config apply -f ~/application.yaml --validate=false
              - KubeConfig:
                  Fn::GetAtt:
                    - ManagedKubernetesCluster
                    - PrivateUserKubConfig
                ApplicationYaml: |
                  apiVersion: v1
                  kind: Pod
                  metadata:
                   name: nginx
                  spec:
                   containers:
                   - name: nginx
                     image: nginx
                     imagePullPolicy: IfNotPresent
  2. 创建私有部署服务。

    关于创建私有部署服务的操作,请参见创建私有部署服务

    在创建服务界面的录入模板区域中的模板内容处,填写步骤1的模板内容或上传已保存的模板内容。

创建和查看服务实例

  1. 创建服务实例。

    创建包含容器资源的服务实例和创建私有部署服务实例步骤一致,更多信息,请参考创建私有部署服务实例

  2. 查看服务实例。

    1. 在左侧导航栏中,单击服务实例

    2. 找到您创建的服务实例,单击服务实例ID。进入服务实例详情页。

    3. 单击资源,在云资源页签的所属产品列中,找到容器服务Kubernetes版的资源,单击资源ID。2024-05-17_16-45-38.png

    4. 在容器服务控制台,您可以查看ACK集群信息和已经创建的Pod。

      容器资源

运维服务实例

如果需要更新容器资源,可以在服务实例的运维管理页面,通过发送远程命令来实现。下文以新建一个Pod为例。

  1. 登录计算巢控制台

  2. 在左侧导航栏中,选择服务实例

  3. 找到您创建的服务实例,单击服务实例ID。进入服务实例详情页面。

  4. 单击运维管理,在应用运维框中单击发送远程命令

  5. 在弹窗的执行命令选型区域,设置参数类型命令内容运行目录超时时间的相关参数。

    其中在命令内容框中,您可以通过以下任意一种方式输入执行命令。

    • 命令内容框中,直接输入执行命令。

      cat <<EOF > ~/nginx.yml
      apiVersion: v1
      kind: Pod
      metadata:
       name: nginx2
      spec:
        containers:
        - name: nginx
          image: nginx
          imagePullPolicy: IfNotPresent
      EOF
      
      kubectl apply -f ~/nginx.yml --validate=false

      输入命令

    • 命令内容框中,调用OSS中已经创建的脚本。

      1. 创建YAML文件,文件内容如下:

        apiVersion: v1
        kind: Pod
        metadata:
         name: nginx2
        spec:
          containers:
          - name: nginx
            image: nginx
            imagePullPolicy: IfNotPresent
      2. 将YAML文件上传到OSS。更多信息,请参见控制台上传文件

      3. 通过kubectl apply命令,调用OSS中已经上传的脚本文件。调用命令

  6. 选择实例区域,设置目标实例信息。

    选择手动选择实例并选择相应的实例。目标实例

  7. 单击下一步,确认设置参数信息,然后单击创建

    可在运维管理页签中,查看任务进度。

    任务进度

    待任务执行完成后,可到ACK集群中查看新创建的Pod。此处是新增了一个名称为nginx2的Pod。

    新建资源

参考模板

此处展示了包含容器资源的私有部署服务完整的ROS模板。

ROSTemplateFormatVersion: '2015-09-01'
Description:
  zh-cn: 创建ACK集群和跳板机并使用kubectl部署(新建VPC)。
  en: Create ACK Cluster And JumpBox Ecs, Deploy with kubectl -f yaml with new vpc.
Parameters:
  VpcId:
    Type: String
    AssociationProperty: ALIYUN::ECS::VPC::VPCId
    Description:
      zh-cn: 请选择已有的VPC,如找不到VPC,请切换地域。
      en: Please select the existing VPC. If you can't find the VPC, please switch Regions.
    Label:
      zh-cn: 现有VPC的实例ID
      en: Existing VPC ID
  ZoneId:
    Type: String
    Description:
      zh-cn: 创建实例前,请确认可用区是否支持Redis资源的规格。
      en: Before you create an instance, confirm that the Availability Zone supports the specifications of Redis resources.
    AssociationProperty: ALIYUN::ECS::Instance:ZoneId
    Label:
      en: Zone ID
      zh-cn: 可用区
  VSwitchId:
    AssociationProperty: ALIYUN::ECS::VSwitch::VSwitchId
    AssociationPropertyMetadata:
      VpcId: VpcId
      ZoneId: ZoneId
    Type: String
    Description:
      zh-cn: 现有网络交换机的实例ID。
      en: The instance ID of an existing network switch.
    Label:
      zh-cn: 网络交换机ID
      en: VSwitch ID
  SecurityGroupId:
    AssociationPropertyMetadata:
      VpcId: VpcId
    Description:
      zh-cn: 现有安全组的实例ID。
      en: The instance ID of an existing security group.
    Label:
      zh-cn: 安全组ID
      en: Security Group ID
    AssociationProperty: ALIYUN::ECS::SecurityGroup::SecurityGroupId
    Type: String
  ClusterName:
    Type: String
    Default: default-ack-test
  EcsInstanceType:
    Type: String
    Label:
      en: Instance Type
      zh-cn: 实例类型
    AssociationProperty: ALIYUN::ECS::Instance::InstanceType
    Default: ecs.g6.large
  SystemDiskSize:
    Default: 40
    Type: Number
    Label:
      zh-cn: 系统盘空间
      en: System Disk Spac
  SystemDiskCategory:
    Type: String
    Description:
      en: '<font color=''blue''><b>Optional values:</b></font><br>[cloud_efficiency: <font color=''green''>Efficient Cloud Disk</font>]<br>[cloud_ssd: <font color=''green''>SSD Cloud Disk</font>]<br>[cloud_essd: <font color=''green''>ESSD Cloud Disk</font>]<br>[cloud: <font color=''green''>Cloud Disk</font>]<br>[ephemeral_ssd: <font color=''green''>Local SSD Cloud Disk</font>]'
      zh-cn: '<font color=''blue''><b>可选值:</b></font><br>[cloud_efficiency: <font color=''green''>高效云盘</font>]<br>[cloud_ssd: <font color=''green''>SSD云盘</font>]<br>[cloud_essd: <font color=''green''>ESSD云盘</font>]<br>[cloud: <font color=''green''>普通云盘</font>]<br>[ephemeral_ssd: <font color=''green''>本地SSD盘</font>]'
    AllowedValues:
      - cloud_efficiency
      - cloud_ssd
      - cloud
      - cloud_essd
      - ephemeral_ssd
    Label:
      en: System Disk Category
      zh-cn: 系统盘类型
    Default: cloud_essd
  LoginPassword:
    NoEcho: true
    Type: String
    Description:
      en: 'Length 8-32 characters, can contain size letters, Numbers and special symbols, including:! @ # $ % ^ & * ( ) _ + - ='
      zh-cn: 长度8-32个字符,可包含大小字母、数字及特殊符号(包含:!@#$%^&*()_+-=)。
    Label:
      en: Instance Password
      zh-cn: 实例密码
    ConstraintDescription:
      en: '8-32 characters, can contain size letters, Numbers and special symbols, including:! @ # $ % ^ & * ( ) _ + - ='
      zh-cn: 8-32个字符,可包含大小字母、数字及特殊符号(包含:!@#$%^&*()_+-=)。
    MinLength: 8
    MaxLength: 32
  WorkerInstanceTypes:
    Type: Json
    Label:
      en: Worker Nodes Types
      zh-cn: Worker节点规格
    Description:
      zh-cn: Worker节点ECS实例规格。
      en: The worker node ECS instance specification.
    Default:
      - ecs.g6.large
  WorkerSystemDiskSize:
    Type: Number
    Description:
      en: |-
        Worker disk system disk size, the unit is GiB.
        Default to 120.
      zh-cn: |-
        工作磁盘系统磁盘大小,单位为GiB。
        默认为120。
    Label:
      en: Worker System Disk Size
      zh-cn: Worker节点系统盘大小
    MinValue: 1
    Default: 120
  NumOfNodes:
    Type: Number
    Description:
      en: |-
        Number of worker nodes. The range is [0,300].
        Default to 3.
      zh-cn: 工作节点数。范围为[0,300]。\n默认为3。
    Label:
      en: Num Of Nodes
      zh-cn: Work节点数量
    MinValue: 2
    MaxValue: 300
    Default: 3
  WorkerSystemDiskCategory:
    Type: String
    Description:
      en: '<font color=''blue''><b>Optional values:</b></font><br>[cloud_efficiency: <font color=''green''>Efficient Cloud Disk</font>]<br>[cloud_ssd: <font color=''green''>SSD Cloud Disk</font>]<br>[cloud_essd: <font color=''green''>ESSD Cloud Disk</font>]<br>[cloud: <font color=''green''>Cloud Disk</font>]<br>[ephemeral_ssd: <font color=''green''>Local SSD Cloud Disk</font>]'
      zh-cn: '<font color=''blue''><b>可选值:</b></font><br>[cloud_efficiency: <font color=''green''>高效云盘</font>]<br>[cloud_ssd: <font color=''green''>SSD云盘</font>]<br>[cloud_essd: <font color=''green''>ESSD云盘</font>]<br>[cloud: <font color=''green''>普通云盘</font>]<br>[ephemeral_ssd: <font color=''green''>本地SSD盘</font>]'
    AllowedValues:
      - cloud
      - cloud_efficiency
      - cloud_ssd
      - cloud_essd
      - ephemeral_ssd
    Label:
      en: Worker System Disk Category.
      zh-cn: Worker系统盘磁盘类型。
  ManagedKubernetesCluster:
    Type: ALIYUN::CS::ManagedKubernetesCluster
    Properties:
      VSwitchIds:
        Ref: VSwitchId
      VpcId:
        Ref: VpcId
      WorkerInstanceTypes:
        Ref: WorkerInstanceTypes
      NumOfNodes:
        Ref: NumOfNodes
      ClusterSpec: ack.pro.small
      ContainerCidr: 172.xx.x.x/16
      ServiceCidr: 172.xx.x.x/20
      WorkerSystemDiskCategory:
        Ref: WorkerSystemDiskCategory
      WorkerSystemDiskSize:
        Ref: WorkerSystemDiskSize
      LoginPassword:
        Ref: LoginPassword
      SnatEntry: true
      Addons:
        - Name: flannel
          Config: ''
      Name:
        Ref: ClusterName
  EcsInstanceJumpBox:
    Type: ALIYUN::ECS::InstanceGroup
    DependsOn: ManagedKubernetesCluster
    Properties:
      InstanceName: jumpbox
      ImageId: centos_7
      InstanceType:
        Ref: EcsInstanceType
      VpcId:
        Ref: VpcId
      VSwitchId:
        Ref: VSwitchId
      SecurityGroupId:
        Ref: SecurityGroupId
      AllocatePublicIP: false
      Password:
        Ref: LoginPassword
      MaxAmount: 1
      SystemDiskSize:
        Ref: SystemDiskSize
      InstanceChargeType: PostPaid
      SystemDiskCategory:
        Ref: SystemDiskCategory
      UserData:
        Fn::Sub:
          - |
            #!/bin/bash
            yum install -y kubernetes-client.x86_64
            mkdir -p ~/.kube
            echo '${KubeConfig}' >> ~/.kube/config
            echo '${ApplicationYaml}' > ~/application.yaml
            sleep 10
            kubectl --kubeconfig ~/.kube/config apply -f ~/application.yaml --validate=false
          - KubeConfig: Null
            Fn::GetAtt:
              - ManagedKubernetesCluster
              - PrivateUserKubConfig
        ApplicationYaml: |
          apiVersion: v1
          kind: Pod
          metadata:
          name: nginx
          spec:
          containers:
          - name: nginx
            image: nginx
            imagePullPolicy: IfNotPresent
Metadata:
  ALIYUN::ROS::Interface:
    ParameterGroups:
      - Parameters:
          - WorkerInstanceTypes
          - WorkerSystemDiskCategory
          - WorkerSystemDiskSize
          - NumOfNodes
        Label:
          en: Kubernetes Configuration
          zh-cn: Kubernetes配置
      - Parameters:
          - ZoneId
          - VpcId
          - VSwitchId
          - SecurityGroupId
          - ClusterName
          - LoginPassword
        Label:
          en: Basic Configuration
          zh-cn: 基础配置
      - Parameters:
          - EcsInstanceType
          - SystemDiskSize
          - SystemDiskCategory
        Label:
          en: ECS jump server Configuration
          zh-cn: ECS跳板机配置