對于使用Docker容器鏡像部署的場景,推薦使用容器鏡像部署物。計算巢提供了公共的ACR容器鏡像實例用來托管保存,一個服務商對應一個命名空間進行多租戶隔離。本文為您介紹容器鏡像部署物使用場景與原理,以及如何創建和使用容器鏡像部署物。
使用場景
通過公網拉取但希望私有化部署的Docker容器鏡像,可使用容器鏡像部署物通過臨時密鑰實現服務部署。
容器鏡像部署物不支持后續的彈性自動伸縮或動態任務頻繁拉取的需求。
無公網訪問能力的服務
對于無法開通公網訪問能力的服務,可以通過自建ACR容器鏡像倉庫的方式,配置容器鏡像倉庫的內網鏈接,實現內網拉取。請參見 配置專有網絡的訪問控制。
部署后仍有拉取需求的服務
私有化部署:需要提供自建的公開ACR容器鏡像倉庫以保持拉取權限。
托管版服務:可以創建私有化的ACR容器鏡像倉庫,并通過ACK集群提供的免密拉取插件進行拉取。
請參見 使用免密組件拉取容器鏡像。
公開可拉取的容器鏡像
對于可以公開拉取的容器鏡像,沒必要使用容器鏡像部署物,可以直接使用公開的容器鏡像倉庫鏈接進行部署。
實現原理
由于多個服務商的容器鏡像存放在一個鏡像倉庫中,為了實現多租戶隔離,目前采用一個服務商對應一個命名空間的方式進行容器鏡像存放,在上傳和拉取時根據服務商AliUid
獲取對應命名空間的臨時密鑰,權限控制以命名空間為維度。
上傳容器鏡像到計算巢ACK倉庫
服務商調用計算巢服務獲取臨時密鑰,計算巢調用ACR服務獲取以服務商
AliUid
為名稱的命名空間的臨時密鑰。服務商使用獲取的臨時密鑰,將本地的容器鏡像上傳到計算巢ACR倉庫中,存放在以服務商
AliUid
為名稱的命名空間中。
部署容器鏡像到ACK集群
計算巢服務獲取服務商對應的容器鏡像臨時密鑰,以Secret的方式部署到ACK集群中。
接著部署容器鏡像,將容器鏡像部署物替換為計算巢容器鏡像倉庫中的容器鏡像鏈接,指定拉取密鑰為部署的Secret。
ACK集群中會進行對應容器鏡像的拉取,完成后續的部署工作。
容器鏡像部署物為什么使用托管版方案?
Docker容器鏡像可以通過ACR(阿里云容器鏡像服務)來保存。服務商可以選擇上傳鏡像到自己的私有倉庫并自行管理。然而,考慮到購買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的安裝與使用。
創建容器鏡像部署物
配置部署物的基本信息。
登錄計算巢控制臺,在左側導航欄選擇服務部署物,并在部署物區域中單擊創建部署物。
在部署物信息區域,完成部署物信息填寫。
配置項
說明
部署物名稱
由中文、數字、英文及下劃線組成,長度在 3~50 個字符之間,一個中文字等于 2 個字符,部署物名稱創建后不可修改。
部署物版本名稱
由中文、數字、英文及下劃線組成,長度在 3~50 個字符之間,一個中文字等于 2 個字符。
部署物描述
簡介長度在10-500個字符之間,一個中文字等于2個字符。
資源組
選擇創建的部署所歸屬的資源組名稱。
資源組對您擁有的云資源從用途、權限、歸屬等維度進行分組,實現企業內部多用戶、多項目的資源分級管理。更多信息,請參見資源組。
標簽配置
選擇或填寫完整的標簽鍵和標簽值,為部署物定標簽。每個資源最多可綁定20條標簽。若無可選的標簽鍵和標簽值,可創建自定義標簽。創建自定義標簽的詳細操作,請參見創建并綁定自定義標簽。
配置容器鏡像部署物。
本節以上傳
apache-php5
鏡像為例。在部署物內容區塊,選擇部署物類型為容器鏡像。
單擊獲取訪問憑證,可以獲得上傳容器鏡像到計算巢倉庫的命令。
登錄命令行工具,輸入登錄命令登錄計算巢鏡像倉庫。
將您的容器鏡像進行計算巢鏡像倉庫打標。
推送已打標的容器鏡像。
執行成功后,在選擇商品中選取上傳的容器鏡像,并單擊發布部署物。
查看部署物。
返回服務部署物頁面,單擊部署物名稱,進入部署物詳情界面查看部署進度。
當狀態為可用時,表示創建完成。
使用容器鏡像部署物
本節以創建私有化部署服務為例,重點介紹在創建服務時使用容器鏡像部署物相關配置。
登錄計算巢控制臺。
在左側導航欄中選擇我的服務,在我創建的服務區域下單擊創建新服務。
創建私有化部署服務。
根據提示填入服務基本信息,在錄入模板中根據實際情況進行選擇并輸入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: 專有網絡VPC實例ID Description: en: >- Please search the ID starting with (vpc-xxx) from console-Virtual Private Cloud zh-cn: 現有虛擬專有網絡的實例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: 可用區配置
在部署物關聯區塊中設置容器鏡像關聯。單擊選擇部署物,在彈框中選擇部署物和版本,最后單擊確定完成容器鏡像部署物替換。
完成服務的創建,并測試通過后, 請根據計算巢服務的發布審核標準進行自檢,并提交審核。發布審核標準的詳細信息,請參見發布審核標準。
服務創建完成后,可以在服務詳情頁查看部署物關聯關系。