쿠버네티스 환경에서의 배포 자동화를 실습하기 위해

Jenkins, Gogs, Docker, Kind, ArgoCD를 사용할 것이다.

작업 환경 구성

먼저 Jenkins와 Gogs를 docker compose를 통해 설치한다.

이전 포스팅과 설치 내용은 동일하다

cat <<EOT > docker-compose.yaml
services:

  jenkins:
    container_name: jenkins
    image: jenkins/jenkins
    restart: unless-stopped
    networks:
      - cicd-network
    ports:
      - "8080:8080"
      - "50000:50000"
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock
      - jenkins_home:/var/jenkins_home

  gogs:
    container_name: gogs
    image: gogs/gogs
    restart: unless-stopped
    networks:
      - cicd-network
    ports:
      - "10022:22"
      - "3000:3000"
    volumes:
      - gogs-data:/data

volumes:
  jenkins_home:
  gogs-data:

networks:
  cicd-network:
    driver: bridge
EOT

docker compose로 기동시키고

docker compose up -d
docker compose ps

image

Jenkins 초기 세팅

http://127.0.0.1:8080에 접속하여 젠킨스 플러그인 설치 및 계정 생성을 마친다.

참고로 나는 이전 세팅 때 볼륨이 남아있어서 docker compose down -v로 jenkins와 gogs의 볼륨까지 삭제한 후 진행하였다.

젠킨스 서버에 접속한 후 내부에 도커 실행 파일까지 설치해 준다

docker compose exec --privileged -u root jenkins bash
-----------------------------------------------------
curl -fsSL https://download.docker.com/linux/debian/gpg -o /etc/apt/keyrings/docker.asc
chmod a+r /etc/apt/keyrings/docker.asc
echo \
  "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/debian \
  $(. /etc/os-release && echo "$VERSION_CODENAME") stable" | \
  tee /etc/apt/sources.list.d/docker.list > /dev/null
apt-get update && apt install docker-ce-cli curl tree jq yq -y

image 1

젠킨스 컨테이너에서 jenkins 유저가 도커를 실행할 수 있게 docker 그룹을 생성하고 실행 파일 소유자그룹을 docker 그룹으로 변경해 준다

groupadd -g 2000 -f docker
chgrp docker /var/run/docker.sock

image 2

jenkins 유저를 docker 그룹에 추가해 준다.

usermod -aG docker jenkins

image 3

docker compose restart jenkins로 젠킨스 컨테이너 재기동해 준다.

image 4

Gogs 초기 세팅

http://127.0.0.1:3000/install에 접속하여 초기 세팅을 진행해 준다.

Your Settings > Applications > Generate New Token을 클릭해서 git 작업을 위한 토큰 하나 발급해 준다

image 4

개발팀용(dev-app)과 데브옵스팀용(ops-deploy)으로 레포 두 개도 생성해 준다.

image 4

이제 로컬에서 해당 레포를 clone해 오고 main 브랜치를 기본으로 설정해 준다.

git clone http://192.168.219.100:3000/devops/dev-app.git
git config user.name "devops"
git config user.email "devops@example.com"
git config init.defaultBranch main
git config credential.helper store

image 7

현재 시간, 버전, hostname을 출력하는 server.py를 생성해 준다.

cat > server.py <<EOF
*from http.server import ThreadingHTTPServer, BaseHTTPRequestHandler
from datetime import datetime
import socket

class RequestHandler(BaseHTTPRequestHandler):
    def do_GET(self):
        self.send_response(200)
        self.send_header('Content-type', 'text/plain')
        self.end_headers()
        
        now = datetime.now()
        hostname = socket.gethostname()
        response_string = now.strftime("The time is %-I:%M:%S %p, VERSION 0.0.1\n")
        response_string += f"Server hostname: {hostname}\n"
        self.wfile.write(bytes(response_string, "utf-8")) 

def startServer():
    try:
        server = ThreadingHTTPServer(('', 80), RequestHandler)
        print("Listening on " + ":".join(map(str, server.server_address)))
        server.serve_forever()
    except KeyboardInterrupt:
        server.shutdown()

if __name__ == "__main__":
    startServer()*
EOF

Dockerfile은 간단하게 server.py를 구동시키는 애플리케이션으로 하나 생성해 준다

cat > Dockerfile <<EOF
FROM python:3.12
ENV PYTHONUNBUFFERED 1
COPY . /app
WORKDIR /app 
CMD python3 server.py
EOF

echo "0.0.1" > VERSION로 버전 파일을 생성해 주고 신규 생성한 아래 세 파일을 git에 푸시한다

image 8

image 9

DockerHub Access Token 발급

Docker Hub를 이미지저장소로 push&pull하기 위해서 Account settings > Security > Personal access tokens에서 토큰 하나 발급해 준다

Access permissions는 Read, Write, Delete로 설정해 준다

image 9

여기까지 실습 환경 구성을 1차적으로 완성하였다

Categories:

Updated: