AWS Türkçe Blog

Karpenter ile Tanışın – Açık Kaynaklı Yüksek Performanslı Kubernetes Küme Otomatik Ölçekleyici

Orijinal makale: Link (Channy Yun)

Bugün Karpenter‘ın üretime hazır olduğunu duyuruyoruz. Karpenter, AWS ile oluşturulmuş açık kaynaklı, esnek, yüksek performanslı bir Kubernetes küme otomatik ölçekleyicidir (cluster autoscaler). Değişen uygulama yüküne yanıt olarak doğru boyutta bilgi işlem kaynaklarını hızla başlatarak uygulama kullanılabilirliğinizi ve küme verimliliğinizi artırmanıza yardımcı olur. Karpenter ayrıca uygulamanızın ihtiyaçlarını karşılamak için tam zamanında bilgi işlem kaynakları sağlar ve maliyetleri azaltmak ve performansı artırmak için kısa sürede bir kümenin işlem kaynağı ayak izini otomatik olarak optimize eder.

Karpenter’dan önce Kubernetes kullanıcılarının Amazon EC2 Auto Scaling gruplarını ve Kubernetes Cluster Autoscaler‘ı kullanan uygulamaları desteklemek için kümelerinin işlem kapasitesini dinamik olarak ayarlaması gerekiyordu. AWS’teki Kubernetes müşterilerinin yaklaşık yarısı, Kubernetes Cluster Autoscaler kullanarak küme otomatik ölçeklendirmeyi yapılandırmanın zorlu ve kısıtlayıcı olduğunu bildiriyor.

Karpenter kümenize kurulduğunda, Karpenter zamanlanmamış bölmelerin (pods) toplu kaynak isteklerini gözlemler ve zamanlama gecikmelerini ve altyapı maliyetlerini azaltmak için yeni düğümler (nodes) başlatma ve bunları sonlandırma kararları alır. Karpenter bunu, Kubernetes kümesi içindeki olayları gözlemleyerek ve ardından temel bulut sağlayıcısının Amazon EC2 gibi bilgi işlem hizmetine komutlar göndererek yapar.

Karpenter, Apache Lisansı 2.0 altında lisanslanmış açık kaynaklı bir projedir. Tüm büyük bulut sağlayıcıları ve şirket içi ortamlar dahil olmak üzere herhangi bir ortamda çalışan herhangi bir Kubernetes kümesiyle çalışmak üzere tasarlanmıştır. Ek bulut sağlayıcıları oluşturmaya veya temel proje işlevselliğini geliştirmeye yönelik katkıları memnuniyetle karşılıyoruz. Bir hata bulursanız, bir öneriniz varsa veya katkıda bulunacak bir şeyiniz varsa lütfen GitHub‘da bizimle iletişime geçin.

AWS’te Karpenter’a Başlarken
Herhangi bir Kubernetes kümesinde Karpenter’ı kullanmaya başlamak için, kullanılabilir bir miktar işlem kapasitesi olduğundan emin olun ve bunu genel havuzda sağlanan Helm çizelgelerini kullanarak kurun. Karpenter ayrıca, seçtiğiniz sağlayıcıda bilgi işlem kaynakları sağlamak için izinler gerektirir.

Kümenize yüklendikten sonra, varsayılan Karpenter sağlayıcısı, kümedeki yetersiz bilgi işlem kaynakları nedeniyle zamanlanamayan, gelen Kubernetes bölmelerini gözlemler ve zamanlama ve kaynak gereksinimlerini karşılamak için otomatik olarak yeni kaynakları başlatır.

AWS’te Karpenter ile Başlarken‘e dayalı bir Amazon EKS kümesinde Karpenter’ı kullanmaya hızlı bir başlangıç ​​göstermek istiyorum. AWS Komut Satırı Arabirimi (AWS Command Line Interface – AWS CLI), kubectl, eksctl ve Helm (Kubernetes için paket yöneticisi) kurulumunu gerektirir. Bu araçları kurduktan sonra eksctl ile bir küme oluşturun. Bu örnek yapılandırma dosyası, bir ilk düğüme sahip temel bir kümeyi belirtir.

cat <<EOF > cluster.yaml --- apiVersion: eksctl.io/v1alpha5 kind: ClusterConfig metadata: name: eks-karpenter-demo region: us-east-1 version: "1.20" managedNodeGroups: - instanceType: m5.large amiFamily: AmazonLinux2 name: eks-kapenter-demo-ng desiredCapacity: 1 minSize: 1 maxSize: 5 EOF
$ eksctl create cluster -f cluster.yaml
Bash

