사내에 CI/CD 도구로 Jenkins를 도입하면서 발생한 이슈들을 정리하고 경험공유를 위해 작성하는 글입니다.
다양한 방법들로 파이프라인을 구성한 것을 보고 정갈하게 정리하고자 함
목차
1) 젠킨스 생성 및 설치 과정에서 발생한 에러 해결 - 1
2) 젠킨스 Container 이미지 생성 - 2
3) 젠킨스 K8s 리소스 구성
참고사이트
https://kanoos-stu.tistory.com/53 (Dind 이미지 빌드 참고사이트)
https://dodo-devops.tistory.com/20 (jenkins-yaml 참고사이트)
설치환경
- 온프레미스 리눅스 우분투 20.04
- kubernetes 클러스터 ( kubeadm)
- CRI -containerd
docker가 호환이 안되는 커널 문제 컨테이너 내부 glibc 2.31
요구하는 커널 버전 2.32 , 2.34
pipeline {
agent any
tools {
docker 'Docker'}
}
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으로 이미지 생성하는데 초점을 뒀습니다.
위 이미지를 활용하여 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
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
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
#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"
kubectl logs 젠킨스파드명 -n jenkins