Almacenar credenciales de registro en Secrets de Kubernetes implica una sobrecarga por rotación y el riesgo de fugas de credenciales. Elastic Container Instance (ECI) admite la identidad basada en roles de RAM para la extracción de imágenes, lo que permite a los pods y a las cachés de imágenes autenticarse en Alibaba Cloud Container Registry (ACR) sin necesidad de ningún Secret de Kubernetes.
ACR ofrece instancias Personal Edition y Enterprise Edition. Container Registry Enterprise Edition es una plataforma de nivel empresarial que gestiona el ciclo de vida de los artefactos de aplicaciones nativas de la nube, incluidas imágenes de contenedores, gráficos de Helm y artefactos de Open Container Initiative (OCI). Está diseñada para escenarios de despliegue a gran escala.
Solo las imágenes almacenadas en instancias de ACR admiten la extracción sin Secret. Las imágenes alojadas fuera de ACR (por ejemplo, imágenes de Docker Hub) no pueden utilizar esta función.
Limitaciones
Las anotaciones para la extracción sin Secret surten efecto solo cuando se crea un pod basado en ECI o una caché de imágenes. Agregar o modificar anotaciones en un pod existente no tiene ningún efecto.
Agregue las anotaciones en la ubicación correcta de su manifiesto. Para un Deployment, agréguelas bajo
spec.template.metadata.annotations, no bajo elmetadata.annotationsde nivel superior.Las instancias de ACR Enterprise Edition que utilizan un nombre de dominio personalizado no tienen habilitada la extracción sin Secret de forma predeterminada. Debe especificar explícitamente el ID de la instancia mediante la anotación
k8s.aliyun.com/acr-instance-ids.
Requisitos previos
Antes de empezar, asegúrese de contar con lo siguiente:
-
Una instancia de ACR con repositorios de imágenes e imágenes configurados
Para ACR Personal Edition, consulte Usar una instancia de Container Registry Personal Edition para enviar y extraer imágenes
Para ACR Enterprise Edition, consulte Usar una instancia de Container Registry Enterprise Edition para enviar y extraer imágenes
-
(Solo para ACR Enterprise Edition) Control de acceso configurado para la instancia. De forma predeterminada, una nueva instancia Enterprise Edition está desconectada de todas las redes. Habilite el acceso antes de continuar:
Acceso a Internet: Consulte Habilitar el acceso a Internet. Una vez habilitado, podrá acceder a las imágenes entre regiones mediante el endpoint público de la instancia.
Acceso a VPC: Habilite el rol vinculado al servicio
AliyunServiceRoleForContainerRegistryAccessCustomerPrivateZone. Consulte Configurar una ACL de VPC.
Elegir un método de configuración
El método depende de si el recurso de ECI y la instancia de ACR pertenecen a la misma cuenta de Alibaba Cloud, así como de la edición de ACR que utilice.
|
Scenario |
Default behavior |
Annotations required |
|
Misma cuenta — Personal Edition o Enterprise Edition con nombre de dominio predeterminado |
La extracción sin Secret está habilitada de forma predeterminada |
Ninguna obligatoria. Opcionalmente, use |
|
Misma cuenta — Enterprise Edition con nombre de dominio personalizado |
No habilitada de forma predeterminada |
|
|
Cuentas diferentes — cualquier edición |
No habilitada de forma predeterminada |
|
Restringir qué instancias admiten la extracción sin Secret (misma cuenta)
De forma predeterminada, ECI utiliza el rol vinculado al servicio AliyunServiceRoleForECI para extraer imágenes. Este rol otorga acceso a todas las instancias Personal Edition y a todas las instancias Enterprise Edition con nombres de dominio predeterminados en la misma cuenta. Para restringir la extracción a instancias específicas, cree un rol de RAM personalizado y refiéralo en su manifiesto.
Paso 1: Crear un rol de RAM y adjuntar una política personalizada
-
Cree un rol de RAM para un servicio de confianza de Alibaba Cloud. Consulte Crear un rol de RAM para un servicio de confianza de Alibaba Cloud. Utilice la siguiente configuración:
Parameter
Value
Entidad de confianza
Alibaba Cloud Service
Tipo de rol
Normal Service Role
Nombre del rol de RAM
acr-test(ejemplo)Servicio de confianza
ECI
-
Cree una política personalizada que restrinja la extracción a una instancia específica de ACR. Consulte Crear una política personalizada. El siguiente ejemplo permite
cr:Get*ycr:List*en todos los recursos, ycr:Pull*solo en la instancia 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 obtener detalles sobre la sintaxis de las políticas, consulte Elementos de política.
Adjunte la política personalizada al rol de RAM. Consulte Otorgar permisos a un rol de RAM.
-
Abra la página de detalles del rol
acr-test, compruebe los permisos adjuntos y copie el Nombre de Recurso de Alibaba Cloud (ARN) del rol.
Paso 2: Referenciar el rol de RAM en su manifiesto
Agregue la anotación k8s.aliyun.com/acr-service-arns para especificar el rol de RAM al crear un pod de ECI o una caché de imágenes.
Ejemplo: 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
Especificar una instancia Enterprise Edition con nombre de dominio personalizado (misma cuenta)
Si utiliza una instancia de ACR Enterprise Edition con un nombre de dominio personalizado, agregue la anotación k8s.aliyun.com/acr-instance-ids para especificar la instancia. La anotación acepta uno o más IDs de instancia.
Las instancias Enterprise Edition pueden utilizarse entre regiones. Para referenciar una instancia en una región diferente a la de su pod, anteponga el ID de región al ID de la instancia. Ejemplo: cn-beijing:cri-j36zhodptmyq**** .
Ejemplo: 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
Ejemplo: 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
Extraer imágenes entre cuentas
Si la instancia de ACR y el recurso de ECI pertenecen a diferentes cuentas de Alibaba Cloud, configure roles de RAM en ambas cuentas para establecer una cadena de confianza.
La configuración involucra dos cuentas:
Cuenta A: la cuenta donde se crea el recurso de ECI (pod o caché de imágenes).
Cuenta B: la cuenta donde se aloja la instancia de ACR.
Paso 1: Crear roles de RAM en ambas cuentas
En la Cuenta A (cuenta de ECI):
-
Cree un rol de RAM para un servicio de confianza de Alibaba Cloud. Consulte Crear un rol de RAM para un servicio de confianza de Alibaba Cloud. Utilice la siguiente configuración:
Parameter
Value
Trusted entity
Alibaba Cloud Service
Role type
Normal Service Role
RAM role name
role-assume(ejemplo)Trusted service
ECI
Otorgue al rol
role-assumepermiso para llamar a la API AssumeRole de Security Token Service (STS). Establezca el tipo de política en system policy y el nombre de la política en AliyunSTSAssumeRoleAccess. Consulte Otorgar permisos a un rol de RAM.-
Abra la página de detalles del rol
role-assume. Compruebe los permisos y la política de confianza, y luego copie el ARN.-
Permisos y ARN:

