젠킨스 설치 및 설정 -1

DevOps Engineer·2023년 8월 18일
0

Jenkis 설치 k8s

목록 보기
1/3
post-thumbnail

글 쓰기 전에

사내에 CI/CD 도구로 Jenkins를 도입하면서 발생한 이슈들을 정리하고 경험공유를 위해 작성하는 글입니다.
다양한 방법들로 파이프라인을 구성한 것을 보고 정갈하게 정리하고자 함

목차
1) 젠킨스 생성 및 설치 과정에서 발생한 에러 해결 - 1
2) 젠킨스 Container 이미지 생성 - 2
3) 젠킨스 K8s 리소스 구성

  • 파이프라인 구성

Jenkins 설치

참고사이트
https://kanoos-stu.tistory.com/53 (Dind 이미지 빌드 참고사이트)
https://dodo-devops.tistory.com/20 (jenkins-yaml 참고사이트)

설치환경

  • 온프레미스 리눅스 우분투 20.04
  • kubernetes 클러스터 ( kubeadm)
  • CRI -containerd

Docker가 동작하는 jenkins 컨테이너 만들기

  • 기존 젠킨스 이미지로 파이프라인을 만들었을 때 생긴 에러

docker가 호환이 안되는 커널 문제 컨테이너 내부 glibc 2.31
요구하는 커널 버전 2.32 , 2.34

  • 젠킨스 Global Tool Docker를 활용하여 파이프라인 동작 시 Console output이 생성이 되지않음
    그래서 위 코드를 없애고 shell script로 동작하게 하고자 함
pipeline {
	agent any
    tools {
    	docker 'Docker'}
}
  • docker 명령어를 root로 접근하기위해 deployment.yaml에서spec.template.containers.securityContext.runAsUser
    spec.template.containers.securityContext.privileged 옵션을 활용함
    -> 실패

jenkins 이미지를 public docker registry에서 받아와서 docker 설치하고 그룹으로 명령어를 사용할 수 있도록 시도해봄

#실행명령어
docker run \
  -p 8080:8080 \
  -v /var/run/docker.sock:/var/run/docker.sock \
  --name jenkins \
  jenkins/jenkins:lts
  
  #/var/run/docker.sock 볼륨설정은 파이프라인 동작 시 노드의 docker를 사용가능해야함

다른 커널에서 컨테이너 접속하기

docker exec -it -u root jenkins bash

#docker 설치커맨드
apt-get update && \
apt-get -y install apt-transport-https \
     ca-certificates \
     curl \
     gnupg2 \
     software-properties-common && \
curl -fsSL https://download.docker.com/linux/$(. /etc/os-release; echo "$ID")/gpg > /tmp/dkey; apt-key add /tmp/dkey && \
add-apt-repository \
   "deb [arch=amd64] https://download.docker.com/linux/$(. /etc/os-release; echo "$ID") \
   $(lsb_release -cs) \
   stable" && \
apt-get update && \
apt-get -y install docker-ce

#docker group으로 jenkins호스트에게 명령어 권한주기
groupadd -f docker
usermod -aG docker jenkins
chown root:docker /var/run/docker.sock

#docker 명령어 되는지 확인
docker -v

#이미지빌드
docker commit jenkins registry/jenkins
docker images
#registry/jenkins 이미지 조회
docker push registry/jenkins

참고사이트는 Dockerfile로 했고 저는 Docker commit으로 이미지 생성하는데 초점을 뒀습니다.

관련 yaml

위 이미지를 활용하여 Deployment, Service, PV, PVC 생성

deployment.yaml
#deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: jenkins-dp
  namespace: jenkins
