EKS & kubecost

EKS & kubecost – Kubernetes-Kosten im Griff

Avatar von Michael Krieg

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
Beispiel-Ansicht: Kosten Einsparungen durch ungenutzte Services. Bildquelle: AWS-Blogs

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.

Avatar von Michael Krieg

Kommentare

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert


Für das Handling unseres Newsletters nutzen wir den Dienst HubSpot. Mehr Informationen, insbesondere auch zu Deinem Widerrufsrecht, kannst Du jederzeit unserer Datenschutzerklärung entnehmen.