본문 바로가기
서버구축 (WEB,DB)

Docker 환경 Container를 Kubernetes 환경으로 이전하는 과정

by 날으는물고기 2023. 11. 29.

Docker 환경 Container를 Kubernetes 환경으로 이전하는 과정

Kubernetes vs Docker – Which One Should You Use?

간단한 Flask 어플리케이션을 Docker에서 Kubernetes로 이전하는 과정을 정리했습니다.

  1. 도커 이미지 수정
    • 기존 Dockerfile에서 필요한 라이브러리 및 환경 설정을 추가하거나 수정한다.
    FROM python:3.8
    
    WORKDIR /app
    
    COPY requirements.txt .
    
    RUN pip install --no-cache-dir -r requirements.txt
    
    COPY . .
    
    CMD ["python", "app.py"]
  2. Kubernetes 매니페스트 파일 작성
    • deployment.yamlservice.yaml 파일을 작성한다.
    # deployment.yaml
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: flask-app
    spec:
      replicas: 3
      selector:
        matchLabels:
          app: flask-app
      template:
        metadata:
          labels:
            app: flask-app
        spec:
          containers:
          - name: flask-app
            image: your-docker-image:tag
            ports:
            - containerPort: 5000
    # service.yaml
    apiVersion: v1
    kind: Service
    metadata:
      name: flask-app-service
    spec:
      selector:
        app: flask-app
      ports:
      - protocol: TCP
        port: 80
        targetPort: 5000
      type: LoadBalancer
  3. Kubernetes 클러스터에 배포
    • Kubernetes 클러스터에 적용한다.
    kubectl apply -f deployment.yaml
    kubectl apply -f service.yaml
  4. 로그 및 모니터링 설정
    • 필요한 경우, Prometheus 및 Grafana와 같은 도구를 사용하여 로깅 및 모니터링을 설정한다.
  5. 테스트 및 디버깅
    • 어플리케이션의 엔드포인트로 접속하여 정상적으로 동작하는지 확인하고, 필요하다면 로그를 확인한다.
  6. 도커 정리
    • Kubernetes로의 성공적인 이전 후, 기존의 Docker 컨테이너를 삭제한다.

이런식으로 단계를 진행하면 도커에서 Kubernetes로 어플리케이션을 이전할 수 있습니다. 당연히 어플리케이션과 환경에 따라 조금씩 다를 수 있지만, 이런 예시를 참고하여 진행하면 좋습니다.

이전하기 위해 데이타를 백업하고 복원이 필요한 경우도 있습니다. (예, Elasticsearch)

  1. Elasticsearch 백업
    • Elasticsearch 클러스터의 데이터를 백업합니다.
      docker run --rm -v es-data:/backup -v $(pwd):/host es-image \
        tar czvf /host/elasticsearch-backup.tar.gz /usr/share/elasticsearch/data
    • 여기서 es-image는 현재 운영중인 Elasticsearch 이미지를 나타냅니다.
  2. Minikube에 백업 파일 복사
    • 백업 파일을 Minikube 노드로 복사합니다.
      minikube ssh "mkdir /mnt/data"
      minikube scp elasticsearch-backup.tar.gz minikube:/mnt/data/
  3. Minikube 클러스터 내 Elasticsearch 정지
    • Elasticsearch가 동작 중인지 확인하고, 동작 중이라면 정지시킵니다.
      kubectl get pods
      kubectl delete pod <elasticsearch-pod-name>
  4. Minikube에 Elasticsearch 복원
    • 백업 파일을 사용하여 Elasticsearch 데이터를 Minikube 클러스터에 복원합니다.
      kubectl cp elasticsearch-backup.tar.gz <elasticsearch-pod-name>:/usr/share/elasticsearch/
      kubectl exec <elasticsearch-pod-name> -- tar xzvf /usr/share/elasticsearch/elasticsearch-backup.tar.gz -C /usr/share/elasticsearch/data --strip-components=1
  5. Elasticsearch Pod 재시작
    • Elasticsearch Pod를 다시 시작하여 새로운 데이터로 클러스터가 올라가게 합니다.
      kubectl delete pod <elasticsearch-pod-name>
  6. 클러스터 확인
    • Elasticsearch 클러스터가 정상적으로 동작하는지 확인합니다.
      kubectl get pods

이렇게 하면 Elasticsearch 데이터를 Docker에서 Minikube Kubernetes 클러스터로 성공적으로 이전할 수 있습니다. 하지만 주의할 점은, Elasticsearch의 버전이나 설정에 따라 세부 단계가 달라질 수 있다는 것입니다. 본 단계들은 일반적인 경우를 가정한 것이라서 상황에 따라 조정이 필요할 수 있습니다.

