Le stockage des identifiants du registre dans des secrets Kubernetes engendre une surcharge liée à leur rotation et un risque de fuite. Elastic Container Instance (ECI) prend en charge l'authentification par rôle RAM pour l'extraction d'images, ce qui permet aux pods et aux caches d'images de s'authentifier auprès d'Alibaba Cloud Container Registry (ACR) sans aucun secret Kubernetes.
ACR propose des instances en édition personnelle et en édition professionnelle. Container Registry Enterprise Edition est une plateforme de niveau entreprise qui gère le cycle de vie des artefacts d'applications cloud native, notamment les images de conteneurs, les charts Helm et les artefacts Open Container Initiative (OCI). Elle est conçue pour les scénarios de déploiement à grande échelle.
Seules les images stockées dans des instances ACR prennent en charge l'extraction sans secret. Les images hébergées en dehors d'ACR (par exemple, les images Docker Hub) ne peuvent pas utiliser cette fonctionnalité.
Limites
Les annotations pour l'extraction sans secret prennent effet uniquement lors de la création d'un pod ou d'un cache d'images basé sur ECI. L'ajout ou la modification d'annotations sur un pod existant n'a aucun effet.
Ajoutez les annotations au bon emplacement dans votre manifeste. Pour un Deployment, ajoutez-les sous
spec.template.metadata.annotations, et non sousmetadata.annotationsau niveau supérieur.Les instances ACR Enterprise Edition utilisant un nom de domaine personnalisé ne sont pas activées par défaut pour l'extraction sans secret. Vous devez spécifier explicitement l'ID de l'instance à l'aide de l'annotation
k8s.aliyun.com/acr-instance-ids.
Prérequis
Avant de commencer, assurez-vous que vous disposez des éléments suivants :
-
Une instance ACR avec des dépôts d'images et des images configurés
Pour ACR Personal Edition, consultez Utiliser une instance Container Registry Personal Edition pour pousser et extraire des images
Pour ACR Enterprise Edition, consultez Utiliser une instance Container Registry Enterprise Edition pour pousser et extraire des images
-
(Uniquement pour ACR Enterprise Edition) Contrôle d'accès configuré pour l'instance. Par défaut, une nouvelle instance Enterprise Edition est déconnectée de tous les réseaux. Activez l'accès avant de poursuivre :
Accès Internet : Consultez la rubrique Activer l'accès Internet. Une fois activé, vous pouvez accéder aux images entre différentes régions en utilisant le point de terminaison public de l'instance.
Accès VPC : Activez le rôle lié au service
AliyunServiceRoleForContainerRegistryAccessCustomerPrivateZone. Consultez la rubrique Configurer une liste de contrôle d'accès VPC.
Choisir une méthode de configuration
La méthode dépend du fait que la ressource ECI et l'instance ACR appartiennent ou non au même compte Alibaba Cloud, ainsi que de l'édition d'ACR que vous utilisez.
|
Scénario |
Comportement par défaut |
Annotations requises |
|
Même compte — Édition personnelle ou Enterprise Edition avec un nom de domaine par défaut |
L'extraction sans secret est activée par défaut |
Aucune annotation requise. Utilisez éventuellement |
|
Même compte — Enterprise Edition avec un nom de domaine personnalisé |
Non activé par défaut |
|
|
Comptes différents — toute édition |
Non activé par défaut |
|
Restreindre les instances prenant en charge l'extraction sans secret (même compte)
Par défaut, ECI utilise le rôle lié au service AliyunServiceRoleForECI pour extraire des images. Ce rôle accorde l'accès à toutes les instances Personal Edition et à toutes les instances Enterprise Edition avec des noms de domaine par défaut dans le même compte. Pour limiter l'extraction à des instances spécifiques, créez un rôle RAM personnalisé et référencez-le dans votre manifeste.
Étape 1 : Créer un rôle RAM et attacher une politique personnalisée
-
Créez un rôle RAM pour un service Alibaba Cloud de confiance. Consultez la rubrique Créer un rôle RAM pour un service Alibaba Cloud de confiance. Utilisez les paramètres suivants :
Paramètre
Valeur
Entité de confiance
Service Alibaba Cloud
Type de rôle
Rôle de service normal
Nom du rôle RAM
acr-test(exemple)Service de confiance
ECI
-
Créez une politique personnalisée qui limite l'extraction à une instance ACR spécifique. Consultez la rubrique Créer une politique personnalisée. L'exemple suivant autorise
cr:Get*etcr:List*sur toutes les ressources, etcr:Pull*uniquement sur l'instance spécifiée :{ "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****" ] } ] }Pour plus de détails sur la syntaxe des politiques, consultez la rubrique Éléments de politique.
Attachez la politique personnalisée au rôle RAM. Consultez la rubrique Accorder des autorisations à un rôle RAM.
-
Ouvrez la page des détails du rôle
acr-test, vérifiez les autorisations attachées et copiez le nom de ressource Alibaba Cloud (ARN) du rôle.
Étape 2 : Référencer le rôle RAM dans votre manifeste
Ajoutez l'annotation k8s.aliyun.com/acr-service-arns pour spécifier le rôle RAM lors de la création d'un pod ECI ou d'un cache d'images.
Exemple : 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
Spécifier une instance Enterprise Edition avec un nom de domaine personnalisé (même compte)
Si vous utilisez une instance ACR Enterprise Edition avec un nom de domaine personnalisé, ajoutez l'annotation k8s.aliyun.com/acr-instance-ids pour spécifier l'instance. L'annotation accepte un ou plusieurs ID d'instance.
Les instances Enterprise Edition peuvent être utilisées entre différentes régions. Pour référencer une instance située dans une région différente de celle de votre pod, préfixez l'ID de région à l'ID de l'instance. Exemple : cn-beijing:cri-j36zhodptmyq**** .
Exemple : 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
Exemple : 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
Extraire des images entre comptes
Si l'instance ACR et la ressource ECI appartiennent à des comptes Alibaba Cloud différents, configurez des rôles RAM dans les deux comptes pour établir une chaîne de confiance.
La configuration implique deux comptes :
Compte A : le compte dans lequel la ressource ECI (pod ou cache d'images) est créée.
Compte B : le compte dans lequel l'instance ACR est hébergée.
Étape 1 : Créer des rôles RAM dans les deux comptes
Dans le Compte A (compte ECI) :
-
Créez un rôle RAM pour un service Alibaba Cloud de confiance. Consultez la rubrique Créer un rôle RAM pour un service Alibaba Cloud de confiance. Utilisez les paramètres suivants :
Paramètre
Valeur
Entité de confiance
Service Alibaba Cloud
Type de rôle
Rôle de service normal
Nom du rôle RAM
role-assume(exemple)Service de confiance
ECI
Accordez au rôle
role-assumel'autorisation d'appeler l'API AssumeRole du Security Token Service (STS). Définissez le type de politique sur system policy et le nom de la politique sur AliyunSTSAssumeRoleAccess. Consultez la rubrique Accorder des autorisations à un rôle RAM.-
Ouvrez la page des détails du rôle
role-assume. Vérifiez les autorisations et la politique de confiance, puis copiez l'ARN.-
Autorisations et ARN :

-
Politique de confiance :

-
Dans le Compte B (compte ACR) :
-
Créez un rôle RAM pour un compte Alibaba Cloud de confiance. Consultez la rubrique Créer un rôle RAM pour un compte Alibaba Cloud de confiance. Utilisez les paramètres suivants :
Paramètre
Valeur
Entité de confiance
Compte Alibaba Cloud
Nom du rôle RAM
role-acr(exemple)Compte de confiance
Autre compte Alibaba Cloud — saisissez l'ID du Compte A
Accordez au rôle
role-acrl'autorisation d'extraire des images depuis ACR. Définissez le type de politique sur system policy et le nom de la politique sur AliyunContainerRegistryFullAccess. Consultez la rubrique Accorder des autorisations à un rôle RAM.-
Modifiez la politique de confiance de
role-acrpour restreindre l'assomption au seul rôlerole-assume. Par défaut, tous les utilisateurs RAM et rôles RAM du Compte A peuvent assumer le rôlerole-acr. Pour limiter cela, définissez le champRAMdans l'élémentPrincipalsur l'ARN derole-assume:"Principal": { "RAM": [ "acs:ram::1609982529******:role/role-assume" ] }Consultez la rubrique Modifier la politique de confiance d'un rôle RAM.
-
Vérifiez les autorisations et la politique de confiance, puis copiez l'ARN de
role-acr.-
Autorisations et ARN :

-
Politique de confiance :

-
Étape 2 : Référencer les deux rôles RAM dans votre manifeste
Ajoutez les annotations k8s.aliyun.com/acr-service-arns et k8s.aliyun.com/acr-user-arns pour spécifier les rôles RAM des deux comptes. Si l'instance ACR utilise un nom de domaine personnalisé, ajoutez également k8s.aliyun.com/acr-instance-ids.
Les instances Enterprise Edition peuvent être utilisées entre différentes régions. Pour référencer une instance située dans une région différente de celle de votre pod, préfixez l'ID de région à l'ID de l'instance. Exemple : cn-beijing:cri-j36zhodptmyq**** .
Exemple : 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
Exemple : 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