Kubernetes에서 Apache HTTPD 프록시 서버 구축 및 Jenkins를 이용한 CI/CD 자동화
최근 프로젝트에서 여러 서비스에 대한 프록시 웹 서버를 구축하고, 이를 Kubernetes 환경에서 Docker 컨테이너로 배포한 후, Jenkins를 활용하여 CI/CD 자동화를 구현하게 되었습니다. 이 글에서는 그 과정을 상세하게 공유하고자 합니다.
목차
1. 프로젝트 개요
2. 구성 설계
3. Git 저장소 구성
4. Jenkins를 이용한 CI/CD 파이프라인 구축
5. Kubernetes에 배포
6. 최종 정리
프로젝트 개요
• 목적: 12개의 프록시 웹 서버를 각각 Docker 컨테이너로 배포하고, 설정 파일(httpd.conf)의 변경 사항을 Git과 Jenkins를 통해 자동으로 적용되도록 구축.
• 환경:
• Kubernetes: 컨테이너 오케스트레이션을 위한 플랫폼.
• Docker: 컨테이너화 기술.
• Jenkins: CI/CD 자동화를 위한 도구.
• Git: 소스 코드 관리.
구성 설계
필요한 구성 요소
1. Git 저장소 12개: 각 프록시 서버별로 독립적인 설정 관리.
2. Jenkins 파이프라인 12개: 각 프록시 서버의 변경 사항을 감지하고 빌드 및 배포.
3. Docker 이미지: 각 프록시 서버별로 고유한 Docker 이미지 생성.
4. Kubernetes Pod: 각 프록시 서버를 독립적인 Pod로 배포.
Git 저장소 구성
저장소 구조
각 프록시 서버는 독립적인 Git 저장소를 가지며, 아래와 같은 구조를 갖습니다.
proxy-server-1/
├── Dockerfile # Docker 이미지를 빌드하는 설정 파일
├── httpd.conf # Apache HTTPD 설정 파일 (프록시 설정)
└── README.md # 프로젝트 설명
Dockerfile 작성
FROM httpd:2.4
# 필요한 Apache 모듈 활성화
RUN sed -i '/^#LoadModule proxy_module/ s/^#//' /usr/local/apache2/conf/httpd.conf
RUN sed -i '/^#LoadModule proxy_http_module/ s/^#//' /usr/local/apache2/conf/httpd.conf
# Git에서 가져온 httpd.conf 파일로 교체
COPY ./httpd.conf /usr/local/apache2/conf/
httpd.conf
httpd.conf 예시 (Proxy Server 1)
ProxyRequests Off
<Proxy *>
Require all granted
</Proxy>
ProxyPass / http://backend-service-1/
ProxyPassReverse / http://backend-service-1/
Git 저장소 초기화 및 푸시
git init proxy-server-1
cd proxy-server-1
git add Dockerfile httpd.conf README.md
git commit -m "Initial commit for Proxy Server 1"
git remote add origin https://github.com/yourusername/proxy-server-1.git
git push -u origin main
Jenkins를 이용한 CI/CD 파이프라인 구축
Jenkins 파이프라인 구성
1. 파이프라인 Job 생성: Jenkins에서 12개의 파이프라인 Job을 생성합니다.
2. 공통 Jenkinsfile 작성: 각 저장소에 동일한 Jenkinsfile을 사용합니다.
Jenkinsfile 예시
pipeline {
agent any
environment {
DOCKER_IMAGE = "yourregistry/proxy-server-${params.SERVER_ID}:${env.BUILD_NUMBER}"
}
parameters {
string(name: 'SERVER_ID', defaultValue: '1', description: 'Proxy Server ID')
}
stages {
stage('Checkout') {
steps {
git url: "https://github.com/yourusername/proxy-server-${params.SERVER_ID}.git", branch: 'main'
}
}
stage('Build Docker Image') {
steps {
script {
dockerImage = docker.build("${DOCKER_IMAGE}")
}
}
}
stage('Push Docker Image') {
steps {
script {
docker.withRegistry('https://yourregistry/', 'docker-credentials') {
dockerImage.push()
}
}
}
}
stage('Deploy to Kubernetes') {
steps {
sh """
kubectl apply -f k8s/deployment-${params.SERVER_ID}.yaml
kubectl apply -f k8s/service-${params.SERVER_ID}.yaml
"""
}
}
}
}
Jenkins 파이프라인 실행
• 각 파이프라인 Job에서 해당 SERVER_ID를 파라미터로 전달하여 실행합니다.
• Git 저장소에 변경 사항이 푸시되면 Jenkins가 자동으로 빌드 및 배포를 수행합니다.
Kubernetes에 배포
Deployment 및 Service 매니페스트 작성
각 프록시 서버에 대한 Kubernetes 매니페스트 파일을 작성합니다.
k8s/deployment-1.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: proxy-server-1
labels:
app: proxy-server-1
spec:
replicas: 1
selector:
matchLabels:
app: proxy-server-1
template:
metadata:
labels:
app: proxy-server-1
spec:
containers:
- name: proxy-server
image: yourregistry/proxy-server-1:latest
ports:
- containerPort: 80
k8s/service-1.yaml
apiVersion: v1
kind: Service
metadata:
name: proxy-server-1
spec:
selector:
app: proxy-server-1
ports:
- protocol: TCP
port: 80
targetPort: 80
type: LoadBalancer
• 나머지 서버들에 대해서도 deployment-2.yaml, service-2.yaml 등으로 작성합니다.
최종 정리
동작 과정
1. 설정 변경 및 Git 푸시: 각 프록시 서버의 httpd.conf를 수정하고 Git에 푸시합니다.
2. Jenkins 자동 빌드 및 배포: Jenkins가 변경 사항을 감지하고 Docker 이미지를 빌드한 후 Kubernetes에 배포합니다.
3. Kubernetes에서 Pod 실행: 각 프록시 서버가 독립적인 Pod로 실행되며, 변경된 설정이 적용됩니다.
4. 서비스 확인: 각 프록시 서버의 동작을 확인하고, 필요에 따라 추가 설정을 진행합니다.
장점
• 독립성: 각 프록시 서버가 독립적으로 관리되어 변경 사항의 영향 범위가 명확합니다.
• 자동화: Jenkins를 통한 CI/CD 파이프라인으로 설정 변경이 자동으로 적용됩니다.
• 확장성: 필요에 따라 프록시 서버를 추가하거나 수정하기 용이합니다.
고려 사항
• 관리 복잡도: Git 저장소와 Jenkins 파이프라인이 많아지므로 관리에 주의가 필요합니다.
• 중복 제거: 공통된 설정이나 스크립트는 템플릿화하여 재사용성을 높일 수 있습니다.
마치며
이번 프로젝트를 통해 Kubernetes와 Jenkins를 활용한 프록시 서버의 자동화된 배포 환경을 구축할 수 있었습니다. 이 글이 비슷한 환경을 구축하고자 하는 분들께 도움이 되길 바랍니다.
추가 문의나 의견이 있으시면 댓글로 남겨주세요!
'인프라 지식' 카테고리의 다른 글
도커(Docker)란 무엇인가? A부터 Z까지 알아보기 (2) | 2024.07.23 |
---|---|
쿠버네티스(Kubernetes)란 무엇인가? A부터 Z까지 알아보기 (0) | 2024.07.23 |
OpenSSL과 Java Keytool을 사용한 SSL 인증서의 .crt에서 .jks로의 변환 (0) | 2023.06.21 |