Kubernetes Docker Registry
Docker Hub Private Repository Image Çekme
Merhabalar,
Bu yazımda Docker Hub’daki private repository image kubernetese çekmeyi inceliycez. ilk olarak docker hub ta login olmanız ve repository alanında image olması gerekir.
Not: Ben bu örneği kendi single clusterımda uyguluyorum siz isterseniz minikube ile yapabilirsiniz. Minikube kurmak için diğer minikube kurulum yazımı okuyabilirsiz.
Single Clusterı’m aşağıdaki resimde görüldüğü gibidir.
Yukarıda görüldüğü gibi k8ssecretli repository’sundeki image kubernetes ile çekip deploy etmeyi öğrenecez. ilk olarak podumuza bakalım.
Pod yaml yukarıda görüldüğü gibidir. Şimdide deploy edelim bakalım ne olacak?
kubectl apply -f yaml_dosyasının_ismi
Deploy ettiğimizde ilk olarak image bulamadığı için ImagePullBackOff düştü.
Image çekemediği için ErrImagePull hatası aldık.
Şimdide describe ile neden hata aldığımıza bakalım.
kubectl describe pods pod_name
Görüldüğü gibi aldığımız hata login olmadığınız için image çekme işlemini yapamadığını söylüyor.
Çözüm için yapacağımız image olduğu repository kubernetes secret objesi ile tanıtıp image çekmesini sağlıycaz.
Not: Secret ile kubernetes ssl,username,password vb. gibi gizli gösterilmesini istemediğimiz key-value secret objesi ile saklarız.
Kubernetes secret objesi yaratmak için,kubectl create secret type secret_name ve saklamak istediğimiz key-value eşlenikleri yazarız.
Daha öncesinde ‘kubectl get secret’ komutu ile localimizdeki secretleri bir listeleyelim.
Not: Burada private registry image çekerken çekceğmiz image hangi namespace’de ise oluşturacağımız secret’te aynı namespace olmak zorundadır. Ek olarak secret tipleride vardır, burada private registry’den image çekeceğimiz için secret tipimiz docker registry olacaktır.
Şimdide secret komutumuz yazalım.
kubectl create secret docker-registry "secret_ismi" --docker-server="registry_url" --docker-username="kullanıcı_adı" --docker-password="şifre"
Buradaki komutla biraz açıklamak gerekirse;
- create secret den sonra secret tipini belirtiyoruz. Bir çok secret type vardır. Siz hangi tip secret oluşturcaksanız onun tipini yazmalısınız. Biz örneğimizde docker registry’inden image çekmek istediğimiz için tipi ‘docker registry’ tipini kullanıyoruz.
- docker-server = ismini yazıyoruz. Burada docker-server url almak için cat ~/.docker/config.json dosyasındaki https ile başlayan url’dir.
- Sonrasında docker registry çekeceğiniz image username, password ve email girerek secreti tanınlamış oluyoruz.
Şimdide oluşturduğumuz secret bakalım.
Secretimizde oluştuğuna göre şimdide yaml bu secreti kullanarak çekme işlemini yapalım. Bunun yaml dosyama eklemeler yapalım.
Eklediğimiz satırları biraz açıklayalım. İlk olarak ‘imagePullPolicy:always’ ekledik. imagePullPolicy 3 farklı tipi vardır.
- Always: Yazarsak her seferinde repository gidip image çekecektir. Eğer image ‘latest’ tagli ise defaultta zaten Always dir.
- IfNotPresent: Yazarsak ilk olarak localimizde image var mı ona bakacak varsa burdan oluşturur yoksa repositoryden image çeker.
- Never: Yazarsak sadece localde var ise image çalıştırır yoksa repository çekme işlemi yapmadığı için hata alırız(ErrImagePull)
ImagePullSecrets:-name :dockerhubsecret
Yukarda oluşturduğumuz secretin ismini yazıyoruz. Şimdi yaml deploy edelim. kubectl apply -f yaml_ismi
Görüldüğü gibi image private repository alanımızdan çekildi ve podumuz ayağa kaldırmaya başladı. Şimdide port-forward ile uygulamıza bakalım. Bunun için yazacağımız komut,
kubectl port-forward obje_adi ports
Sonrada localhost:5000 gittiğimizde
Image başarılı bir şekilde çekilmiş ve çalışıyordur.
Not: Bilmeniz gereken tek ve önemli olan nokta oluşturduğunuz secret ile oluşturcağınız obje (pod,deployment,statefulset vb ) aynı namespace olmalıdır. Farklı namespacelerde olursa çalışmaz !!!!
Bu yazımızın da sonuna gelmiş bulunmaktayız. Araştırmalarım ve sektörde karşılaştığım senaryolar üzerine yazılarımı yazmaya devam edeceğim. Umarım faydalı bir yazı olmuştur. Yazımı okuduğunuz için teşekkürler. Diğer yazımda kubernetes RBAC ve Service Account konusu inceliycez.