Kubernetes Üzerinde Docker Registry Kurulumu

Docker Registery, Docker imaj’larınızı toplu olarak tutabileceğiniz bir saklama alanı, depo gibi hizmet vermek için kullanabileceğiniz bir uygulamadır. Özel bir Docker Registery ise imajlarınızı güvenli olarak saklama imkanı bulabileceğiniz bir depo olacaktır.

Kubernetes makalalerimizde şimdiye kadar sizlerle paylaştığım bölümlerde üretim ortamında olmazsa olmaz pek çok bileşeni adım adım kurduk. Üretim ortamının güvenliğini sağlamanın yollarından biriside kullanılan Docker imajlarının kontrollü olarak kullanımıdır. Buna bir de kurum için kullandığımız imajları Docker Hub’a koymayı istemeyeceğinizi de katacak olursanız, kaçınılmaz olarak bir yerelde kurulu bir Docker Registery ihtiyacı ortaya çıkmakta. Bu makalemde adım adım Kubernetes Cluster’ı üzerine nasıl Docker Registery kurabileceğinizi sizlerle paylaşacağım.

Takip edeceğimiz kurulum adımları Helm kullanımı gerektirdiği için Helm’in ne olduğunu bildiğinizi ve sisteminizde kurulu olduğunu varsayıyorum.  Helm’in mimarisi ve ne olduğu hakkında detaylı bilgiye bu makalemde ulaşabilirsiniz. Sisteminize Helm kurmak için ise bu makalemdeki adımları takip edebilirsiniz.

Kurulum

Docker Registery’yi kurarak dışarında erişime NodePort veya Ingress Controller üzerinden erişime açabilirsiniz. Aşağıda her iki yöntem için de takip edeceğiniz adımları bulabilirsiniz.

NodePort Üzerinden Açma

Docker Registery kurulumu en basit haliyle aşağıdaki komut yardımıyla gerçekleştirilebilir;

helm install stable/docker-registry --set service.type=NodePort -n docker-registry --namespace kube-system

Komutun çalıştırılması ardından ayağa kalkan Docker Registery pod’u NodePort olarak dışarı açılacaktır. Aşağıdaki komutları takip ederek Docker Registery’ye ulaşabileceğiniz ip ve port’u öğrenebilirsiniz;

export NODE_PORT=$(kubectl get --namespace kube-system -o jsonpath="{.spec.ports[0].nodePort}" services docker-registry)
export NODE_IP=$(kubectl get nodes --namespace kube-system -o jsonpath="{.items[0].status.addresses[0].address}")
echo http://$NODE_IP:$NODE_PORT

Docker Registery’nin çalışmasını kontrol etmek için aşağıdaki komutla katalog listesi alınabilir;

curl -X GET http://$NODE_IP:$NODE_PORT/v2/_catalog

İlk kurulum ardından çalıştırdığımız bu komut neticesinde yanıt olarak boş katalog listesi gelecektir.

Docker-Registery'nin kurularak NodePort olarak dışarı açılması

Kullanılacak NodePort’u belirtmek isterseniz aşağıdaki şekilde helm release’i oluşturabilirsiniz;

helm install stable/docker-registry --set service.nodePort=30600,service.type=NodePort -n docker-registry --namespace kube-system

Ingress Controller Üzerinden Açma

Bu bölümdeki adımları takip etmek için Kubernetes Cluster’ınızda Ingress Controller kurulu olmalıdır. Ingress Controller kurulum adımları için bu makaleme göz atabilirsiniz. Docker Registery’yi Ingress Controller olarak kurmak için öncelikle aşağıdaki içerikle bir registry-values.yaml dosyası oluşturulur;

ingress:
  enabled: true
  hosts:
  - registry-192-168-200-3.enterprisecoding.io
  tls:
  - secretName: registry-tls

Bu yapılandırmada registry-tls adıyla daha önceden oluşturulmuş bir TLS secret olduğu varsayılmıştır. Docker Registery’ye ulaşmakta kullanılacak Ingress Controller’ın registry-192-168-200-3.enterprisecoding.io adresini karşılaması sağlanmıştır.  Bu DNS kaydı 192.168.200.3 ile Kubernetes Cluster’ımdaki worker node’lardan birisini işaret etmektedir. Siz de benzer bir şekilde enterprisecoding.io alan adı yardımıyla kendi worker node’unuzu işaret edecek bir adres kullanabilirsiniz. Kullanabileceğiniz alternatif Wildcard DNS hizmetleri için bu makaleme göz atabilirsiniz. Üretim ortamı yapılandırmalarında ise bir worker node’u işaret etmek yerine tüm Ingress Controller’larınızın önüne konumlandırılmış bir Load Balancer’ı işaret eden DNS kaydı kullanılması daha doğru olacaktır.

Aşağıdaki komut yardımıyla Docker Registry kurularak Ingress Controller üzerinden dışarı açılması için gerekli yapılandırma yapılır;

helm install stable/docker-registry -f registry-values.yaml -n docker-registry --namespace kube-system

Docker-Registery'nin kurularak Ingress Controller üzerinden dışarı açılması

Docker Registery’nin çalışmasını kontrol etmek için aşağıdaki komutla katalog listesi alınabilir;

curl -X GET http://registry-192-168-200-3.enterprisecoding.io/v2/_catalog

ya da

curl –X –k GET https://registry-192-168-200-3.enterprisecoding.io/v2/_catalog

Docker Yapılandırması

Kurulumunu yaptığımız Docker Registry’nin Docker tarafından imaj işlemlerinde kullanılabilmesi için öncelikle insecure-registries içerisine Docker Registry adresini eklemeliyiz. Bu amaçla /etc/docker/daemon.json dosyasına aşağıdaki girdi eklenmelidir;

"insecure-registries" : ["registry-192-168-200-3.enterprisecoding.io"]

insecure-registries

Kendi kurulumunuz doğrultusunda buradaki Docker Registry adresini güncellemelisiniz.

Docker’ın Ingress Controller’da kullandığımız sertifikaya güvenmesi için ingress adresi kullanılarak /etc/docker/certs.d altında klasör oluşturulur;

mkdir -p /etc/docker/certs.d/registry-192-168-200-3.enterprisecoding.io

Public sertifika bu klasör altına kopyalanır;

cp registry-192-168-200-3.enterprisecoding.io.crt /etc/docker/certs.d/registry-192-168-200-3.enterprisecoding.io

Docker servisi yeniden başlatılır;

service docker restart

Kurulum Testi

Sırada kurulumumuzu test etmekte var. Bunun için öncelikle örnek bir imaj’ı Docker Hub’tan yerele indiririz;

docker pull hello-world

Ardından imajı yeni registry için tagleriz;

docker tag hello-world registry-192-168-200-3.enterprisecoding.io/hello-world

Son olarak taglediğimiz imaj’ı yeni registry’ye göndeririz;

docker push registry-192-168-200-3.enterprisecoding.io/hello-world

Kullanıcı Yetkilendirmesi

Yukarıdaki adımlar takip edilerek kurulan Docker Registry anonim olarak kullanılabilir olacaktır. Herhangi bir kullanıcı yetkiye tabi olmaksızın image ekleme/silme/çekme işlemlerini gerçekleştirebilecektir. Üretim ortamlarında erişimin kontrollü olması isteneceği için aşağıdaki adımlar takip edilerek yetkilendirme eklenmelidir.

Yetkilendirme için gerekli olan httpd-tools paketi aşağıdaki şekilde kurulmalıdır;

yum install httpd-tools -y

Not: Centos 7 üzerinden yapılan bu kurulum kullandığınız işletim sistemine göre farklılık gösterecektir.

Aşağıdaki komut yardımıyla repouser adıyla yeni bir kullanıcı bilgisi ile htpasswd_dosyasi oluşturulur;

htpasswd -B -c htpasswd_dosyasi repouser

Şifre girilmesi ardından oluşan dosya görüntülenir;

cat htpasswd_dosyasi

