Harbor ve Konteyner Dünyası

Fatih KÜÇÜK
KoçSistem
Published in
5 min readJun 5, 2022

Günümüzde cloud-native yaklaşım ile uygulamalar geliştirilmektedir. Geliştirilen bu uygulamalarda temel yaklaşım, container tabanlı olması ve bunun bir imajının olmasıdır. Bu sayede siz uygulamanızı EKS, AKS gibi cloud tarafından yönetilen orkestrasyon platformlarında ya da Openshift gibi on-premise çözümlerde kolaylıkla çalıştırabilirsiniz. Hazırlamış olduğunuz uygulamanızın imajı bir konteynır deposunda barındırılır ve siz istediğiniz platformdan bu imajı çekerek kolaylıkla uygulamanızı ayağa kaldırabilirsiniz.

https://www.jpaul.me/2020/09/harbor-how-to-deploy-a-private-container-registry/

Bu yazı içerisinde sizlere Cloud-Native Computing Foundation tarafından 31 Temmuz 2018 tarihinde mezun olmuş Harbor’dan bahsedeceğim.

Konteyner tabanlı uygulamarınız varsa ve bunları nerede tutacağınıza henüz karar vermediyseniz, Harbor bunun için biçilmiş kaftan sözünü kullanmak sanırım abartılı olmayacaktır.

Neden Harbor sorusuna cevabı gelin birlikte arayalım.

Tek başına konteyner imajlarını tutması sizin için yeterli olacak mı? Aklınızdan bir sürü soru geçtiğinden eminim.

Gelin bu sorulara 2 başlık altında cevap bulalım.

Yönetim

  • Kullanıcı yönetimi bir çok farklı yöntem ile yapılabilmektedir.
    - Harbor içerisinde kullanıcı oluşturabilir ve yönetebilirsiniz. Kullanıcılar database içerisinde tutulur.
    - Harbor’ı harici bir LDAP/Active Directory sunucusu ile entegre edebilirsiz. Kullanıcılar, LDAP/AD sağlayıcınız tarafından oluşturulur ve yönetilir.
    - Harbor’ı harici bir OIDC sağlayıcısı ile entegre edebilirsiniz. Kullanıcı hesapları, OIDC sağlayıcınız tarafından oluşturulur ve yönetilir.
  • Yetkilendirmeler, farklı roller ile yönetilebilmektedir.
https://goharbor.io/docs/2.5.0/administration/managing-users/
  • Projeler içerisinde kota belirleyebilmektesiniz. Bu çok güzel bir özellik çünkü imajlar çoğaldıkça disk sorunu yaşayabilirsiniz.
  • OCI artifact desteği mevcut. OCI artifact ile ilgili daha fazla bilgi için lütfen tıklayın.
{
"schemaVersion": 2,
"config": {
"mediaType": "application/vnd.caicloud.model.config.v1alpha1+json",
"digest": "sha256:be948daf0e22f264ea70b713ea0db35050ae659c185706aa2fad74834455fe8c",
"size": 187,
"annotations": {
"io.goharbor.artifact.v1alpha1.skip-list": "metrics,git"
}
},
"layers": [
{
"mediaType": "image/png",
"digest": "sha256:d923b93eadde0af5c639a972710a4d919066aba5d0dfbf4b9385099f70272da0",
"size": 166015,
"annotations": {
"io.goharbor.artifact.v1alpha1.icon": ""
}
},
{
"mediaType": "application/tar+gzip",
"digest": "sha256:d923b93eadde0af5c639a972710a4d919066aba5d0dfbf4b9385099f70272da0",
"size": 166015
}
]
}
  • Farklı ya da aynı tip konteyner depoları ile replikasyon yapılabilmektedir.
    - AWS Elastic Container Registry, Azure Container Registry, Ali Cloud Container Registry, Google Container Registry, Huawei SWR, Artifact Hub, Gitlab, Quay, Jfrog Artifactory
  • Proxy cache özelliği mevcuttur. İnternete erişimi sınırlı ya da hiç olmayan veya çok fazla bant genişliği kullanmak istemediğiniz durumlar için biçilmiş kaftan.
  • Uygulama içerisinde built-in gelen Webhook özelliği mevcut.
  • Proje için çalışan işlemleri otomatikleştirmek için kullanabileceğiniz Robot hesaplar oluşturabilmektesiniz.
  • Dağıtılmış İzleme özelliği mevcut. Yapmanız gereken tek şey Harbor YML dosyası içerisinde bunu aktif hale getirmek. Jaeger veya Otel

Güvenlik

Uygulamalarınız imajlarını hazırladınız ve bir depoda barındırıyorsunuz. Peki bu imajlar ne kadar güvenli? Bu noktada, Trivy aracılığıyla imajlarınızı güvenlik açıklarının statik analizini sağlar.

  • Güvenlik açığı taraması mevcut.