spec:
  replicas: 1
  selector:
    matchLabels:
      app: jenkins
  template:
    metadata:
      labels:
        app: jenkins
    spec:
      hostAliases:
        - ip: "xxx.xxx.xxx.xxx"
          hostnames:
            - "madame3369"
      containers:
        - name: jenkins
          image: akeka0303/jenkins
          imagePullPolicy: Always
  	#	  imagePullSecrets:	    CRI가 docker일 때 작성하기
  	#		- name: secret-kw
          ports:
            - name: http-port
              containerPort: 8080
            - name: jnlp-port
              containerPort: 50000
          env:
            - name: TZ
              value: "Asia/Seoul"
          securityContext:
            privileged: true
          volumeMounts:
            - name: jenkins
              mountPath: /var/jenkins_home
            - name: docker
              mountPath: /var/run/docker.sock	
      volumes:
        - name: jenkins
          persistentVolumeClaim:
            claimName: jenkins
        - name: docker
          hostPath:
            path: /var/run/docker.sock
      affinity:
        nodeAffinity:
          requiredDuringSchedulingIgnoredDuringExecution:
            nodeSelectorTerms:
              - matchExpressions:
                  - key: kubernetes.io/hostname
                    operator: In
                    values:
                      - madame3369
          preferredDuringSchedulingIgnoredDuringExecution:
            - weight: 30
              preference:
                matchExpressions:
                  - key: kubernetes.io/hostname
                    operator: In
                    values:
                      - madame3369

Deployment 작성 시 유의 점!!!
volume 설정할 때 volume에 위치하는 디렉토리의 파일접근권한이 CrashLoopBackOff를 유발한다.
꼭 확인할 것! 해결법

#example
chmod 777 directory | chmod 666 directory
Service.yaml
#service.yaml
apiVersion: v1
kind: Service
metadata:
  name: jenkins-jnlp
  namespace: jenkins
spec:
  type: LoadBalancer
  ports:
    - port: 25001
      protocol: TCP
      targetPort: 50000
  selector:
    app: jenkins
  clusterIP: yyy.yyy.yyy.yyy
  externalIPs:
    - xxx.xxx.xxx.xxx
---
apiVersion: v1
kind: Service
metadata:
  name: jenkins-http
  namespace: jenkins
spec:
  type: LoadBalancer
  ports:
    - port: 25000
      protocol: TCP
      targetPort: 8080
  selector:
    app: jenkins
  clusterIP: yyy.yyy.yyy.yyy
  externalIPs:
    - xxx.xxx.xxx.xxx
PV.yaml, PVC.yaml
apiVersion: v1
kind: PersistentVolume
metadata:
  name: jenkins
  namespace: jenkins
  labels:
    type: nas
    app: jenkins
spec:
  capacity:
    storage: 50Gi
  accessModes:
    - ReadWriteMany
  persistentVolumeReclaimPolicy: Retain
  storageClassName: nas-storage
  nfs:
    server: zzz.zzz.zzz.zzz
    path: /path/jenkins_home
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: jenkins
  namespace: jenkins
spec:
  storageClassName: nas-storage
  accessModes:
    - ReadWriteMany
  resources:
    requests:
      storage: 50Gi 
hostpath로 PV설정하기
apiVersion: v1
kind: PersistentVolume
metadata:
name: jenkins
namespace: jenkins
labels:
  type: nas
  app: jenkins
spec:
capacity:
  storage: 50Gi
accessModes:
  - ReadWriteMany
persistentVolumeReclaimPolicy: Retain
storageClassName: local-storage
local:
	path: /path/jenkins_home
StorageClass.yaml
#StoageClass.yaml
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
 name: nfs-storage-test
provisioner: nfs-test
parameters:
 server: yyy.yyy.yyy.yyy
 path: /path
 readOnly: "false"
설치 완료 후 설치된 노드로 직접 접속하는 방법을 택했다 부가적으로 인그레스로 노출시키려면 ingress.yaml 작성해야 함. 접속 후 비밀번호 확인 커맨드

kubectl logs 젠킨스파드명 -n jenkins

profile
madame의 Techblog

0개의 댓글