Gestione del componente aggiuntivo autogestito CSI per Amazon EBS
Questo argomento illustra come implementare il driver CSI per Amazon EBS come componente aggiuntivo autogestito nel cluster Amazon EKS e verificarne il funzionamento.
Il driver non è supportato su Fargate. Le caratteristiche alfa del driver CSI per Amazon EBS non sono supportate nei cluster Amazon EKS.
Per una descrizione dettagliata dei parametri disponibili ed esempi completi che illustrano le caratteristiche del driver, consultare il progetto Driver Container Storage Interface (CSI) per Amazon EBS su GitHub.
Implementazione del driver CSI per Amazon EBS in un cluster Amazon EKS
-
Creare una policy IAM che consenta all'account di servizio del driver CSI di effettuare chiamate alle API AWS per conto dell'utente. Il documento di policy può essere visualizzato su GitHub.
-
Eseguire il download del documento di policy IAM da GitHub.
curl -o example-iam-policy.json https://raw.githubusercontent.com/kubernetes-sigs/aws-ebs-csi-driver/master/docs/example-iam-policy.json
-
Creare la policy. È possibile modificare AmazonEKS_EBS_CSI_Driver_Policy
con un nome diverso. Se la modifichi, assicurati di modificarla anche nei passaggi successivi.
aws iam create-policy \
--policy-name AmazonEKS_EBS_CSI_Driver_Policy
\
--policy-document file://example-iam-policy.json
-
Creare un ruolo IAM e collegarvi la policy IAM. In alternativa, è possibile utilizzare eksctl
o la AWS CLI.
- eksctl
-
Sostituire my-cluster
con il nome del cluster e 111122223333
con l'ID del proprio account.
eksctl create iamserviceaccount \
--name ebs-csi-controller-sa \
--namespace kube-system \
--cluster my-cluster
\
--attach-policy-arn arn:aws:iam::111122223333
:policy/AmazonEKS_EBS_CSI_Driver_Policy
\
--approve \
--override-existing-serviceaccounts
Recuperare l'ARN del ruolo creato e annotare il valore restituito per l'utilizzo in un passaggio successivo.
aws cloudformation describe-stacks \
--stack-name eksctl-my-cluster
-addon-iamserviceaccount-kube-system-ebs-csi-controller-sa \
--query='Stacks[].Outputs[?OutputKey==`Role1`].OutputValue' \
--output text
L'output è il seguente.
arn:aws:iam::111122223333
:role/eksctl-my-cluster
-addon-iamserviceaccount-kube-sy-Role1-1J7XB63IN3L6T
- AWS CLI
-
-
Visualizzare l'URL del provider OIDC del cluster. Sostituire my-cluster
con il nome del cluster. Se l'output dal comando è None
, rivedere i Prerequisiti.
aws eks describe-cluster \
--name my-cluster
\
--query "cluster.identity.oidc.issuer" \
--output text
L'output è il seguente.
https://oidc.eks.region-code
.amazonaws.com/id/oidc-id
-
Creare il ruolo IAM.
-
Copiare i contenuti seguenti in un file denominato trust-policy.json
. Sostituisci 111122223333
con l'ID del tuo account, region-code
con la tua Regione AWS e oidc-id
con il valore restituito nella fase precedente.
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"Federated": "arn:aws:iam::111122223333
:oidc-provider/oidc.eks.region-code
.amazonaws.com/id/oidc-id
"
},
"Action": "sts:AssumeRoleWithWebIdentity",
"Condition": {
"StringEquals": {
"oidc.eks.region-code
.amazonaws.com/id/oidc-id
:sub": "system:serviceaccount:kube-system:ebs-csi-controller-sa"
}
}
}
]
}
-
Creare il ruolo. È possibile modificare AmazonEKS_EBS_CSI_DriverRole
con un nome diverso. Se la modifichi, assicurati di modificarla anche nei passaggi successivi.
aws iam create-role \
--role-name AmazonEKS_EBS_CSI_DriverRole
\
--assume-role-policy-document file://"trust-policy.json
"
-
Allegare la policy IAM al ruolo. Sostituire 111122223333
con l'ID del proprio account.
aws iam attach-role-policy \
--policy-arn arn:aws:iam::111122223333
:policy/AmazonEKS_EBS_CSI_Driver_Policy
\
--role-name AmazonEKS_EBS_CSI_DriverRole
-
È possibile implementare il driver utilizzando Helm o un manifesto. Per la compatibilità del driver con Helm, vedere la Tabella relativa alla compatibilità delle versioni Kubernetes su GitHub. Se si desidera installare una versione precedente del driver CSI per Amazon EBS, utilizzare il manifesto.
- Helm
-
Installazione del driver CSI per Amazon EBS utilizzando Helm V3 o versioni successive. Per installare o aggiornare Helm, consultare Utilizzo di Helm con Amazon EKS.
-
Aggiungere il repository Helm aws-ebs-csi-driver
:
helm repo add aws-ebs-csi-driver https://kubernetes-sigs.github.io/aws-ebs-csi-driver
helm repo update
-
Installare una versione del driver utilizzando il grafico Helm. Sostituire l'indirizzo del repository con l'Indirizzo immagine container del cluster. Utilizzare il comando corrispondente allo strumento utilizzato per creare il ruolo in un passaggio precedente.
-
Se hai usato eksctl
per creare il ruolo, utilizzare il seguente comando.
helm upgrade -install aws-ebs-csi-driver aws-ebs-csi-driver/aws-ebs-csi-driver \
--namespace kube-system \
--set image.repository=123456789012
.dkr.ecr.region-code
.amazonaws.com/eks/aws-ebs-csi-driver \
--set controller.serviceAccount.create=false \
--set controller.serviceAccount.name=ebs-csi-controller-sa
-
Se hai usato AWS CLI per creare il ruolo, utilizzare il seguente comando con il ruolo ARN corretto creato.
helm upgrade -install aws-ebs-csi-driver aws-ebs-csi-driver/aws-ebs-csi-driver \
--namespace kube-system \
--set image.repository=123456789012
.dkr.ecr.region-code
.amazonaws.com/eks/aws-ebs-csi-driver \
--set controller.serviceAccount.create=true \
--set controller.serviceAccount.name=ebs-csi-controller-sa \
--set controller.serviceAccount.annotations."eks\.amazonaws\.com/role-arn"="arn:aws:iam::111122223333
:role/AmazonEKS_EBS_CSI_DriverRole
"
- Manifest
-
È possibile implementare il driver per creare volumi con o senza tag.
-
Con tag – Implementa il driver in modo che tagghi tutti i volumi Amazon EBS creati con i tag specificati.
-
Clonare il repository GitHub del driver Container Storage Interface (CSI) per Amazon EBS nel computer.
git clone https://github.com/kubernetes-sigs/aws-ebs-csi-driver.git
-
Accedere alla cartella di esempio base
.
cd aws-ebs-csi-driver/deploy/kubernetes/base/
-
Modificare il file controller.yaml
. Trovare la sezione del file con il testo seguente e aggiungere --extra-tags
. Il testo seguente mostra la sezione del file con il testo esistente e aggiunto. Questo esempio fa sì che il controller aggiunga i tag department
e environment
a tutti i volumi che crea.
...
containers:
- name: ebs-plugin
image: amazon/aws-ebs-csi-driver:latest
imagePullPolicy: IfNotPresent
args:
# - {all,controller,node} # specify the driver mode
- --endpoint=$(CSI_ENDPOINT)
- --logtostderr
- --v=5
- --extra-tags=department=accounting
,environment=dev
...
-
Accedere alla cartella ecr
.
cd ../overlays/stable/ecr
Se il cluster non si trova nella us-west-2
Regione AWS, sostituisci 602401143452.dkr.ecr.us-west-2.amazonaws.com
con l'indirizzo dell'immagine del container del tuo cluster nel file kustomization.yaml
.
-
Applicare il file manifesto modificato al cluster.
kubectl apply -k ../ecr
-
Annotare l'account del servizio Kubernetes ebs-csi-controller-sa
con l'ARN del ruolo IAM creato precedentemente. Utilizzare il comando corrispondente allo strumento utilizzato per creare il ruolo in un passaggio precedente. Sostituire 111122223333
con l'ID del proprio account.
-
Se hai usato eksctl
per creare il ruolo, utilizzare questo comando.
kubectl annotate serviceaccount ebs-csi-controller-sa \
-n kube-system \
eks.amazonaws.com/role-arn=arn:aws:iam::111122223333
:role/eksctl-my-cluster
-addon-iamserviceaccount-kube-sy-Role1-1J7XB63IN3L6T
-
Se hai usato AWS CLI per creare il ruolo, utilizzare questo comando.
kubectl annotate serviceaccount ebs-csi-controller-sa \
-n kube-system \
eks.amazonaws.com/role-arn=arn:aws:iam::111122223333
:role/AmazonEKS_EBS_CSI_DriverRole
-
Riavviare l'implementazione ebs-csi-controller
.
kubectl rollout restart \
deployment ebs-csi-controller \
-n kube-system
-
Senza tag – Implementa il driver in modo che non tagghi i volumi Amazon EBS da lui creati. Per visualizzare o scaricare il file kustomization.yaml
, vedere il file su GitHub.
Se il cluster non si trova nella us-west-2
Regione AWS, sostituisci 602401143452.dkr.ecr.us-west-2.amazonaws.com
con l'indirizzo dell'immagine del container del tuo cluster nel file kustomization.yaml
. Quindi, applica il file manifesto localmente.
-
Applicare il file manifesto.
kubectl apply -k "github.com/kubernetes-sigs/aws-ebs-csi-driver/deploy/kubernetes/overlays/stable/ecr/?ref=master"
-
Annotare l'account del servizio Kubernetes ebs-csi-controller-sa
con l'ARN del ruolo IAM creato precedentemente. Utilizzare il comando corrispondente allo strumento utilizzato per creare il ruolo in un passaggio precedente. Sostituire 111122223333
con l'ID del proprio account.
-
Se hai usato eksctl
per creare il ruolo, utilizzare questo comando.
kubectl annotate serviceaccount ebs-csi-controller-sa \
-n kube-system \
eks.amazonaws.com/role-arn=arn:aws:iam::111122223333
:role/eksctl-my-cluster
-addon-iamserviceaccount-kube-sy-Role1-1J7XB63IN3L6T
-
Se hai usato AWS CLI per creare il ruolo, utilizzare questo comando.
kubectl annotate serviceaccount ebs-csi-controller-sa \
-n kube-system \
eks.amazonaws.com/role-arn=arn:aws:iam::111122223333
:role/AmazonEKS_EBS_CSI_DriverRole
-
Eliminare i pod del driver. Vengono reimplementati automaticamente con le autorizzazioni IAM dalle policy IAM assegnate al ruolo.
kubectl delete pods \
-n kube-system \
-l=app=ebs-csi-controller
Per implementare un'applicazione di esempio e verificare il funzionamento del driver CSI
Questa procedura utilizza l'esempio di provisioning di volumi dinamici disponibile nel repository GitHub del driver Container Storage Interface (CSI) per Amazon EBS finalizzato all'uso di un volume Amazon EBS con provisioning dinamico. È possibile implementare applicazioni di esempio che utilizzano snapshot di volume o dimensionamento volume seguendo le istruzioni su GitHub.
-
Clonare il repository GitHub del driver Container Storage Interface (CSI) per Amazon EBS nel sistema locale.
git clone https://github.com/kubernetes-sigs/aws-ebs-csi-driver.git
-
Passare alla directory di esempio dynamic-provisioning
.
cd aws-ebs-csi-driver/examples/kubernetes/dynamic-provisioning/
-
Implementare la classe di storage ebs-sc
, la dichiarazione di volume persistente ebs-claim
e l'applicazione di esempio app
dalla directory specs
.
kubectl apply -f specs/
-
Descrivere la classe di storage ebs-sc
.
kubectl describe storageclass ebs-sc
L'output è il seguente.
Name: ebs-sc
IsDefaultClass: No
Annotations: kubectl.kubernetes.io/last-applied-configuration={"apiVersion":"storage.k8s.io/v1","kind":"StorageClass","metadata":{"annotations":{},"name":"ebs-sc"},"provisioner":"ebs.csi.aws.com","volumeBindingMode":"WaitForFirstConsumer"}
Provisioner: ebs.csi.aws.com
Parameters: <none>
AllowVolumeExpansion: <unset>
MountOptions: <none>
ReclaimPolicy: Delete
VolumeBindingMode: WaitForFirstConsumer
Events: <none>
La classe di storage utilizza la modalità di associazione di volumi WaitForFirstConsumer
. Ciò significa che i volumi non vengono assegnati dinamicamente finché un pod non effettua una dichiarazione di volume persistente. Per ulteriori informazioni, consultare la sezione relativa alla modalità di associazione dei volumi nella documentazione Kubernetes.
-
Controlla i pod nello spazio dei nomi predefinito. Dopo pochi minuti, lo stato del pod app
cambia in Running
.
kubectl get pods --watch
Inserire Ctrl
+C
per tornare a un prompt della shell.
-
Elencare i volumi persistenti nello spazio dei nomi predefinito. Cercare un volume persistente con la richiesta default/ebs-claim
.
kubectl get pv
L'output è il seguente.
NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE
pvc-37717cd6-d0dc-11e9-b17f-06fad4858a5a
4Gi RWO Delete Bound default/ebs-claim ebs-sc 30s
-
Descrivere il volume persistente. Sostituisci pvc-37717cd6-d0dc-11e9-b17f-06fad4858a5a
con il valore dell'output del passaggio precedente.
kubectl describe pv pvc-37717cd6-d0dc-11e9-b17f-06fad4858a5a
L'output è il seguente.
Name: pvc-37717cd6-d0dc-11e9-b17f-06fad4858a5a
Labels: <none>
Annotations: pv.kubernetes.io/provisioned-by: ebs.csi.aws.com
Finalizers: [kubernetes.io/pv-protection external-attacher/ebs-csi-aws-com]
StorageClass: ebs-sc
Status: Bound
Claim: default/ebs-claim
Reclaim Policy: Delete
Access Modes: RWO
VolumeMode: Filesystem
Capacity: 4Gi
Node Affinity:
Required Terms:
Term 0: topology.ebs.csi.aws.com/zone in [region-code
]
Message:
Source:
Type: CSI (a Container Storage Interface (CSI) volume source)
Driver: ebs.csi.aws.com
VolumeHandle: vol-0d651e157c6d93445
ReadOnly: false
VolumeAttributes: storage.kubernetes.io/csiProvisionerIdentity=1567792483192
-8081-ebs.csi.aws.com
Events: <none>
L'ID volume Amazon EBS è il valore per VolumeHandle
nell'output precedente.
-
Verificare che il pod scriva correttamente i dati nel volume.
kubectl exec -it app -- cat /data/out.txt
L'output è il seguente.
Wed May 5 16:17:03 UTC 2021
Wed May 5 16:17:08 UTC 2021
Wed May 5 16:17:13 UTC 2021
Wed May 5 16:17:18 UTC 2021
...
-
Al termine, eliminare le risorse per questa applicazione di esempio.
kubectl delete -f specs/