GitHub Actions에서 커밋 해시 기반 Docker 이미지 태그로 배포 자동화하기
·
Devops/GitHub Actions
GitHub Actions에서 커밋 해시 기반 Docker 이미지 태그로 배포 자동화하기이번 글에서는 GitHub Actions를 이용해 Docker 이미지를 빌드하고, 커밋 해시 기반 태그로 이미지를 푸시한 뒤, Kubernetes 배포에 사용하는 Kustomize overlay 파일까지 자동으로 수정하는 과정을 정리합니다. 현재 프로젝트에서는 로컬 Kubernetes 환경에 서비스를 배포하고 있으며, 이미지는 로컬 private registry에 푸시합니다. 이후 Argo CD가 Git 저장소의 변경 사항을 감지해 클러스터에 배포하는 GitOps 흐름을 사용하고 있습니다. 전체 흐름은 다음과 같습니다.main 브랜치에 코드가 push됨GitHub Actions가 실행됨커밋 해시를 기반으로 Docker..
Kustomize secretGenerator와 Argo CD 동기화 오류 해결하기
·
Devops/Kubernetes
개요이번 글에서는 Kustomize의 secretGenerator를 사용해 Secret을 생성하던 중, Argo CD에서 동기화 오류가 발생한 문제를 정리합니다. 로컬에서는 .env 파일을 기준으로 Secret을 생성해 사용할 수 있었지만, 해당 .env 파일은 민감 정보이기 때문에 GitHub에 업로드하지 않았습니다. 그 결과 Argo CD가 Git 저장소를 기준으로 매니페스트를 생성하는 과정에서 .env 파일을 찾지 못해 에러가 발생했습니다.문제 상황Kustomize에서 다음과 같은 방식으로 Secret을 생성하고 있었습니다.secretGenerator: - name: user-database-secret envs: - secrets/user-database-secret.env그리고 ..
Helm으로 Argo CD 설치 후 Gateway API와 TLS로 접속 구성하기
·
Devops/Kubernetes
이번 글에서는 Kubernetes 클러스터에 Argo CD를 설치하고, Gateway API를 이용해 외부에서 접속할 수 있도록 구성하는 과정을 정리합니다. 설치는 Helm Chart를 사용했으며, 외부 노출은 Gateway API를 통해 처리했습니다. 로컬 테스트 환경에서는 Argo CD가 생성한 인증서를 별도의 TLS Secret으로 복사해 Gateway에서 사용하도록 구성했습니다.구성 개요전체 구성 흐름은 다음과 같습니다.Helm으로 Argo CD 설치Gateway에서 사용할 TLS Secret 준비Gateway와 HTTPRoute를 적용해 Argo CD Server 외부 노출초기 admin 계정으로 로그인Argo CD Application 리소스 생성이 글에서는 Gateway가 HTTPS를 종료하..
GitHub Actions Self-hosted Runner를 WSL 환경에 설치하고 서비스로 실행하기
·
Devops/GitHub Actions
개요GitHub Actions는 기본적으로 GitHub에서 제공하는 hosted runner를 사용할 수 있습니다. 하지만 로컬 환경에서만 접근 가능한 리소스를 사용해야 하거나, 사설 레지스트리·로컬 Kubernetes 클러스터·내부 네트워크 환경에서 빌드와 배포를 수행해야 하는 경우에는 self-hosted runner를 구성하는 것이 유용합니다. 이번 글에서는 Windows 사용자 기준으로, Ubuntu WSL 개발 환경에 GitHub Actions self-hosted runner를 설치하고 서비스로 실행하는 과정을 정리합니다. 현재 개발 환경은 다음과 같습니다.Windows에서 개발 진행Ubuntu WSL을 주 개발 환경으로 사용Docker는 Windows에 설치된 Docker Desktop 사용..
Kubernetes kubelet의 컨테이너 로그 로테이션 설정 정리
·
Devops/Kubernetes
Kubernetes에서 컨테이너 로그는 노드에 계속 쌓일 수 있기 때문에, 별도의 관리가 없다면 디스크 사용량 문제가 발생할 수 있습니다.다행히 kubelet은 기본적으로 컨테이너 로그에 대해 로테이션을 수행합니다. 즉, 로그 파일이 일정 크기를 넘으면 새 파일로 교체하고, 오래된 로그 파일은 일정 개수까지만 유지합니다.이번 글에서는 kubelet의 컨테이너 로그 로테이션 기본 설정과, 로그 보관 시 주의할 점을 정리합니다.kubelet의 기본 컨테이너 로그 로테이션 설정Kubernetes 공식 문서에 따르면 kubelet은 컨테이너 로그 로테이션을 위해 다음 설정을 제공합니다.containerLogMaxSize: 10MicontainerLogMaxFiles: 5각 설정의 의미는 다음과 같습니다.cont..
Kubernetes 노드와 Docker 환경에서 디스크 용량 확인 및 정리하기
·
환경구성
개발 환경이나 로컬 Kubernetes 클러스터를 오래 사용하다 보면 어느 순간 디스크 용량이 부족해지는 경우가 있습니다. 특히 컨테이너 이미지, 빌드 캐시, Pod 로그, 컨테이너 writable layer 등이 계속 쌓이면서 /var 디렉터리의 용량이 커질 수 있습니다.이번 글에서는 Linux 환경에서 디스크 용량을 확인하는 방법과, Kubernetes에서 사용하는 containerd 및 Docker의 용량을 정리하는 방법을 정리합니다.전체 디스크 용량 확인먼저 루트 디렉터리 기준으로 어떤 디렉터리가 용량을 많이 사용하는지 확인합니다.sudo du -xh / --max-depth=1 | sort -h옵션의 의미는 다음과 같습니다.du: 디렉터리별 디스크 사용량 확인-x: 다른 파일 시스템은 제외-h:..
머지된 Git 브랜치를 안전하게 정리하는 방법
·
Git
Git 브랜치 삭제 명령어 정리Git을 사용하다 보면 기능 개발이나 버그 수정을 위해 여러 브랜치를 만들게 됩니다.작업이 끝난 브랜치를 계속 남겨두면 로컬과 원격 저장소의 브랜치 목록이 복잡해질 수 있으므로, 필요 없는 브랜치는 주기적으로 정리하는 것이 좋습니다.이번 글에서는 로컬 브랜치, 원격 브랜치, 로컬에 남아 있는 원격 브랜치 정보를 삭제하는 방법을 정리합니다.로컬 브랜치 삭제로컬에 있는 브랜치는 다음 명령어로 삭제할 수 있습니다.git branch -D 예를 들어 feature/login 브랜치를 삭제하려면 다음과 같이 실행합니다.git branch -D feature/login-D 옵션은 강제 삭제 옵션입니다.해당 브랜치가 아직 merge되지 않았더라도 삭제할 수 있으므로, 정말 삭제해도 되는..
Slack Incoming Webhook으로 채널에 메시지 보내기
·
환경구성
Slack Incoming Webhook으로 채널에 메시지 보내기이번 글에서는 Slack의 Incoming Webhook을 사용해 특정 채널로 메시지를 보내는 방법을 정리합니다.Incoming Webhook은 외부 애플리케이션이나 스크립트에서 Slack 채널로 메시지를 전송할 수 있게 해주는 기능입니다. Slack 공식 문서에서도 Webhook URL에 JSON payload를 POST 요청으로 보내면 앱이 Slack에 메시지를 게시할 수 있다고 설명합니다.예를 들어 배포 완료 알림, 에러 알림, 모니터링 알림 등을 Slack 채널로 보내고 싶을 때 사용할 수 있습니다.1. Slack 채널 생성먼저 Webhook 메시지를 받을 Slack 채널을 생성합니다.Slack에서 다음 순서로 진행합니다.Slack ..
Python 개발 환경 세팅하기: venv, Ruff, Black, Mypy, pre-commit 설정 정리
·
환경구성
개요Python 프로젝트를 시작할 때는 기능 구현에 바로 들어가기 전에 기본 개발 환경을 먼저 정리해두는 것이 좋습니다.특히 여러 명이 함께 개발하거나, 여러 서비스로 나뉜 프로젝트를 관리하는 경우에는 코드 스타일과 검사 기준이 제각각이면 유지보수가 어려워집니다.이번 글에서는 Python 프로젝트를 시작할 때 설정하면 좋은 기본 개발 환경을 정리합니다.다루는 내용은 다음과 같습니다.Python 가상환경 생성공통 개발 도구 설치pyproject.toml을 이용한 lint, formatter, type checker 설정pre-commit을 이용한 커밋 전 자동 검사 설정이 글은 Python 프로젝트에서 가상환경을 어떻게 구성해야 하는지, 그리고 ruff, black, mypy, pre-commit이 각각 ..
Ruff E712와 SQLAlchemy Boolean 조건식 처리하기
·
Language/Python
문제 상황SQLAlchemy를 사용해 상품 목록을 조회하는 조건식을 작성하던 중, Ruff에서 다음과 같은 경고가 발생했습니다.services\product-service\app\routes\products.py:94:27: E712 Avoid equality comparisons to `True`; use `if Product.is_active:` for truth checks문제가 된 코드는 다음과 같습니다.conditions.append(Product.is_active == True)Ruff의 E712 규칙은 Python 코드에서 True, False와 직접 비교하는 패턴을 피하라는 경고입니다.일반적인 Python 코드에서는 다음과 같은 비교를 권장하지 않습니다.if value == True: ..