Dapr ile microservisler arasında service invocation yöntemi ile nasıl haberleşeceğimizi ve bu yöntemin avantajlarını bir önceki yazımda anlatmıştım. Sonuç itibariyle microservisler Side Car’ları kullanarak Docker-Compose ile oluşturduğumuz network üzerinden konuştu. Bu makalemin konusu bu işlemi Kubernetes ortamında gerçekleştirmek.
Bu işlemi gerçekleştirmek için Minikube, Docker-Desktop ve benzeri bir Kubernetes Cluster’ına ihtiyacımız var. Ben, Docker-Desktop ile hızlı ve zahmetsiz bir şekilde tek node dan oluşan bir cluster oluşturdum ve burada çalışacağım.
Dapr’ın Kubernetes’e Kurulumu
Bu işlem eğer Dapr CLI sizin bilgisayarınızda kurulu ise oldukça basit, kurulu değilse bu yönergeleri takip ederek kurulum yapmanız gerekmekte.
Eğer Dapr CLI kurulum yaptıysanız bu linki takip ederek Kubernetes ortamına kurulumu yapabilirsiniz. Günün sonunda yapacağınız tek şey terminalden “dapr init -k” komutunu çalıştırmak. Herşey yolunda gittiyse Lens gibi bir tool ile ilgili contexti seçip “dapr-system” namespacesinde oluşan podları görebilirsizin. Yada “kubectl get pods -n dapr-system” komutunu çalıştırın.

Makalemizin konusu Kubernetes ortamına Dapr kurulumu olmasa da özet geçmek zorunda hisettim kendimi. Şimdi asıl konumuz Microservisler arası iletişim yöntemleri ve bu yöntemlerden birisi olan Service Invocation ‘ın Kubernetes’te nasıl çalıştığını incelemek. Daha önce bahsettiğim gibi microservisler diğer microservisler ile dapr sidecar ile iletişim kuruyor.
Kubernetes’te Sidecar Nedir?
Kubernetes’te bir “sidecar” konteyner, bir ana uygulamanın konteyneri ile aynı pod’da (Kubernetes’teki en küçük ve en basit dağıtım birimi) çalışan ve ana uygulamanın işlevselliğini genişletmek veya geliştirmek için kullanılan bir konteynerdır.

