Kubernetes Komut Satırı Aracı: kubectl

Kubernetes Komut Satırı Aracı: kubectl

Önceki makalelerimizde Kubernetes'in geçmişi ve evriminden, ardından Kubernetes kümesinin ne olduğundan ve nasıl çalıştığından bahsetmiştik. Bu yazımızda, Kubernetes'in yönetimi ve etkileşimi için kullanılan temel araçlardan biri olan kubectl'i ele alacağız. Kubernetes dünyasına adım atan herkesin öğrenmesi gereken bu güçlü komut satırı aracını daha yakından tanıyacağız.

kubectl Nedir?

kubectl, Kubernetes kümesi ile etkileşime geçmenizi sağlayan bir komut satırı aracıdır. Kubernetes'in api-server objesine komutlar göndererek kubernetes kümesindeki kaynakları yönetmenize olanak tanır. kubectl, Kubernetes'in çeşitli bileşenlerini ve kaynaklarını (örneğin, podlar, hizmetler, dağıtımlar) yaratmak, güncellemek, silmek ve görüntülemek için kullanılır.

Eğer örnekleri sizde uygulamak isterseniz bir kubernetes kümesine ihtiyacınız olacak. Kendi bilgisayarınıza minikube kurarak hızlı bir şekilde bir kubernetes kümesine sahip olabilirsiniz.

kubectl Kubernetes Cluster İle Nasıl İletişim Kurar?

kubectl, kubernetes kümesi ile iletişime geçebilmesi için bir takım bilgilere ihtiyaç duyar. Bunlar;

  1. Kullanıcı kimlik bilgileri (users)

  2. Küme bilgileri (clusters)

  3. Bağlam bilgileri (context)

Bu bilgileri doğru bir şekilde kubectl tarafına verdiğimiz zaman kubernetes kümesine başarılı bir şekilde bağlanabilir ve kubernetes api-server objesi ile sağlıklı bir şekilde iletişim kurabiliriz. Kubectl bu verileri okumak için varsayılan olarak bilgisayarımızdaki ana dizin altındaki .kube klasörü içerisindeki config dosyasına bakar.

Örneğin;

  • macos: ~/.kube/config

  • linux: ~/.kube/config

  • windows: "C:\Users\<KullanıcıAdı>\.kube\config"

Örneğin ben kendi makinemdeki config dosyasını vscode editörü ile açtığımda aşağıdaki yaml tanımını görüyorum. docker-desktop ve minikube adında iki farklı kümeye, docker-desktop ve minikube adında iki farklı kullanıcıya sahibim. Son olarak bu kullanıcıları ve küme bilgilerini birleştiren context bilgilerimi görüyorum. Contextler sayesinde hangi kümeye hangi kullanıcı ile bağlanacağımızı belirleriz.

