Takip et

Kubernetes ile Linkerd Kurulumu ve Kullanımı

Kubernetes ile Linkerd Kurulumu ve Kullanımı Kubernetes, modern bulut tabanlı uygulamaların dağıtımını, ölçeklendirilmesini ve yönetimi

Kubernetes ile Linkerd Kurulumu ve Kullanımı

Kubernetes, modern bulut tabanlı uygulamaların dağıtımını, ölçeklendirilmesini ve yönetimini basitleştiren güçlü bir konteyner orkestrasyon platformudur. Mikroservis mimarileri yaygınlaştıkça, bu servislerin birbirleriyle güvenli, gözlemlenebilir ve verimli bir şekilde iletişim kurmasını sağlamak kritik bir ihtiyaç haline gelmiştir. İşte bu noktada “Service Mesh” kavramı devreye girer. Linkerd, Kubernetes için özel olarak tasarlanmış, hafif, yüksek performanslı ve kullanımı kolay bir açık kaynak Service Mesh çözümüdür. Bu makale, Linkerd’in ne olduğunu, neden önemli olduğunu, Kubernetes kümenize nasıl kurulacağını ve temel özelliklerini kullanarak uygulamalarınızı nasıl yöneteceğinizi detaylı bir şekilde açıklayacaktır.

Service Mesh Kavramına Giriş

Mikroservis mimarileri, büyük ve karmaşık uygulamaları daha küçük, bağımsız ve yönetilebilir servisler halinde bölerek geliştirme hızını ve esnekliği artırır. Ancak bu dağıtık yapı, beraberinde bazı zorlukları da getirir:

* Gözlemlenebilirlik: Hangi servisin hangi servisle konuştuğunu, gecikmeleri, hataları ve genel sistem sağlığını izlemek zorlaşır.
* Güvenlik: Servisler arası iletişimi şifrelemek (TLS), kimlik doğrulamak ve yetkilendirmek karmaşık hale gelir.
* Trafik Yönetimi: İsteklerin nasıl yönlendirileceği, yük dengeleme, yeniden denemeler, zaman aşımları ve hata enjeksiyonu gibi özellikler her serviste ayrı ayrı uygulanmalıdır.
* Güvenilirlik: Bir servisteki hatanın tüm sistemi etkilemesini önlemek için devre kesici (circuit breaker) gibi desenler gereklidir.

Service Mesh, bu operasyonel zorlukları uygulama kodundan ayırarak çözmek için tasarlanmış bir altyapı katmanıdır. Temel olarak, her servis pod’una bir “sidecar” proxy enjekte ederek servisler arası tüm trafiği bu proxy’ler üzerinden yönlendirir. Bu proxy’ler, uygulamanın kendisini değiştirmeye gerek kalmadan güvenlik, gözlemlenebilirlik ve trafik yönetimi özelliklerini sağlar.

Bir Service Mesh genellikle iki ana bileşenden oluşur:

* Data Plane (Veri Düzlemi): Servisler arası trafiği yöneten ve uygulayan proxy’lerdir. Linkerd’de bu proxy’ler Rust ile yazılmış ve yüksek performans sunar.
* Control Plane (Kontrol Düzlemi): Data Plane’deki proxy’leri yapılandıran, yöneten ve gözlemleyen merkezi bileşenlerdir. Linkerd’in kontrol düzlemi Kubernetes üzerinde çalışır ve metrikleri toplar, politikaları uygular ve genel sistem durumunu izler.

Linkerd dışında Istio, Consul Connect gibi başka Service Mesh çözümleri de bulunmaktadır. Linkerd, basitliği, performansı ve düşük kaynak tüketimi ile öne çıkar.

Linkerd Neden Tercih Edilmeli?

Linkerd, Kubernetes ekosisteminde Service Mesh çözümleri arasında kendine özgü bir yer edinmiştir. Tercih edilmesinin başlıca nedenleri şunlardır:

* Performans ve Kaynak Verimliliği: Linkerd’in data plane’i için kullanılan proxy’ler, Rust programlama dili ile yazılmıştır. Bu, proxy’lerin çok düşük gecikme süresiyle çalışmasını ve minimum CPU ve bellek tüketmesini sağlar. Mikroservisleriniz için ekstra yük getirmeden maksimum performans sunar.
* Sadelik ve Kolay Kullanım: Linkerd, “basitlik” felsefesiyle tasarlanmıştır. Kurulumu hızlı ve kolaydır. Yönetimi ve sorun gidermesi diğer Service Mesh çözümlerine göre daha az karmaşıktır. linkerd CLI aracı, tüm operasyonları basitleştirir.
* Otomatik mTLS (Mutual TLS): Linkerd, tüm servisler arası iletişimi otomatik olarak şifreler ve kimlik doğrulaması yapar. Bu, geliştiricilerin güvenlik endişeleriyle uğraşmadan güvenli bir iletişim katmanına sahip olmasını sağlar. Kümenizdeki tüm trafik varsayılan olarak güvenlidir.
* Derin Gözlemlenebilirlik: Linkerd, servislerinizin sağlığı ve performansı hakkında zengin metrikler, loglar ve izleme verileri toplar. Kendi web tabanlı gösterge paneli (Dashboard), linkerd stat ve linkerd tap gibi CLI araçları sayesinde gerçek zamanlı trafik akışını, gecikmeleri, başarı oranlarını ve hata oranlarını kolayca izleyebilirsiniz. Prometheus ve Grafana ile entegrasyonu da sorunsuzdur.
* Geliştirme Topluluğu ve Olgunluk: Linkerd, Cloud Native Computing Foundation (CNCF) bünyesinde bulunan ve aktif bir topluluğa sahip olgun bir projedir. Sürekli geliştirilir ve güncel Kubernetes standartlarına uyum sağlar.
* Politika ve Trafik Yönetimi: Linkerd, servisler arası iletişimi kontrol etmek için kapsamlı yetkilendirme politikaları ve gelişmiş trafik yönetimi özellikleri sunar. Örneğin, belirli servislerin yalnızca belirli diğer servislerle iletişim kurmasına izin verebilir, canary dağıtımlarını kolayca uygulayabilir veya A/B testleri yapabilirsiniz.

Bu özellikler, Linkerd’i özellikle performansın ve kullanım kolaylığının ön planda olduğu Kubernetes ortamları için cazip bir seçenek haline getirir.

Ön Koşullar

Linkerd’i Kubernetes kümenize kurmadan ve kullanmaya başlamadan önce bazı temel gereksinimleri karşılamanız gerekmektedir:

* Kubernetes Kümesi: Çalışır durumda bir Kubernetes kümesine sahip olmanız gerekir. Bu bir geliştirme ortamı için Minikube, K3s veya Docker Desktop’ın Kubernetes özelliği olabilir. Üretim ortamları için ise AKS (Azure Kubernetes Service), EKS (Amazon Elastic Kubernetes Service) veya GKE (Google Kubernetes Engine) gibi bulut sağlayıcılarının yönetilen Kubernetes servisleri kullanılabilir. Kümenizin en az 1.25 veya daha yeni bir Kubernetes sürümüne sahip olması önerilir.
* kubectl CLI Aracı: Kubernetes kümenizle etkileşim kurmak için kubectl komut satırı aracının yerel makinenizde yüklü ve yapılandırılmış olması gerekir. kubectl get nodes komutunu çalıştırarak kümenize erişebildiğinizden emin olun.
* helm CLI Aracı (İsteğe Bağlı ama Önerilir): Linkerd’i Helm ile kurmak veya yönetmek isterseniz, Helm’in yüklü olması gerekir. Helm, Kubernetes uygulamalarını paketlemek ve dağıtmak için bir paket yöneticisidir.
* Linkerd CLI Aracı: Linkerd’in kontrol düzlemini kurmak, yönetmek ve uygulamalarınıza enjekte etmek için Linkerd’in kendi komut satırı aracı olan linkerd‘e ihtiyacınız olacak. Bu makalede kurulum adımları verilecektir.

Bu ön koşullar tamamlandığında, Linkerd’in kurulumuna ve kullanımına geçmeye hazır olacaksınız.

Linkerd Kurulumu

Linkerd kurulumu oldukça basittir ve genellikle iki ana adımdan oluşur: Linkerd CLI aracının kurulumu ve ardından Linkerd kontrol düzleminin Kubernetes kümesine dağıtılması.

Linkerd CLI Kurulumu

Linkerd CLI, Linkerd kontrol düzlemini yönetmek, uygulamalara proxy’leri enjekte etmek ve kümedeki Linkerd ile ilgili metrikleri görüntülemek için kullanılır.

Linux ve macOS için:
Aşağıdaki komut ile Linkerd CLI’yi indirebilir ve PATH’inize ekleyebilirsiniz:

curl --proto '=https' --tlsv1.2 -sSf https://run.linkerd.io/install | sh
export PATH=$PATH:$HOME/.linkerd2/bin

Bu komut, Linkerd CLI’nin en son kararlı sürümünü indirir ve /home//.linkerd2/bin dizinine yerleştirir. İkinci komut ise bu dizini PATH ortam değişkeninize ekler, böylece linkerd komutunu doğrudan çalıştırabilirsiniz. Terminalinizi yeniden başlattıktan sonra veya source ~/.bashrc (veya kullandığınız shell’e göre .zshrc, .profile vb.) komutunu çalıştırdıktan sonra komutun aktif olması gerekir.