배포를 위한 Kubernetes 매니페스트를 만들고 적용하는 과정을 살펴보겠습니다.

  1. Elasticsearch 배포용 매니페스트 작성
    • elasticsearch-deployment.yaml 파일을 생성하여 Elasticsearch를 배포하는 매니페스트를 작성합니다.
      apiVersion: apps/v1
      kind: Deployment
      metadata:
        name: elasticsearch
      spec:
        replicas: 1
        selector:
          matchLabels:
            app: elasticsearch
        template:
          metadata:
            labels:
              app: elasticsearch
          spec:
            containers:
            - name: elasticsearch
              image: docker.elastic.co/elasticsearch/elasticsearch:7.10.0
              ports:
              - containerPort: 9200
              - containerPort: 9300
              volumeMounts:
              - name: elasticsearch-data
                mountPath: /usr/share/elasticsearch/data
            volumes:
            - name: elasticsearch-data
              persistentVolumeClaim:
                claimName: elasticsearch-data
  2. Elasticsearch 서비스 매니페스트 작성
    • elasticsearch-service.yaml 파일을 생성하여 Elasticsearch를 위한 서비스를 정의하는 매니페스트를 작성합니다.
      apiVersion: v1
      kind: Service
      metadata:
        name: elasticsearch-service
      spec:
        selector:
          app: elasticsearch
        ports:
        - protocol: TCP
          port: 9200
          targetPort: 9200
        - protocol: TCP
          port: 9300
          targetPort: 9300
  3. PersistentVolume 및 PersistentVolumeClaim 매니페스트 작성
    • elasticsearch-pv.yamlelasticsearch-pvc.yaml 파일을 생성하여 Elasticsearch 데이터를 저장할 PersistentVolume 및 PersistentVolumeClaim을 정의하는 매니페스트를 작성합니다.
      # elasticsearch-pvc.yaml
      apiVersion: v1
      kind: PersistentVolumeClaim
      metadata:
        name: elasticsearch-data
      spec:
        accessModes:
          - ReadWriteOnce
        resources:
          requests:
            storage: 1Gi
    • # elasticsearch-pv.yaml apiVersion: v1 kind: PersistentVolume metadata: name: elasticsearch-pv spec: capacity: storage: 1Gi accessModes: - ReadWriteOnce hostPath: path: /mnt/data/elasticsearch
  4. 매니페스트 적용
    • 작성한 매니페스트 파일들을 적용하여 Elasticsearch를 배포합니다.
      kubectl apply -f elasticsearch-pv.yaml
      kubectl apply -f elasticsearch-pvc.yaml
      kubectl apply -f elasticsearch-deployment.yaml
      kubectl apply -f elasticsearch-service.yaml
  5. 클러스터 확인
    • Elasticsearch 클러스터가 정상적으로 배포되었는지 확인합니다.
      kubectl get pods

이제 Elasticsearch를 Minikube Kubernetes 클러스터로 성공적으로 배포하고 데이터를 이전했습니다. 매니페스트들은 예시이므로 상황에 따라 수정이 필요할 수 있습니다.

Kibana를 Docker에서 Kubernetes로 이전하고 Elasticsearch와 연동하는 과정을 단계별로 정리했습니다.

  1. Kibana 배포용 매니페스트 작성
    • kibana-deployment.yaml 파일을 생성하여 Kibana를 배포하는 매니페스트를 작성합니다.
      apiVersion: apps/v1
      kind: Deployment
      metadata:
        name: kibana
      spec:
        replicas: 1
        selector:
          matchLabels:
            app: kibana
        template:
          metadata:
            labels:
              app: kibana
          spec:
            containers:
            - name: kibana
              image: docker.elastic.co/kibana/kibana:7.10.0
              ports:
              - containerPort: 5601
              env:
              - name: ELASTICSEARCH_HOSTS
                value: "http://elasticsearch-service:9200"
  2. Kibana 서비스 매니페스트 작성
    • kibana-service.yaml 파일을 생성하여 Kibana를 위한 서비스를 정의하는 매니페스트를 작성합니다.
      apiVersion: v1
      kind: Service
      metadata:
        name: kibana-service
      spec:
        selector:
          app: kibana
        ports:
        - protocol: TCP
          port: 5601
          targetPort: 5601
  3. 매니페스트 적용
    • 작성한 매니페스트 파일들을 적용하여 Kibana를 배포합니다.
      kubectl apply -f kibana-deployment.yaml
      kubectl apply -f kibana-service.yaml
  4. Kibana 접속 확인
    • Kibana가 정상적으로 배포되었는지 확인합니다.
      kubectl get pods
  5. Kibana와 Elasticsearch 연동 확인
    • Kibana에 접속하여 Elasticsearch와 연동이 정상인지 확인합니다. 웹 브라우저를 열고 http://<Minikube-IP>:<NodePort>로 접속하여 확인할 수 있습니다.

이제 Elasticsearch와 Kibana가 Minikube Kubernetes 클러스터에서 연동되어 동작하게 되었어요. 역시나 이 단계들도 예시이므로 상황에 따라 수정이 필요할 수 있습니다.

728x90

댓글