Kubernetes açık kaynaklı bir araçtır ve konteyner orkestrasyonunda kritik bir öneme sahiptir. Kubernetes, çeşitli bulut ortamlarında veya şirket içi (on-premise) sunucularda kümelerin ölçekli bir şekilde orkestre edilmesine ve yönetilmesine yardımcı olur. Küme (cluster), konteynerleştirilmiş uygulamaları ve hizmetleri çalıştırmak için tasarlanmış bir ana bilgisayar (host) kümesidir. Bir kümenin çalışması için en az iki düğüme (node) ihtiyacı vardır – bir ana düğüm (master node) ve bir çalışan düğüm (worker node). Daha fazla çalışan düğüm ekleyerek Kubernetes altyapınızı ölçeklendirebilirsiniz. Altyapının çalışabilmesi için bir ana düğümün ve çalışan düğümlerinin bir ağ üzerinden iletişim kurabilmesi gerekir. Kubernetes'in en önemli özelliklerine genel bir bakış için lütfen şu eğitimimizi takip edin: Kubernetes'i Yakından Tanımak.
Bu eğitimde size, Kubernetes ağının incelenmesine ve sorunlarının giderilmesine yardımcı olacak çeşitli araç ve teknikleri göstereceğiz.
Önkoşullar
-
Bu eğitimi takip edebilmek için bir Kubernetes kümesine sahip olmalısınız. Gösterim için temel bir küme kurmanıza yardımcı olabilecek, Ubuntu 20.04 Üzerinde Kubernetes Nasıl Kurulur ve Kullanılır konusunu açıklayan bir eğitimimiz bulunmaktadır.
-
Ayrıca yerel olarak kubectl kurulu olmalıdır. Yerel ortamınıza bağlı olarak, Kubernetes araçlarının kurulması hakkındaki resmi belgeleri takip edin. kubectl aracının kümenize bağlanacak şekilde yapılandırılması gerekir. Bunu aşağıdaki bölümde daha ayrıntılı olarak açıklayacağız.
Hem yerel olarak hem de Kubernetes düğümünde birkaç komut çalıştıracağız. Başlayalım!
Uzak Bir Kubernetes Kümesine Bağlanmak İçin Yerel kubectl'i Yapılandırma
İlk olarak kubectl kurulumuyla başlayalım. Yerel ortamımız Ubuntu çalıştırıyor, farklı bir yerel ortam çalıştırıyorsanız bu bağlantıyı takip edin. kubectl araçlarını, apt paket yöneticisine sahip bir Ubuntu/Debian yerel ortamına kurmak için, apt deposunu güncellemek ve gerekli paketleri kurmak için aşağıdaki komutları çalıştırın:
|
1 2 |
sudo apt-get update sudo apt-get install -y apt-transport-https ca-certificates curl |
Ardından, Google bulut genel imzalama anahtarını indirmek için aşağıdaki komutu çalıştırın:
|
1 |
sudo curl -fsSLo /usr/share/keyrings/kubernetes-archive-keyring.gpg https://packages.cloud.google.com/apt/doc/apt-key.gpg |
Then, add Kubernetes apt repository:
|
1 |
echo "deb [signed-by=/usr/share/keyrings/kubernetes-archive-keyring.gpg] https://apt.kubernetes.io/ kubernetes-xenial main" | sudo tee /etc/apt/sources.list.d/kubernetes.list |
Bundan sonra, apt dizinini güncelleyin ve aşağıdaki komutla kubectl aracını kurun:
|
1 2 |
sudo apt-get update sudo apt-get install -y kubectl |
Ardından, aşağıdaki komutla sürümü kontrol ederek kubectl aracının kurulu olduğunu doğrulayın:
|
1 |
kubectl version |
Eğer kubectl aracını yerel olarak yeni kurduysanız çıktı şu şekilde olacaktır:

