Mikroservis Mimarisi & Konfigürasyon Yönetimi 4 dk okuma 2 okunma

Microservices'te Configuration Management: Consul, Vault

Mikroservislerde konfigürasyon yönetimi, dağıtık sistemlerin en kritik operasyonel zorluklarından biridir. Bu yazıda, HashiCorp Consul ve Vault'un birlikte kullanımı ele alınır: Consul servis keşfi ve genel konfigürasyon dağıtımı için, Vault ise gizli bilgi yönetimi ve dinamik kimlik bilgisi üretimi için kullanılır. İkisinin .NET ekosistemindeki entegrasyonu, en iyi pratikler ve gerçek dünya senaryoları incelenir.

Microservices'te Configuration Management: Consul, Vault

Microservices'te Configuration Management: Consul, Vault

Mikroservis mimarisinde, onlarca hatta yüzlerce servisin konfigürasyonunu merkezi olarak yönetmek, dağıtık sistemlerin en zorlu operasyonel problemlerinden biridir. Geleneksel yaklaşımdaki appsettings.json dosyaları, container ortamlarında yaşamaz; environment variable'lar ise ölçeklendikçe yönetilemez hale gelir . İşte bu noktada HashiCorp Consul ve Vault, birbirini tamamlayan iki güçlü araç olarak devreye girer.


1. Neden Merkezi Konfigürasyon Yönetimi?

Konfigürasyonu dışsallaştırmanın (externalized configuration) temel faydaları:

  • Immutable Artifact (Değişmez Yapı): Aynı build artifact'i (Docker image) farklı ortamlarda (dev, staging, prod) değiştirilmeden çalıştırılabilir .

  • Dinamik Değişiklik (Hot Reload): Servisi yeniden başlatmadan konfigürasyon değiştirilebilir (feature flag, rate limit) .

  • Merkezi Denetim (Audit Trail): Kim, ne zaman, hangi değeri değiştirdi? Tüm değişiklikler kaydedilir .

  • Güvenlik: Gizli bilgiler (şifre, API key) kod tabanından ve container image'ından çıkarılır .


2. Consul ve Vault: Görev Ayrımı

Bu iki araç, farklı ihtiyaçlar için tasarlanmıştır ve birlikte kullanıldığında sinerji yaratır .

Özellik Consul Vault
Birincil Amaç Servis Keşfi (Service Discovery) Gizli Bilgi Yönetimi (Secret Management)
Konfigürasyon KV Store (anahtar-değer) Şifreli KV Store (KV v2)
Gizli Bilgi Uygun değil (şifrelenmemiş) Dinamik Secrets, şifreleme, TTL
Veritabanı Kimlik Bilgisi Statik, manuel Dinamik, otomatik rotasyon
Sağlık Kontrolü Var -
ACL Var Var (daha detaylı)

Altın Kural: Consul'a hassas olmayan konfigürasyon (feature flag, servis adresi, timeout değeri); Vault'a hassas bilgiler (şifre, API key, sertifika) yazılır .


3. Consul: Servis Keşfi ve Konfigürasyon

Consul, iki temel yetenek sunar: Servis Keşfi ve Dağıtık KV Store.

A. Consul KV Store ile Konfigürasyon

Consul'un KV store'u, küçük konfigürasyon objeleri, feature flag'ler ve referans verileri için idealdir .

KV Yapısı:

text

app/my-service/config/db-host → "postgres.prod.example.com"
app/my-service/config/db-port → "5432"
app/my-service/flags/new-checkout → "true"

.NET'te Consul Konfigürasyon Sağlayıcısı:

csharp

// Program.cs
builder.Configuration.AddConsul(
    options =>
    {
        options.Address = new Uri("http://consul:8500");
        options.Datacenter = "dc1";
        options.Token = "your-acl-token";
    },
    "app/my-service/config"
);

B. Consul Template ile Dinamik Konfigürasyon

Consul Template, KV store'daki değişiklikleri izleyerek konfigürasyon dosyalarını otomatik olarak yeniden oluşturur .

hcl

# appsettings.ctmpl
{
  "ConnectionStrings": {
    "Default": "Server={{ key "app/my-service/config/db-host" }};Database=MyDb;"
  }
}

4. Vault: Gizli Bilgi Yönetimi ve Dinamik Secrets

Vault'un en güçlü özelliği, dinamik secrets (dynamic secrets) üretmesidir: Kimlik bilgileri talep edildiğinde anında oluşturulur ve belirli bir TTL sonrasında otomatik olarak iptal edilir .

A. Dinamik Veritabanı Kimlik Bilgisi

