[Jenkins] 쿠버네티스 컨테이너 파이프라인(front)

최동혁·2023년 4월 28일
0

CI/CD

목록 보기
3/4

젠킨스 ssh 키 설정

rm -rf ~/.ssh/*
ssh-keygen -t rsa -b 4096 -m PEM
엔터 3번

ssh-copy-id root@쿠버네티스마스터노드IP

  • 왜냐면 젠킨스에 master node가 원격 ssh 접속을 해서 이미지로 불러온 파일들을 복사한 후, 쿠버로 올릴것이기 때문

확인

  • 젠킨스 서버 터미널
  • ssh root@마스터노드IP
  • 접속 되면 된거임.

젠킨스 대시보드에서 설정 변경

  • 젠킨스 대시보드 -> Jenkins 관리 -> 플러그인 관리 -> Available plugins -> Publish Over SSH 검색 후 체크 -> Download now and install after restart 클릭 -> 설치가 끝나고 실행중인 작업이 없으면 Jenkins 재시작 체크

  • 가장 밑에 클릭하면 됨.

키 받아오기

  • jenkins 터미널에서
  • cat ~/.ssh/id_rsa
  • 해서 나온 키 파일 전체 복사

  • 젠킨스 대시보드 -> Jenkins 관리 -> 시스템 설정 -> Publish over SSH -> Key: 키파일 내용 붙여넣기, SSH Servers에서 추가

  • 그러고 위와 같이 name은 아무거나 써주고, hostname은 쿠버 master ip, username은 root로 고정 그리고 Remote Directory는 원격 접속했을때 시작 디렉토리 위치이다.
  • test를 해서 위와 같이 Success가 떠야함.

파이프라인 수정

  • 그리고 미리 생성해놓은 파이프라인 클릭 후, 구성 -> 빌드 후 조치에서 Send build artifacts over SSH 클릭

  • 그러먼 요런식으로 나옴.
  • name은 방금 만든 이름 클릭
  • source files는 jenkins의 현재 workspace에 있는 폴더들 전부 복사할것이기 때문에 *
  • Remote directory는 /로 아까 원격 접속 설정했던것과 같이 설정
  • Exec command는 우리가 이미지까지 빌드하고 push 한 후, 쿠버 master 노드에 입력할 명령어임.
sed -i "s/latest/$BUILD_ID/g" /httpd-deployment-prod.yml
kubectl apply -f /httpd-deployment-prod.yml
  • 첫 줄 sed -i에 latest/~~는 latest라는 문자열을 찾아서 현재 build id로 바꿔주는 명령어임.
  • 왜냐면 내가 이미지 올릴 때 현재 build id로 tag를 쓰기 때문에, 나중에 파드 생성 디플로이먼트에서도 latest를 써서 지금 현재 설정한대로 build id 따라가게 할것이기 때문
  • 두번째줄은 파드를 생성하기 위한 yml 파일을 적용해서 파드를 생성하겠다는 코드.
  • 저장

Dockerfile

FROM nginx:latest
RUN rm -rf /usr/share/nginx/html/index.html
ADD build /usr/share/nginx/html
RUN rm -rf /etc/nginx/conf.d/default.conf
ADD default.conf.template /etc/nginx/conf.d/default.conf.template

default.conf.template

server {
    listen       80;
    server_name  localhost;

    location / {
        root   /usr/share/nginx/html;
        index  index.html index.htm;
    }

    location /dev {
        proxy_set_header Host $http_host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_pass http://${BACKEND_SVC_NAME}:8000;
    }

    error_page   500 502 503 504  /50x.html;
    location = /50x.html {
        root   /usr/share/nginx/html;
    }
}

deployment yml 파일 추가

  • git 과 연동되어 있는 폴더에 yml 파일 추가 후, push
apiVersion: apps/v1
kind: Deployment
metadata:
 name: httpd-deployment-dev
 namespace: cdh-dev
spec:
 selector:
   matchLabels:
    type: front
 replicas: 1
 template:
   metadata:
     labels:
       type: front
   spec:
    containers:
    - name: container
      image: cis07385/front:latest
      command: ["/bin/sh", "-ec", "envsubst '$BACKEND_SVC_NAME' < /etc/nginx/conf.d/default.conf.template > /etc/nginx/conf.d/default.conf && nginx -g 'daemon off;'"]
      envFrom:
      - configMapRef:
          name: frontend-cm
      ports:
      - containerPort: 80
  • 여기서 이미지에 latest로 태그를 가장 최신껄 가져온다고 되어있는데, 아까 파이프라인에서 latest라는 글자를 찾아서 build id로 바꿔주는 작업을 했음.
  • 그게 그거긴함 ㅋ
  • 그리고 git에 push를 하면??!!

  • 요렇게 파이프라인 작동!
  • 그런데 지금 master node에는 복사가 잘되고 이미지도 잘 불러오는데, yml 파일 적용을 못시킨다.
  • yml 파일이 잘못된거가 싶어서 직접 master node에 쳐봤는데도 잘된다.
  • 뭐가 문제인지... 화요일날 물어보기

트러블 슈팅

  • 일단 위에서 문제는 빌드 후 조치에서 문제가 있었다.
  • 처음에는 원격 접속이 어떤사용자로 되는지 확인하기 위해 who라는 명령어를 이용해 확인해봤다.
  • 그러니 root 사용자로 잘 나왔다.

  • 당연히 처음에 jenkins 설정할때 이렇게 해줬으니깐 ㅎ..

  • 거기다가, 원격 접속해서 가장 상위 디렉토리에 jenkins 서버를 구동시킨 서버에 있는 파일들을 쿠버 master 노드로도 잘 복사해온다.

  • 문제는 명령어에 있었다.

  • 명렁어에 디플로이먼트 파일의 위치를 상대 경로가 아닌 절대 경로로 해줘야 잘 읽는다..
  • 분명히 시작 디렉토리를 가장 상위 디렉토리로 했고, 해당 디플로이먼트 파일도 최상위에 위치하는데 왜 상대경로가 안되는지 모르겠다..
  • 그래서 위에처럼 절대경로로 바꾸니

  • 위에처럼 해결

  • 디플로이먼트 잘 생성되고, 파드도 잘 생성됨
  • 아직 backend와 db 컨테이너 생성 안해서 오류뜸.
  • 이건 다음 게시글에 할 예정

번외 트러블

  • 분명히 docker hub에 이미지 올리는게 잘 됐었는데 갑자기 안됨.
  • docker를 돌리는데, docker.sock 파일로 돌림. 근데, 루트 권한이 없으면 사용하지 못함.

  • 한번 껏다 키고, docker 설정을 다시 만진 후 적용했을 때, 파일이 덮어쓰기 되면서 권한이 풀림.

  • 그래서 권한 바꿔주고 다시 해보니 이미지 잘 생성됨.
profile
항상 성장하는 개발자 최동혁입니다.

0개의 댓글