Helm kurulumu için aşağıdaki yazıya göz atın ve adımları tamamlayın. Helm paket yöneticisinden Gitlab’ı kuracağız.

jenkins adında bir namespace oluşturuyoruz

kubectl create ns jenkins

Helm ile Jenkins’i kaldırıyoruz.

helm install jenkins \
   --set jenkinsUser=admin \
   --set jenkinsPassword=sezer.test \
   bitnami/jenkins \
   --namespace jenkins
  • Kullanıcı adı admin şifre sezer.test olarak belirledik. Yukarıdaki komutta buna göre değişiklik yapabilirsiniz.

Aşağıdaki komut ile Jenkins podlarını kontrol ediyoruz.

kubectl get pods --namespace=jenkins
NAME                      READY   STATUS    RESTARTS   AGE
jenkins-c4b7c46d7-f54jk   1/1     Running   0          4m

Bununla beraber bir domain üzerinden yayına vermek için ingress yazıp Jenkins servisi ile matchlemeniz gerekiyor. Daha önce kurduğumuz MetalLB ingress üzerinden nasıl uygulamanızı tek ip ile dışarı verebileceğinizi anlatmıştım.

image 99

Alternatif kurulum – Kubernetes üzerinde çalışan Jenkins için Docker ve Kubectl kurulumu

Kubernetes üzerinde Jenkins’i kurarken default olarak docker client yüklü gelmiyor. Bu sebepten dolayı Jenkinsfile gibi dosyalarda docker.build gibi docker komutlarını kullandığınızda aşağıdaki gibi hata alırsınız.

script.sh: docker: not found
script.sh: kubectl: not found

Şimdi kendimize özel bir image yaratacağız.

Github üzerinde projeyi clone olarak sunucumuza çekelim.

git clone https://github.com/bitnami/bitnami-docker-jenkins.git

İlgili dizine gidelim.

bitnami-docker-jenkins/2/debian-10# ls -la
total 24
drwxr-xr-x 4 root root 4096 Mar 24 10:10 .
drwxr-xr-x 3 root root 4096 Mar 24 10:10 ..
-rw-r--r-- 1 root root 2129 Mar 24 10:10 Dockerfile
-rw-r--r-- 1 root root  250 Mar 24 10:10 docker-compose.yml
drwxr-xr-x 4 root root 4096 Mar 24 10:10 prebuildfs
drwxr-xr-x 3 root root 4096 Mar 24 10:10 rootfs

Buradaki “Dockerfile” dosyasını editor ile açıp EXPOSE komutunun üstüne aşağıdaki komutları yapıştıralım.

ARG DOCKER_CLIENT="docker-20.10.9.tgz"

