K3s ile Kubernetes Kurulumu: Hafif Konteyner Orkestrasyonu
K3s ile tek node ve çok node Kubernetes cluster kurulumu, kubectl kullanımı, deployment ve service oluşturma, Helm ile uygulama yönetimi. VPS üzerinde Kubernetes rehberi.
Özel Docker Registry kurulumu, TLS ile güvenli registry, kimlik doğrulama, image push/pull işlemleri, Harbor ile kurumsal registry ve CI/CD entegrasyonu.
Docker Hub gibi genel registry'ler pratik olsa da, özel image'larınızı barındırmak için kendi registry'nizi kurmak güvenlik, hız ve maliyet açısından avantajlıdır. Bu rehberde basit Docker Registry'den kurumsal Harbor'a kadar farklı seçenekleri ele alacağız.
| Avantaj | Açıklama |
|---|---|
| Güvenlik | Özel image'lar dışarıya açık değil |
| Hız | Yerel ağda hızlı pull/push |
| Maliyet | Docker Hub rate limit yok |
| Kontrol | Tam image yaşam döngüsü kontrolü |
| Uyumluluk | Veri yerelleştirme gereksinimleri |
# Registry konteynerini başlat
docker run -d \
--name registry \
--restart always \
-p 5000:5000 \
-v registry-data:/var/lib/registry \
registry:2
# Registry'nin çalıştığını doğrula
curl http://localhost:5000/v2/
# Çıktı: {}
# Image'ı tag'le
docker tag myapp:latest localhost:5000/myapp:latest
# Registry'ye push et
docker push localhost:5000/myapp:latest
# Registry'den pull et
docker pull localhost:5000/myapp:latest
# Registry'deki image'ları listele
curl http://localhost:5000/v2/_catalog
# Çıktı: {"repositories":["myapp"]}
# Image tag'lerini listele
curl http://localhost:5000/v2/myapp/tags/list
# Sertifika dizini oluştur
mkdir -p /etc/docker/certs/registry
# Self-signed sertifika oluştur
openssl req -newkey rsa:4096 -nodes -sha256 \
-keyout /etc/docker/certs/registry/domain.key \
-x509 -days 365 \
-out /etc/docker/certs/registry/domain.crt \
-subj "/CN=registry.example.com" \
-addext "subjectAltName=DNS:registry.example.com,IP:192.168.1.100"
# Sertifikayı Docker'ın güvendiği sertifikalara ekle
mkdir -p /etc/docker/certs.d/registry.example.com:5000
cp /etc/docker/certs/registry/domain.crt \
/etc/docker/certs.d/registry.example.com:5000/ca.crt
# Docker'ı yeniden başlat
systemctl restart docker
docker run -d \
--name registry \
--restart always \
-p 5000:5000 \
-v registry-data:/var/lib/registry \
-v /etc/docker/certs/registry:/certs \
-e REGISTRY_HTTP_TLS_CERTIFICATE=/certs/domain.crt \
-e REGISTRY_HTTP_TLS_KEY=/certs/domain.key \
registry:2
# HTTPS ile test et
curl https://registry.example.com:5000/v2/ \
--cacert /etc/docker/certs/registry/domain.crt
# htpasswd dosyası oluştur
mkdir -p /etc/docker/registry/auth
docker run --rm \
--entrypoint htpasswd \
httpd:2 -Bbn admin GucluSifre123! > /etc/docker/registry/auth/htpasswd
# Kullanıcı ekle
docker run --rm \
--entrypoint htpasswd \
httpd:2 -Bbn developer DevSifre456! >> /etc/docker/registry/auth/htpasswd
# Kimlik doğrulama ile registry başlat
docker run -d \
--name registry \
--restart always \
-p 5000:5000 \
-v registry-data:/var/lib/registry \
-v /etc/docker/certs/registry:/certs \
-v /etc/docker/registry/auth:/auth \
-e REGISTRY_HTTP_TLS_CERTIFICATE=/certs/domain.crt \
-e REGISTRY_HTTP_TLS_KEY=/certs/domain.key \
-e REGISTRY_AUTH=htpasswd \
-e REGISTRY_AUTH_HTPASSWD_REALM="Registry Realm" \
-e REGISTRY_AUTH_HTPASSWD_PATH=/auth/htpasswd \
registry:2
# Giriş yap
docker login registry.example.com:5000
# registry-compose.yml
version: '3.8'
services:
registry:
image: registry:2
restart: always
ports:
- "5000:5000"
environment:
REGISTRY_HTTP_TLS_CERTIFICATE: /certs/domain.crt
REGISTRY_HTTP_TLS_KEY: /certs/domain.key
REGISTRY_AUTH: htpasswd
REGISTRY_AUTH_HTPASSWD_REALM: Registry Realm
REGISTRY_AUTH_HTPASSWD_PATH: /auth/htpasswd
REGISTRY_STORAGE_DELETE_ENABLED: "true"
volumes:
- registry-data:/var/lib/registry
- ./certs:/certs:ro
- ./auth:/auth:ro
registry-ui:
image: joxit/docker-registry-ui:latest
restart: always
ports:
- "8080:80"
environment:
- REGISTRY_TITLE=REXE Private Registry
- REGISTRY_URL=https://registry.example.com:5000
- SINGLE_REGISTRY=true
depends_on:
- registry
volumes:
registry-data:
Harbor, CNCF tarafından desteklenen kurumsal düzeyde bir container registry'dir.
# Harbor installer'ı indir
wget https://github.com/goharbor/harbor/releases/download/v2.9.0/harbor-online-installer-v2.9.0.tgz
tar xzf harbor-online-installer-v2.9.0.tgz
cd harbor
# Yapılandırma dosyasını düzenle
cp harbor.yml.tmpl harbor.yml
nano harbor.yml
# harbor.yml (temel ayarlar)
hostname: registry.example.com
https:
port: 443
certificate: /etc/harbor/certs/domain.crt
private_key: /etc/harbor/certs/domain.key
harbor_admin_password: GucluSifre123!
database:
password: DbSifre789!
data_volume: /data/harbor
# Harbor'ı kur
./install.sh
# Harbor'a giriş yap
docker login registry.example.com
# Kullanıcı: admin
# Şifre: GucluSifre123!
# Proje oluştur ve image push et
docker tag myapp:latest registry.example.com/myproject/myapp:latest
docker push registry.example.com/myproject/myapp:latest
# Kullanılmayan katmanları temizle
docker exec registry registry garbage-collect \
/etc/docker/registry/config.yml
# Dry-run (silmeden önce kontrol)
docker exec registry registry garbage-collect \
--dry-run \
/etc/docker/registry/config.yml
# Image sil (API ile)
curl -X DELETE \
https://registry.example.com:5000/v2/myapp/manifests/DIGEST \
--cacert /etc/docker/certs/registry/domain.crt \
-u admin:GucluSifre123!
# .github/workflows/build-push.yml
name: Build and Push
on:
push:
branches: [main]
jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Login to Private Registry
uses: docker/login-action@v3
with:
registry: registry.example.com:5000
username: ${{ secrets.REGISTRY_USER }}
password: ${{ secrets.REGISTRY_PASSWORD }}
- name: Build and Push
uses: docker/build-push-action@v5
with:
context: .
push: true
tags: registry.example.com:5000/myapp:${{ github.sha }}
# Registry kimlik bilgilerini secret olarak ekle
kubectl create secret docker-registry registry-secret \
--docker-server=registry.example.com:5000 \
--docker-username=admin \
--docker-password=GucluSifre123! \
--docker-email=admin@example.com
# deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: myapp
spec:
template:
spec:
imagePullSecrets:
- name: registry-secret
containers:
- name: myapp
image: registry.example.com:5000/myapp:latest
Özel Docker Registry, kurumsal ortamlarda image güvenliği ve yönetimi için vazgeçilmezdir. Basit kullanım için registry:2, kurumsal özellikler (RBAC, güvenlik tarama, replikasyon) için Harbor tercih edin. REXE sunucularında özel registry ile image'larınızı güvenle saklayabilir ve CI/CD pipeline'larınıza entegre edebilirsiniz.
Birkaç önemli neden: 1) Güvenlik — özel image'larınız dışarıya açık olmaz, 2) Hız — yerel ağda pull/push çok daha hızlı, 3) Rate limit yok — Docker Hub ücretsiz hesaplarda saatlik pull limiti var, 4) Veri kontrolü — image'larınız kendi sunucunuzda, 5) Uyumluluk — bazı sektörlerde veri yerelleştirme zorunlu.
HTTP (TLS olmadan) registry kullanıyorsanız Docker'a güvensiz registry olarak tanıtmanız gerekir. /etc/docker/daemon.json dosyasına {"insecure-registries": ["registry.example.com:5000"]} ekleyin ve Docker'ı yeniden başlatın. Production'da TLS kullanmanız şiddetle önerilir.
İki adım: 1) Önce image'ları API ile silin (DELETE /v2/IMAGE/manifests/DIGEST), 2) Ardından garbage collection çalıştırın (docker exec registry registry garbage-collect /etc/docker/registry/config.yml). Garbage collection olmadan sadece manifest silinir, katmanlar disk üzerinde kalır.
registry:2 basit ve hafif bir image deposudur. Harbor ise kurumsal özellikler sunar: RBAC (rol tabanlı erişim kontrolü), güvenlik açığı tarama (Trivy entegrasyonu), image replikasyonu, webhook'lar, audit log ve web arayüzü. Küçük ekipler için registry:2, büyük organizasyonlar için Harbor önerilir.
Kubernetes'in registry kimlik bilgilerine ihtiyacı var. kubectl create secret docker-registry ile kimlik bilgilerini secret olarak oluşturun ve deployment'ınıza imagePullSecrets ekleyin. Alternatif olarak service account'a imagePullSecrets ekleyerek namespace genelinde geçerli kılabilirsiniz.
K3s ile tek node ve çok node Kubernetes cluster kurulumu, kubectl kullanımı, deployment ve service oluşturma, Helm ile uygulama yönetimi. VPS üzerinde Kubernetes rehberi.
Docker volume türleri (named, bind mount, tmpfs), volume yönetimi, Docker network modları (bridge, host, overlay), özel ağ oluşturma ve konteyner iletişimi. Kapsamlı rehber.
Docker log sürücüleri, docker logs komutu, Kubernetes pod logları, merkezi log toplama (Loki, ELK Stack), log rotasyonu ve production ortamında log yönetimi en iyi pratikleri.