Konfiguracja AWS EBS na klastrze AWS EKS

Jak skonfigurować klaster AWS EKS, aby móc korzystać z dysków EBS? Z pomocą przychodzi nam Amazon EBS 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

URL zapiszcie sobie gdziekolwiek, ponieważ będzie nam potrzebny za chwilę.

Tworzenie IAM Role

Tworzymy sobie plik aws-ebs-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/36433FA6E2B992357BA6EFE8169128D9"
      },
      "Action": "sts:AssumeRoleWithWebIdentity",
      "Condition": {
        "StringEquals": {
          "oidc.eks.eu-central-1.amazonaws.com/id/36433FA6E2B992357BA6EFE8169128D9:aud": "sts.amazonaws.com",
          "oidc.eks.eu-central-1.amazonaws.com/id/36433FA6E2B992357BA6EFE8169128D9:sub": "system:serviceaccount:kube-system:ebs-csi-controller-sa"
        }
      }
    }
  ]
}
  1. Identyfikator 111111111111 – zamieniamy na swój account ID.
  2. Natomiast wszystkie wystąpienia oidc.eks.eu-central-1.amazonaws.com/id/36433FA6E2B992357BA6EFE8169128D9 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_EBS_CSI_DriverRole \
  --assume-role-policy-document file://"aws-ebs-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/AmazonEBSCSIDriverPolicy --role-name AmazonEKS_EBS_CSI_DriverRole

Dzięki temu, stworzyliśmy rolę oraz przypisaliśmy im potrzebne polityki, aby wszystko działało nam bez problemu.

Dodanie Amazon EBS CSI driver do klastra

Kolejnym krokiem, który musimy wykonać jest dodanie do naszego klastra addon o nazwie EBS CSI Driver z wcześniej utworzoną rolą, można to zrobić w konsoli lub poprzez CLI, w naszym wypadku zrobimy to przy pomocy CLI, za pomocą polecenia

aws eks create-addon --cluster-name LearningCluster --addon-name aws-ebs-csi-driver --service-account-role-arn arn:aws:iam::111111111111:role/AmazonEKS_EBS_CSI_DriverRole

Teraz do adnotacji ServiceAccount o nazwie ebs-csi-controller-sa, musimy dodać informację odnośnie utworzonej roli, dodajemy to za pomocą polecenia

kubectl annotate serviceaccount ebs-csi-controller-sa     -n kube-system     eks.amazonaws.com/role-arn=arn:aws:iam::111111111111:role/AmazonEKS_EBS_CSI_DriverRole

Ostatnim krokiem z całego procesu konfiguracji jaki nam został, jest restart kontrolera, robimy to za pomocą polecenia

kubectl rollout restart deployment ebs-csi-controller -n kube-system

I to tyle, jeżeli chodzi o konfigurację EKS, aby mógł swobodnie korzystać z EBS.

Testujemy konfigurację

Po pomyślnej konfiguracji, zostało nam przetestować czy wszystko działa jak należy. W tym celu, utworzymy 3 pliki tzn pod, storageclass oraz claim.

pod.yml

apiVersion: v1
kind: Pod
metadata:
  name: nginx
spec:
  containers:
  - name: nginx
    image: nginx
    command: ["/bin/sh"]
    args: ["-c", "while true; do echo $(date -u) >> /data/out.txt; sleep 5; done"]
    volumeMounts:
    - name: persistent-storage
      mountPath: /data
    ports:
      - containerPort: 80
  volumes:
  - name: persistent-storage
    persistentVolumeClaim:
      claimName: ebs-claim

storageclass.yml

apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: ebs-sc
provisioner: ebs.csi.aws.com
volumeBindingMode: WaitForFirstConsumer

claim.yml

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: ebs-claim
spec:
  accessModes:
    - ReadWriteOnce
  storageClassName: ebs-sc
  resources:
    requests:
      storage: 5Gi

Pliki utworzone, zostałyo nam wykonać polecenie

kubectl apply -f .

Jeżeli wszystko poprawnie skonfigurowaliśmy, to po wykonaniu polecenia

kubectl get pv

Powinniśmy zobaczyć PersistentVolume, który jest spięty z naszym PVC, tzn w claim ma default/ebs-claim, natomiast w storageclass ebs-sc 🙂

 

Related Posts