全部產品
Search
文件中心

Compute Nest:容器鏡像部署物

更新時間:Nov 15, 2024

對於使用Docker容器鏡像部署的情境,推薦使用容器鏡像部署物。計算巢提供了公用的ACR容器鏡像執行個體用來託管儲存,一個服務商對應一個命名空間進行多租戶隔離。本文為您介紹容器鏡像部署物使用情境與原理,以及如何建立和使用容器鏡像部署物。

使用情境

通過公網拉取但希望私人化部署的Docker容器鏡像,可使用容器鏡像部署物通過臨時密鑰實現服務部署。

重要

容器鏡像部署物不支援後續的彈性自動調整或動態任務頻繁拉取的需求。

如果您的服務情境不適用容器鏡像部署物。

  • 無公網訪問能力的服務

    對於無法開通公網訪問能力的服務,可以通過自建ACR容器鏡像倉庫的方式,配置容器鏡像倉庫的內網連結,實現內網拉取。請參見 配置專用網路的存取控制

  • 部署後仍有拉取需求的服務

    私人化部署:需要提供自建的公開ACR容器鏡像倉庫以保持拉取許可權。

    託管版服務:可以建立私人化的ACR容器鏡像倉庫,並通過ACK叢集提供的免密拉取外掛程式進行拉取。

    請參見 使用免密組件拉取容器鏡像

  • 公開可拉取的容器鏡像

    對於可以公開拉取的容器鏡像,沒必要使用容器鏡像部署物,可以直接使用公開的容器鏡像倉庫連結進行部署。

實現原理

由於多個服務商的容器鏡像存放在一個鏡像倉庫中,為了實現多租戶隔離,目前採用一個服務商對應一個命名空間的方式進行容器鏡像存放,在上傳和拉取時根據服務商AliUid擷取對應命名空間的臨時密鑰,許可權控制以命名空間為維度。

詳細說明

  1. 上傳容器鏡像到計算巢ACK倉庫

    1. 服務商調用計算巢服務擷取臨時密鑰,計算巢調用ACR服務擷取以服務商AliUid為名稱的命名空間的臨時密鑰。

    2. 服務商使用擷取的臨時密鑰,將本地的容器鏡像上傳到計算巢ACR倉庫中,存放在以服務商AliUid為名稱的命名空間中。

  2. 部署容器鏡像到ACK叢集

    1. 計算巢服務擷取服務商對應的容器鏡像臨時密鑰,以Secret的方式部署到ACK叢集中。

    2. 接著部署容器鏡像,將容器鏡像部署物替換為計算巢容器鏡像倉庫中的容器鏡像連結,指定拉取密鑰為部署的Secret。

    3. ACK叢集中會進行對應容器鏡像的拉取,完成後續的部署工作。

容器鏡像部署物為什麼使用託管版方案?

Docker容器鏡像可以通過ACR(阿里雲Container Registry)來儲存。服務商可以選擇上傳鏡像到自己的私人倉庫並自行管理。然而,考慮到購買ACR執行個體的成本、方便進行安全掃描的需求以及防止服務商意外刪除鏡像的問題,計算巢提供一個公用的容器鏡像倉庫即計算巢ACR倉庫,專門用於儲存和維護服務商的容器鏡像,確保了安全和穩定性。

應用原理

需要在服務的ROS模板中定義以下兩個標識,在部署時進行替換。

  • {{ computenest::acrimage::yourimage }} 容器鏡像部署物標識位,計算巢會在部署服務範本時進行替換,替換為關聯部署物對應的容器鏡像地址,如compute-nest-registry.cn-hangzhou.cr.aliyuncs.com/aliUid1/volcanosh/vc-controller-manager:1.0

  • {{ computenest::acr::dockerconfigjson }} 容器鏡像倉庫拉取密鑰標識位,在部署時會替換為容器鏡像拉取臨時密鑰,用來進行私人容器鏡像的拉取。

使用容器鏡像部署物進行部署的樣本YAML如下所示,可以看到拉取密鑰{{ computenest::acr::dockerconfigjson }}部署成了Secret computenestrepo,作為容器鏡像部署物的imagePullSecret去拉取部署物替換後的容器鏡像。

範例程式碼

