Harbor Nedir? Kubernetes Harbor Kurulumu ve Github Action İşlemleri
Harbor Nedir?
Harbor, açık kaynaklı bir Docker Container Registry yönetim platformudur. Docker Hub, ACR gibi Container Registry hizmetlerine benzer şekilde çalışıyor.
Bu yapının güzel kısmı kendi altyapımızda barındırabiliyor olmamız. Öncesinde ACR üzerinde olan projelerimizi buraya taşımamız gerektiğini varsayalım. Bunun için de Harbor kullanıyor olacağız. Öncelikle hangi adımlardan geçeceğimize bakalım.
Yapılacaklar
Harbor Kurulumu
Harbor Proje Oluşturma
Harbor Projesi için Github Action Hazırlama
Harbor k8s Deploy İşlemleri
Harbor Token ve Secret İşlemleri
Harbor Kurulumu
Bir dizin içerisinde, helm kullanarak harbor u yükleyelim.
helm repo add harbor https://helm.goharbor.io
helm fetch harbor/harbor –untar
Harbor sorunsuz yüklendiyse işlemimize devam edebiliriz. Dizine çıkardığımız dosyaları buradan kontrol edebiliriz. Özellikle values.yaml dosyası için kendi ayarlarımızı konfigüre edebiliriz. Dilersek Kubernetes kurulum anında da bazı değerleri set edebiliriz. Daha fazla detay için buraya göz atabilirsiniz.
helm install harbor . –set persistence.persistentVolumeClaim.registry.accessMode=ReadWriteMany –set persistence.persistentVolumeClaim.jobservice.accessMode=ReadWriteMany –set persistence.persistentVolumeClaim.registry.size=20Gi –set persistence.persistentVolumeClaim.chartmuseum.size=2Gi –set persistence.persistentVolumeClaim.database.size=2Gi –set persistence.persistentVolumeClaim.trivy.size=2Gi –set expose.ingress.hosts.core=harbor.domain.com –set expose.ingress.hosts.notary=notary.domain.com –set persistence.enabled=false –set externalURL=https://harbor.domain.com –set expose.ingress.className=nginx -n harbor
Harbor ingress üzerinden çalışacak. Bu yüzden ingress className kısmını nginx olarak geçiyoruz ve harbor namespace altında podlarımız oluşacak. Domain kısmına dilerseniz kendi bilgilerinizi girebilirsiniz.
Bu adımlardan sonra ilgili domaini yönlendirdikten sonra giriş yapabilirsiniz. Eğer herhangi bir kullanıcı adı veya parola belirlemediyseniz. admin ve Harbor12345 şeklinde ilerleyebilirsiniz.
Harbor Proje Oluşturma
Harbor paneline artık erişebilir durumdayız. Giriş yaptıktan sonra bir harbor tarafında proje oluşturalım ve proje içerisine Github Action dan gönderdiğimiz repository, oluşturduğumuz proje içerisine gönderilsin.
Harbor tarafında projemiz oluştu. Bu adımdan sonra, container larımızın artık burada depolanmasını isteyebiliriz. Bunun için Github üzerinden bir repository ile haberleşiyor olacağız.
Harbor Projesi için Github Action Hazırlama
Github üzerinden herhangi bir repository oluşturduğumuzu varsayalım. Harbor adresimiz kullanıcı adımız ve parolamızı alıp Github tarafında secret olarak geçelim.
Harbor bilgilerini de secret olarak geçtiğimize göre artık projemizi build alabiliriz. Buradaki önemli nokta projemizin dockerize mimarisina uygun olmasıdır. Aşağıdaki yaml dosyası buna uyumludur.
.github/workflows/action.yaml
name: testapp Github Action Workflow on: workflow_dispatch: jobs: docker_build_push_acr: name: 'Docker Build and Push to Harbor' runs-on: ubuntu-latest defaults: run: shell: bash steps: - name: Checkout repository uses: actions/checkout@v2 - name: Login to Harbor Registry run: docker login -u ${{ secrets.HARBOR_REGISTRY_USERNAME }} -p ${{ secrets.HARBOR_REGISTRY_PASSWORD }} ${{ secrets.HARBOR_REGISTRY }} - name: Build Docker image run: docker build -t ${{ secrets.HARBOR_REGISTRY }}/test/testapp:${{ github.sha }} . ## Dockerfile adlı dosya build edilir (.) - name: Push Docker image to Harbor run: docker push ${{ secrets.HARBOR_REGISTRY }}/test/testapp:${{ github.sha }}
Action dosyamızı çalıştırdıktan sonra Harbor panelinde oluşturduğumuz projenin içerisine göz atabiliriz.
Oluşturduğumuz repository bilgileri action işleminden sonra harbor içerisine gönderildi.
Harbor k8s Deploy İşlemleri
Artık container oluşturabildiğimize göre, docker imajlarını pod olarak çalıştırabiliriz.
deploy
apiVersion: apps/v1 kind: Deployment metadata: name: testapp spec: replicas: 1 selector: matchLabels: app: testapp template: metadata: labels: app: testapp spec: containers: - name: testapp image: harbor.domain.com/test/testapp:image-id resources: requests: cpu: 50m memory: 150Mi limits: cpu: 150m memory: 250Mi imagePullSecrets: - name: harbor-registryapply
kubectl apply -f deployment.yaml
Harbor adresimize yukarıdaki deployment dosyası ile istek yapmaya çalıştığımızda 401 Unauthorized hatası almamız muhtemel. Çünkü docker imajına ait değeri çekmeye çalışıyoruz. Bunun için imagePullSecrets oluşturmamız gerek. Deployment dosyasında zaten bunu gönderdik fakat böyle bir secret değerimiz mevcut değil. Şimdi bunu oluşturalım.
Harbor Token ve Secret İşlemleri
Harbor paneli üzerinden Adminstration > Robot Accounts > New Robot Account kısmına gelerek bir token oluşturalım. Robot hesabı oluştururken ilgili projemizi seçebilir ve verilecek yetkiyi düzenleyebiliriz.
Oluşturduğumuz robotu kubernetes içerisine apply edeceğiz.
kubectl create secret docker-registry harbor-registry –docker-server=harbor.domain.com –docker-username=’robot$robotadi’ –docker-password=token
kubectl get secret
Eğer her şey sorunsuz ilerlediyse harbor-registry adında secret değerimizin oluşmuş olması gerekiyor. Bundan sonrası için artık repository action larımızı çalıştırıp kubernetes tarafına deploy işlemlerimizi kolaylıkla tamamlayabiliriz.