Windows için:
Windows kullanıcıları genellikle WSL (Windows Subsystem for Linux) kullanarak Linux ortamında yukarıdaki adımları takip edebilir veya Chocolatey gibi bir paket yöneticisi kullanabilirler:

choco install linkerd

Kurulumu doğrulama:
linkerd CLI’nin doğru şekilde yüklendiğinden emin olmak için sürümünü kontrol edebilirsiniz:

linkerd version

Bu komut, hem CLI’nin sürümünü hem de eğer yüklüyse kontrol düzleminin sürümünü gösterecektir.

Ön kontrol:
Linkerd kontrol düzlemini kurmadan önce, kümenizin Linkerd için uygun olup olmadığını kontrol etmek iyi bir uygulamadır:

linkerd check --pre

Bu komut, gerekli Kubernetes API’lerinin mevcut olup olmadığını, yeterli kaynak olup olmadığını ve diğer temel ön koşulların karşılanıp karşılanmadığını denetler.

Kubernetes’e Linkerd Kontrol Düzlemi Kurulumu

Linkerd kontrol düzlemi, Linkerd’in tüm yönetim bileşenlerini içerir ve Kubernetes kümenize dağıtılır.

Doğrudan kubectl ile Kurulum:
Bu, Linkerd kontrol düzlemini kurmanın en yaygın ve basit yoludur:

linkerd install | kubectl apply -f -

Bu komut:
1. linkerd install komutu, Linkerd kontrol düzlemi için gerekli tüm Kubernetes manifestlerini (Deployment’lar, Service’ler, CRD’ler vb.) YAML formatında oluşturur.
2. | (pipe) operatörü, bu YAML çıktısını kubectl apply -f - komutuna yönlendirir.
3. kubectl apply -f - komutu, standart girdiden okuduğu YAML manifestlerini Kubernetes kümenize uygular.

Kurulumun ardından, kontrol düzleminin sağlıklı bir şekilde çalıştığından emin olmak için tekrar check komutunu çalıştırın:

linkerd check

Tüm kontrollerin yeşil (başarılı) olduğunu görmelisiniz. Herhangi bir hata varsa, çıktıyı dikkatlice inceleyerek sorunu gidermeye çalışın.

Linkerd Dashboard Kurulumu:
Linkerd, kümenizdeki servisler ve trafik hakkında zengin görselleştirmeler sağlayan bir web tabanlı gösterge paneli (Dashboard) ile birlikte gelir. Bu paneli kurmak için:

linkerd viz install | kubectl apply -f -

Yine, kurulumu doğrulayın:

linkerd viz check

Dashboard’a erişmek için:

linkerd viz dashboard

Bu komut, yerel tarayıcınızda Linkerd Dashboard’u açacaktır. Genellikle bir port yönlendirme (port-forward) işlemi başlatır ve localhost üzerinden erişim sağlar.

Helm ile Kurulum (Alternatif):
Helm kullanmayı tercih ediyorsanız, Linkerd’i Helm ile de kurabilirsiniz.

1. Linkerd Helm deposunu ekleyin:

helm repo add linkerd https://helm.linkerd.io/stable
    helm repo update

2. Linkerd kontrol düzlemini kurun:

helm install linkerd2 linkerd/linkerd2 -n linkerd --create-namespace

3. Linkerd Viz uzantısını kurun:

helm install linkerd-viz linkerd/linkerd-viz -n linkerd --create-namespace

Helm ile kurulumun ardından da linkerd check ve linkerd viz check komutlarını kullanarak kurulumu doğrulamanız önemlidir.

Uygulamanızı Linkerd’e Entegre Etme

Linkerd kontrol düzlemi kurulduktan sonra, uygulamalarınızın faydalarından yararlanabilmesi için Linkerd’in veri düzlemi (data plane) proxy’lerini uygulamalarınıza enjekte etmeniz gerekir. Bu işleme “enjeksiyon” (injection) denir.

Enjeksiyon (Injection) Kavramı

Linkerd, her uygulama pod’una bir sidecar konteyneri olarak küçük, yüksek performanslı bir proxy ekleyerek çalışır. Bu proxy, uygulamanın tüm gelen ve giden ağ trafiğini ele alır. Enjeksiyon, mevcut Kubernetes Deployment veya Pod YAML dosyalarınıza bu sidecar konteyner tanımını otomatik olarak ekleme işlemidir.

