Kubernetes RabbitMQ Kurulumu
.Net Core 3.1 Publisher Örneği
Merhabalar,
Bu yazımda da Single Clusterımıza RabbitMQ kurulumunu inceliycez. Kurulum yaptıktan sonra basit bir .Net Core 3.1 ile publisher örneği inceliycez.
İlk olarak rabbitmq nedir buna bakalım.
RabbitMQ: Açık kaynak kodlu bir ‘message broker’ yapılarından bir tanesidir. Bir uygulamdan mesajı alıp (producer) başka bir kaynağa ileten (consumer) yapıdır. Erlang diliyle geliştirilmiştir. ‘Exchange’ ve ‘Queue’ olmak üzere iki yapı üzerinde bulunmaktadır.
RabbitMQ Clusterımızı minikube üzerinde kurulumu gerçekleştircez. Bunun için eğer sisteminizde minikube ve kubectl yüklü değilse diğer yazımdan minikube kurulumunu okuyabilirsiniz.
Minikube kurulduktan sonra aşağıdaki komut ile clusterımızı aktifleştiriyoruz.
minikube start — memory=8000 — cpus=4
Sonrada “kubectl get nodes” ile control plane bakıyoruz.
kubectl get all -A
Komutu ile de clusterımızda çalışan tüm objeleri bakalım. RabbitMQ kurulumu yapacağımız Single Clusterımız aşağıdaki yapıdadır.
Şimdide RabbitMQ için bir namespace oluşturalım ve ardından “kubectl apply -f rq-namespace.yaml” namespace oluşturalım.
“kubectl get namespaces” yada “kubectl get ns” komutu ile listeleyelim.
Şimdide RabbitMQ Clustımız için configmap objemizi oluşturalım.
“kubectl apply -f rq-configmap.yaml” komutu ile oluşturalım ve “kubectl get configmap” komutu ile listeleyelim.
Şimdi de oluşturduğumuz namespace Kimlik doğrulama(Authentication) , role yapılandırma (RBAC) ve oluşan objelerdeki proccess çağrı yapmak için Service Account oluşturalım.
Not: Kubernetes user tipinde bir obje yoktur. User için “openssl” ile bir sertifika oluşturulup Kimlik doğrulama ve Role yapısı Cluster’ımıza bildirilir. Başka bir yazımda bu konuyu detaylıca inceliycez.
“kubectl apply -f rq-rbac.yaml” komutu ile oluşturalım. Aşağıdaki komutlar ile oluşturduğumuz objelere bakalım.
kubectl get serviceaccountskubectl get roles.rbac.authorization.k8s.iokubectl get rolebindings.rbac.authorization.k8s.io
Şimdide RabbitMQ kurulumu için erlang cookie almamız gerekiyor. Bunun için secret oluşturmalıyız.
Not: Eğer Erlang ve rabbitmq kubernetes dışında kurulum yapılmış ise, Örneğin “Linux” veya Windows işletim sistemine kurulum yaptıysanız ilgili path “/var/lib/rabbitmq/.erlang.cookie” cookie buradadır. Bu .erlang.cookie ile de aşağıdaki komut ile secret oluşturabilirsiniz. Fakat Benim Local bilgisayarımda kurulu olmadığı içim cookie başka yol ile oluşturcam.
kubectl get secret generic secret_name — from-file=/var/lib/rabbitmq/.erlang.cookie
Local bilgiyarımda cookie oluşturmak için,
echo -n “cookie-value” | base64
Sonrada , base64 li cookie ilgili objenin değeri olarak atıycam.
kubectl apply -f rq-secret.yamlkubectl get secretkubectl describe secret secret_name
Komutları ile oluşturup secretimizi bakalım.
Şimde de en önemli olan obje yani statefulset oluşturalım.
kubectl apply -f rq-statefulset.yamlkubecl get statefulsetkubectl get podskubectl exec -it pod_name — printenv
Komutları ile oluşturup statefulset bakalım.
Not: Burada statefulset objenizde bilmeniz gereken,
- Kubernetes Clusterımızı minikube ile oluşturduğumuz için kendisi default bir tane storageclass oluşturdu. “kubectl get storageclass” komutu ile bakalım. Eğer başka bir platform ile kurulum yapıyorsanız, kurduğunuz platforma göre storageclass oluşturmalısınız.
Şimdi de RabbitMQ Clusterımız için servis objemizi oluşturalım.
kubectl apply -f service.yamlkubectl get servicekubectl describe servis servis_namekubectl exec -it servis_name — bash
Komutları ile oluşturup servis objemize bakalım.
Not: Service Dns çözümlemesi kontrol edelim. Bunun için podların bir tanesi ‘exec’ komutu ile bağlanalım.
apt updateapt install dnsutils
Pod un içinde komutları çalıştıralım.
nslookup servis_name
Not: Minikube ile Kubernetes Clusterımız kurulu olduğu için service üzerinden bir tünel oluşturup, service dışarı açmak için kullancağımız komut;
minikube service — url servis_name
İlgili iplerden service objesinde tanımladığımız discovery portuna denk elen ip’ye gittiğimizde RabbitMQ arayüzüne ulaşırız.
Default olarak username=guest ve password=guest yazıp giriş yapalım.
RabbitMQ Cluster kurulumumuz başarılı bir şekilde gerçekleşmiştir. Fakat her seferinde böyle minikube ile tünel oluşturmaktansa buraya gelin bir “ingress” yazalım. Bunun için
İngress objesini oluşturmadan önce minikube için “ingress” objesini enable yapmamız gerekir.
minikube addons list
Not: Minikube ile enable olan objelerin yanında yeşil check işareti vardır.
minikube addons enable ingress
komutları ile ingress objemizi enable edelim. Şimdi de
kubectl apply -f rq-ingress.yamlkubectl get ingress
ile ingress objemize ve aldığı ip ye öğrenelim.
Görüldüğü gibi ip ve host ismini almış. Dns çözümlemesi için
sudo vim /etc/hosts
ip ve hostname ekliyoruz.
Son olarak artık tarayıcıdan “web.rabbitmq.com” gidebiliriz.
Kurulum Kubernetes ile 3 nod’lu olarak başarılı bir şekilde gerçekleşmiştir.
Son olarakta .Net Core 3.1 ile basit publisher örneği yapalım. Bunun için terminalden,
Şimdide .Net Core 3.1 için RabbitMQ paketi ekleyelim. Bunun için
dotnet add package Rabbitmq.Client
Controllerde basit bir publisher yazalım.
Yukaridaki Şekilde gözüktüğü gibi “localhost:5000” gittiğimizde hata alırız.
minikube service list
Hostname 192.168.49.2Port 30120
olarak güncelleyelim ve “dotnet run” komutu ile uygulamamızı tekrar çalıştıralım.
Not: Yukaridaki şekilde gözüktüğü gibi rabbitmq iki farklı Nodeport almıştır. 32653 tarayıcıdan erişebilceğimiz port,30120 ise amqp protokolunun aldığı port numarasıdır.
Mesajımız RabbitMQ kuyruğuna tüketilmek üzere eklenmiştir.
Mesaj içeriğide yukarıdaki şekilde gözüktüğü gibidir.
Bu yazımızın da sonuna gelmiş bulunmaktayız. Araştırmalarım ve sektörde karşılaştığım senaryolar üzerine yazılarımı yazmaya devam edeceğim. Umarım faydalı bir yazı olmuştur. Yazımı okuduğunuz için teşekkürler. Diğer yazımda Kubernetes Apache Kafka kurulunu inceliycez.