Yukarıdaki ekran görüntüsünde, kubectl yerel Kubernetes kümesine bağlanmaya çalışıyor. Ancak, yerel makinemizde henüz çalışan bir Kubernetes kümesi olmadığı için bu işlem başarısız oluyor.
Uzak Kubernetes kümesine bağlanmak için öncelikle uzak kümeden Kubernetes kimlik bilgilerini indireceksiniz. Kimlik bilgilerini ana düğümden kopyalamak için kullanabileceğiniz komut şudur:
|
1 |
scp -r hackins@178.22.66.253:/home/hackins/.kube . |
Vurgulanan kısımları kendi ssh kullanıcı adınız ve ana düğümün genel IP'si ile değiştirin. Kimlik bilgilerinin indirilmesi tamamlandığında, bunları ev (home) dizininize kopyalayın:
|
1 |
cp -r .kube $HOME/ |
Hepsi bu kadar. Yerel kubectl aracınız artık uzak Kubernetes kümenize bağlanabilmeli ve orada komutlar çalıştırabilmelidir. Yerel kubectl aracınızın uzak kümeye bağlı olduğunu onaylamak için sürüm komutunu tekrar kontrol edin:
|
1 |
kubectl version --output='json' |
Başarılı bir bağlantıyı gösteren çıktı şu şekildedir:

İsteğe bağlı olarak, get nodes komutunu şu şekilde çalıştırabilirsiniz:

Bir Pod'un Cluster IP'sini Alma
Bir Pod'un Cluster IP'sini, yerel makinenizde kubectl get pod komutunu çalıştırarak alabilirsiniz. Pod'u barındıran düğüm ve pod'un cluster IP'si gibi daha fazla bilgiyi listelemek için komuta -o wide bayrağını ekleyin:
|
1 |
kubectl get pod -o wide |
İşte Kubernetes kümemizden bir çıktı. Önkoşul eğitiminde görebileceğiniz gibi bir Nginx web sunucusu dağıtımı yapmıştık:

IP sütunu, bağımsız pod'ların dahili IP adresini gösterir. Aradığınız pod listede görünmüyorsa, farklı bir ad alanında (namespace) olabilirsiniz. Tüm namespaces:
|
1 |
kubectl get pod -o wide --all-namespaces |
Bir Servisin IP Adresini Alma
Kümenizdeki bir Servisin IP adresini de alabilirsiniz. --all-namespaces bayrağını ekleyerek kümede çalışan tüm servisleri alırsınız:
|
1 |
kubectl get service --all-namespaces |
Yukarıdaki komutun çıktısı aşağıdaki gibidir. Servis IP'si cluster-ip sütunundadır:

Pod Ağ Ad Alanlarını (Network Namespaces) Alma ve Bunlara Erişme
Her Kubernetes pod'una atanmış bir ağ ad alanı (network namespace) vardır. netns olarak da adlandırılan ağ ad alanları, Linux'ta ağ cihazları arasında yalıtım sağlayan yerel ağ kitaplıklarıdır.
DNS çözünürlüğünü veya genel ağ bağlantısını kontrol etmek için bir pod'un ağ ad alanı içinde komutlar çalıştırabilirsiniz. Bunu başarmak için, bir pod'daki konteynerlerden birinin işlem kimliğini (process ID) arayarak işe başlarsınız. Bunu Docker üzerinde Docker'a özgü komutları kullanarak kolayca yapabilirsiniz. İlk komut, bir düğümde çalışan konteynerleri listeler. Worker düğümlerinizden birinde oturum açın ve aşağıdaki komutu çalıştırın:
|
1 |
docker ps |

Çıktıda, container ID veya Names sütunuyla ilgileniyoruz. Önkoşul eğitiminde dağıttığımız Nginx konteynerine dikkat edin: Ubuntu 20.04 Üzerinde Kubernetes Nasıl Kurulur ve Kullanılır.
Ardından, işlem kimliğini bulmak için bir sonraki komutta kullanacağımız konteyner kimliğini (container ID) veya Adını (Name) kopyalayın:
|
1 |
docker inspect --format '{{ .State.Pid }}' container-id-veya-name |
Vurgulanan kısmı önceki komuttan kopyaladığınız değerle değiştirin. Aşağıda aldığımız çıktı, yani işlem kimliği (process ID) yer almaktadır:

