-
[젠킨스] 도커없이 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
계속된 빌드 실패
놓치고 있던 점
한가지 착각하고 있던 점은 파드 안에 컨테이너가 하나만 뜬다고 생각했던 점이었다.
하나의 파드에 여러 컨테이너가 뜰수있기때문에 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
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-docker image: gcr.io/kaniko-project/executor:debug command: ['sleep'] args: ['infinity'] volumeMounts: - name: registry-credentials mountPath: /kaniko/.docker volumes: - name: registry-credentials secret: secretName: kaniko items: - key: .dockerconfigjson path: config.json ''' } } environment { dockerImage = "acoursove2/tp-front-app" imageVersion = "1.0" } stages { // git pull stage('source github pulling') { steps{ container('tp-front-app-build') { git branch: 'dev', url: 'https://github.com/JEONSEUNGREE/TripPenguinFront.git' } } } // npm install stage('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 build stage('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 push stage('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
4. CI 프로세스 진행 후 완료 화면
도커허브에 latest도 추가로 kaniko destination에 추가할 필요가 있어 보인다.
'DevOps > Jenkins' 카테고리의 다른 글
[젠킨스] 작업내용 슬랙 알림 (0) 2023.10.31 [젠킨스] 깔끔한 UI/UX 플러그인 (0) 2023.10.30 [젠킨스] 쿠버네티스 agent 설정 (0) 2023.10.30 [젠킨스] 쿠버네티스에 젠킨스 설치 (0) 2023.10.29