Linkerd, enjeksiyon için iki ana yöntem sunar:

1. Manuel Enjeksiyon: YAML manifest dosyalarınıza linkerd inject komutu ile proxy’yi manuel olarak ekleyebilirsiniz. Bu yöntem, belirli uygulamaları Linkerd’e dahil etmek istediğinizde veya otomatik enjeksiyonu henüz yapılandırmadığınızda kullanışlıdır.
2. Otomatik Enjeksiyon: Bir Kubernetes namespace’ine linkerd.io/inject: enabled annotation’ını ekleyerek, o namespace’te dağıtılan tüm yeni pod’lara Linkerd proxy’lerinin otomatik olarak enjekte edilmesini sağlayabilirsiniz. Bu, büyük ölçekli uygulamalar için daha pratik bir yaklaşımdır.

Örnek Uygulama ile Entegrasyon

Şimdi basit bir örnek uygulama olan emojivoto uygulamasını Linkerd’e enjekte ederek nasıl çalıştığını görelim. emojivoto, Linkerd tarafından sağlanan bir demo uygulamasıdır ve birçok mikroservisten oluşur.

1. Emojivoto uygulamasının YAML manifestini indirin:

curl -sL https://run.linkerd.io/emojivoto.yml > emojivoto.yml

2. Uygulamayı Linkerd’e enjekte edin ve dağıtın:
Bu adımda, linkerd inject komutunu kullanarak emojivoto.yml dosyasını işleyeceğiz. linkerd inject komutu, YAML dosyasını okur, gerekli sidecar proxy tanımlarını ekler ve değiştirilmiş YAML’yi standart çıktıya yazar. Bu çıktıyı doğrudan kubectl apply komutuna yönlendirerek uygulamayı dağıtabiliriz.

linkerd inject emojivoto.yml | kubectl apply -f -

Bu komut çalıştırıldıktan sonra, emojivoto uygulamasının emojivoto namespace’ine dağıtıldığını ve her pod’da Linkerd proxy’sinin sidecar olarak çalıştığını göreceksiniz.

3. Uygulamanın durumunu doğrulayın:
Pod’ların çalıştığından ve Linkerd proxy’lerinin enjekte edildiğinden emin olmak için kontrol edebiliriz:

kubectl get pods -n emojivoto

Çıktıda, her pod için 2/2 veya 3/3 gibi bir “READY” durumu görmelisiniz. Örneğin, web pod’u normalde 1 konteyner içerirken, Linkerd enjeksiyonu ile 2 konteyner (uygulama konteyneri + Linkerd proxy) olacaktır.

# Örnek çıktı:
    # NAME                        READY   STATUS    RESTARTS   AGE
    # emoji-d886689d-7j9b5        2/2     Running   0          2m
    # voting-569477d46-4t7f8      2/2     Running   0          2m
    # web-7c7f465c4-v4k2f         2/2     Running   0          2m

Ayrıca, linkerd stat komutuyla enjekte edilmiş servislerin metriklerini görebilirsiniz:

linkerd -n emojivoto stat deploy

Bu komut, emojivoto namespace’indeki tüm deployment’lar için başarı oranları, gecikmeler ve trafik hacimleri gibi temel metrikleri gösterecektir.

4. Uygulamaya erişim:
emojivoto uygulamasının web servisine erişmek için bir port yönlendirme (port-forward) işlemi başlatabilirsiniz:

kubectl -n emojivoto port-forward svc/web 8080:80

Şimdi tarayıcınızda http://localhost:8080 adresine giderek uygulamaya erişebilirsiniz. Uygulama içinde dolaşın, oylama yapın; bu, Linkerd’in trafiği izlemesi için veri üretecektir.

Otomatik Enjeksiyonu Etkinleştirme:
Eğer bir namespace’teki tüm yeni pod’lara Linkerd’i otomatik olarak enjekte etmek isterseniz, o namespace’e bir annotation eklemeniz yeterlidir:

kubectl annotate namespace my-app linkerd.io/inject=enabled

Bu komutu çalıştırdıktan sonra, my-app namespace’ine dağıtacağınız tüm yeni deployment’lar ve pod’lar otomatik olarak Linkerd proxy’si ile başlatılacaktır. Mevcut pod’lar için bu değişiklik geçerli olmaz; onları yeniden dağıtmanız veya yeniden başlatmanız gerekir.

Linkerd Kullanımı ve Özellikleri

Linkerd, enjekte edilmiş uygulamalarınıza bir dizi güçlü özellik sunar. Bu özellikler, gözlemlenebilirlik, güvenlik ve trafik yönetimi başlıkları altında toplanabilir.

Gözlemlenebilirlik (Observability)

