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

최동혁·2023년 5월 2일
0

CI/CD

목록 보기
4/4

이미지 파이프라인 생성

앞에 게시글과 같이 깃 레포지토리 생성 후, github와 jenkins 연결

Dockerfile

FROM python:3.9
ENV PYTHONUNBUFFERED 1
WORKDIR /app
COPY r.txt /app/r.txt
COPY . /app
RUN pip install -r r.txt

gunicorn-deployment.yml

apiVersion: apps/v1
kind: Deployment
metadata:
 name: gunicorn-deployment-dev
 namespace: cdh-dev
spec:
 selector:
   matchLabels:
    type: web
 replicas: 1
 template:
   metadata:
     labels:
       type: web
   spec:
    containers:
    - name: container
      image: cis07385/back:latest
      command: ["/bin/sh", "-ec", "python manage.py makemigrations && python manage.py migrate && gunicorn config.wsgi --bind 0.0.0.0:8000"]
      envFrom:
      - configMapRef:
          name: gunicorn-cm
      ports:
      - containerPort: 8000
  • 명심할건, 각 라벨의 타입과 configmapref에 내가 생성한 configmap의 이름을 정확히 쓸것
  • 라벨을 따라 연결이 되기 때문에 하나라도 연결 안되면 에러..

jenkins 쉘 명령어

docker login -u cis07385 -p (docker 비번)

docker build --tag cis07385/back:$BUILD_ID .
docker push cis07385/back:$BUILD_ID
  • 앞선 게시글처럼 BUILD_ID를 이용해 불러오면 jenkins에서 build 할 때 사용된 ID를 가지고 tag로 불러온다.
  • 어차피 나는 docker hub에 tag를 jenkins의 build id로 하기 때문에 가장 최신 버전으로 불러온다.
  • latest로 하면 못읽는다.

원격 명령어

  • 쿠버 마스터 노드에 원격으로 접속해서 jenkins의 모든 파일을 복사해온다.
  • 시작 디렉토리는 가장 최상위 디렉토리
sed -i "s/latest/$BUILD_ID/g" /gunicorn-deployment.yml
kubectl apply -f /gunicorn-deployment.yml
  • 위의 명령어는 latest라는 글자를 BUILD_ID로 바꾸어주는 것이다.
  • 그걸 gunicorn-deployment.yml 파일에 적용하는 것
  • 왜냐면 나는 디플로이먼트 파일에 이미지 태그를 latest라고 지정해놨기 때문에.
  • 그리고 디플로이먼트 파일을 적용하면?

  • 잘 작동한다.

  • 물론 여기서 선행해야 할 것은, db 서비스와 db configmap, db pod 생성

  • gunicorn 서비스, gunicorn configmap

  • nginx 서비스(로드밸런서), nginx configmap 이다.

결과

  • db에 저장한 데이터들을 backend에서 잘 불러온다.

  • 접속은 front 서비스에서 제공해준 로드밸런서 ip를 이용해 접속한다.

  • 각 서비스에서 이름을 이용해 파드들끼리 서비스 이름을 이용해 통신하게끔 해준다.

  • 필자는 front의 서비스는 front-svc, back의 서비스는 gunicorn-svc, db의 서비스는 db-svc

  • configmap은 front-cm, gunicorn-cm, db-cm.

  • 이렇게 정해놨다.

  • 이건 jenkins 파이프라인을 이용해 알아서 생성된 디플로이먼트

  • db-pod는 직접 생성해준것이고, front와 back 파드는 jenkins 파이프라인을 통해 생성된 디플로이먼트가 적용되면서 생성된 파드.

트러블 슈팅

  • 계속 컨테이너가 만들어지지 않았음.
  • 에러가 이미지를 불러오지 못한다였는데, 쿠버네티스 안의 dns 서버가 잘 동작하지 않았음.
  • 일단 확인해보기 위해 이미지에 RUN apt-get update && apt-get install -y iputils-ping curl net-tools 명령어를 이용해 ping, curl, netstat을 설치해줬음.
  • ping을 해보니 8.8.8.8과 통신이 안됨.

  • kube-system 네임스페이스 접속

  • coredns 파드들 삭제하면 디플로이먼트 덕분에 알아서 다시 재생성됨.
  • 그러면 dns 서버 제대로 동작.
profile
항상 성장하는 개발자 최동혁입니다.

0개의 댓글