Konfiguracja AWS EFS CSI Driver na klastrze AWS EKS

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"
        }
      }
    }
  ]
}
  1. Identyfikator 111111111111 – zamieniamy na swój account ID.
  2. 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 🙂

Related Posts