Ein vollständig verwalteter Kubernetes-Service auf AWS ist eine feine Sache: binnen weniger Minuten können wir auf EKS-Cluster zugreifen und von den Möglichkeiten der Plattform profitieren.
Doch wie sieht es mit den Kosten aus? AWS berechnet Gebühren für Compute, Storage und Data Transfer. Hinzu kommt noch eine feste monatliche Gebühr in Höhe von 73 US-Dollar pro EKS-Cluster …
Laufende Kosten im Blick
Kubernetes-Cluster sind hochdynamische Plattformen zum Betrieb von Containern. Additiv zur erwähnten festen Servicegebühr kommen natürlich noch Kosten für laufende EC2-Instanzen, Fargate-Nutzung und Storage (EBS und bei Bedarf auch EFS). Haben wir an alles gedacht? Was, wenn wir auch noch MySQL-Datenbanken in RDS nutzen wollen und unsere Applikationen reichlich Gebrauch von S3 machen?
Hier den Überblick zu behalten und nicht erst am Monatsende die Überraschung in Gestalt der AWS-Rechnung zu erleben, ist aus dem Stand nicht immer einfach.
kubecost und AWS EKS
Im August 2022 kündigte Amazon die Kooperation mit dem Projekt kubecost an: EKS-Nutzer können von nun an ohne Zusatzkosten von kubecost profitieren. Einige Features erfordern aber dennoch eine gültige Lizenz.
Neben Amazons Kubernetes-Service werden auch Azure/AKS und Google GKE sowie on-premise-Cluster unterstützt. Unter der Haube steckt das Open-Source-Projekt opencost.
Werfen wir einen Blick darauf. Zunächst erstellen wir ein neues EKS-Cluster mit den gängigen Deployment-Modellen:
- EC2 on demand
- Spot Instances
- Fargate Profiles
Der Einfachheit halber nutzen wir eksctl zur Cluster-Bereitstellung und natürlich Helm.
Darüber hinaus sollen unsere Kubernetes-Applikationen auch noch RDS und S3 nutzen. Dafür würden wir AWS Cost and Usage Report (CUR) und AWS Athena integrieren und konfigurieren, was den Rahmen dieses Beitrags sprengen würde.
Durch sauberes und konsequentes Tagging aller genutzten Ressourcen stellen wir die Zuordnung im AWS Cost Explorer sicher.
Wichtig
Alle von kubecost gesammelten Daten bleiben im Cluster! Es werden keine Daten irgendwohin transportiert oder gar gespeichert!
In vier Schritten zur Kostenanalyse
Um nun einen Überblick über die Kosten zu erhalten, müssen wir vier kleine Schritte gehen.
1. EKS-Cluster bereitstellen
Zunächst erstellen wir einen EKS-Cluster mit zusätzlichen Spot- und Fargate-Ressourcen:
export EKS_CLUSTER_NAME=kubecost-demo export CREATOR=Mayflower export AWS_REGION=eu-central-1 export AWS_ACCOUNT_ID=<your-account-id> export FARGATE_NAMESPACE=fargate eksctl create cluster \ --name ${EKS_CLUSTER_NAME} \ --external-dns-access \ --asg-access \ --full-ecr-access \ --alb-ingress-access \ --with-oidc \ --managed \ --nodes-min 3 \ --nodes-max 5 \ --tags "Creator=${CREATOR}" \ --auto-kubeconfig \ --region ${AWS_REGION} export KUBECONFIG=$HOME/.kube/eksctl/clusters/${EKS_CLUSTER_NAME} eksctl create addon \ --name aws-ebs-csi-driver \ --cluster ${EKS_CLUSTER_NAME} \ --service-account-role-arn arn:aws:iam::${AWS_ACCOUNT_ID}:role/AmazonEKS_EBS_CSI_DriverRole \ --wait \ --force eksctl create nodegroup \ --cluster=${EKS_CLUSTER_NAME} \ --spot --instance-types=m5.large,t3.medium,t3.xlarge \ --region ${AWS_REGION} eksctl create fargateprofile \ --namespace ${FARGATE_NAMESPACE} \ --cluster ${EKS_CLUSTER_NAME} \ --region ${AWS_REGION} kubectl create namespace ${FARGATE_NAMESPACE}
2. kubecost installieren
helm upgrade -i kubecost \ oci://public.ecr.aws/kubecost/cost-analyzer --version 1.98.0 \ --namespace kubecost --create-namespace \ -f https://raw.githubusercontent.com/kubecost/cost-analyzer-helm-chart/develop/cost-analyzer/values-eks-cost-monitoring.yaml
3. Beispiel-Applikation ausrollen
Nun rollen wir unsere Beispiel-Applikation aus, inklusive Spot- und Fargate-Installationen.
# WordPress: helm repo add bitnami https://charts.bitnami.com/bitnami helm install wordpress bitnami/wordpress # etwas auf Fargate: kubectl run nginx --image=nginx --restart=Never --namespace fargate # und zu guter letzt auf Spot: # hierbei ist jedes Standard-Deployment möglich, mit der Anpassung "NodeAffinity" und "Tolerations". # ein Beispiel (cut): apiVersion: apps/v1 kind: Deployment metadata: ## cut ..... spec: ## cut ..... spec: affinity: nodeAffinity: preferredDuringSchedulingIgnoredDuringExecution: - weight: 1 preference: matchExpressions: - key: eks.amazonaws.com/capacityType operator: In values: - SPOT tolerations: - key: "spotInstance" operator: "Equal" value: "true" effect: "PreferNoSchedule" ## cut .....
4. Kosten analysieren
kubecost analysiert in Echtzeit die Nutzung unserer Cluster-Ressourcen. Preisangaben werden dynamisch über das Billing- und Pricing-API bezogen. Übrigens: für on-premise-Cluster kann ein Preismodell definiert und abgelegt werden, auf welches sich dann kubecost beziehen kann.
Folgende Erkenntnisse können gewonnen werden:
- Ausgaben, aggregiert über Namespaces, Deployments, Services u. a. m.
- Utilization: RAM, CPU, GPU, Storage (PV, PVC)
- Kosten-Rückschau und -Vorschau
- Einsparpotentiale
- ungenutzte Ressourcen
kubecost Dashboard
Wir erreichen das Dashboard über Port Forwarding. Alternativ kann eine Ingress-Regel definiert werden; und die kostenpflichtige Version von kubecost unterstützt darüber hinaus auch Single Sign-on.
kubectl port-forward --namespace kubecost deployment/kubecost-cost-analyzer 9090
Resümee
kubecost hilft uns, den Überblick über unsere Kubernetes-Ausgaben zu behalten. Ein übersichtliches Dashboard ist intuitiv zu bedienen und weitere Integrationen sind möglich: zum Beispiel können Ausgaben zu RDS oder S3 mit einbezogen werden.
Ein weiterer großer Pluspunkt: Daten bleiben in deinem Cluster. Zu keinem Zeitpunkt werden Mess- oder sonstige Daten extern verbreitet. Und auch mehrere Cluster können einheitlich betrachtet werden.
Weitere Ressourcen
Natürlich habe ich noch weitere Ressourcen zur Hand. Zum einen bereiten wir nach und nach Videos unseres Mayflower Cloud Day 2022 für euch auf – ihr findet sie in der Playlist auf unserem Youtube-Channel. Wie der Zufall es möchte, behandelt das erste Video das Thema Kostenmanagement in der AWS-Cloud.
Darüber hinaus habe ich aber auch noch ein paar weiterführende Blogposts, die euch das Thema kubecost näher bringen.
Schreibe einen Kommentar