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ış:
-
order-servicebaşlar, Consul'dan genel konfigürasyonu alır. -
Vault'tan dinamik veritabanı kimlik bilgisi ister (TTL: 1 saat).
-
Uygulama çalışırken, Vault Agent sidecar'ı kimlik bilgilerini periyodik olarak yeniler.
-
Consul'daki
feature/new-checkoutflag'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.