Karpenter, kendi kendini yöneten düğüm grupları, yönetilen düğüm grupları veya AWS Fargate dahil olmak üzere her yerde çalışabilir. Karpenter, hesabınızda EC2 bulut sunucuları sağlayacaktır.

Ardından, belgeleri izleyerek sunucuları başlatmak gibi izinleri almak için Karpenter denetleyicisi için AWS CloudFormation şablonunu ve Service Accounts için IAM Rollerini (IRSA) kullanarak gerekli AWS Kimlik ve Erişim Yönetimi (IAM) kaynaklarını oluşturmanız gerekir. Karpenter’ı kümenize dağıtmak için Helm grafiğini de yüklemeniz gerekir.

$ helm repo add karpenter https://charts.karpenter.sh
$ helm repo update
$ helm upgrade --install --skip-crds karpenter karpenter/karpenter --namespace karpenter \
  --create-namespace --set serviceAccount.create=false --version 0.5.0 \
  --set controller.clusterName=eks-karpenter-demo \
  --set controller.clusterEndpoint=$(aws eks describe-cluster --name eks-karpenter-demo --query "cluster.endpoint" --output json) \
  --wait # for the defaulting webhook to install before creating a Provisioner
Bash

Karpenter sağlayıcıları, kümenizdeki Karpenter davranışını yapılandırmanıza olanak tanıyan bir Kubernetes kaynağıdır. Varsayılan bir sağlayıcı oluşturduğunuzda, Karpenter’ın kümenizde bilgi işlem kaynakları sağlaması için gerekenlerin yanı sıra daha fazla özelleştirme yapmadan, Karpenter, sunucu türleri, bölgeler, mimariler, işletim sistemleri ve sunucu satın alma türleri gibi düğüm özelliklerini otomatik olarak keşfeder. Açık bir iş gereksinimi yoksa, bu belirtim:gereksinimleri tanımlamanız gerekmez.

cat <<EOF | kubectl apply -f - apiVersion: karpenter.sh/v1alpha5 kind: Provisioner metadata: name: default spec: #Requirements that constrain the parameters of provisioned nodes. #Operators { In, NotIn } are supported to enable including or excluding values requirements: - key: "node.kubernetes.io/instance-type" #If not included, all instance types are considered operator: In values: ["m5.large", "m5.2xlarge"] - key: "topology.kubernetes.io/zone" #If not included, all zones are considered operator: In values: ["us-east-1a", "us-east-1b"] - key: "kubernetes.io/arch" #If not included, all architectures are considered operator: In values: ["arm64", "amd64"] - key: " karpenter.sh/capacity-type" #If not included, the webhook for the AWS cloud provider will default to on-demand operator: In values: ["spot", "on-demand"] provider: instanceProfile: KarpenterNodeInstanceProfile-eks-karpenter-demo ttlSecondsAfterEmpty: 30 EOF
Bash

ttlSecondsAfterEmpty değeri, Karpenter’ı boş düğümleri sonlandıracak şekilde yapılandırır. Bu değer devre dışı bırakılırsa, düşük kullanım nedeniyle düğümler hiçbir zaman küçülmez. Daha fazla bilgi edinmek için Karpenter sitesindeki Sağlayıcı özel kaynak tanımlarına (Custom Resource Definitions – CRD’ler) bakın.

Karpenter artık etkin ve kümenizdeki düğümleri sağlamaya başlamaya hazır. Bir dağıtım kullanarak bazı bölmeler oluşturun ve yanıt olarak Karpenter sağlayıcı düğümlerini izleyin.

$ kubectl create deployment inflate \
          --image=public.ecr.aws/eks-distro/kubernetes/pause:3.2 \
		  --requests.cpu=1
Bash

Dağıtımı ölçeklendirelim ve Karpenter denetleyicisinin günlüklerini kontrol edelim.