apiVersion: v1
clusters:
- cluster:
    certificate-authority-data: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSURCVENDQWUyZ0F3SUJBZ0lJSXFzd1Q3eUN0bFl3RFFZSktvWklodmNOQVFFTEJRQXdGVEVUTUJFR0ExVUUKQXhNS2EzVmlaWEp1WlhSbGN6QWVGdzB5TkRBM01USXdOVFV3TlRCYUZ3MHpOREEzTVRBd05UVTFOVEJhTUJVeApFekFSQmdOVkJBTVRDbXQxWW1WeWJtVjBaWE13Z2dFaU1BMEdDU3FHU0liM0RRRUJBUVVBQTRJQkR3QXdnZ0VLCkFvSUJBUUM2SkdXeFFONHNLZWpkNWNmcnhsOEJhNytnUGxiZkpZRmRVbTFjZmE5cmlRd1UxazJyaFpMaDJuN0MKOS9zcXpzckx5dkhwaktSby85R3VoZmJFVEVObkJYTU1GT3BmOG96Vnd3SzlyMzRWa1p1QTVEY213d3VxOW1lWApRZkhwajJicE12SS9iYno3V1lzVkJ5TzNOL2xGWGMxN3ppQTJzeWRNT0NRZjRjZHlycWc1QnRGejlQb2FaRVZtCk84Q2tnK0NZMVVBTm9jWHNEVE5LTjFDbU5GejFIa3NjTElvR0hRQmJVbCtqT1FNNndoQ0Ewd2FmU0w0ZDJPSHEKK1QzL3BIWEJRUmhuNHV5VmZBcDBxZ1hhVE5LMWtLTGZQOCs1aDVPVDh0OFF4T1NsVWozb1VLOEZBTGFUL05mUApzejZlL08rendLWVU2UjJHK2dSM2ViZG5uWC8xQWdNQkFBR2pXVEJYTUE0R0ExVWREd0VCL3dRRUF3SUNwREFQCkJnTlZIUk1CQWY4RUJUQURBUUgvTUIwR0ExVWREZ1FXQkJURDhkMFJTRkRuMEJNWmpBOFJsZlFvcmthV2h6QVYKQmdOVkhSRUVEakFNZ2dwcmRXSmxjbTVsZEdWek1BMEdDU3FHU0liM0RRRUJDd1VBQTRJQkFRQ1RoS1V2SUlQZgpITU9RNi9iQ2pjUk40RlF4M0p6My9CQXFwRkhiaTBTMHcvcEllNW9FMDdLUnJWdDZnSVp0UGtMNUhrNmxrUnovCjNtQ3Z6TysxMDBKaW1RWjNqVzVtUElUS0czcWhjNDdhMHl5c1k2TXNabG1OR2lBbEtiSUNCc0xpbFpCaXFGMFAKQkYzRUlrVnY1dVZzV05VTjJYWWo4QkwvczhCYjRWUXJFeCtFYTZwc1UxdkROa2ZDQjFkakRnb0hVaXBra0JVZQo2REV2M1dINHNsS0x0QTRGSEZ2OXNwckR4MUx6cmJvRzUraExvUUphZS8zTE1mMlRTL25tVFlZMFVScEZXbmxaCjhlSlh2NDZQQ2NRT0pYYTRtS08rZkxIM2piSkZpSHk2MkgrNnp3Zko2eW1NRVhoQmgrUjgySjJaQ0xUL2FRTXkKZEwzeFJ4d1NGZFh4Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0K
    server: https://kubernetes.docker.internal:6443
  name: docker-desktop
- cluster:
    certificate-authority: C:\Users\serha\.minikube\ca.crt
    extensions:
    - extension:
        last-update: Sun, 02 Aug 2024 09:08:25 +03
        provider: minikube.sigs.k8s.io
        version: v1.33.1
      name: cluster_info
    server: https://127.0.0.1:57415
  name: minikube
contexts:
- context:
    cluster: docker-desktop
    user: docker-desktop
  name: docker-desktop
- context:
    cluster: minikube
    extensions:
    - extension:
        last-update: Sun, 02 Aug 2024 09:08:25 +03
        provider: minikube.sigs.k8s.io
        version: v1.33.1
      name: context_info
    namespace: default
    user: minikube
  name: minikube
