Ö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;
Kullanıcı kimlik bilgileri (users)
Küme bilgileri (clusters)
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ı
- 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
- 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.
- 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.