Artık bir işlem kimliğimiz olduğuna göre, bunu işlemin ağ ad alanı içinde nsenter komutunu çalıştırmak için kullanabiliriz:
|
1 |
sudo nsenter -t container-pid -n ip addr |
Vurgulanan kısmı önceki komutta aldığınız işlem kimliği ile değiştirin. Ardından ip addr yerine, pod'un ağ ad alanı içinde çalıştırmak istediğiniz herhangi bir komutu koyabilirsiniz. İzin reddedildi hatası almanız durumunda bunu sudo ile de çalıştırabilirsiniz.
The nsenter komutu, sizi yalnızca konteynerin içine yüklenmiş komutlarla sınırlayan docker exec kullanımının aksine, bir düğümde mevcut olan daha geniş bir komut yelpazesini çalıştırmanıza olanak tanır.
Bir Pod'un Sanal Ethernet Arayüzünü (Virtual Ethernet Interface) Alma
Bir pod üzerindeki ağ ad alanı, düğümün kök netns'i ile sanal bir ethernet borusu (pipe) aracılığıyla iletişim kurar. Düğüm tarafında bu boru, adı veth ile başlayan ve veth742f721 veya veth90 gibi benzersiz bir tanımlayıcıyla biten bir cihaz olarak görünür. Pod'un içindeyken ise boru kendisini eth0.
olarak tanımlar. Hangi veth cihazının hangi pod ile eşleştiğini bilmek isteyebilirsiniz. Düğümdeki tüm ağ cihazlarını listeleyerek başlayabilir, ardından pod'un ağındaki tüm cihazları listeleyebilirsiniz. Hangi veth cihazının belirli bir pod ile eşleştiğini belirlemek için iki listedeki cihaz numaralarını birbiriyle ilişkilendirebilirsiniz.
Pod'un ağ ad alanında nsenter komutunu kullanarak ip addr komutunu çalıştırın. Konteynerin işlem kimliklerinden (process ID) birini bilmeniz gerekecektir. Bunun için, Pod Ağ Ad Alanlarını Alma ve Bunlara Erişme.
Ardından, vurgulanan kısmı uygun şekilde değiştirerek çalışan düğümünüzün (worker node) terminalinde aşağıdaki komutu çalıştırın:
|
1 |
sudo nsenter -t container-pid -n ip addr |
Komut, pod'un arayüzlerinin bir listesini çıktı olarak verir:

Şuradaki if7 karakterlerine dikkat edin: eth0@ (yukarıdaki çıktıda). Bu, pod'un eth0 arayüzünün düğümün 7. arayüzü ile eşleştiği anlamına gelir. Ardından, ip addr komutunu çalıştırarak düğümün varsayılan ad alanı (namespace) içindeki arayüzleri listeleyin:
|
1 |
ip addr |
Komut, arayüzleri aşağıda gösterildiği gibi listeler:

Çıktıda, 7. arayüz veth254b50e6@if3 – test ettiğimiz pod ile eşleştirilmiş sanal ethernet borusudur (pipe).
Iptables Kurallarını İnceleme
Bir düğümdeki tüm iptables kurallarını listelemek için iptables-save komutunu çalıştırabilirsiniz:
|
1 |
iptables-save |
Komutun çıktısı uzun olabilir, bu nedenle daha sonra incelemek üzere bir dosyaya kaydedebilirsiniz:
|
1 |
iptables-save > iptables.txt |
Çıktıyı sayfalamak için less komutunu da kullanabilirsiniz:
|
1 |
iptables-save | less |
Yalnızca Kubernetes NAT kurallarıyla ilgilendiğimiz için, doğru hedefi belirtmek üzere -L bayrağını ekleyin:
|
1 |
sudo iptables -t nat -L KUBE-SERVICES |
İşte çıktı:

IPVS Detaylarını İnceleme
Kube-proxy, Kubernetes kümenizdeki her düğümde çalışan bir ağ proxy'sidir. Sanal Servis IP'lerinin pod IP'lerine dönüştürülmesini yönetmek üzere IPVS'yi yapılandırmak için kullanılabilir. IP'lerin dönüşüm tablosunu listelemek için ipvsadm komutunu kullanabilirsiniz. Öncelikle bunu düğümünüze kurmanız gerekir:
|
1 |
sudo apt install ipvsadm |
Şimdi aşağıdaki komutu çalıştırabilirsiniz:
|
1 |
sudo ipvsadm -Ln |
Tek bir Servis IP'sini göstermek için, istediğiniz IP adresini belirterek -t bayrağını ekleyin:
|
1 |
ipvsadm -Ln -t 10.244.1.255 |
Küme DNS'ini Sorgulama
Küme DNS çözümlemenizde hata ayıklamak için izleyebileceğiniz birkaç yol vardır. Resmi belgeler yollardan biri olarak, gerekli tüm araçlara sahip bir hata ayıklama (debug) konteyneri dağıtmayı ve ardından kubectl kullanarak nslookup.
çalıştırmayı açıklar. İsteğe bağlı olarak, doğrudan düğümün kendisinden dig ve nsenter komutlarını kullanarak DNS'i sorgulayabilirsiniz. İlk olarak, master düğümünüze dig kurmanız gerekecektir. Ubuntu için apt komutuyla yükleyin:
|
1 |
sudo apt install dnsutils |