Resources:
  ClusterApplication:
    Type: ALIYUN::CS::ClusterApplication
    Properties:
      YamlContent: |
          apiVersion: v1
          data:
            .dockerconfigjson: {{computenest::acr::dockerconfigjson}}
          kind: Secret
          metadata:
            name: computenestrepo
            namespace: nginx
          type: kubernetes.io/dockerconfigjson
          ---
          apiVersion: apps/v1
          kind: Deployment
          spec:
            template:
              spec:
                containers:
                - name: nginx
                  image: {{ computenest::acrimage::nginx }}
                  ports:
                  - containerPort: 80
                imagePullSecrets:
                - name: computenestrepo

建立並使用

前提條件

已安裝Docker並製作Docker鏡像。如果您沒有,請參見Docker的安裝與使用

建立容器鏡像部署物

  1. 配置部署物的基本資料。

    1. 登入計算巢控制台,在左側導覽列選擇服務部署物,並在部署物地區中單擊建立部署物

    2. 部署物資訊地區,完成部署物資訊填寫。

      配置項

      說明

      部署物名稱

      由中文、數字、英文及底線組成,長度在 3~50 個字元之間,一個中文字等於 2 個字元,部署物名稱建立後不可修改。

      部署物版本名稱

      由中文、數字、英文及底線組成,長度在 3~50 個字元之間,一個中文字等於 2 個字元。

      部署物描述

      簡介長度在10-500個字元之間,一個中文字等於2個字元。

      資源群組

      選擇建立的部署所歸屬的資源群組名稱。

      資源群組對您擁有的雲資源從用途、許可權、歸屬等維度進行分組,實現企業內部多使用者、多專案的資源分級管理。更多資訊,請參見資源群組

      標籤配置

      選擇或填寫完整的標籤鍵和標籤值,為部署物定標籤。每個資源最多可綁定20列標籤。若無可選的標籤鍵和標籤值,可建立自訂標籤。建立自訂標籤的詳細操作,請參見建立並綁定自訂標籤

  2. 配置容器鏡像部署物。

    本節以上傳apache-php5鏡像為例。

    1. 部署物內容區塊,選擇部署物類型容器鏡像

    2. 單擊擷取訪問憑證,可以獲得上傳容器鏡像到計算巢倉庫的命令。

      image

      1. 登入命令列工具,輸入登入命令登入計算巢鏡像倉庫。

        image

      2. 將您的容器鏡像進行計算巢鏡像倉庫打標。

        image

      3. 推送已打標的容器鏡像。

        image

    3. 執行成功後,在選擇商品中選取上傳的容器鏡像,並單擊發布部署物

      image

  3. 查看部署物。

    1. 返回服務部署物頁面,單擊部署物名稱,進入部署物詳情介面查看部署進度。

    2. 當狀態為可用時,表示建立完成。

使用容器鏡像部署物