$ kubectl scale deployment inflate --replicas 10
$ kubectl logs -f -n karpenter $(kubectl get pods -n karpenter -l karpenter=controller -o name)
2021-11-23T04:46:11.280Z        INFO    controller.allocation.provisioner/default       Starting provisioning loop      {"commit": "abc12345"}
2021-11-23T04:46:11.280Z        INFO    controller.allocation.provisioner/default       Waiting to batch additional pods        {"commit": "abc123456"}
2021-11-23T04:46:12.452Z        INFO    controller.allocation.provisioner/default       Found 9 provisionable pods      {"commit": "abc12345"}
2021-11-23T04:46:13.689Z        INFO    controller.allocation.provisioner/default       Computed packing for 10 pod(s) with instance type option(s) [m5.large]  {"commit": " abc123456"}
2021-11-23T04:46:16.228Z        INFO    controller.allocation.provisioner/default       Launched instance: i-01234abcdef, type: m5.large, zone: us-east-1a, hostname: ip-192-168-0-0.ec2.internal    {"commit": "abc12345"}
2021-11-23T04:46:16.265Z        INFO    controller.allocation.provisioner/default       Bound 9 pod(s) to node ip-192-168-0-0.ec2.internal  {"commit": "abc12345"}
2021-11-23T04:46:16.265Z        INFO    controller.allocation.provisioner/default       Watching for pod events {"commit": "abc12345"}
Bash

Sağlayıcının denetleyicisi, yeni bir sunucu başlatan ve hazırlanabilir bölmeleri yeni düğümlere bağlayan bölme değişikliklerini dinler.

Şimdi, dağıtımı silin. 30 saniye sonra (ttlSecondsAfterEmpty = 30), Karpenter boş düğümleri sonlandırmalıdır.

$ kubectl delete deployment inflate
$ kubectl logs -f -n karpenter $(kubectl get pods -n karpenter -l karpenter=controller -o name)
2021-11-23T04:46:18.953Z        INFO    controller.allocation.provisioner/default       Watching for pod events {"commit": "abc12345"}
2021-11-23T04:49:05.805Z        INFO    controller.Node Added TTL to empty node ip-192-168-0-0.ec2.internal {"commit": "abc12345"}
2021-11-23T04:49:35.823Z        INFO    controller.Node Triggering termination after 30s for empty node ip-192-168-0-0.ec2.internal {"commit": "abc12345"}
2021-11-23T04:49:35.849Z        INFO    controller.Termination  Cordoned node ip-192-168-116-109.ec2.internal   {"commit": "abc12345"}
2021-11-23T04:49:36.521Z        INFO    controller.Termination  Deleted node ip-192-168-0-0.ec2.internal    {"commit": "abc12345"}
Bash

“kubectl” ile bir düğümü silerseniz, Karpenter ilgili sunucuyu incelikle kordon altına alır, boşaltır ve kapatır. Yakından bakıldığında Karpenter, tüm bölmeler boşaltılana ve sunucu sonlandırılana kadar silme işlemini engelleyen düğüm nesnesine bir sonlandırıcı ekler.

Bilmeniz Gerekenler
Kapenter özellikleri hakkında akılda tutulması gereken birkaç şey:

Hızlandırılmış Bilgi İşlem: Karpenter, her tür Kubernetes uygulamasıyla çalışır, ancak çok sayıda farklı işlem kaynağının hızlı bir şekilde sağlanmasını ve hızlı bir şekilde kaldırılmasını gerektiren kullanım durumları için özellikle iyi performans gösterir. Örneğin, buna makine öğrenimi modellerini eğitmek, simülasyonları çalıştırmak veya karmaşık finansal hesaplamalar yapmak için toplu işler dahildir. Hızlandırılmış EC2 bulut sunucuları gerektiren kullanım durumları için nvidia.com/gpu, amd.com/gpu ve aws.amazon.com/neuron özel kaynaklarından yararlanabilirsiniz.

Sağlayıcı Uyumluluğu: Karpenter sağlayıcıları, Amazon EKS tarafından yönetilen düğüm grupları ve EC2 Auto Scaling grupları gibi statik kapasite yönetimi çözümleriyle birlikte çalışacak şekilde tasarlanmıştır. Hem dinamik hem de statik olarak yönetilen kapasiteye sahip karma bir model veya tamamen statik bir yaklaşım olarak sağlayıcıları kullanarak kapasitenizin tamamını yönetmeyi seçebilirsiniz. Kubernetes Cluster Autoscaler’ı Karpenter ile aynı anda kullanmamanızı öneririz çünkü her iki sistem de zamanlanmayan bölmelere yanıt olarak düğümleri ölçeklendirir. Birlikte yapılandırılırsa, her iki sistem de bu bölmeler için sunucuları başlatmak veya sonlandırmak için yarışacaktır.

Karpenter hakkında daha fazla bilgi edinmek için AWS Container Day’deki belgelere ve demo videosuna bakın.