Linkerd’in en güçlü yönlerinden biri, uygulamalarınız hakkında sağladığı derinlemesine gözlemlenebilirliktir.

* Linkerd Dashboard:
linkerd viz dashboard komutu ile erişilebilen web arayüzü, kümenizdeki tüm enjekte edilmiş servislerinizi, onların başarı oranlarını, gecikmelerini ve trafik hacimlerini görsel olarak sunar. Servisler arası bağımlılıkları gösteren bir topoloji haritası, gerçek zamanlı trafik akışını gösteren “Tap” aracı ve ayrıntılı metrikler gibi özellikler içerir. Her bir servisin içindeki pod’ları, gelen/giden istekleri ve sağlık durumlarını kolayca inceleyebilirsiniz.

* linkerd stat Komutu:
Bu CLI komutu, belirli bir namespace’teki veya tüm kümedeki servisler, deployment’lar veya pod’lar için özet metrikler sağlar.

linkerd -n emojivoto stat deploy
    linkerd -n emojivoto stat pod -o wide

Çıktı, başarı oranları (Success Rate), RPS (Request Per Second), gecikmeler (P50, P95, P99 latency) gibi kritik performans göstergelerini içerir.

* linkerd tap Komutu:
linkerd tap komutu, belirli bir servisten veya servise giden gerçek zamanlı istek akışını görmenizi sağlar. Bu, sorun giderme ve trafik analizi için inanılmaz derecede faydalıdır.

linkerd -n emojivoto tap deploy/web

Bu komut, emojivoto namespace’indeki web deployment’ına giden veya ondan gelen HTTP isteklerinin ayrıntılarını (kaynak IP, hedef IP, HTTP metodu, URL, HTTP durumu vb.) canlı olarak gösterecektir.

* Prometheus ve Grafana Entegrasyonu:
Linkerd, varsayılan olarak Prometheus formatında metrikler toplar. Linkerd Viz uzantısı ile birlikte kurulan Prometheus ve Grafana örnekleri, Linkerd’in topladığı metrikleri görselleştirmek için önceden yapılandırılmış gösterge panelleri sunar. Bu sayede, Linkerd’in sağladığı verileri daha gelişmiş bir şekilde analiz edebilir ve kendi özel uyarılarınızı oluşturabilirsiniz.

Güvenlik (Security)

Linkerd, mikroservisler arası iletişimi güvenli hale getirmek için güçlü özellikler sunar.

* Otomatik Karşılıklı TLS (mTLS):
Linkerd’in en temel güvenlik özelliği, tüm enjekte edilmiş servisler arası iletişimi otomatik olarak karşılıklı TLS (mTLS) ile şifrelemesidir. Bu, servislerin birbirleriyle iletişim kurarken kimliklerini doğrulamasını ve tüm trafiğin şifreli olmasını sağlar. Geliştiricilerin kodlarında herhangi bir değişiklik yapmasına gerek kalmaz. Bu, “sıfır güven” (zero-trust) ağ ortamları için kritik bir özelliktir.

* Yetkilendirme Politikaları (Authorization Policies):
Linkerd, Kubernetes Custom Resources (CRD’ler) kullanarak servisler arası yetkilendirme politikaları tanımlamanıza olanak tanır. Bu politikalar, hangi servislerin hangi servislerle iletişim kurabileceğini ve hangi HTTP yöntemlerini kullanabileceğini belirlemenizi sağlar.
Temel CRD’ler şunlardır:
* Server: Bir servisin belirli bir port üzerindeki dinleme davranışını tanımlar.
* ServerAuthorization: Belirli bir Server‘a kimlerin erişebileceğini tanımlar. Örneğin, yalnızca belirli bir namespace’teki servislerin veya belirli bir kimliğe sahip servislerin erişimine izin verebilirsiniz.
* HTTPRoute (Gateway API ile): Daha granüler HTTP bazlı yetkilendirme ve trafik yönetimi kuralları tanımlamak için kullanılır.

Örnek bir yetkilendirme politikası:

apiVersion: policy.linkerd.io/v1beta1
    kind: Server
    metadata:
      name: my-app-server
      namespace: my-app
    spec:
      port: 8080 # Uygulamanın dinlediği port
      proxyProtocol: HTTP
    ---
    apiVersion: policy.linkerd.io/v1beta1
    kind: ServerAuthorization
    metadata:
      name: allow-frontend-to-my-app
      namespace: my-app
    spec:
      server:
        name: my-app-server
      client:
        meshTLS:
          unauthenticatedRoutes:
            - allow:
                - serviceAccount:
                    name: frontend-service-account
                    namespace: frontend-namespace

