Jenkins를 Kubernetes에 올리는 이유는 Jenkins를 Kubernetes CI/CD에 활용하기 위함일 것이다. 아래는 해당 파이프라인 구성도이다.
우선 Kubernetes에 Jenkins를 올리는 방법을 알아보자
1. Namespace 생성 & ServiceAccount 생성 & ClusterRoleBinding
배포 파이프라인을 만들기 위해서는 우선 쿠버네티스 클러스터에 ns-jenkins라는 namespace를 만들고 jenkins-sa-clusteradmin-rbac.yaml파일로 jenkins 구동 시 사용할 ServiceAccount를 생성하고 cluster-admin role을 부여한다. 또한 default 계정에도 cluster-admin role을 부여한다.
# kubectl create namespace ns-jenkins
# mkdir jenkins && cd jenkins
# vi jenkins-sa-clusteradmin-rbac.yaml
vi jenkins-sa-clusteradmin-rbac.yaml
apiVersion: v1
kind: ServiceAccount
metadata:
namespace: ns-jenkins
name: jenkins
---
kind: ClusterRoleBinding
apiVersion: rbac.authorization.k8s.io/v1beta1
metadata:
name: cluster-admin-clusterrolebinding
subjects:
- kind: ServiceAccount
name: jenkins
namespace: ns-jenkins
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: ClusterRole
name: cluster-admin
---
kind: ClusterRoleBinding
apiVersion: rbac.authorization.k8s.io/v1beta1
metadata:
name: cluster-admin-clusterrolebinding-2
subjects:
- kind: ServiceAccount
name: default
namespace: ns-jenkins
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: ClusterRole
name: cluster-admin
위와 같이 작성하고 해당 yaml파일을 적용시킨다.
#kubectl apply -f jenkins-sa-clusteradmin-rbac.yaml
2. Jenkins Deployment 및 Service 구동
jenkins를 사용하기 위해서는 jenkins 데이터가 저장될 저장소가 필요하다. 참고한 자료에서는 pvc(persistent volume claim)을 활용하여 저장소도 쿠버네티스로 올렸지만, 필자는 프로젝트 진행 시 glusterFS같은 파일시스템이 준비되지 않았었기 때문에 해당 방법으로 진행하지 않고, jenkins 저장소를 서버 디렉토리에 mount시키는 방법으로 진행해 보겠다. glusterFS와 pvc를 활용한 jenkins 구축은 추후 별도의 포스팅으로 작성해보도록 하겠다.
우선 아래와 같이 jenkins-svc.yaml파일을 작성하자.
vi jenkins-svc.yaml
#apiVersion: extensions/v1beta1
apiVersion: apps/v1
kind: Deployment
metadata:
name: jenkins-leader
namespace: ns-jenkins
spec:
replicas: 1
selector:
matchLabels:
app: jenkins-leader
template:
metadata:
labels:
app: jenkins-leader
spec:
serviceAccountName: jenkins
securityContext: # Jenkins uid:gid=1000:1000
fsGroup: 1000
containers:
- name: jenkins-leader
image: jenkins/jenkins:alpine
volumeMounts:
- name: jenkins-home
mountPath: /var/jenkins_home
ports:
- containerPort: 8080
- containerPort: 50000
volumes:
- name: jenkins-home
#persistentVolumeClaim:
#claimName: jenkins-leader-pvc
hostPath:
path: /home/admin/k8s/jenkins/jenkins-home/
type: Directory
nodeSelector:
kubernetes.io/hostname: jpkimworkernode
---
apiVersion: v1
kind: Service
metadata:
name: jenkins-leader-svc
namespace: ns-jenkins
labels:
app: jenkins-leader
spec:
type: NodePort
ports:
- port: 80
targetPort: 8080
protocol: TCP
name: http
nodePort: 30000
- port: 50000
protocol: TCP
name: slave
nodePort: 30001
selector:
app: jenkins-leader
해당 yaml파일의 Deployment와 Service 두개로 구현이 되어 있다. 특이사항은 persistentVolumeClaim대신 hostPath를 설정하여 jenkins 저장소를 서버의 특정 디렉토리(/home/admin/k8s/jenkins/jenkins-home)로 지정했다는 점이다. 또한 nodeSelector를 사용하여 label이 kubernetes.io/hostname=jpkimworkernode 인 노드, 즉 특정 노드에 jenkins를 올렸다는 점이다. 사실 jenkins를 굳이 노드를 정해서 올려놓을 필요는 없지만, 해당 yaml파일을 적용하게 될 경우 jenkins저장소로 지정된 디렉토리가 미 존재하게 되면(이 포스트에서는 /home/admin/k8s/jenkins/jenkins-home) 쿠버네티스 클러스터에 jenkins가 올라가지 않는다. 그런데 만약 nodeSelector로 특정 노드를 지정하지 않았다면 어느 노드에 jenkins가 올라갈지 확인이 되지 않기 때문에 모든 노드에 jenkins 저장소를 만들어 놔야 하는 번거로움이 있어서, 그냥 마스터노드에 올리기로 정하고 마스터노드에 jenkins저장소 디렉토리를 만든 것이다.
컨테이너 생성 시 jenkins저장소 디렉토리(/home/admin/k8s/jenkins/jenkins-home)에 권한 문제로 접근할 수 없기 때문이다. 때문에 아래 명령어를 수행해서 권한 문제를 해결해줘야 한다.
# chown -R 1000:1000 [디렉토리명]
해당 yaml파일을 적용시킨다.
#kubectl apply -f jenkins-svc.yaml
jenkins 환경설정을 해보자. 우선 http://<호스트ip>:30000 주소를 웹페이지에 입력해보자. 입력하게 되면 아래와 같은 화면이 나오게 된다.
jenkins 컨테이너 내부에 있는 /var/jenkins_home/secrets/initialAdminPassword 파일을 확인해서 암호를 입력해야 한다. 아래 명령어를 이용하여 해당 암호를 확인하고 입력하고 Continue 버튼을 클릭하자.
# kubectl exec -it [jenkins pod 명] cat /var/jenkins_home/secrets/initialAdminPassword -n ns-jenkins
'PaaS > CI CD' 카테고리의 다른 글
(Jenkins, Dockerhub, Github, Kubernetes) Github에서 소스를 가져와 Kubernetes에 Jenkins 통해서 배포하기 (0) | 2021.07.22 |
---|---|
(Jenkins, Kubernetes) Jenkins와 Kubernetes 연동하기 (0) | 2021.07.21 |
(Jenkins, Github, Docker) Github에서 불러와 Docker빌드 (0) | 2021.07.10 |
(Docker) Python 웹페이지를 띄울수 있는 Dockerfile만들어서 빌드 및 배포하기 (0) | 2021.07.07 |
(Jenkins) Jenkins 설치하기 (0) | 2021.07.04 |