Yerel makinenizdeki terminale geri dönün ve kube-dns servisinin küme IP'sini (cluster IP) bulmak için aşağıdaki komutu çalıştırın:
|
1 |
kubectl get service -n kube-system kube-dns |
Komut şu çıktıyı verir:

The cluster-ip sütunu ihtiyacımız olan değeri içerir. Şimdi, konteyner ad alanında (namespace) nsenter kullanarak dig çalıştırabiliriz. Ancak, ad alanına erişmek için bir konteyner işlem kimliğine (process ID) ihtiyacınız olacaktır. Yol göstermesi için yukarıdaki Getting and Accessing Pod Network Namespaces bölümüne bakın.
Once you have the container-id değerini aldıktan sonra, master düğümünüzde aşağıdaki komutu çalıştırın:
|
1 |
sudo nsenter -t 27168 -n dig kubernetes.default.svc.cluster.local @10.96.0.10 |
The dig komutu, küme DNS servisinin IP'sini ( @10.96.0.10) alır ve şu formattaki Servisin tam alan adını (FQDN) arar: service-name.namespace.svc.cluster.local:

Servis adlarını ve ad alanlarını bulma hakkında bilgi için şu bölüme göz atın: Getting the IP address of a Service.
Conntrack Bağlantı İzlemeyi İnceleme
Şu anda izlenen tüm bağlantıları görüntülemek için conntrack komutunu kullanabilirsiniz:
|
1 |
sudo conntrack -L |
Ekran görüntüsüne benzer bir çıktı verir:

Gelen bağlantıları sürekli olarak izlemek için -E bayrağını ekleyin:
|
1 |
sudo conntrack -E |
Belirli bir hedef adrese giden izlenen bağlantıları görüntülemek için -d bayrağını ekleyin ve hedef adresi belirtin:
|
1 |
sudo conntrack -L -d 80.45.6.4 |
Bazen bağlantı izleme tablosu dolar ve bu da yeni bağlantıların kesilmesine neden olur. Bu durum, düğümlerinizin güvenilir bağlantılar kurmasını engelleyen sorunlara yol açar. Bu gerçekleşirse, sistem günlüklerinizde şu konumda aşağıdaki gibi mesajlar görürsünüz: /var/log/syslog:
|
1 |
Mar 07 19:12:11 worker-105 kernel: nf_conntrack: table full, dropping packet. |
İzlenecek maksimum bağlantı sayısı için bir sistem ayarı mevcuttur. Mevcut değerinizi listelemek için aşağıdaki komutu kullanın:
|
1 |
sysctl net.netfilter.nf_conntrack_max |
Şu çıktıyı verir:

Değeri, -w bayrağını kullanarak değiştirebilirsiniz:
|
1 |
sudo sysctl -w net.netfilter.nf_conntrack_max=231074 |
Değeri kalıcı hale getirmek ve yeniden başlatmalarda korunmasını sağlamak için /etc/sysctl.conf dosyasını düzenlemek isteyebilirsiniz. Dosyayı nano ile açın:
|
1 |
sudo nano /etc/sysctl.conf |
Ardından, satır mevcutsa değeri değiştirin veya yeni değeri belirterek satırı dosyanın sonuna ekleyin:
|
1 |
net.netfilter.nf_conntrack_max=231074 |
Sonuç
Birden çok konteynerleştirilmiş hizmeti dağıtırken, size merkezi bir yönetim noktası sağladığı için Kubernetes'ten büyük ölçüde yararlanacaksınız. Çeşitli Kubernetes pod'ları arasında bağlantı olduğundan emin olmak için, Kubernetes altyapınızdaki sorunları gidermek amacıyla kullanabileceğiniz bazı ağ denetleme komutlarını gösterdik.
Kubernetes, avantajları, Kubernetes üzerinde uygulamaların kurulması ve dağıtılması hakkında daha fazla bilgi edinmek için çeşitli Kubernetes eğitimlerimize göz atın.
Keyifli Çalışmalar!
Yorumlar
Henüz yorum yapılmamış. İlk siz olun.