htpasswd ile şifre oluşturulması

Çıktıda yer alan bilgiler kurulum sırasında değerleri verdiğimiz yaml dosyasına eklenir. Örneğin;

htpasswd: |-
       repouser:$2y$05$Td1IPxdTp15FVaHo37pfIezX7RnRcAkUGGKAJnnUSPRceoJHiyFse

Ingress kurulumu üzeriden devam edilecek olursa örnek values dosyası şu şekilde olacaktır;

ingress:
  enabled: true
  hosts:
  - registry-192-168-200-3.enterprisecoding.io
  tls:
  - secretName: registry-tls
secrets:
  htpasswd: |-
       repouser:$2y$05$Td1IPxdTp15FVaHo37pfIezX7RnRcAkUGGKAJnnUSPRceoJHiyFse

Oluşturulan şifre Values.yaml dosyasına eklenir

Helm release güncellemesi ardından artık Docker registry’si kullanıcı bilgileri isteyecektir. Giriş için aşağıdaki komut kullanılabilir;

docker login registry-192-168-200-3.enterprisecoding.io

Docker login ile Docker Regitry'ye giriş yapılır

Kubernetes Entegrasyonu

Docker Regitry kurulum ve yapılandırması ardından testlerde de başarılı şekilde işlem yapabildikten sonra sıra geldi Kubernetes Cluster’ı ile entegrasyona.

Docker login işlemi yapıldığında kullanıcı bilgileri home klasörü altındaki .docker/config.json dosyasına yazılmaktadır. Aşağıdaki komut ~/.docker/config.json dosyasını kullanarak Kubernetes için gerekli secret tanımını oluşturmanızı sağlayacaktır;

kubectl create secret generic registry-cred --from-file=.dockerconfigjson=/root/.docker/config.json --type=kubernetes.io/dockerconfigjson

Tüm Kubernetes Node’ları için yukarıda tariflenen docker yapılandırmalarının gerçekleştirilmesi ardından aşağıdakine benzer imagePullSecrets bölümünün bulunduğu yaml’lar ile docker imaj’ları çekilebilir;

apiVersion: apps/v1
kind: Deployment
metadata:
  name: hello-registry
spec:
  replicas: 3
  selector:
    matchLabels:
      app: hello-registry
  template:
    metadata:
      labels:
        app: hello-registry
    spec:
      containers:
      - name: hello-registry
        image: registry-192-168-200-3.enterprisecoding.io/hello-world:latest
        ports:
        - containerPort: 8080
      imagePullSecrets:
      - name: registry-cred

Fatih Boy

Ankara'da yaşayan Fatih, kendi şirketinde özellikle bankacılık, sigortacılık ve otomotiv sektörlerinde IT danışmanlıkları vermektedir. Devops, ALM süreçleri, kurumsal veri yolu sistemleri, kurumsal altyapı ve yazılım geliştirme konularında destek vermektedir. Boş zamanlarında açık kaynak kodlu projeler geliştirmeyi ve bilgisini yazdığı makalelerle paylaşmayı seven Fatih, aynı zamanda Visual C# ve Visual Studio teknolojileri konusundan Microsoft tarafından altı yıl üst üste MVP (En Değerli Profesyonel) ödülüne layık görülmüştür. İş hayatı boyunca masaüstü uygulamaları, web teknolojileri, akıllı istemciler gibi konularda Asp.Net, Php, C#, Java programlama dilleri ve MySql, MsSql ve Oracle gibi veritabanı yönetim yazılımları ile çalışmıştır. İngilizce ve Türkçe olarak yayınlanan makalelerini gerek İngilizce bloğunda, gerekse de Türkçe bloğunda bulabileceğiniz gibi web sitesinden de açık kaynak kodlu geliştirdiği yazılımlarına ulaşabilirsiniz. vCard - Twitter - Facebook

1 Yorum

  1. Pingback: Kubernetes Eğitimi: Docker Registry Kurulumu - Fatih'in Notları

Bir cevap yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir

This site uses Akismet to reduce spam. Learn how your comment data is processed.