RUN cd /tmp/
RUN curl -sSL -O https://download.docker.com/linux/static/stable/x86_64/${DOCKER_CLIENT}
RUN tar vxf ${DOCKER_CLIENT}
RUN mkdir -p /usr/local/bin
RUN mv ./docker/docker /usr/local/bin
RUN chmod +x /usr/local/bin/docker
RUN rm -rf /tmp/*

RUN curl -LO "https://dl.k8s.io/release/$(curl -L -s https://dl.k8s.io/release/stable.txt)/bin/linux/amd64/kubectl"
RUN install -o root -g root -m 0755 kubectl /usr/local/bin/kubectl
RUN chmod +x kubectl
RUN mkdir -p ~/.local/bin
RUN cp ./kubectl ~/.local/bin/kubectl
RUN kubectl version --client

Şimdi Dockerfile dosyasını registry adresimize push etmeden önce compile edelim

docker build -t harbor.sezer.test:443/library/jenkins-with-docker:latest .

Docker compose ile uğraşmamak için doğrudan image’ı run ile çalıştırıp volume olarak docker.sock tanımlayalım. Daha sonra exec ile içerisine girip docker komutumuzu test edicez.

docker run -d --group-add $(stat -c '%g' /var/run/docker.sock) -v /var/run/docker.sock:/var/run/docker.sock -P harbor.sezer.test:443/library/jenkins-with-docker:latest

Docker ps ile kontrol ediyoruz.

root@rancher01:~/bitnami_docker# docker ps
CONTAINER ID   IMAGE                                                                      COMMAND                  CREATED              STATUS              PORTS                                                                      NAMES
dbd27647bf68   harbor.sezer.test:443/library/jenkins-with-docker:latest   "/opt/bitnami/script…"   About a minute ago   Up About a minute   8080/tcp, 8443/tcp, 50000/tcp                                              lucid_gauss

Şimdi içeresine girelim.

docker exec -it -u root dbd27647bf68 bash

Docker komutlarımız doğru çalışıyor mu kontrol edelim image içerisinde.

jenkins@52aac1513afc:/$ docker ps
CONTAINER ID   IMAGE                                                          COMMAND                  CREATED         STATUS         PORTS                                                                      NAMES
dbd27647bf68   harbor.sezer.test:443/library/jenkins-with-docker:latest   "/opt/bitnami/script…"   3 seconds ago   Up 2 seconds   8080/tcp, 8443/tcp, 50000/tcp                                              lucid_gauss

Exit yazarak container’dan çıkalım.

root@dbd27647bf68:/$ exit

Container’ı durduralım

docker stop dbd27647bf68

Şimdi bu container’ı bir image haline getirelim.

docker commit dbd27647bf68 harbor.sezer.test:443/library/jenkins-with-docker:latest

Şimdi de bu image’ı registry’e pushlayalım

docker push harbor.sezer.test:443/library/jenkins-with-docker:latest
736784463a13: Pushed 
b3dea61d7edb: Pushed 
df87214df5a5: Pushed 
41c9bb120783: Pushed 
82f358e60a16: Pushed 
0c8c9f92ac56: Pushed 
61db287e5473: Pushed 
fa7884a2ded0: Pushed 
f72f7b196037: Pushed 
5e4165082f02: Pushed 
2bd32df212a2: Pushed 
fc1d1168acff: Pushed 
6632a5be156d: Pushed 
6c18c06bf764: Pushed 
fe7a05eda2c2: Pushed 
2b492f305509: Pushed 
81191ab3f03d: Pushed 
latest: digest: sha256:1d9431a706a6b051053b8cd835f7d7c89551b9cbd358632b9afa1c2ff52fb5f2 size: 3897

Jenkins adında bir namespace oluşturalım

kubectl create ns jenkins

TCP olarak docker dind kullanacağız. Bu nedenle values.yaml adında bir dosya oluşturup içerisine aşağıdaki komutları ekleyin.

sidecars:
  - name: docker
    image: docker:dind
    command: ["dockerd"]
    args: ["-H", "tcp://127.0.0.1:2376"]
    ports:
      - containerPort: 2376
    securityContext:
      privileged: true

Şimdi rancher makinesi üzerinden Jenkins’i kaldıralım

helm install jenkins \
--set image.registry=harbor.sezer.test:443 \
--set image.repository=library/jenkins-with-docker \
--set image.tag=latest \
--set jenkinsUser=admin \
--set service.type=ClusterIP \
--set jenkinsPassword=sezer.test \

-f values.yaml bitnami/jenkins \
--namespace jenkins

Pod’un çalıştığı Worker’a gidip içerisine Docker exec -it ile girelim.

docker exec -it -u root 34e /bin/bash --

Docker registry kullanacağımız için içerisinde login olalım.

docker -H tcp://127.0.0.1 login harbor.sezer.test:443 -u admin
Password: 
WARNING! Your password will be stored unencrypted in /.docker/config.json.
Configure a credential helper to remove this warning. See
https://docs.docker.com/engine/reference/commandline/login/#credentials-store

Login Succeeded

Ardından dizine yetki verelim ki Jenkins okuyabilsin.

chmod 750 -R /.docker

Test için image pushlayabilirsiniz ve aşağıdaki komutla docker düzgün çalışıyor mu check edebilirsiniz

docker -H tcp://127.0.0.1:2376 ps
CONTAINER ID   IMAGE     COMMAND   CREATED   STATUS    PORTS     NAMES

Ingress ayarlarınızı yaptıktan sonra web isteği gönderince aşağıdaki ekranla karşılaşacaksınız

image
İlgili pod’un loglarından bu password’u görebilirsiniz.
Jenkins initial setup is required. An admin user has been created and a password generated.
Please use the following password to proceed to installation:
b39aakj37834jkklsdkj1jn1kjlnkbd
This may also be found at: /bitnami/jenkins/home/secrets/initialAdminPassword

Özelleştirme yapacaksanız tek tek pluginleri kurabilirsiniz veya önerilen kurulumu seçip bu adımı atlayabilirsiniz.

image 1

Daha sonra ilgili admin bilgilerini doldurarak kurulumu bitirin

image 2

Son olarak Jenkinsfile dosyalarınızda docker komutlarını kullanırken aşağıdaki gibi kullanım yapmalısınız.

docker.withServer('tcp://127.0.0.1:2376') {}