Bu örnek, my-app namespace’indeki my-app-server‘a yalnızca frontend-namespace‘teki frontend-service-account‘a sahip servislerin erişmesine izin verir.

Trafik Yönetimi (Traffic Management)

Linkerd, uygulamalarınızın trafiğini esnek bir şekilde yönetmek için çeşitli özellikler sunar.

* Timeouts ve Retries:
Servisler arası iletişimde zaman aşımlarını ve yeniden deneme mekanizmalarını merkezi olarak yapılandırabilirsiniz. Bu, geçici ağ sorunlarından veya yavaş yanıt veren servislerden kaynaklanan hataları azaltmaya yardımcı olur. ServiceProfile veya HTTPRoute CRD’leri ile yapılandırılır.

* Load Balancing (Yük Dengeleme):
Linkerd proxy’leri, varsayılan olarak servisler arası trafiği otomatik olarak yük dengeleyerek dağıtır. Linkerd’in yük dengelemesi, geleneksel TCP bazlı yük dengeleyicilere göre daha akıllı HTTP bazlı stratejiler kullanabilir.

* Trafik Bölme (Traffic Splitting) ve Canary Deployments:
Linkerd, ServiceProfile ve HTTPRoute CRD’lerini kullanarak trafiği farklı servis sürümleri arasında bölmenize olanak tanır. Bu, yeni bir sürümü kademeli olarak kullanıcılara sunmak (canary deployment) veya A/B testleri yapmak için idealdir.
Örneğin, uygulamanızın v1 ve v2 sürümleri varsa, trafiğin %90’ını v1‘e ve %10’unu v2‘ye yönlendirebilirsiniz.

apiVersion: gateway.networking.k8s.io/v1beta1
    kind: HTTPRoute
    metadata:
      name: my-app-route
      namespace: my-app
    spec:
      parentRefs:
        - name: my-app-gateway # veya Service
      hostnames:
        - "my-app.example.com"
      rules:
        - backendRefs:
            - name: my-app-v1
              port: 8080
              weight: 90
            - name: my-app-v2
              port: 8080
              weight: 10

* Hata Enjeksiyonu (Fault Injection):
Uygulamanızın dayanıklılığını test etmek için belirli servislere gecikme veya HTTP hata kodları enjekte edebilirsiniz. Bu, uygulamanızın beklenmedik durumlarla nasıl başa çıktığını anlamanıza yardımcı olur. HTTPRoute CRD’si üzerinden yapılandırılabilir.

apiVersion: gateway.networking.k8s.io/v1beta1
    kind: HTTPRoute
    metadata:
      name: my-app-fault-injection
      namespace: my-app
    spec:
      parentRefs:
        - name: my-app-gateway
      hostnames:
        - "my-app.example.com"
      rules:
        - matches:
            - headers:
                - name: x-fault-inject
                  value: "true"
          filters:
            - type: RequestMirror
              requestMirror:
                backendRef:
                  name: my-app-v2
                  port: 8080
            - type: RequestHeaderModifier
              requestHeaderModifier:
                set:
                  - name: x-request-delay
                    value: "5s"
            - type: ResponseHeaderModifier
              responseHeaderModifier:
                set:
                  - name: x-response-status
                    value: "500"
          backendRefs:
            - name: my-app-v1
              port: 8080

Bu örnek, x-fault-inject: true başlığına sahip isteklere 5 saniye gecikme ve 500 HTTP hata kodu eklerken, normal istekleri my-app-v1‘e yönlendirir.

Linkerd’i Yönetme ve Bakım

Linkerd’i kurduktan ve uygulamalarınıza entegre ettikten sonra, zaman zaman bakım ve yönetim görevleri gerçekleştirmeniz gerekebilir.

Güncelleme

Linkerd’i güncel tutmak, en son özelliklere, güvenlik düzeltmelerine ve performans iyileştirmelerine sahip olmanızı sağlar.

* CLI Güncellemesi:
Öncelikle yerel linkerd CLI aracınızı güncellemeniz önerilir:

curl --proto '=https' --tlsv1.2 -sSf https://run.linkerd.io/install | sh

Bu komut, CLI’nin en son kararlı sürümünü indirip kuracaktır.

* Kontrol Düzlemi Güncellemesi:
CLI güncellendikten sonra, Kubernetes kümenizdeki Linkerd kontrol düzlemini güncelleyebilirsiniz:

linkerd upgrade | kubectl apply -f -

Bu komut, mevcut kontrol düzlemi yapılandırmanızı alır, yeni sürümle uyumlu hale getirir ve güncellenmiş manifestleri kümenize uygular. İşlem tamamlandıktan sonra, kontrol düzleminin sağlıklı çalıştığından emin olmak için tekrar linkerd check komutunu çalıştırmalısınız.

