Home TürkçeKubernetes Kubernetes Üzerinde Docker Registry Kurulumu

Kubernetes Üzerinde Docker Registry Kurulumu

by Fatih Boy
1 comment

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

Şu Yazıları da Sevebilirsiniz

1 comment

Kubernetes Eğitimi: Docker Registry Kurulumu - Fatih'in Notları 3 Ekim 2019 - 10:15

[…] önceki makalemde sizlere bir Kubernetes Cluster’ı üzerinde nasıl Docker Registry kuracağınızı […]

Reply

Leave a Comment

* Bu formu kullanarak, verilerinizin bu web sitesi tarafından saklanması ve kullanılmasını kabul ediyorsunuz.

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

Bu web sitesi deneyiminizi geliştirmek için çerezleri kullanır. Bunu kabul ettiğinizi varsayacağız, ancak isterseniz vazgeçebilirsiniz. Kabul Et Daha Fazla Bilgi