Para implantações que utilizam imagens de contêiner Docker, recomendamos o uso de um pacote de implantação de imagem de contêiner. O Compute Nest fornece uma instância pública do Container Registry (ACR) para hospedar e armazenar imagens, na qual cada provedor de serviços recebe um namespace exclusivo para garantir o isolamento entre locatários. Este tópico descreve os casos de uso dos pacotes de implantação de imagem de contêiner, explica seu funcionamento e mostra como criá-los e utilizá-los.
Casos de uso
Em implantações privadas que baixam imagens de contêiner Docker da internet pública, utilize um pacote de implantação de imagem de contêiner com uma chave temporária.
Importante
Os pacotes de implantação de imagem de contêiner não oferecem suporte a Auto Scaling nem a downloads frequentes de imagens após a implantação inicial.
Quando não usar pacotes de implantação de imagem de contêiner
-
Serviços sem acesso à rede pública
Caso seus serviços não tenham acesso à internet pública, crie um repositório autogerenciado do Container Registry (ACR). Configure o endpoint interno do repositório para baixar as imagens pela rede interna. Para mais informações, consulte Configurar controle de acesso à VPC.
-
Serviços que exigem download de imagens após a implantação
Implantação privada: Forneça um repositório público autogerenciado do Container Registry (ACR) para manter o acesso de download.
Serviço totalmente gerenciado: Crie um repositório privado do Container Registry (ACR) e utilize o componente aliyun-acr-credential-helper, fornecido por um cluster do Container Service for Kubernetes (ACK), para baixar as imagens.
Para mais informações, consulte Usar o componente aliyun-acr-credential-helper para baixar imagens sem usar um secret.
-
Imagens de contêiner acessíveis publicamente
Se as suas imagens de contêiner já forem acessíveis publicamente, não é necessário utilizar um pacote de implantação de imagem de contêiner. Implante-as diretamente usando a URL do repositório público de imagens de contêiner.
Como funciona
Para garantir o isolamento entre locatários, as imagens de contêiner de diferentes provedores de serviços são armazenadas em um repositório compartilhado, mas isoladas por namespace. Cada provedor de serviços é mapeado para um namespace exclusivo. Ao enviar ou baixar uma imagem, o sistema gera uma chave temporária para o namespace com base no AliUid do provedor de serviços. O controle de acesso é aplicado no nível do namespace.
Detalhes
-
Enviar uma imagem de contêiner para o repositório ACR do Compute Nest
O provedor de serviços solicita uma chave temporária ao Compute Nest. Em seguida, o Compute Nest obtém uma chave do Container Registry (ACR) para o namespace correspondente ao AliUid do provedor de serviços.
O provedor de serviços utiliza essa chave temporária para enviar a imagem de contêiner local para o repositório ACR do Compute Nest. A imagem fica armazenada no namespace associado ao AliUid do provedor de serviços.
-
Implantar uma imagem de contêiner em um cluster ACK
O Compute Nest obtém a chave temporária da imagem de contêiner do provedor de serviços e a implanta como um Secret no cluster ACK.
Durante a implantação, o Compute Nest substitui o espaço reservado do pacote de implantação de imagem de contêiner pela URL da imagem no repositório de imagens de contêiner do Compute Nest e especifica o Secret implantado como credencial de download.
O cluster ACK utiliza então o Secret para baixar a imagem de contêiner e concluir a implantação.
Por que usar uma solução gerenciada para pacotes de implantação de imagem de contêiner?
As imagens de contêiner Docker podem ser armazenadas no Container Registry (ACR). Embora os provedores de serviços possam enviar imagens para seus próprios repositórios privados, o Compute Nest oferece um repositório ACR do Compute Nest público. Essa solução gerenciada reduz o custo de aquisição de instâncias do ACR, simplifica a varredura de segurança e evita a exclusão acidental de imagens, garantindo segurança e estabilidade.
Implementação
Defina os dois espaços reservados a seguir no modelo do Resource Orchestration Service (ROS) do seu serviço. Esses espaços reservados são substituídos pelos valores reais durante a implantação.
{{ computenest::acrimage::yourimage }}: Espaço reservado para o pacote de implantação de imagem de contêiner. Durante a implantação, o Compute Nest substitui este campo pela URL da imagem de contêiner associada, como compute-nest-registry.cn-hangzhou.cr.aliyuncs.com/aliUid1/volcanosh/vc-controller-manager:1.0.
{{ computenest::acr::dockerconfigjson }}: Espaço reservado para a credencial de download da imagem. Durante a implantação, este campo é substituído por uma chave temporária usada para baixar a imagem de contêiner privada.
O exemplo YAML a seguir demonstra como utilizar um pacote de implantação de imagem de contêiner. O espaço reservado da credencial de download {{ computenest::acr::dockerconfigjson }} é implantado como um Secret chamado computenestrepo. Esse Secret é então utilizado como imagePullSecret para baixar a imagem de contêiner após a substituição do espaço reservado da imagem.
Código de exemplo
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
Criar e usar
Pré-requisitos
É necessário ter o Docker instalado e uma imagem Docker criada. Caso contrário, consulte Instalar e usar o Docker.
Criar um pacote de implantação
-
Configure as informações básicas do pacote de implantação.
Faça login no console do Compute Nest. No painel de navegação à esquerda, escolha Service Deployment Package. Na aba Packages, clique em Create Deployment Package.
-
Na seção Basic Information, configure os parâmetros a seguir.
|
Parâmetro
|
Descrição
|
|
Deployment Package Name
|
O nome pode conter caracteres chineses, letras, dígitos e sublinhados (_). Deve ter entre 3 e 128 caracteres, considerando que cada caractere chinês conta como dois. Não é possível alterar o nome do pacote de implantação após a criação.
|
|
Version Name
|
O nome pode conter caracteres chineses, letras, dígitos e sublinhados (_). Deve ter entre 3 e 50 caracteres, considerando que cada caractere chinês conta como dois.
|
|
Description
|
A descrição deve ter entre 10 e 500 caracteres. Cada caractere chinês conta como dois.
|
|
Resource Group
|
Selecione o grupo de recursos ao qual o pacote de implantação pertence.
Os grupos de recursos permitem agrupar seus recursos de nuvem por uso, permissões ou propriedade, possibilitando o gerenciamento hierárquico de recursos para múltiplos usuários e projetos dentro de uma organização. Para mais informações, consulte grupos de recursos.
|
|
Tag Settings
|
Selecione ou insira uma chave de tag e um valor de tag completos para adicionar uma tag ao pacote de implantação. É possível vincular até 20 tags a um recurso. Se não houver chaves ou valores disponíveis, crie uma tag personalizada. Para mais informações, consulte Criar e vincular uma tag personalizada.
|
-
Configure o pacote de implantação de imagem de contêiner.
Esta seção utiliza o envio de uma imagem apache-php5 como exemplo.
Na seção Deployment Package Content, defina Deployment Package Type como Container Image.
-
Clique em Obtain Access Credential para obter os comandos necessários para enviar sua imagem de contêiner ao repositório do Compute Nest.
Após obter a credencial, a página exibirá os comandos necessários. Primeiro, faça login no repositório de imagens do Compute Nest com o comando docker login. Em seguida, após inserir o Image Name e a Tag (por exemplo, latest), aplique a tag à sua imagem local usando o comando docker tag. Por fim, envie a imagem com tag para o repositório com o comando docker push.
-
Acesse sua ferramenta de linha de comando e execute o comando de login para acessar o repositório de imagens do Compute Nest.
docker login compute-nest-registry.cn-hangzhou.cr.aliyuncs.com --username=cr_temp_user --password=<temporary_token>
-
Aplique a tag à sua imagem de contêiner para o repositório de imagens do Compute Nest.
docker tag registry.cn-hangzhou.aliyuncs.com/lxepoo/apache-php5:latest compute-nest-registry.cn-hangzhou.cr.aliyuncs.com/lxepoo/apache-php5:latest
-
Envie a imagem de contêiner com tag.
docker push compute-nest-registry.cn-hangzhou.cr.aliyuncs.com/156345785543852/registry.cn-hangzhou.aliyuncs.com/lxepoo/apache-php5:latest
The push refers to repository [compute-nest-registry.cn-hangzhou.cr.aliyuncs.com/156345785543852/registry.cn-hangzhou.aliyuncs.com/lxepoo/apache-php5]
6bb81559e239: Pushed
cea911103474: Pushed
cc523d99ead5: Pushed
b00b1ec7b8ef: Pushed
7715ecdbe18e: Pushed
5e755f0e0b5c: Pushed
2a1ce34e52b6: Pushed
28dc854edc91: Pushed
24fc817b31ed: Pushed
7cd75a52f72c: Pushed
05b156d2bc54: Pushed
8cc36998586f: Pushed
ab73fa68e475: Pushed
dbf739521f53: Pushed
3e019add9ad9: Pushed
18e3751aa1ef: Pushed
4eb95f543324: Pushed
a594229cce80: Pushed
69a54e38f06b: Pushed
d2808f8124fd: Pushed
fe4c16cbf7a4: Pushed
latest: digest: sha256:2afcd2b89f317e0570325817f4e8d9c93f12ac781779e365e456ae37aa297f7a size: 4700
Após o envio bem-sucedido, na seção Container Image, escolha a imagem enviada e clique em Publish Deployment Package.
-
Visualize o pacote de implantação.
Retorne à página Service Deployment Package. Clique no nome do pacote de implantação para acessar a página Deployment Package Details e visualizar seu status.
Quando o status mudar para Available, o pacote estará criado.
Usar o pacote de implantação
Esta seção explica como utilizar um pacote de implantação de imagem de contêiner ao criar um serviço de implantação privada.
Faça login no console do Compute Nest.
No painel de navegação à esquerda, clique em My Services. Na aba Created Services da página My Services, clique em Create Service.
Na página Create New Service, selecione Custom launch como método de criação, escolha Private Service como tipo de serviço e clique em Next: Configure Settings.
-
Insira as informações básicas do serviço e forneça o modelo ROS conforme necessário.
No modelo ROS, defina o espaço reservado {{ computenest::acr::dockerconfigjson }} para a credencial de acesso e o espaço reservado {{ computenest::acrimage::yourimage }} para a imagem de contêiner dentro do recurso ALIYUN::CS::ClusterApplication.
Modelo de exemplo
Nota
Este modelo de exemplo destina-se apenas a testes.
ROSTemplateFormatVersion: '2015-09-01'
Description:
en: Application deployed by using 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: The password of the server. The password must be 8 to 30 characters in length and contain at least three of the following character types: uppercase letters, lowercase letters, digits, and special characters ()`~!@#$%^&*_-+=|{}[]:;'<>,.?/
zh-cn: 服务器登录密码,长度8-30,必须包含三项(大写字母、小写字母、数字、 ()`~!@#$%^&*_-+=|{}[]:;'<>,.?/ 中的特殊符号)
AllowedPattern: '^[a-zA-Z0-9-\(\)\`\~\!\@\#\$\%\^\&\*\_\-\+\=\|\{\}\[\]\:\;\<\>\,\.\?\/]*$'
Label:
en: Instance Password
zh-cn: 实例密码
ConstraintDescription:
en: The password must be 8 to 30 characters in length and contain at least three of the following character types: uppercase letters, lowercase letters, digits, and special characters ()`~!@#$%^&*_-+=|{}[]:;'<>,.?/.
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: The ID of the existing VPC.
zh-cn: 现有虚拟专有网络的实例ID
AssociationProperty: 'ALIYUN::ECS::VPC::VPCId'
VSwitchId:
Type: String
Label:
en: VSwitch ID
zh-cn: 交换机实例ID
Description:
en: The ID of the existing VSwitch.
zh-cn: 现有业务网络交换机的实例ID
Default: ''
AssociationProperty: 'ALIYUN::ECS::VSwitch::VSwitchId'
AssociationPropertyMetadata:
VpcId: VpcId
ZoneId: ZoneId
AdminPassword:
Type: String
AssociationProperty: ALIYUN::ECS::Instance::Password
Label: Administrator Password
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:
# Billing method
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
# You can reference parameters in the docker-compose.yaml file.
# A single nginx service instance.
services:
# Service name
nginx:
# Docker image
image: {{computenest::acrimage::nginx}}
# Port mapping
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
# This command snippet runs before Docker Compose starts. You can reference parameters in the command.
echo "before docker compose starts"
mkdir -p /home/admin/application/nginx/logs
systemctl start docker-compose-app
sleep 10
# This command snippet runs after Docker Compose starts. You can reference parameters in the command.
echo "after docker compose starts"
echo ${AdminPassword}
# The callback is invoked when the script is successfully run, and WaitCondition no longer needs to wait for signals.
${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: Billing Configuration
- Parameters:
- EcsInstanceType
- InstancePassword
Label:
default: Resource Configuration
- Parameters:
- AdminPassword
Label:
en: Software Configuration
zh-cn: 软件配置
- Parameters:
- ZoneId
- VpcId
- VSwitchId
Label:
default: Zone Configuration
Na seção Deployment Package Association, Set Container Image Association. Clique em Select Deployment Package. Na caixa de diálogo exibida, selecione o pacote de implantação e a versão e clique em OK para associar o pacote de implantação de imagem de contêiner.
Após criar e testar o serviço, realize uma verificação automática em relação aos critérios de lançamento do serviço e envie-o para revisão. Para mais informações, consulte Critérios de revisão.
-
Depois que o serviço for criado, visualize a associação do pacote de implantação na página de detalhes do serviço.
Na página de detalhes do serviço, clique na aba Deployment Package Association e, em seguida, na aba Container Image Association para visualizar a associação entre o espaço reservado (como {{ computenest::acrimage::nginx }}) e as informações correspondentes do pacote de implantação.
Documentos relacionados
Para mais informações sobre como criar um serviço no Compute Nest, consulte Criar um serviço.
Exclua um pacote de implantação ou uma de suas versões caso não sejam mais necessários. Para mais informações, consulte Excluir um pacote de implantação.
Para alterar o conteúdo ou outras informações de um pacote de implantação, crie uma nova versão. Para mais informações, consulte Criar uma nova versão.
Para definir a configuração de atualização de um pacote de implantação, consulte Configurar atualizações de serviço.