-
Política de confianza:

-
En la Cuenta B (cuenta de ACR):
-
Cree un rol de RAM para una cuenta de confianza de Alibaba Cloud. Consulte Crear un rol de RAM para una cuenta de confianza de Alibaba Cloud. Utilice la siguiente configuración:
Parameter
Value
Trusted entity
Alibaba Cloud Account
RAM role name
role-acr(ejemplo)Trusted account
Other Alibaba Cloud Account — introduzca el ID de la Cuenta A
Otorgue al rol
role-acrpermiso para extraer imágenes de ACR. Establezca el tipo de política en system policy y el nombre de la política en AliyunContainerRegistryFullAccess. Consulte Otorgar permisos a un rol de RAM.-
Edite la política de confianza de
role-acrpara restringir la asunción únicamente arole-assume. De forma predeterminada, todos los usuarios de RAM y roles de RAM en la Cuenta A pueden asumirrole-acr. Para limitar esto, establezca el campoRAMen el elementoPrincipalcon el ARN derole-assume:"Principal": { "RAM": [ "acs:ram::1609982529******:role/role-assume" ] } -
Compruebe los permisos y la política de confianza, y luego copie el ARN de
role-acr.-
Permisos y ARN:

-
Política de confianza:

-
Paso 2: Referenciar ambos roles de RAM en su manifiesto
Agregue las anotaciones k8s.aliyun.com/acr-service-arns y k8s.aliyun.com/acr-user-arns para especificar los roles de RAM de ambas cuentas. Si la instancia de ACR utiliza un nombre de dominio personalizado, agregue también k8s.aliyun.com/acr-instance-ids.
Las instancias Enterprise Edition pueden utilizarse entre regiones. Para referenciar una instancia en una región diferente a la de su pod, anteponga el ID de región al ID de la instancia. Ejemplo: cn-beijing:cri-j36zhodptmyq**** .
Ejemplo: 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
Ejemplo: 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