Kubernetes RabbitMQ Kurulumu

Deniz TÜRKMEN
6 min readNov 26, 2022

--

.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.

RabbitMQ

İ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.

RabbitMQ Namespace

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

RabbitMQ ConfigMap

Ş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
RabbitMQ RBAC ve Service Account

Ş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
Dnsutils Configuration

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.

--

--

Deniz TÜRKMEN
Deniz TÜRKMEN

Responses (1)