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