İmajları imzalama ve imza doğrulama, bir yapının bütünlüğünü doğrulamanıza olanak tanıyan kritik güvenlik yeteneklerinden birisidir.

  • Cosign veya Notary kullanarak imajlarınızı imzalayabilir ve doğrulayabilirsiniz.

Gördüğünüz gibi bir çok önemli özelliği içerisinde barındıran Harbor, boş yere CNCF tarafından mezun edilmemiş :)

Sizler de 3 dakika gibi kısa bir sürede Harbor’ı kuralabilir ve yeteneklerini keşfetme imkanı elde edebilirsiniz.

Kurulum

Sizlerin de deneyebilmesi için çok kompleks bir mimari ile ilerlemek yerine, hepinizin kolaylıkla uygulayabileceği Docker Desktop içerisinde built-in gelen tek sunuculu bir Kubernetes cluster ile ilerleyeceğim.

  • Docker Desktop’ı Windows’a yükleyin. Nasıl yapacağınızı ilgili link üzerinden inceleyebilirsiniz.
  • Kurulum tamamlandıktan sonra Kubernetes kümenizi aktif hale getirmeyi unutmayın :)
  • NGINX Ingress Controller kurulumu yapılmalı ama öncesinde bir dizi kurulumlar gerçekleştireceğiz.
    - Helm kurmak için önce Chocolatey paket yönetiminin kurulması gerekiyor. Aşağıdaki komut satırı kopyalandıktan sonra powershell üzerinde çalıştırılmalıdır.
Set-ExecutionPolicy Bypass -Scope Process -Force; [System.Net.ServicePointManager]::SecurityProtocol = [System.Net.ServicePointManager]::SecurityProtocol -bor 3072; iex ((New-Object System.Net.WebClient).DownloadString('https://community.chocolatey.org/install.ps1'))

- Daha sonra powershell üzerinde “choco install kubernetes-helm” çalıştırılmalı.
- Bunlardan sonra ingress-nginx kurulumunu gerçekleştirebiliriz.

helm upgrade --install ingress-nginx ingress-nginx \   --repo https://kubernetes.github.io/ingress-nginx \   --namespace ingress-nginx --create-namespace

Docker Desktop kuruldu, Tek sunuculu Kubernetes kümesi aktif hale getirildi, Kubernetes içerisinde çalışan bir Nginx Ingress Controller mevcut. Şimdi yapmamız gereken şey Harbor’ın kurulması :)

  • Aşağıdaki komut satırlarını powershell üzerinde çalıştıralım.
helm repo add harbor https://helm.goharbor.io
helm fetch harbor/harbor --untar
  • Daha sonra bu işlemi çalıştırdığımız dizine geçmemiz gerekiyor ve aşağıdaki komut satırlarını çalıştırmalıyız.
cd .\harbor\
helm install my-release .

Kurulumların tamamlanması 5 dakika sürebilir, o yüzden acele etmeyin. Günün sonunda podları kontrol ettiğimizde hepsinin çalışıyor olmasını bekliyoruz.

Tarayıcı üzerinden https://core.harbor.domain/ (Helm chart üzerinde değişiklik yapmadıysanız) adresine erişmek istediğim zaman bana aşağıdaki gibi hata mesajı döndü.

Aşağıdaki komutları çalıştırdıktan sonra ingress detaylarına kontrol ettim.

kubectl get pods -n ingress-nginx
kubectl describe pod/ingress-nginx-controller-756f546d89-vjqcd -n ingress-nginx

Ve karşıma aşağıdaki hata geldi.

“Ignoring ingress because of error while validating ingress class” ingress=”default/sitecore-ingress” error=”ingress does not contain a valid IngressClass”

Hata mesajını arattıktan sonra hızlıca çözümü buldum. Bir tane Breaking change mevcutmuş. Aşağıdaki komut satırını çalıştırdıktan sonra ingress objesinde bulunan annotation alanına ‘kubernetes.io/ingress.class: “nginx”’ satırını eklemeniz gerekiyor.

kubectl edit ingress/my-release-harbor-ingress

Notepad içerisinde işlemi yaptıktan sonra kaydedin ve kapatın.

Tarayıcıdan tekrar https://core.harbor.domain/ adresine istek gönderdiğiniz zaman uygulamanın geldiğini göreceksiniz.

values.yml dosyasında değişiklik yapmadıysanız, aşağıdaki bilgiler ile giriş yapabilirsiniz.

Username: admin
Password: Harbor12345

Referanslar

--

--

Fatih KÜÇÜK
KoçSistem

Fatih is a technology lover with interest in DevOps, Agile, Container and Container Orchestration.