Armazenar credenciais de registro em Secrets do Kubernetes gera sobrecarga na rotação e risco de vazamento. O Elastic Container Instance (ECI) oferece suporte à identidade baseada em função RAM para obtenção de imagens, permitindo que pods e caches de imagem se autentiquem no Alibaba Cloud Container Registry (ACR) sem nenhum Secret do Kubernetes.
O ACR disponibiliza instâncias Personal Edition e Enterprise Edition. O Container Registry Enterprise Edition é uma plataforma de nível empresarial que gerencia o ciclo de vida de artefatos de aplicações nativas da nuvem, incluindo imagens de contêiner, gráficos Helm e artefatos da Open Container Initiative (OCI). Essa solução foi projetada para cenários de implantação em grande escala.
Apenas imagens armazenadas em instâncias do ACR permitem obtenção sem Secret. Imagens hospedadas fora do ACR (por exemplo, imagens do Docker Hub) não oferecem suporte a esse recurso.
Limitações
As anotações para obtenção sem Secret entram em vigor apenas durante a criação de um pod baseado em ECI ou de um cache de imagem. Adicionar ou modificar anotações em um pod existente não surte efeito.
Adicione as anotações no local correto do manifesto. Em um Deployment, insira-as em
spec.template.metadata.annotations, e não no nível superior emmetadata.annotations.Instâncias do ACR Enterprise Edition com nome de domínio personalizado não têm a obtenção sem Secret ativada por padrão. Especifique explicitamente o ID da instância usando a anotação
k8s.aliyun.com/acr-instance-ids.
Pré-requisitos
Antes de começar, verifique se você possui:
-
Uma instância do ACR com repositórios e imagens configurados
Para o ACR Personal Edition, consulte Usar uma instância do Container Registry Personal Edition para enviar e fazer pull de imagens
Para o ACR Enterprise Edition, consulte Usar uma instância do Container Registry Enterprise Edition para enviar e fazer pull de imagens
-
(Apenas ACR Enterprise Edition) Controle de acesso configurado para a instância. Por padrão, uma nova instância Enterprise Edition fica desconectada de todas as redes. Ative o acesso antes de prosseguir:
Acesso pela Internet: Consulte Ativar acesso pela Internet. Após a ativação, é possível acessar imagens entre regiões usando o endpoint público da instância.
Acesso por VPC: Ative a função vinculada ao serviço
AliyunServiceRoleForContainerRegistryAccessCustomerPrivateZone. Consulte Configurar uma ACL de VPC.
Escolha um método de configuração
O método depende de o recurso ECI e a instância do ACR pertencerem à mesma conta Alibaba Cloud e da edição do ACR utilizada.
|
Cenário |
Comportamento padrão |
Anotações necessárias |
|
Mesma conta — Personal Edition ou Enterprise Edition com nome de domínio padrão |
Obtenção sem Secret ativada por padrão |
Nenhuma obrigatória. Opcionalmente, use |
|
Mesma conta — Enterprise Edition com nome de domínio personalizado |
Não ativado por padrão |
|
|
Contas diferentes — qualquer edição |
Não ativado por padrão |
|
Restringir quais instâncias permitem obtenção sem Secret (mesma conta)
Por padrão, o ECI usa a função vinculada ao serviço AliyunServiceRoleForECI para obter imagens. Essa função concede acesso a todas as instâncias Personal Edition e a todas as instâncias Enterprise Edition com nomes de domínio padrão na mesma conta. Para restringir a obtenção a instâncias específicas, crie uma função RAM personalizada e referencie-a no manifesto.
Etapa 1: Crie uma função RAM e anexar uma política personalizada
-
Crie uma função RAM para um serviço confiável da Alibaba Cloud. Consulte Criar uma função RAM para um serviço confiável da Alibaba Cloud. Use as seguintes configurações:
Parâmetro
Valor
Entidade confiável
Alibaba Cloud Service
Tipo de função
Normal Service Role
Nome da função RAM
acr-test(exemplo)Serviço confiável
ECI
-
Crie uma política personalizada que restrinja a obtenção a uma instância específica do ACR. Consulte Criar uma política personalizada. O exemplo a seguir permite
cr:Get*ecr:List*em todos os recursos, ecr:Pull*apenas na instância especificada:{ "Version": "1", "Statement": [ { "Effect": "Allow", "Action": [ "cr:Get*", "cr:List*" ], "Resource": "*" }, { "Effect": "Allow", "Action": [ "cr:Pull*" ], "Resource": [ "acs:cr:cn-hangzhou:1609982529******:instance/cri-nwj395hgf6f3****" ] } ] }Para detalhes sobre a sintaxe da política, consulte Elementos de política.
Anexe a política personalizada à função RAM. Consulte Conceder permissões a uma função RAM.
-
Abra a página de detalhes da função
acr-test, verifique as permissões anexadas e copie o ARN (Alibaba Cloud Resource Name) da função.
Etapa 2: Referenciar a função RAM no manifesto
Adicione a anotação k8s.aliyun.com/acr-service-arns para especificar a função RAM ao criar um pod ECI ou cache de imagem.
Exemplo: Deployment
apiVersion: apps/v1
kind: Deployment
metadata:
name: test
labels:
app: test
spec:
replicas: 2
selector:
matchLabels:
app: nginx
template:
metadata:
name: nginx-test
labels:
app: nginx
alibabacloud.com/eci: "true"
annotations:
k8s.aliyun.com/acr-service-arns: "acs:ram::1609982529******:role/acr-test" # ARN of the RAM role
spec:
containers:
- name: nginx
image: test****-registry.cn-hangzhou.cr.aliyuncs.com/eci_test/nginx:1.0 # Image in the instance the role is allowed to pull from
ports:
- containerPort: 80
Especifique uma instância Enterprise Edition com nome de domínio personalizado (mesma conta)
Se você utilizar uma instância do ACR Enterprise Edition com nome de domínio personalizado, adicione a anotação k8s.aliyun.com/acr-instance-ids para especificar a instância. A anotação aceita um ou mais IDs de instância.
Instâncias Enterprise Edition podem ser usadas entre regiões. Para referenciar uma instância em uma região diferente da do seu pod, adicione o prefixo do ID da região ao ID da instância. Exemplo: cn-beijing:cri-j36zhodptmyq**** .
Exemplo: Deployment
apiVersion: apps/v1
kind: Deployment
metadata:
name: test
labels:
app: test
spec:
replicas: 2
selector:
matchLabels:
app: nginx
template:
metadata:
name: nginx-test
labels:
app: nginx
alibabacloud.com/eci: "true"
annotations:
k8s.aliyun.com/acr-instance-ids: "cri-j36zhodptmyq****" # ACR Enterprise Edition instance ID
spec:
containers:
- name: nginx
image: test****-registry.example.com/eci_test/nginx:1.0 # Image in the Enterprise Edition instance with a custom domain name
ports:
- containerPort: 80
Exemplo: ImageCache
apiVersion: eci.alibabacloud.com/v1
kind: ImageCache
metadata:
name: imagecache-sample
annotations:
k8s.aliyun.com/acr-instance-ids: "cri-j36zhodptmyq****" # ACR Enterprise Edition instance ID
spec:
images:
- test****-registry.example.com/eci_test/nginx:1.0
imagePullSecrets:
- default:secret1
- default:secret2
- kube-system:secret3
imageCacheSize: 25
retentionDays: 7
Obter imagens entre contas
Se a instância do ACR e o recurso ECI pertencerem a contas Alibaba Cloud diferentes, configure funções RAM em ambas as contas para estabelecer uma cadeia de confiança.
A configuração envolve duas contas:
Conta A: conta onde o recurso ECI (pod ou cache de imagem) é criado.
Conta B: conta onde a instância do ACR está hospedada.
Etapa 1: Crie funções RAM em ambas as contas
Na Conta A (conta ECI):
-
Crie uma função RAM para um serviço confiável da Alibaba Cloud. Consulte Criar uma função RAM para um serviço confiável da Alibaba Cloud. Use as seguintes configurações:
Parâmetro
Valor
Entidade confiável
Alibaba Cloud Service
Tipo de função
Normal Service Role
Nome da função RAM
role-assume(exemplo)Serviço confiável
ECI
Conceda à função
role-assumepermissão para chamar a API AssumeRole do Security Token Service (STS). Defina o tipo de política como system policy e o nome da política como AliyunSTSAssumeRoleAccess. Consulte Conceder permissões a uma função RAM.-
Abra a página de detalhes da função
role-assume. Verifique as permissões e a política de confiança e copie o ARN.-
Permissões e ARN:

-
Política de confiança:

-
Na Conta B (conta ACR):
-
Crie uma função RAM para uma conta confiável da Alibaba Cloud. Consulte Criar uma função RAM para uma conta confiável da Alibaba Cloud. Use as seguintes configurações:
Parâmetro
Valor
Entidade confiável
Alibaba Cloud Account
Nome da função RAM
role-acr(exemplo)Conta confiável
Other Alibaba Cloud Account — insira o ID da Conta A
Conceda à função
role-acrpermissão para obter imagens do ACR. Defina o tipo de política como system policy e o nome da política como AliyunContainerRegistryFullAccess. Consulte Conceder permissões a uma função RAM.-
Edite a política de confiança de
role-acrpara restringir a assunção apenas arole-assume. Por padrão, todos os usuários RAM e funções RAM na Conta A podem assumirrole-acr. Para limitar isso, defina o campoRAMno elementoPrincipalcomo o ARN derole-assume:"Principal": { "RAM": [ "acs:ram::1609982529******:role/role-assume" ] } -
Verifique as permissões e a política de confiança e copie o ARN de
role-acr.-
Permissões e ARN:

-
Política de confiança:

-
Etapa 2: Referenciar ambas as funções RAM no manifesto
Adicione as anotações k8s.aliyun.com/acr-service-arns e k8s.aliyun.com/acr-user-arns para especificar as funções RAM de ambas as contas. Se a instância do ACR usar um nome de domínio personalizado, adicione também k8s.aliyun.com/acr-instance-ids.
Instâncias Enterprise Edition podem ser usadas entre regiões. Para referenciar uma instância em uma região diferente da do seu pod, adicione o prefixo do ID da região ao ID da instância. Exemplo: cn-beijing:cri-j36zhodptmyq**** .
Exemplo: Deployment
apiVersion: apps/v1
kind: Deployment
metadata:
name: test
labels:
app: test
spec:
replicas: 1
selector:
matchLabels:
app: nginx
template:
metadata:
name: nginx-test
labels:
app: nginx
alibabacloud.com/eci: "true"
annotations:
k8s.aliyun.com/acr-instance-ids: "cri-j36zhodptmyq****" # ACR instance ID
k8s.aliyun.com/acr-service-arns: "acs:ram::1609982529******:role/role-assume" # ARN of role-assume in Account A
k8s.aliyun.com/acr-user-arns: "acs:ram::1298452580******:role/role-acr" # ARN of role-acr in Account B
spec:
containers:
- name: nginx
image: test****-registry.example.com/eci_test/nginx:1.0 # Image in the Enterprise Edition instance with a custom domain name
ports:
- containerPort: 80
Exemplo: ImageCache
apiVersion: eci.alibabacloud.com/v1
kind: ImageCache
metadata:
name: imagecache-sample
annotations:
k8s.aliyun.com/acr-instance-ids: "cri-j36zhodptmyq****"
k8s.aliyun.com/acr-service-arns: "acs:ram::1609982529******:role/role-assume"
k8s.aliyun.com/acr-user-arns: "acs:ram::1298452580******:role/role-acr"
spec:
images:
- test****-registry.example.com/eci_test/nginx:1.0 # Image in the Enterprise Edition instance with a custom domain name
imagePullSecrets:
- default:secret1
- default:secret2
- kube-system:secret3
imageCacheSize: 25
retentionDays: 7