본문 바로가기
인프라 지식

Apache Httpd docker & k8s 배포

by 스퀴시 2024. 12. 3.
728x90
SMALL

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를 활용한 프록시 서버의 자동화된 배포 환경을 구축할 수 있었습니다. 이 글이 비슷한 환경을 구축하고자 하는 분들께 도움이 되길 바랍니다.

추가 문의나 의견이 있으시면 댓글로 남겨주세요!

LIST