Ana içeriğe geç

Tüm Diller / HTTP API

Consul, KV deposunu basit bir HTTP API üzerinden sunar. HTTP isteği yapabilen herhangi bir dil, konfigürasyonu okuyabilir ve yazabilir. Guardian aynı anahtarları bağımsız olarak izler -- uygulamanızın hangi dilde yazıldığı önemli değildir.

Consul KV HTTP API

Bir anahtar okuma

GET /v1/kv/:key
curl http://consul:8500/v1/kv/config/myapp/db_host?raw
# Dönen değer: db.prod.internal

?raw parametresi olmadan, yanıt Base64 kodlanmış değer içeren JSON formatındadır:

curl -s http://consul:8500/v1/kv/config/myapp/db_host | jq .
[
{
"LockIndex": 0,
"Key": "config/myapp/db_host",
"Flags": 0,
"Value": "ZGIucHJvZC5pbnRlcm5hbA==",
"CreateIndex": 42,
"ModifyIndex": 87
}
]

Bir anahtar yazma

curl -X PUT -d "db.prod.internal" http://consul:8500/v1/kv/config/myapp/db_host

Bir prefix altındaki anahtarları listeleme

curl http://consul:8500/v1/kv/config/myapp/?keys
# ["config/myapp/db_host", "config/myapp/db_port", "config/myapp/cache_ttl"]

Bir prefix altındaki tüm anahtarları okuma

curl -s http://consul:8500/v1/kv/config/myapp/?recurse | jq .

Dil örnekleri

Ruby

require "net/http"
require "json"

def consul_get(key)
uri = URI("http://consul:8500/v1/kv/#{key}?raw")
Net::HTTP.get(uri)
end

db_host = consul_get("config/myapp/db_host")
db_port = consul_get("config/myapp/db_port").to_i

PHP

<?php
function consul_get(string $key): string {
$url = "http://consul:8500/v1/kv/{$key}?raw";
return file_get_contents($url);
}

$dbHost = consul_get("config/myapp/db_host");
$dbPort = (int) consul_get("config/myapp/db_port");

Rust

use reqwest;

async fn consul_get(key: &str) -> Result<String, reqwest::Error> {
let url = format!("http://consul:8500/v1/kv/{}?raw", key);
reqwest::get(&url).await?.text().await
}

Shell script

#!/bin/bash
DB_HOST=$(curl -s http://consul:8500/v1/kv/config/myapp/db_host?raw)
DB_PORT=$(curl -s http://consul:8500/v1/kv/config/myapp/db_port?raw)

echo "${DB_HOST}:${DB_PORT} adresine baglaniliyor"

Guardian ekleme

Docker Compose sablonu

Bu sablon herhangi bir dil ile calışır. myapp kısmını kendi servisinizle değiştirin:

version: "3.8"

services:
consul:
image: hashicorp/consul:1.17
ports:
- "8500:8500"
command: agent -dev -client=0.0.0.0

myapp:
build: .
ports:
- "8080:8080"
environment:
- CONSUL_ADDR=http://consul:8500
depends_on:
- consul

guardian:
image: ghcr.io/consul-guardian/consul-guardian:latest
environment:
- CONSUL_GUARDIAN_CONSUL_ADDRESS=http://consul:8500
- CONSUL_GUARDIAN_WATCH_PREFIXES=config/
- CONSUL_GUARDIAN_GIT_REPO_PATH=/data/repo
volumes:
- guardian-data:/data
depends_on:
- consul

volumes:
guardian-data:

Kubernetes sablonu

apiVersion: apps/v1
kind: Deployment
metadata:
name: consul-guardian
spec:
replicas: 1
selector:
matchLabels:
app: consul-guardian
template:
metadata:
labels:
app: consul-guardian
spec:
containers:
- name: guardian
image: ghcr.io/consul-guardian/consul-guardian:latest
env:
- name: CONSUL_GUARDIAN_CONSUL_ADDRESS
value: "http://consul.consul.svc.cluster.local:8500"
- name: CONSUL_GUARDIAN_WATCH_PREFIXES
value: "config/"
- name: CONSUL_GUARDIAN_GIT_REPO_PATH
value: "/data/repo"
volumeMounts:
- name: guardian-data
mountPath: /data
volumes:
- name: guardian-data
persistentVolumeClaim:
claimName: guardian-pvc

Bunu mevcut uygulamanızın yanına deploy edin. Uygulamanızın Deployment'ında herhangi bir değişiklik gerekmez.

consul-template ile ortam değişkeni yaklaşımı

Uygulamanız Consul'dan doğrudan değil, ortam değişkenlerinden konfigürasyon okuyorsa, consul-template kullanarak Consul KV'den bir .env dosyası oluşturabilirsiniz. Guardian yine Consul'daki kaynak verileri korur:

# consul-template.hcl
template {
contents = <<EOF
DB_HOST={{ key "config/myapp/db_host" }}
DB_PORT={{ key "config/myapp/db_port" }}
CACHE_TTL={{ key "config/myapp/cache_ttl" }}
EOF
destination = "/app/.env"
command = "kill -HUP $(cat /app/app.pid)"
}
version: "3.8"

services:
consul:
image: hashicorp/consul:1.17
command: agent -dev -client=0.0.0.0

myapp:
build: .
volumes:
- app-env:/app

consul-template:
image: hashicorp/consul-template:latest
command: -config=/etc/consul-template.hcl
volumes:
- ./consul-template.hcl:/etc/consul-template.hcl
- app-env:/app
depends_on:
- consul

guardian:
image: ghcr.io/consul-guardian/consul-guardian:latest
environment:
- CONSUL_GUARDIAN_CONSUL_ADDRESS=http://consul:8500
- CONSUL_GUARDIAN_WATCH_PREFIXES=config/
- CONSUL_GUARDIAN_GIT_REPO_PATH=/data/repo
volumes:
- guardian-data:/data
depends_on:
- consul

volumes:
guardian-data:
app-env:

Bu kurulumda:

  • consul-template Consul'dan okur ve uygulamanız için ortam değişken dosyaları yazar
  • Guardian aynı Consul anahtarlarını izler ve Git geçmişini tutar
  • Uygulamanız .env dosyalarını okur ve Consul'dan habersizdir

Geri yükleme senaryosu

Dil fark etmeksizin, geri yükleme akışı aynıdır:

# Değişiklik geçmişini görün
consul-guardian log --prefix config/myapp/

# Tek bir anahtarı geri yükleyin
consul-guardian restore --key config/myapp/db_host --commit abc1234

# Tüm prefix'i geri yükleyin
consul-guardian restore --prefix config/myapp/ --commit abc1234

Guardian, CAS kullanarak değerleri Consul'a geri yazar. Uygulamanız, halihazırda kullandığı mekanizma aracılığıyla (polling, watch, consul-template, yeniden başlatma) değişiklikleri alır.

Kod değişikliği gerekmez

Guardian herhangi bir dille çalışır çünkü uygulamanıza hiç dokunmaz. Consul'un KV deposunu HTTP üzerinden izleyen ve değişiklikleri Git'e commit eden bağımsız bir süreçtir. Uygulamanız Ruby, PHP, Rust, Elixir veya bash script ile yazılmış olsun -- Guardian aynı şekilde çalışır.