Bloğa geri dön

Kubernetes Ağ İletişimi Sorunları Nasıl Giderilir ve İncelenir

Kubernetes Ağ İletişimi Sorunları Nasıl Giderilir ve İncelenir

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

  • 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:

Ardından, Google bulut genel imzalama anahtarını indirmek için aşağıdaki komutu çalıştırın:

Then, add Kubernetes apt repository:

Bundan sonra, apt dizinini güncelleyin ve aşağıdaki komutla kubectl aracını kurun:

Ardından, aşağıdaki komutla sürümü kontrol ederek kubectl aracının kurulu olduğunu doğrulayın:

Eğer kubectl aracını yerel olarak yeni kurduysanız çıktı şu şekilde olacaktır:

kubectl version

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:

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:

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:

Başarılı bir bağlantıyı gösteren çıktı şu şekildedir:

kubectl version json

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

kubectl get nodes

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:

İşte Kubernetes kümemizden bir çıktı. Önkoşul eğitiminde görebileceğiniz gibi bir Nginx web sunucusu dağıtımı yapmıştık:

kubectl get pod -o wide

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:

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:

Yukarıdaki komutun çıktısı aşağıdaki gibidir. Servis IP'si cluster-ip sütunundadır:

kubectl get svc

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:

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:

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:

docker inspect

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:

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:

Komut, pod'un arayüzlerinin bir listesini çıktı olarak verir:

nsenter ip addr

Ş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:

Komut, arayüzleri aşağıda gösterildiği gibi listeler:

Kubernetes Networking ip addr

Çı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:

Komutun çıktısı uzun olabilir, bu nedenle daha sonra incelemek üzere bir dosyaya kaydedebilirsiniz:

Çıktıyı sayfalamak için less komutunu da kullanabilirsiniz:

Yalnızca Kubernetes NAT kurallarıyla ilgilendiğimiz için, doğru hedefi belirtmek üzere -L bayrağını ekleyin:

İşte çıktı:

Kubernetes Networking iptables

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:

Şimdi aşağıdaki komutu çalıştırabilirsiniz:

Tek bir Servis IP'sini göstermek için, istediğiniz IP adresini belirterek -t bayrağını ekleyin:

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:

Kubernetes Networking 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:

Komut şu çıktıyı verir:

get kube dns service

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:

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:

Kubernetes Networking nsenter dig

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:

Ekran görüntüsüne benzer bir çıktı verir:

Kubernetes Networking conntrac -l

Gelen bağlantıları sürekli olarak izlemek için -E bayrağını ekleyin:

Belirli bir hedef adrese giden izlenen bağlantıları görüntülemek için -d bayrağını ekleyin ve hedef adresi belirtin:

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:

İzlenecek maksimum bağlantı sayısı için bir sistem ayarı mevcuttur. Mevcut değerinizi listelemek için aşağıdaki komutu kullanın:

Şu çıktıyı verir:

conntrack max

Değeri, -w bayrağını kullanarak değiştirebilirsiniz:

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:

Ardından, satır mevcutsa değeri değiştirin veya yeni değeri belirterek satırı dosyanın sonuna ekleyin:

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!

author

Pranay Kapgate

Yazar · CloudSigma

Preslav Dobrev, CloudSigma'da Kreatif Tasarımcı olarak görev yapmakta olup geleneksel ve yenilikçi pazarlama kanallarını kullanarak tutarlı bir kurumsal kimlik oluşturmaya odaklanmaktadır. Sanatsal vizyonu stratejik pazarlamayla harmanlayarak etkili marka anlatıları oluşturma konusunda oldukça yeteneklidir.

Yorumlar

Henüz yorum yapılmamış. İlk siz olun.