-
[젠킨스] 도커없이 K8S에서 도커 이미지 빌드DevOps/Jenkins 2023. 11. 9. 01:16
클러스터 스펙
마스터노드 3대
cpu 2core ram 6g storage 50g
워커노드 3대
cpu 4core ram 14g storage 100g
CNI : flannel
CRI : CRI-O
계속된 빌드 실패
69번에 성공한 빌드 놓치고 있던 점
한가지 착각하고 있던 점은 파드 안에 컨테이너가 하나만 뜬다고 생각했던 점이었다.
하나의 파드에 여러 컨테이너가 뜰수있기때문에 agent에 원하는 이미지기술을 골라서 복수로 적용할 수 있다.
문제 주요 원인
1.리액트 빌드 과정에서 eslint 에러 -> 사용하지 않는 변수 관련
리액트 게시글에 올렸지만 eslint 관련 모듈과 prettier를 통해서 코드 컨벤션 적용 후 해결완료
2. DinD(DockerInDocker)로 도커 이미지를 빌드하려고했는데 문제가 발생했다.
DinD는 도커 데몬을 사용하기 위해서 호스트의 루트 권한을 필수로 필요로하여 --privilege 옵션을 꼭 사용해야한다. ( 보안 문제 )
권한문제도 --privilege=true로 설정했는데 아래 문제가 발생했다.
Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?
현재 1.28 쿠버네티스를 사용하고 CRI-O를 사용하고있기 때문에 도커 데몬이 없어서 발생한 문제였다.
도커 없이 도커이미지를 빌드하는 방법
Kaniko를 통해 이런 문제를 해결할 수 있다.
kaniko 토큰 생성 공식문서
1. secret 파일생성
jenkins 네임스페이스에 위치시킨다.
# https://index.docker.io/v1/ 도커허브 주소kubectl create secret docker-registry kaniko--docker-server=https://index.docker.io/v1/--docker-username=<your-name>--docker-password=<your-pword>--docker-email=<your-email>2. 파드 템플릿 생성
젠킨스 -> Dashboard -> Manage Jenkins -> Cloud -> K8S 클러스터 선택 -> Configure
1. 파드템플릿 이름 설정
2. 네임스페이스 설정
3. AddContainer 클릭
4. Docker image : gcr.io/kaniko-project/executor:debug
Kaniko 컨테이너 적용 ( 도커 이미지 빌드, 허브 push용) 리액트 빌드용 이미지 - 노드버전에 맞게 이미지 사용해도 무관한다. ( 개인 도커 허브에 커밋해놓은 이미지 ) node - Official Image | Docker Hub
Docker Official Images are a curated set of Docker open source and drop-in solution repositories. Why Official Images? These images have clear documentation, promote best practices, and are designed for the most common use cases.
hub.docker.com
3. 도커 파일 생성
깃에 미리 생성해둔 도커파일
https://github.com/JEONSEUNGREE/TripPenguinFront/blob/dev/dockerfile
// Uses Declarative syntax to run commands inside a container.pipeline {agent {kubernetes {inheritFrom 'node-v20'yaml '''spec:containers:- name: tp-front-dockerimage: gcr.io/kaniko-project/executor:debugcommand: ['sleep']args: ['infinity']volumeMounts:- name: registry-credentialsmountPath: /kaniko/.dockervolumes:- name: registry-credentialssecret:secretName: kanikoitems:- key: .dockerconfigjsonpath: config.json'''}}environment {dockerImage = "acoursove2/tp-front-app"imageVersion = "1.0"}stages {// git pullstage('source github pulling') {steps{container('tp-front-app-build') {git branch: 'dev', url: 'https://github.com/JEONSEUNGREE/TripPenguinFront.git'}}}// npm installstage('tp-front-app npm install') {steps {container('tp-front-app-build') {dir('./tp-front-app') {sh '''echo 'start npm install'npm install'''}// slackSend(channel: "#build-image", color: "#FFFF00", message: "tp-front-app npm install....")}}}// npm buildstage('tp-front-app npm build') {steps {container('tp-front-app-build') {dir('./tp-front-app') {sh '''echo 'start npm build'npm run build'''}// slackSend(channel: "#build-image", color: "#FFFF00", message: "tp-front-app npm build....")}}}// docker image build && docker hub pushstage('docker image build && push') {steps {container('tp-front-docker') {script{sh "executor --dockerfile=dockerfile \--context=dir://${env.WORKSPACE} \--destination=${dockerImage}:${imageVersion}"}}}}}}agent kubernetes 선언부 설명
inheritFrom은 젠킨스 클러스터 Configure에서 생성한 파드 템플릿을 가져와서 사용한다는 의미이다.
yaml로 바로 하단에 선언하면 name이 tp-front-docker 컨테이너인 템플릿만 정보 일부 수정하겠다는 의미이다.
https://plugins.jenkins.io/kubernetes/#plugin-content-overview-1
Kubernetes
This plugin integrates Jenkins with <a href="https://github.com/GoogleCloudPlatform/kubernetes/" target="_blank" rel="nofollow noopener noreferrer">Kubernetes</a>
plugins.jenkins.io
4. CI 프로세스 진행 후 완료 화면
build & push 완료 도커허브에 latest도 추가로 kaniko destination에 추가할 필요가 있어 보인다.
도커허브에서 확인 'DevOps > Jenkins' 카테고리의 다른 글
[젠킨스] 작업내용 슬랙 알림 (0) 2023.10.31 [젠킨스] 깔끔한 UI/UX 플러그인 (0) 2023.10.30 [젠킨스] 쿠버네티스 agent 설정 (0) 2023.10.30 [젠킨스] 쿠버네티스에 젠킨스 설치 (0) 2023.10.29