Kubernetes’te Sidecarı Nasıl Oluştururum?
apiVersion: apps/v1
kind: Deployment
metadata:
name: aggregator-deployment
namespace: daprdotnetjourney
labels:
app: aggregator
spec:
replicas: 2
strategy:
type: RollingUpdate
rollingUpdate:
maxSurge: 25%
maxUnavailable: 25%
selector:
matchLabels:
service: aggregator
template:
metadata:
annotations:
dapr.io/enabled: "true"
dapr.io/app-id: aggregator
dapr.io/app-port: "80"
dapr.io/config: "config"
labels:
app: aggregator
service: aggregator
spec:
containers:
- name: aggregator
image: cahityusuf/aggregator:v1
imagePullPolicy: Always
.
.
.
Bu işlem için podların oluşmasını sağlayan Kubernetes’te “Deployment” olarak isimlendirdiğimiz bir hizmet var. Yaml formatında yazılan ve belirli kuralları ve kalıpları olan bir yapı. Bu yapıya yukarıda paylaştığım “annotations” ları ekleyerek Dapr Sidecar’ın pod içine yerleşmesini sağlıyorsunuz. Bunun nasıl olduğunu birazdan görseller ile paylaşacağım. Önce bu “annotations” larda ne gibi detaylar var ve ne işe yarıyorlar bunlardan bahsetmek istiyorum.
1.dapr.io/enabled
: Bu eklemeyi true
olarak ayarlayarak, Dapr’ın bu pod’a sidecar olarak eklenmesi gerektiğini belirtirsiniz. Örneğin:
annotations:
dapr.io/enabled: "true"
2. dapr.io/app-id
: Bu eklemeyi kullanarak Dapr sidecar’ın ait olduğu uygulamanın kimliğini belirtirsiniz. Bu, Dapr kontrol planının sidecar’ı doğru şekilde yapılandırmasını ve uygulamanın diğer Dapr uygulamalarıyla iletişim kurmasını sağlar. Örneğin:
annotations:
dapr.io/app-id: "myapp"
3.dapr.io/app-port
: Bu eklemeyi kullanarak, uygulamanın dinlediği port numarasını belirtirsiniz. Dapr sidecar, bu porta HTTP veya gRPC çağrıları yapar. Örneğin:
annotations:
dapr.io/app-port: "5000"
4.dapr.io/config
: Bu eklemeyi kullanarak, uygulamanın Dapr tarafından kullanılacak olan yapılandırma ismini belirtirsiniz. Bu, Dapr’ın özelliklerini ve davranışını kontrol etmek için kullanılır. Örneğin:
annotations:
dapr.io/config: "myconfig"
5.dapr.io/log-level
: Bu eklemeyi kullanarak, Dapr’ın üreteceği logların seviyesini belirtirsiniz. Kabul edilen değerler debug
, info
, warn
, error
, fatal
, ve panic
dir. Örneğin:
annotations:
dapr.io/log-level: "info"
Bunlara benzer Annotations’ları kullanarak Dapr Sidecar faklı özellikler ekleyebilirsiniz.
Kubernetes Ortamına Deployment
Öncelikle apilerimden Docker Imageları oluşturup Docker Hub hesabıma göndereceğim. Image oluşturmak için kullandığım komutlar aşağıdaki gibidir. Bu komutları Docker-Desktop kurulu bir makinada proje dizininde çalıştırınız.
docker build -f Dockerfile.Aggregator -t cahityusuf/aggregatorapi:v1.0.0 .
docker build -f Dockerfile.BasketApi -t cahityusuf/basketapi:v1.0.0 .
Oluşan imageları Docker Container Registry yolladığım komutlar aşağıdaki gibidir.
docker push cahityusuf/basketapi:v1.0.0
docker push cahityusuf/aggregatorapi:v1.0.0
Şimdi yapmamız gereken bu “cahityusuf/basketapi:v1.0.0” ve “cahityusuf/aggregatorapi:v1.0.0” imageları ile Kubernetes Deployment yaml oluşturmak ve Kubernetes ortamına dağıtmak.
Aggregator Api’sine ait Deployment
apiVersion: apps/v1
kind: Deployment
metadata:
name: aggregator-deployment
namespace: daprdotnetjourney
labels:
app: aggregator
spec:
replicas: 1
strategy:
type: RollingUpdate
rollingUpdate:
maxSurge: 25%
maxUnavailable: 25%
selector:
matchLabels:
service: aggregator
template:
metadata:
annotations:
dapr.io/enabled: "true"
dapr.io/app-id: aggregator
dapr.io/app-port: "80"
dapr.io/config: "config"
labels:
app: aggregator
service: aggregator
spec:
containers:
- name: aggregator
image: cahityusuf/aggregatorapi:v1.0.0
imagePullPolicy: Always
ports:
- containerPort: 80
protocol: TCP
resources:
requests:
memory: "500Mi"
cpu: "0.3"
limits:
memory: "2048Mi"
cpu: "1"
env:
- name: ASPNETCORE_ENVIRONMENT
value: Production
- name: ASPNETCORE_URLS
value: http://+:80
Basket Api’sine ait Deployment
apiVersion: apps/v1
kind: Deployment
metadata:
name: basketapi-deployment
namespace: daprdotnetjourney
labels:
app: basketapi
spec:
replicas: 1
strategy:
type: RollingUpdate
rollingUpdate:
maxSurge: 25%
maxUnavailable: 25%
selector:
matchLabels:
service: basketapi
template:
metadata:
annotations:
dapr.io/enabled: "true"
dapr.io/app-id: basketapi
dapr.io/app-port: "80"
dapr.io/config: "config"
labels:
app: basketapi
service: basketapi
spec:
containers:
- name: basketapi
image: cahityusuf/basketapi:v1.0.0
imagePullPolicy: Always
ports:
- containerPort: 80
protocol: TCP
resources:
requests:
memory: "500Mi"
cpu: "0.3"
limits:
memory: "2048Mi"
cpu: "1"
env:
- name: ASPNETCORE_ENVIRONMENT
value: Production
- name: ASPNETCORE_URLS
value: http://+:80
Şimdi bu apileri yukarıdaki yaml’ları kullanarak Kubernetes’ e aşağıdaki komutları kullanarak göndereceğiz.
kubectl create ns daprdotnetjourney
kubectl apply -f .\aggregator-deployment.yaml
kubectl apply -f .\basketapi-deployment.yaml
Eğer herşey yolunda gittiyse Kubernetes’te apilerimiz aşağıdaki gibi görünmeli.

Artık görselde de görüldüğü gibi her apinin yanında “daprd” isimli birde sidecarı var. Artık diğer tüm apiler ve dış dünya ile olan ilişkisini bununla sağlayacak. “daprd” isimli küçük applicationda da apimizin ulaşmak istediği yerler ile iletişime girebileceği her türlü yetenek söz konusu. Bunları zamanla göreceğiz.
Microservislerimizi Kubernetes ortamına dağıttık. Makale çok uzayacağı için, microservislere ulaşabilmek için Kubernetes Servislerinden faydalanma, oluşturduğumuz servisi kullanarak nginx-ingress veya port-forward yöntemleri ile microservise ulaşma ve diğer microservisler ile etkileşime gireceği endpointleri tetiklemek gibi işlemleri sonraki makaleye saklıyorum. Ayrıca Dapr’da microservisler arasınadaki tüm bağımlılıkları haritalayan Zipkin gibi monitoring toollarınada değineceğiz.
Tekrar görüşmek dileğiyle.
Çok faydalı bir anlatım olmuş hocam ellerinize sağlık.