本節以建立私人化部署服務為例,重點介紹在建立服務時使用容器鏡像部署物相關配置。

  1. 登入計算巢控制台

  2. 在左側導覽列中選擇我的服務,在我建立的服務地區下單擊建立新服務

  3. 建立私人化部署服務。

    image

  4. 根據提示填入服務基本資料,在錄入模板中根據實際情況進行選擇並輸入ROS模板。

    在服務ROS模板ALIYUN::CS::ClusterApplication資源中定義訪問憑證標識位{{ computenest::acr::dockerconfigjson }} 和容器鏡像部署物標識{{ computenest::acrimage::yourimage }}

    樣本模板

    說明

    本樣本模板僅可用於測試。

    ROSTemplateFormatVersion: '2015-09-01'
    Description:
      en: Application deployed by docker
      zh-cn:  使用docker部署單機應用
    Parameters:
      PayType:
        Type: String
        Label:
          en: ECS Instance Charge Type
          zh-cn: 付費類型
        Default: PostPaid
        AllowedValues:
          - PostPaid
          - PrePaid
        AssociationProperty: ChargeType
        AssociationPropertyMetadata:
          LocaleKey: InstanceChargeType
      PayPeriodUnit:
        Type: String
        Label:
          en: Pay Period Unit
          zh-cn: 購買資源時間長度周期
        Default: Month
        AllowedValues:
          - Month
          - Year
        AssociationProperty: PayPeriodUnit
        AssociationPropertyMetadata:
          Visible:
            Condition:
              Fn::Not:
                Fn::Equals:
                  - ${PayType}
                  - PostPaid
      PayPeriod:
        Type: Number
        Label:
          en: Period
          zh-cn: 購買資源時間長度
        Default: 1
        AllowedValues:
          - 1
          - 2
          - 3
          - 4
          - 5
          - 6
          - 7
          - 8
          - 9
        AssociationProperty: PayPeriod
        AssociationPropertyMetadata:
          Visible:
            Condition:
              Fn::Not:
                Fn::Equals:
                  - ${PayType}
                  - PostPaid
      EcsInstanceType:
        Type: String
        Label:
          en: Instance Type
          zh-cn: 執行個體類型
        AssociationProperty: ALIYUN::ECS::Instance::InstanceType
        AssociationPropertyMetadata:
          InstanceChargeType: ${PayType}
        AllowedValues:
          - ecs.g8i.large
          - ecs.g6.large
        
      InstancePassword:
        NoEcho: true
        Type: String
        Description:
          en: Server login password, Length 8-30, must contain three(Capital letters, lowercase letters, numbers, ()`~!@#$%^&*_-+=|{}[]:;'<>,.?/ Special symbol in)
          zh-cn: 伺服器登入密碼,長度8-30,必須包含三項(大寫字母、小寫字母、數字、 ()`~!@#$%^&*_-+=|{}[]:;'<>,.?/ 中的特殊符號)
        AllowedPattern: '^[a-zA-Z0-9-\(\)\`\~\!\@\#\$\%\^\&\*\_\-\+\=\|\{\}\[\]\:\;\<\>\,\.\?\/]*$'
        Label:
          en: Instance Password
          zh-cn: 執行個體密碼
        ConstraintDescription:
          en: Length 8-30, must contain three(Capital letters, lowercase letters, numbers, ()`~!@#$%^&*_-+=|{}[]:;'<>,.?/ Special symbol in)
          zh-cn: 長度8-30,必須包含三項(大寫字母、小寫字母、數字、 ()`~!@#$%^&*_-+=|{}[]:;'<>,.?/ 中的特殊符號)
        MinLength: 8
        MaxLength: 30
        AssociationProperty: ALIYUN::ECS::Instance::Password
      ZoneId:
        Type: String
        Label:
          en: Zone ID
          zh-cn: 可用性區域ID
        AssociationProperty: ALIYUN::ECS::Instance::ZoneId
      VpcId:
        Type: String
        Label:
          en: VPC ID
          zh-cn: Virtual Private Cloud執行個體ID
        Description:
          en: >-
            Please search the ID starting with (vpc-xxx) from console-Virtual
            Private Cloud
          zh-cn: 現有Virtual Private Cloud絡的執行個體ID
        AssociationProperty: 'ALIYUN::ECS::VPC::VPCId'
      VSwitchId:
        Type: String
        Label:
          en: VSwitch ID
          zh-cn: 交換器執行個體ID
        Description:
          en: >-
            Instance ID of existing business network switches, console-Virtual
            Private Cloud-VSwitches under query
          zh-cn: 現有業務網路交換器的執行個體ID
        Default: ''
        AssociationProperty: 'ALIYUN::ECS::VSwitch::VSwitchId'
        AssociationPropertyMetadata:
          VpcId: VpcId
          ZoneId: ZoneId
      AdminPassword:
        Type: String
        AssociationProperty: ALIYUN::ECS::Instance::Password
        Label: 管理員密碼
        NoEcho: True
    Resources:
      SecurityGroup:
        Type: ALIYUN::ECS::SecurityGroup
        Properties:
          SecurityGroupName:
            Ref: ALIYUN::StackName
          VpcId:
            Ref: VpcId
          SecurityGroupIngress:
            - PortRange: 80/80
              Priority: 1
              SourceCidrIp: 0.0.0.0/0
              IpProtocol: tcp
              NicType: internet
      InstanceGroup:
        Type: ALIYUN::ECS::InstanceGroup
        Properties:
          # 付費類型
          InstanceChargeType:
            Ref: PayType
          PeriodUnit:
            Ref: PayPeriodUnit
          Period:
            Ref: PayPeriod
          VpcId:
            Ref: VpcId
          VSwitchId:
            Ref: VSwitchId
          SecurityGroupId:
            Ref: SecurityGroup
          ZoneId:
            Ref: ZoneId
          ImageId: centos_7
          Password:
            Ref: InstancePassword
          InstanceType:
            Ref: EcsInstanceType
          SystemDiskCategory: cloud_essd
          SystemDiskSize: 200
          InternetMaxBandwidthOut: 5
          IoOptimized: optimized
          MaxAmount: 1
      WaitCondition:
        Type: ALIYUN::ROS::WaitCondition
        Properties:
          Count: 1
          Handle:
            Ref: WaitConditionHandle
          Timeout: 300
      WaitConditionHandle:
        Type: ALIYUN::ROS::WaitConditionHandle
      InstallPackage:
        Type: ALIYUN::ECS::RunCommand
        Properties:
          InstanceIds:
            Fn::GetAtt:
              - InstanceGroup
              - InstanceIds
          Type: RunShellScript
          Sync: true
          Timeout: 300
          CommandContent:
            Fn::Sub:
              - |
                yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
                yum makecache fast
                yum -y install docker-ce jq
                systemctl enable docker
                systemctl start docker
                sleep 10
    
                dockerJson='{{ computenest::acr::dockerconfigjson }}'
                decodeDockerJson=$(echo $dockerJson | base64 -d)
                host=$(echo $decodeDockerJson | jq '.auths' | jq 'keys' | jq .[0])
                username=$(echo $decodeDockerJson | jq ".auths.$host.username" | tr -d '"')
                password=$(echo $decodeDockerJson | jq ".auths.$host.password" | tr -d '"')
                host=$(echo $host | tr -d '"')
                docker login $host --username=$username --password=$password
    
                mkdir -p /home/admin/application
                cat >/home/admin/application/docker-compose.yaml<<EOF
                # docker-compose.yaml中可以引用參數
                # 單個nginx服務執行個體
                services:
                  # 服務名
                  nginx:
                    # Docker鏡像
                    image: {{computenest::acrimage::nginx}}
                    # 連接埠映射
                    ports:
                      - 80:80
                    volumes:
                      - /home/admin/application/nginx/logs:/var/log/nginx/
                EOF
                
                cat > /etc/systemd/system/docker-compose-app.service <<EOF
                [Unit]
                Description=Docker Compose Application Service
                Requires=docker.service
                After=docker.service
                
                [Service]
                Type=oneshot
                RemainAfterExit=yes
                WorkingDirectory=/home/admin/application
                ExecStart=/usr/bin/docker compose up -d
                ExecStop=/usr/bin/docker compose down
                TimeoutStartSec=0
                
                [Install]
                WantedBy=multi-user.target
                EOF
                
                systemctl enable docker-compose-app
    
                # 在Docker Compose啟動前執行此命令片段,命令中可以引用參數
                echo "before docker compose starts"
                mkdir -p /home/admin/application/nginx/logs
                
                systemctl start docker-compose-app
                sleep 10
                # 在Docker Compose啟動後執行此命令片段,命令中可以引用參數
                echo "after docker compose starts"
                echo ${AdminPassword}
                
                # 執行成功回調WaitCondition結束waitCondition的等待
                ${CurlCli} -d "{\"Data\" : \"Success\", \"status\" : \"SUCCESS\"}"
              - CurlCli:
                  Fn::GetAtt:
                    - WaitConditionHandle
                    - CurlCli
    Outputs: 
      Endpoint:
        Value:
          Fn::Sub:
            - http://${Address}:80
            - Address:
                Fn::Select:
                - 0
                - Fn::GetAtt:
                  - InstanceGroup
                  - PublicIps
    Metadata:
      ALIYUN::ROS::Interface:
        ParameterGroups:
          - Parameters:
              - PayType
              - PayPeriodUnit
              - PayPeriod
            Label:
              default: 付費類型配置
          - Parameters:
              - EcsInstanceType
              - InstancePassword
            Label:
              default: 資源配置
          
          - Parameters:
              - AdminPassword
            Label:
              en: Software Configuration
              zh-cn: 軟體配置
          
          - Parameters:
              - ZoneId
              - VpcId
              - VSwitchId
            Label:
              default: 可用性區域配置
  5. 部署物關聯區塊中設定容器鏡像關聯。單擊選擇部署物,在彈框中選擇部署物和版本,最後單擊確定完成容器鏡像部署物替換。

  6. 完成服務的建立,並測試通過後, 請根據計算巢服務的發布審核標準進行自檢,並提交審核。發布審核標準的詳細資料,請參見發布審核標準

  7. 服務建立完成後,可以在服務詳情頁查看部署物關聯關係。

相關文檔

  • 關於建立計算巢服務的詳細內容,請參見建立服務

  • 當您不再需要部署物或部署物版本時,可刪除該部署物或部署物版本,請參見刪除部署物

  • 當您需要變更部署物內容等資訊時,可通過建立新版本來實現,請參見建立新版本

  • 設定部署物的升級配置,請參見服務升級配置