current-context: minikube
kind: Config
preferences: {}
users:
- name: docker-desktop
  user:
    client-certificate-data: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSURRakNDQWlxZ0F3SUJBZ0lJT2Z4WHdqOWNtUjh3RFFZSktvWklodmNOQVFFTEJRQXdGVEVUTUJFR0ExVUUKQXhNS2EzVmlaWEp1WlhSbGN6QWVGdzB5TkRBM01USXdOVFV3TlRCYUZ3MHlOVEEzTVRJd05UVTFOVEZhTURZeApGekFWQmdOVkJBb1REbk41YzNSbGJUcHRZWE4wWlhKek1Sc3dHUVlEVlFRREV4SmtiMk5yWlhJdFptOXlMV1JsCmMydDBiM0F3Z2dFaU1BMEdDU3FHU0liM0RRRUJBUVVBQTRJQkR3QXdnZ0VLQW9JQkFRQytvVitqazFhWklZTloKTVNDVUsrckx1UEZYVzZOWnNZWG12aG1yc3NhOXUyNFpLelhVcWxxOEdLZHlHNnhJZ2c5WW41L1cwdkN6eVAzcwpsWXpnR2tNYlZiYm0wZGh4UytUVUFiVWZCcjgybG1DbS80Y0MyVHJBODVIUHNsSUFhdWJsTlM1L05GVzMwMEZkCjhWaFN3dmhVdjZTU281dm15Z2RxMzZpdVk3S01ZeGlHUHVEQUZpSlhybjR0bFh0MEs4QW85ZEV5bGJhS0h0MFoKVmFJOWcyUjBCcXZXK21pQTlyeTVNbjhsNlA2S0hLRTAyVmxucGVzeDlpWjB6VjhuZ0pKOC9aTlh5TXVJdW9ZUwo3NDgyVUNucVpRVktteDNPZEdGYkVKZDNjWG5WM0Y1K21ZTFhMNXhMRk1odUw2TFhkaDdMVExRa1lYNk5LQmtGCmlFVTM2ZFdiQWdNQkFBR2pkVEJ6TUE0R0ExVWREd0VCL3dRRUF3SUZvREFUQmdOVkhTVUVEREFLQmdnckJnRUYKQlFjREFqQU1CZ05WSFJNQkFmOEVBakFBTUI4R0ExVWRJd1FZTUJhQUZNUHgzUkZJVU9mUUV4bU1EeEdWOUNpdQpScGFITUIwR0ExVWRFUVFXTUJTQ0VtUnZZMnRsY2kxbWIzSXRaR1Z6YTNSdmNEQU5CZ2txaGtpRzl3MEJBUXNGCkFBT0NBUUVBUXk1Wmd2dHhYNDBaSGNaNDR0L3ZvbEhGQWk2eG8vdVVhUmFSN1IzeUpMVjNTaXp3Sk1ZRmxrNFcKdDAwRkMzL3VsWS9NdTkrTlE1MnpXU0s0R0NwaFllOHpMdFNnUGM4WU41QnFrTDlWYnYwNTJtMjBYWHBjaHJ2RAo1cDBjMklIWFhMSkJ6SG0zMDNoQkN1N2w3MVVsSUFTVExkcTBzK3ZrMkFhVmVTVjkwbG56bFdXbi92OUtjaFZ6CmJPWFo2T3JvZDB0MXNmczNCZlRoMmZsd09vNkdadCtwN0J0TTJIT0Jta0ZOYUNYTFFuYkNRYXpkQU5rbWMyWEwKUkxxSVVibVdGeWwrcjFZaG1Ibk50NHRqRlBldzF1L1piWUFnd1J1am5hQUdKM08ya1Q0VkFrNUtNSHNyZFZHNApyL0lINC8rN1ZGNk8rSnFoQlBXVXVIcTlwVkpHNFE9PQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCg==
    client-key-data: LS0tLS1CRUdJTiBSU0EgUFJJVkFURSBLRVktLS0tLQpNSUlFcEFJQkFBS0NBUUVBdnFGZm81TldtU0dEV1RFZ2xDdnF5N2p4VjF1aldiR0Y1cjRacTdMR3ZidHVHU3MxCjFLcGF2QmluY2h1c1NJSVBXSitmMXRMd3M4ajk3SldNNEJwREcxVzI1dEhZY1V2azFBRzFId2EvTnBaZ3B2K0gKQXRrNndQT1J6N0pTQUdybTVUVXVmelJWdDlOQlhmRllVc0w0Vkwra2txT2I1c29IYXQrb3JtT3lqR01ZaGo3Zwp3QllpVjY1K0xaVjdkQ3ZBS1BYUk1wVzJpaDdkR1ZXaVBZTmtkQWFyMXZwb2dQYTh1VEovSmVqK2loeWhOTmxaClo2WHJNZlltZE0xZko0Q1NmUDJUVjhqTGlMcUdFdStQTmxBcDZtVUZTcHNkem5SaFd4Q1hkM0Y1MWR4ZWZwbUMKMXkrY1N4VEliaStpMTNZZXkweTBKR0YralNnWkJZaEZOK25WbXdJREFRQUJBb0lCQVFDa1EvaGV3d0szVjVxUQppL1hQMkh3dDZvTUV6UEZZdzlGbmdONHNCeFNjdjlyaWswcUNvLzBsNG5TL3JqcnFERERmSkVXZTN3d05VQ0FHCjh1Tis1UUo0bG9iU0pYZEdRYWpBUzJ4Z2ZQYmVPZnkxU3JGemNlN2YvOExnMzM4cjN2SnlCajYzM0VnVTdGU0MKZUFxczNsY1E2RWNQR1M2cFUrUEtZMG8rWTZpaXNPN0V3MEt2QmlFVkd0Y3NwbzAxSGhERXlIYUIvRWNMaVR4RQprY29ndmUvbHFMRldZN0w0MU9IY0srUDRXclN5M0pRVXpNUjVYV0VwRkU4Ymk2UHZiRlVZTEpVTVNueitOVmxoCnU5bVVZMks1Zzg1c003dkxKYnppVUp5eStRZHFBS09MSEhSNmwzRmxBWnJpckQrVkx4elVHRzZWNG1FUFdtN28KekttUzNtZUJBb0dCQU1iTGhoQVhkZVNlZ0JRVi83YkJYRm1BYTdPOHFBN0trNkNqSWh0NkhRekJvY0pncWc2eApvQTZidmdmd3hmSGJpeEMyT1Jib0VBdy8rdlNlVlJUZTRwb2dCeDU4TlkzeS9PU1ZWUXdwTlZZbmJtSlBuU2lPCmdXUk9rbitNZ1IyeTJtaURvZnRyc2V2a3lRa3E4OURWbytieGgranB6MmljbTFqdGh1ZXpkUGxiQW9HQkFQVjgKWkNFa3Iycm1TbnBTdFIyYnd5OUpaKzhUVm9yOGZaMXZmeHF6Szd3NGx6QmtUdDNwaW5JSmdFNDZGRnBVL3o1MwpPNit3QVNyOGtHRWtTWEp5YmZZOVJMcXNWVGVFTkh1SG5jQnU4RzJnT0JLaTI2YTJ0TG5FaC8rTyt4b0l5L3QzCmNVRTB0Q3hGSjNObERnalRETE04dkN4YjQ2NjJVdXlvYzRSaS9RakJBb0dBUDU3M0FzTmZXWkZZVUJWU1J6ek8KdjE0WUdlZXdxVHN2eitNbGtVR2RkbTJweFRtR2N6bHBqZ05ONStDb21PUzROdHI2bmxnYWVyRW5NWTVTa0dGYwppQkxqOUYrd0RBUE41NkhiSEE4OElKeHgrVWlkZFZOV0diSUR0SXBVOEJwRFI5dUl4WndMendEalRlblBLZkNWCmlkMldyM1hVaVJoRnAwb3RPSTM0UzYwQ2dZQUdvRkh2bHhicEVzaEYzdittaWZMTnp2UndQcHhpYWdoVi9KRjQKdmdkYk1FZmNkWWl2Y3NOYTZxaTg4OUppMGRLRjlCLzNVUS9uQWlRL2l3UTBnNlEyTmxjcGxzZENGVjU1U3lMVgo4K2luZk9DbW1DREhzanpVbXRwMDZuNGFxTXdnd0l1ZEQvZ2hEY2pQMDVWNlpYLzlRcEZ0dlJrN09RNnA5cTRQCmo4QjJ3UUtCZ1FDNWlWbGdrdWZFUGowazhiMkVZU01VcXlMR1RlaXRrZmtJYkQ3Q1BZejZva0p4eUxLWVY1UncKYi9JZDd0RndiREZPemc3Vk1zMnBhajd6UmF2dnd6bHc5NWViUTUzT094aG9NbWxPTmtUVTRhMk9vS1ZTdW9CYQo5S2VyanRjZnlNMVRWelJJZVlrWWFST1QxbW1KUFNtclkwUnovWWVUUlRQVG9GcVVscjdqamc9PQotLS0tLUVORCBSU0EgUFJJVkFURSBLRVktLS0tLQo=