Sorun Giderme (Troubleshooting)

Linkerd ile ilgili bir sorunla karşılaştığınızda başvurabileceğiniz bazı araçlar ve yöntemler vardır:

* linkerd check Komutu:
Bu, sorun gidermenin ilk adımıdır. linkerd check komutu, Linkerd kontrol düzleminin ve veri düzleminin (enjekte edilmiş pod’lar) genel sağlığını kontrol eder. Eksik CRD’ler, hatalı konfigürasyonlar veya bağlantı sorunları gibi yaygın sorunları tespit edebilir.

linkerd check --proxy # Sadece proxy'leri kontrol eder
    linkerd check --controller # Sadece kontrol düzlemini kontrol eder

* Pod Logları:
Linkerd kontrol düzlemi bileşenlerinin (e.g., linkerd-controller, linkerd-proxy-injector, linkerd-identity) ve enjekte edilmiş uygulama pod’larındaki Linkerd proxy’lerinin loglarını incelemek, sorunların kök nedenini anlamak için kritik bilgiler sağlayabilir.

kubectl logs -n linkerd 
    kubectl logs -n   -c linkerd-proxy

* linkerd diagnostics Komutu:
Bu komut, Linkerd ile ilgili tüm önemli bilgileri (konfigürasyon, loglar, metrikler vb.) toplayarak bir ZIP dosyası halinde kaydeder. Bu dosya, karmaşık sorunları Linkerd topluluğuna veya destek ekibine raporlarken çok faydalıdır.

linkerd diagnostics

Kaldırma

Linkerd’i Kubernetes kümenizden tamamen kaldırmak istediğinizde aşağıdaki adımları izleyebilirsiniz:

1. Uygulamalardan Enjeksiyonu Kaldırma:
Öncelikle, Linkerd proxy’lerinin enjekte edildiği tüm uygulamaları Linkerd’den ayırmanız gerekir. Eğer namespace’lerinizde otomatik enjeksiyonu etkinleştirdiyseniz, bu annotation’ı kaldırmalısınız:

kubectl annotate namespace  linkerd.io/inject-

Ardından, enjekte edilmiş tüm pod’ları yeniden başlatmanız veya yeniden dağıtmanız gerekir, böylece yeni pod’lar proxy olmadan başlar.

Eğer uygulamalarınızı manuel olarak enjekte ettiyseniz, onların manifest dosyalarından Linkerd proxy tanımını kaldırıp yeniden uygulamanız gerekir. Alternatif olarak, linkerd uninject komutunu kullanarak bir YAML dosyasından enjeksiyonu kaldırabilirsiniz:

linkerd uninject  | kubectl apply -f -

Bu adımı atlamanız durumunda, kontrol düzlemi kaldırıldığında bu proxy’ler işlevsiz kalacak ve hatalara neden olabilecektir.

2. Kontrol Düzlemini Kaldırma:
Uygulamalarınız Linkerd’den ayrıldıktan sonra, kontrol düzlemini kaldırabilirsiniz:

linkerd uninstall | kubectl delete -f -

Bu komut, Linkerd kontrol düzlemi bileşenlerini ve ilgili Custom Resource Definition’ları (CRD’ler) kümenizden kaldıracaktır.

Eğer Helm ile kurduysanız:

helm uninstall linkerd-viz -n linkerd
    helm uninstall linkerd2 -n linkerd
    kubectl delete namespace linkerd

Kaldırma işlemi tamamlandıktan sonra, kubectl get all -n linkerd gibi komutlarla Linkerd ile ilgili herhangi bir kaynağın kalıp kalmadığını kontrol edebilirsiniz.

Linkerd ile En İyi Uygulamalar

Linkerd’den en iyi şekilde yararlanmak ve sağlıklı bir Service Mesh ortamı sürdürmek için bazı en iyi uygulamaları takip etmek önemlidir:

* Tüm Servisleri Enjekte Edin: Mümkünse, tüm mikroservislerinizi Linkerd’e enjekte edin. Bu, kümenizdeki tüm servisler arası iletişimin mTLS ile güvenli olmasını, gözlemlenebilir olmasını ve trafik yönetimi politikalarına tabi olmasını sağlar. Yalnızca belirli servisleri enjekte etmek, ağ içinde “kör noktalar” yaratabilir.
* ServiceProfile Kullanın: ServiceProfile Custom Resource’ları, Linkerd’e servisleriniz hakkında ek bilgiler sağlamak için kullanılır (örneğin, HTTP yolları, yeniden deneme ve zaman aşımı politikaları). Bu, Linkerd’in daha akıllı trafik yönetimi yapmasına ve daha zengin metrikler sağlamasına olanak tanır. Her kritik servisiniz için bir ServiceProfile tanımlamanız önerilir.
* Güvenlik Politikalarını Uygulayın: Server ve ServerAuthorization gibi Linkerd politikalarını kullanarak servisler arası iletişimi sıkı bir şekilde kontrol edin. Hangi servislerin kiminle konuşabileceğini açıkça tanımlayarak “en az ayrıcalık” (least privilege) ilkesini uygulayın ve güvenlik duruşunuzu güçlendirin.
* Gözlemlenebilirlik Araçlarını Aktif Kullanın: Linkerd Dashboard, linkerd stat ve linkerd tap gibi araçları düzenli olarak kullanarak uygulamalarınızın sağlığını, performansını ve trafik akışını izleyin. Anormallikleri erken tespit etmek ve sorunları hızlıca gidermek için bu verileri kullanın. Prometheus ve Grafana entegrasyonundan faydalanın.
* Kaynak Limitleri Belirleyin: Linkerd proxy’leri hafif olsa da, her pod’a ek bir konteyner olarak eklenirler. Bu proxy’ler için uygun CPU ve bellek kaynak limitleri belirlemek, kümenizin istikrarını ve performansını korumak için önemlidir. Linkerd dokümantasyonunda önerilen başlangıç değerlerini kullanın ve uygulamanızın ihtiyaçlarına göre ayarlayın.
* Otomatik Enjeksiyonu Tercih Edin: Yeni uygulamalarınızı Linkerd’e dahil ederken manuel enjeksiyon yerine namespace bazında otomatik enjeksiyonu kullanın. Bu, operasyonel yükü azaltır ve tüm yeni servislerin Linkerd’in faydalarından otomatik olarak yararlanmasını sağlar.
* Güncel Kalın: Linkerd’in yeni sürümlerini takip edin ve düzenli olarak güncelleyin. Bu, güvenlik yamalarından ve performans iyileştirmelerinden faydalanmanızı sağlar.

Sonuç

Linkerd, Kubernetes üzerinde çalışan mikroservis tabanlı uygulamalar için vazgeçilmez bir Service Mesh çözümüdür. Bu makale boyunca, Linkerd’in ne olduğu, neden tercih edilmesi gerektiği ve Kubernetes kümenize nasıl kurulacağı konularına derinlemesine değindik. Ayrıca, Linkerd’in sunduğu gözlemlenebilirlik, güvenlik ve trafik yönetimi gibi temel özelliklerini örneklerle inceledik ve uygulamanızı Linkerd’e nasıl entegre edeceğinizi gösterdik. Son olarak, Linkerd’i yönetme, sorun giderme ve en iyi uygulamalar hakkında bilgi verdik.

Linkerd’in hafif yapısı, yüksek performansı ve kullanım kolaylığı, onu hem geliştirme hem de üretim ortamları için cazip bir seçenek haline getirmektedir. Otomatik mTLS ile servisler arası güvenliği sağlaması, zengin metriklerle derinlemesine gözlemlenebilirlik sunması ve esnek trafik yönetimi yetenekleri, modern dağıtık sistemlerin karmaşıklığını önemli ölçüde azaltır. Uygulama kodunuzu değiştirmeden bu operasyonel faydaları elde etmek, geliştiricilerin iş mantığına odaklanmasına olanak tanırken, operasyon ekiplerinin de uygulamaların sağlığını ve performansını daha etkin bir şekilde yönetmesini sağlar.

Kubernetes ekosisteminde Service Mesh çözümleri arasında Linkerd, özellikle basitliği ve performansı ön planda tutan ekipler için güçlü bir alternatiftir. Gelecekte, Linkerd’in Kubernetes Gateway API ile entegrasyonu ve daha gelişmiş trafik yönetimi senaryoları için sağladığı yetenekler, bulut yerel uygulamaların yönetimini daha da kolaylaştıracaktır. Linkerd’i benimseyerek, Kubernetes kümenizdeki mikroservislerinizin daha güvenli, daha dayanıklı ve daha gözlemlenebilir olmasını sağlayabilirsiniz.

Yorumlar
İçeriği beğendiniz mi? Bir tartışma başlatın veya görüşlerinizi paylaşın.
Yorum Yaz

Bir yanıt yazın

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir

E-posta Bülteni
Yazılım Topluluğuna Katılın
En son güncellemeleri, yaratıcı ipuçlarını ve özel kaynakları doğrudan e-posta kutunuza alın. Tasarım ve inovasyonun geleceğini birlikte keşfedelim.