Jak skonfigurować klaster AWS EKS, aby móc korzystać z dysków EFS? Z pomocą przychodzi nam Amazon EFS CSI Driver, które konfigurację pokaże w poniższym artykule.
Co potrzebne na start?
Aby zacząć pracę, potrzebujemy dwóch rzeczy.
1. Utworzony klaster AWS EKS, jak to zrobić opisywałem w innym poście: https://cloud-devops.pl/tworzenie-klastra-kubernetes-przy-pomocy-aws-eks/
2. Musimy utworzyć IAM OIDC provider dla naszego klastra, jak to zrobić odysłam do dokumentacji AWS: https://docs.aws.amazon.com/eks/latest/userguide/enable-iam-roles-for-service-accounts.html
Na potrzeby tego postu, utworzyłem sobie klaster o nazwie LearningCluster, więc pamiętajcie, aby podmieniać nazwę na swoją 🙂
Zaczynamy!
W pierwszej kolejności, musimy uzyskać OIDC provider URL, uzyskamy go za pomocą polecenia
aws eks describe-cluster --name LearningCluster --query "cluster.identity.oidc.issuer" --output text
Adres z wyniku zapiszcie sobie gdziekolwiek, ponieważ będzie nam potrzebny za chwilę.
Tworzenie IAM Role
Tworzymy sobie plik aws-efs-csi-driver-trust-policy.json, w którym będzie opisana nasza polityka
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"Federated": "arn:aws:iam::111111111111:oidc-provider/oidc.eks.eu-central-1.amazonaws.com/id/0D3CE66EC9F706CE79436E6E59367AA9"
},
"Action": "sts:AssumeRoleWithWebIdentity",
"Condition": {
"StringLike": {
"oidc.eks.eu-central-1.amazonaws.com/id/0D3CE66EC9F706CE79436E6E59367AA9:sub": "system:serviceaccount:kube-system:efs-csi-*",
"oidc.eks.eu-central-1.amazonaws.com/id/0D3CE66EC9F706CE79436E6E59367AA9:aud": "sts.amazonaws.com"
}
}
}
]
}
- Identyfikator 111111111111 – zamieniamy na swój account ID.
- Natomiast wszystkie wystąpienia oidc.eks.eu-central-1.amazonaws.com/id/0D3CE66EC9F706CE79436E6E59367AA9 zamieniamy na adres, który otrzymaliśmy w poprzednim kroku
Kolejnym krokiem jest utworzenie roli z wykorzystaniem utworzonego pliku, robimy to przy pomocy polecenia
aws iam create-role \
--role-name AmazonEKS_EFS_CSI_DriverRole \
--assume-role-policy-document file://"aws-efs-csi-driver-trust-policy.json"
Nasz rola wymaga dodania polityki o nazwie AmazonEBSCSIDriverPolicy, robimy to w poniższy sposób
aws iam attach-role-policy \
--policy-arn arn:aws:iam::aws:policy/service-role/AmazonEFSCSIDriverPolicy \
--role-name AmazonEKS_EFS_CSI_DriverRole
Dzięki temu, stworzyliśmy rolę oraz przypisaliśmy im potrzebne polityki, aby wszystko działało nam bez problemu.
Aktywacja dodatku aws-efs-csi-driver
W pierwszej kolejności, musimy sprawdzić najnowszę wersję, robimy to przy pomocy polecenia
aws eks describe-addon-versions --kubernetes-version 1.30 --addon-name aws-efs-csi-driver \
--query 'addons[].addonVersions[].{Version: addonVersion, Defaultversion: compatibilities[0].defaultVersion}' --output table
W momencie tworzenia tego artykułu, była to wersja v2.0.2-eksbuild.1. Teraz musimy aktywować dodatek na naszym klastrze, robimy to przy pomocy polecenia
aws eks create-addon --cluster-name LearningCluster --addon-name aws-efs-csi-driver --addon-version v2.0.2-eksbuild.1 \
--service-account-role-arn arn:aws:iam::111111111111:role/AmazonEKS_EFS_CSI_DriverRole --resolve-conflicts OVERWRITE
Na koniec sprawdzamy czy nasz dodatek został poprawnie włączony, robimy to przy pomocy polecenia
aws eks list-addons --cluster-name LearningCluster
Jezeli nasz dodatek jest umieszony na liście, to wszystko zrobiliśmy poprawnie 🙂
Wykorzystanie EFS w praktyce
Ostatnim krokiem jaki znam został, to przetestowanie czy pod zamontuje nam poprawnie EFS jako wolumen. Do tego kroku potrzebujemy wcześniej utworzony dysk EFS, a dokładnie jego identyfikator oraz poniższe manifesty kubernetesa
1. Storage Class
kind: StorageClass
apiVersion: storage.k8s.io/v1
metadata:
name: efs-sc
provisioner: efs.csi.aws.com
2. Persistent Volume
apiVersion: v1
kind: PersistentVolume
metadata:
name: efs-claim-pv
spec:
volumeMode: Filesystem
persistentVolumeReclaimPolicy: Retain
accessModes:
- ReadWriteMany
storageClassName: efs-sc
capacity:
storage: 10Gi
csi:
volumeHandle: id_volumenu_efs
driver: efs.csi.aws.com
3. Persistent Volume Claim
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: efs-claim
spec:
accessModes:
- ReadWriteMany
storageClassName: efs-sc
resources:
requests:
storage: 5Gi
4. Pod
apiVersion: v1
kind: Pod
metadata:
name: efs-app
spec:
containers:
- name: nginx
image: nginx
volumeMounts:
- name: persistent-storage
mountPath: /usr/share/nginx/html
volumes:
- name: persistent-storage
persistentVolumeClaim:
claimName: efs-claim
Ostatnie co nam pozostało to odpalić poniższe polecenie i jeżeli zrobiliśmy wszystko poprawnie to cieszyć się z zamontowanego dysku EFS do klastra EKS
kubectl apply -f .
Mam nadzieję, że powyższy artykuł pomoże komuś z montowaniem EFS do klastra AWS EKS 🙂