Vault, veritabanına bağlanır, geçici bir kullanıcı oluşturur ve kimlik bilgilerini uygulamaya verir. TTL dolduğunda kullanıcı otomatik silinir .

bash

# Vault'tan geçici veritabanı kimlik bilgisi alma
vault read database/creds/my-role

# Çıktı:
# username: v-token-my-role-abc123
# password: A1a-randompassword
# lease_duration: 1h

.NET'te Vault Entegrasyonu (VaultSharp):

csharp

var vaultClient = new VaultClient(new VaultClientSettings(
    "http://vault:8200",
    new AppRoleAuthMethodInfo("role-id", "secret-id")
));

// Dinamik veritabanı kimlik bilgisi al
var secret = await vaultClient.V1.Secrets.Database.GetCredentialsAsync("my-role");
var connectionString = $"Server=...;User Id={secret.Data.Username};Password={secret.Data.Password};";

B. Vault Agent ile Şablon Tabanlı Enjeksiyon

Vault Agent, bir sidecar olarak çalışır ve Vault'tan aldığı gizli bilgileri appsettings.json dosyasına yazar. Dosya değiştiğinde, .NET uygulaması reloadOnChange: true ile konfigürasyonu otomatik yeniler .


5. .NET Ekosisteminde Entegrasyon

A. NuGet Paketleri

  • Consul: Consul (resmi .NET client)

  • Vault: VaultSharp (en aktif geliştirilen)

  • Birleşik Sağlayıcı: Meyer.Common.Extensions.Configuration.ConsulVault (.NET 6-9 uyumlu)

B. Configuration Builder Entegrasyonu

csharp

// Program.cs
builder.Configuration
    .AddConsul("app/my-service/config")  // Genel konfigürasyon
    .AddVault(options =>                  // Gizli bilgiler
    {
        options.Address = "http://vault:8200";
        options.AuthMethod = new AppRoleAuthMethodInfo("role-id", "secret-id");
        options.SecretsPath = "secret/data/my-service";
    });

6. En İyi Pratikler

Pratik Açıklama
Görev Ayrımı Yapın Consul: hassas olmayan konfigürasyon. Vault: şifre, API key, sertifika .
Dinamik Secrets Kullanın Statik şifreler yerine Vault'un dinamik veritabanı kimlik bilgilerini tercih edin .
Schema Doğrulaması Yapın Konfigürasyon değerlerini uygulamaya almadan önce doğrulayın (OpenAPI Schema) .
Hot Reload Sağlayın reloadOnChange: true ile konfigürasyon değişikliklerini anında uygulayın .
ACL Token Yönetimi Consul ve Vault ACL token'larını Vault'un Consul secrets engine'i ile otomatik yönetin .
Yüksek Erişilebilirlik Consul ve Vault cluster'larını HA modda çalıştırın; tek nokta arızasından kaçının .

7. Gerçek Dünya Senaryosu

Senaryo: Bir e-ticaret uygulamasında, order-service ve payment-service çalışıyor.

Consul'da tutulanlar:

  • order-service/config/db-host → "postgres.prod"

  • order-service/config/feature/new-checkout → "true"

  • payment-service/config/gateway-url → "https://payments.example.com"

Vault'ta tutulanlar:

  • Veritabanı dinamik kimlik bilgileri (database/creds/order-service)

  • Ödeme sağlayıcısı API key'i (secret/data/payment-service/stripe-key)

Akış:

  1. order-service başlar, Consul'dan genel konfigürasyonu alır.

  2. Vault'tan dinamik veritabanı kimlik bilgisi ister (TTL: 1 saat).

  3. Uygulama çalışırken, Vault Agent sidecar'ı kimlik bilgilerini periyodik olarak yeniler.

  4. Consul'daki feature/new-checkout flag'i değiştirilirse, uygulama hot reload ile yeni değeri alır.


Sonuç

Mikroservis mimarisinde konfigürasyon yönetimi, sadece bir "dosya okuma" işi değil; güvenlik, ölçeklenebilirlik ve operasyonel mükemmellik gerektiren bir disiplindir. Consul, servis keşfi ve genel konfigürasyon dağıtımı için; Vault, gizli bilgi yönetimi ve dinamik kimlik bilgisi üretimi için idealdir. İkisi birlikte kullanıldığında, HashiCorp stack'inin sunduğu güçlü sinerji ortaya çıkar . .NET ekosisteminde, Consul ve VaultSharp kütüphaneleri ile bu entegrasyonu kolayca gerçekleştirebilirsiniz. Unutmayın: Konfigürasyonunuzu merkezileştirmek, sadece bir kolaylık değil; güvenli, denetlenebilir ve ölçeklenebilir bir sistemin temelidir.

Tüm yazılar Soru ya da yorumun mu var? Yaz