- name: minikube
  user:
    client-certificate: C:\Users\serha\.minikube\profiles\minikube\client.crt
    client-key: C:\Users\serha\.minikube\profiles\minikube\client.key

Ayrıca gördüğünüz üzere bir config dosyası üzerinde birden fazla küme, kullanıcı ve context bilgisi bulunabilir ve biz kubectl üzerinden contextler arasında geçişler yapabiliriz.

kubectl config Komutları

  1. Contextleri listeleme için aşağıdaki komutu yazarız.
kubectl config get-contexts

Bu komut bize aşağıdaki gibi bir sonuç üretir.

Bu tablodaki kolonlardan kısaca bahsedelim.

  • CURRENT: Config içerisine birden fazla context tanımlanıyor olsada biz anlık olarak sadece bir context üzerinde çalışabiliriz. kubectl'e verdiğimiz tüm komutlar current olarak işaretlenmiş context üzerinde çalıştırılıyor. Yukarıdaki tabloda benim current context'im minikube isimle context. Yazdığım tüm komutlarda minikube context'in bağlandığı kubernetes kümesi üzerinde çalıştırılacak. Tablodaki current kolonu yıldız ile işaretlenen context, current context'dir.

  • NAME: Context adı

  • CLUSTER: Context'in bağlandığı kubernetes cluster adı

  • AUTHINFO: Context'in kullandığı kullanıcı adı

  • NAMESPACE: Context'in kullanıdığı namespace bilgisi

  1. Aktif context bilgisini alabilmek için aşağıdaki komutu yazarız.
