간단한 Flask 어플리케이션을 Docker에서 Kubernetes로 이전하는 과정을 정리했습니다.
- 도커 이미지 수정
- 기존 Dockerfile에서 필요한 라이브러리 및 환경 설정을 추가하거나 수정한다.
FROM python:3.8 WORKDIR /app COPY requirements.txt . RUN pip install --no-cache-dir -r requirements.txt COPY . . CMD ["python", "app.py"]
- Kubernetes 매니페스트 파일 작성
deployment.yaml
및service.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
- Kubernetes 클러스터에 배포
- Kubernetes 클러스터에 적용한다.
kubectl apply -f deployment.yaml kubectl apply -f service.yaml
- 로그 및 모니터링 설정
- 필요한 경우, Prometheus 및 Grafana와 같은 도구를 사용하여 로깅 및 모니터링을 설정한다.
- 테스트 및 디버깅
- 어플리케이션의 엔드포인트로 접속하여 정상적으로 동작하는지 확인하고, 필요하다면 로그를 확인한다.
- 도커 정리
- Kubernetes로의 성공적인 이전 후, 기존의 Docker 컨테이너를 삭제한다.
이런식으로 단계를 진행하면 도커에서 Kubernetes로 어플리케이션을 이전할 수 있습니다. 당연히 어플리케이션과 환경에 따라 조금씩 다를 수 있지만, 이런 예시를 참고하여 진행하면 좋습니다.
이전하기 위해 데이타를 백업하고 복원이 필요한 경우도 있습니다. (예, Elasticsearch)
- 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 이미지를 나타냅니다.
- Elasticsearch 클러스터의 데이터를 백업합니다.
- Minikube에 백업 파일 복사
- 백업 파일을 Minikube 노드로 복사합니다.
minikube ssh "mkdir /mnt/data" minikube scp elasticsearch-backup.tar.gz minikube:/mnt/data/
- 백업 파일을 Minikube 노드로 복사합니다.
- Minikube 클러스터 내 Elasticsearch 정지
- Elasticsearch가 동작 중인지 확인하고, 동작 중이라면 정지시킵니다.
kubectl get pods kubectl delete pod <elasticsearch-pod-name>
- Elasticsearch가 동작 중인지 확인하고, 동작 중이라면 정지시킵니다.
- 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
- 백업 파일을 사용하여 Elasticsearch 데이터를 Minikube 클러스터에 복원합니다.
- Elasticsearch Pod 재시작
- Elasticsearch Pod를 다시 시작하여 새로운 데이터로 클러스터가 올라가게 합니다.
kubectl delete pod <elasticsearch-pod-name>
- Elasticsearch Pod를 다시 시작하여 새로운 데이터로 클러스터가 올라가게 합니다.
- 클러스터 확인
- Elasticsearch 클러스터가 정상적으로 동작하는지 확인합니다.
kubectl get pods
- Elasticsearch 클러스터가 정상적으로 동작하는지 확인합니다.
이렇게 하면 Elasticsearch 데이터를 Docker에서 Minikube Kubernetes 클러스터로 성공적으로 이전할 수 있습니다. 하지만 주의할 점은, Elasticsearch의 버전이나 설정에 따라 세부 단계가 달라질 수 있다는 것입니다. 본 단계들은 일반적인 경우를 가정한 것이라서 상황에 따라 조정이 필요할 수 있습니다.
배포를 위한 Kubernetes 매니페스트를 만들고 적용하는 과정을 살펴보겠습니다.
- 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
- 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
- PersistentVolume 및 PersistentVolumeClaim 매니페스트 작성
elasticsearch-pv.yaml
와elasticsearch-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
- 매니페스트 적용
- 작성한 매니페스트 파일들을 적용하여 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
- 작성한 매니페스트 파일들을 적용하여 Elasticsearch를 배포합니다.
- 클러스터 확인
- Elasticsearch 클러스터가 정상적으로 배포되었는지 확인합니다.
kubectl get pods
- Elasticsearch 클러스터가 정상적으로 배포되었는지 확인합니다.
이제 Elasticsearch를 Minikube Kubernetes 클러스터로 성공적으로 배포하고 데이터를 이전했습니다. 매니페스트들은 예시이므로 상황에 따라 수정이 필요할 수 있습니다.
Kibana를 Docker에서 Kubernetes로 이전하고 Elasticsearch와 연동하는 과정을 단계별로 정리했습니다.
- 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"
- Kibana 서비스 매니페스트 작성
kibana-service.yaml
파일을 생성하여 Kibana를 위한 서비스를 정의하는 매니페스트를 작성합니다.apiVersion: v1 kind: Service metadata: name: kibana-service spec: selector: app: kibana ports: - protocol: TCP port: 5601 targetPort: 5601
- 매니페스트 적용
- 작성한 매니페스트 파일들을 적용하여 Kibana를 배포합니다.
kubectl apply -f kibana-deployment.yaml kubectl apply -f kibana-service.yaml
- 작성한 매니페스트 파일들을 적용하여 Kibana를 배포합니다.
- Kibana 접속 확인
- Kibana가 정상적으로 배포되었는지 확인합니다.
kubectl get pods
- Kibana가 정상적으로 배포되었는지 확인합니다.
- Kibana와 Elasticsearch 연동 확인
- Kibana에 접속하여 Elasticsearch와 연동이 정상인지 확인합니다. 웹 브라우저를 열고
http://<Minikube-IP>:<NodePort>
로 접속하여 확인할 수 있습니다.
- Kibana에 접속하여 Elasticsearch와 연동이 정상인지 확인합니다. 웹 브라우저를 열고
이제 Elasticsearch와 Kibana가 Minikube Kubernetes 클러스터에서 연동되어 동작하게 되었어요. 역시나 이 단계들도 예시이므로 상황에 따라 수정이 필요할 수 있습니다.
728x90
댓글