kubectl config current-context

Bu sonuç olarak sadece aktif context'in adını yazar.

  1. Eğer aktif context'den başka bir context geçiş yapmak istiyorsak aşağıdaki komutu yazarız.
kubectl config use-context docker-desktop

Bu komut çalıştıktan sonra aktif context değerimiz docker-desktop isimli context olur.

kubectl Yapısı

kubectl komutları belirli bir yapıya sahiptir. Temel bir kubectl komutu şu şekilde yapılandırılmıştır:

kubectl [komut] [kaynak tipi] [kaynak adı] [flags]

1. Komut

kubectl'de kullanılabilen temel komutlar şunlardır:

  • create: Yeni bir kaynak oluşturur.

  • get: Mevcut kaynakları listeler.

  • describe: Bir kaynağın detaylarını gösterir.

  • apply: Bir YAML dosyasındaki kaynak tanımlarını uygular veya günceller.

  • delete: Bir kaynağı siler.

Örnek:

kubectl get pods

Bu komut, mevcut tüm podları listeler.

2. Kaynak Tipi

kubectl komutlarında kullanılan kaynak tipleri, Kubernetes'in temel yapı taşlarını oluşturur. Aşağıda yaygın olarak kullanılan bazı kaynak tiplerini ve kısa açıklamalarını bulabilirsiniz:

2.1. Pod

Podlar, Kubernetes'in en küçük dağıtım birimidir. Bir veya daha fazla konteyneri barındırır.

Örnek:

kubectl get pods

2.2. Deployments

Deployments, belirli bir pod setinin ve bu podların sürümlerinin yönetimini sağlar.

Örnek:

kubectl get deployments

2.3. Services

Services, Kubernetes içindeki podların ağ üzerinde erişilebilir olmasını sağlar. Yük dengeleme (load balancer) ve hizmet keşfi (service discovery) sunar.

Örnek:

kubectl get services

2.4. ConfigMaps

ConfigMap, yapılandırma verilerini key-value (anahtar-değer) çiftleri olarak saklar ve podlar tarafından kullanılabilir.

Örnek:

kubectl get configmaps

2.5. Secrets

Secret, duyarlı verileri (örneğin, parolalar, tokenlar) güvenli bir şekilde saklar ve podlar tarafından kullanılabilir.

Örnek:

kubectl get secrets

2.6. ReplicaSet

ReplicaSet, belirli bir pod sayısının her zaman çalışır durumda olmasını sağlar.

Örnek:

kubectl get replicasets

2.7. Namespace (namespaces)

Namespace, kaynakları mantıksal olarak izole etmek için kullanılır. Büyük kümelerde kaynakları organize etmek için yararlıdır.

Örnek:

kubectl get namespaces

2.8. Ingress (ingresses)

Ingress, HTTP ve HTTPS yönlendirmeleri için kuralları tanımlar. Dış trafiğin cluster içindeki hizmetlere nasıl yönlendirileceğini belirler.

Örnek:

kubectl get ingresses

2.9. Node (nodes)

Node, Kubernetes kümesindeki fiziksel veya sanal makineleri temsil eder.

Örnek:

kubectl get nodes

2.10. PersistentVolume

PersistentVolume (PV), kümede depolama kaynaklarını temsil eder. Podlar için kalıcı depolama sağlar.

Örnek:

kubectl get persistentvolumes

2.11. PersistentVolumeClaim (persistentvolumeclaims)

PersistentVolumeClaim (PVC), podlar tarafından talep edilen kalıcı depolama kaynaklarını tanımlar.

Örnek:

kubectl get persistentvolumeclaims

2.12. StatefulSet

StatefulSet, durum bilgisi olan uygulamaları yönetmek için kullanılır. Her bir podun kimliğini korur.

Örnek:

kubectl get statefulsets

2.13. Job

Job, belirli sayıda podu çalıştıran ve tamamlandıklarında sona eren geçici görevler için kullanılır.

Örnek:

kubectl get jobs

2.14. CronJob

CronJob, belirli zaman aralıklarında yinelenen görevleri (job'ları) çalıştırmak için kullanılır.

Örnek:

kubectl get cronjobs

3. Kaynak Adı

Komutun hedef aldığı spesifik kaynağın adıdır. Bu, belirli bir pod, deployment, service veya başka bir kaynağın adını belirtir.

Örnek:

kubectl delete pod mypod

Bu komut, "mypod" adlı podu siler.

4. Bayraklar (Flag)

Bayraklar, komutun davranışını değiştirmek veya ek seçenekler eklemek için kullanılır. Örneğin, komuta -o eklediğimiz çıktıyı belirli bir formatta görüntülemek için kullanılır (json, yaml, wide vb.).

Örnek:

kubectl get pods -o wide

Bu komut, podları daha geniş bir formatta listeler, daha fazla bilgi içerir.

kubectl Kullanım Örnekleri

kubectl'in gücünü ve esnekliğini göstermek için bazı kullanım örneklerine bakalım.

Bir Pod Oluşturma

Bir pod oluşturmak için run komutunu kullanabilirsiniz:

kubectl run nginxpod --image=nginx

Bu komut, nginx imajını kullanan bir pod oluşturur.

Podları Listeleme

Kümedeki tüm podları listelemek için get komutunu kullanabilirsiniz:

kubectl get pods

Pod Detaylarını Görüntüleme

Bir podun detaylarını görüntülemek için describe komutunu kullanabilirsiniz:

kubectl describe pod nginxpod

Bir YAML Dosyasını Uygulama

Bir YAML dosyasındaki tanımları uygulamak için apply komutunu kullanabilirsiniz:

kubectl apply -f deployment.yaml

Bir Kaynağı Silme

Bir kaynağı silmek için delete komutunu kullanabilirsiniz:

kubectl delete pod nginx-pod

Özetlemek gerekirse kubectl, Kubernetes kümesi ile etkileşime geçmek için temel bir araçtır. Komut yapısı ve esnekliği sayesinde Kubernetes kaynaklarını yönetmek oldukça kolay ve etkilidir. Bu makalede kubectl'in temel yapısını ve bazı yaygın kullanım örneklerini ele aldık. Bu bilgilerin üzerine daha fazla araştırma yaparak, denemeler yaparak kubernetes konusunda kendinizi geliştirebilir ve uygulamalarınızı kubernetes ortamında çalıştırabilirsiniz. Umarım sana dokunmuş olabilirim. Merak ettiğin bir şey olursa benimle iletişime geçebilirsin.