본문 바로가기

윈도우 개발환경

쿠버네티스로 MSA DevOps 환경 구축; 2. 로컬 컨테이너 Registry

쿠버네티스로 MSA DevOps 환경 구축

1. 로컬 쿠버네티스설치

2. 로컬 컨테이너 Registry

3. Pod, Service, Deployment

4. 포트포워딩 없는 Minikube

5. URL기반 Service - Ingress

6. Helm | Chart - 패키지 설치

7. Helm | Chart - 패키지 만들기

8. ArgoCD - GitOps

3. 테스트용 docker image

쿠버네티스에 배포 테스트를 하기 위해는 docker image가 필요하다. 좀 더 DevOps에 가까운 시나리오로 진행해 보기 위해, Nginx와 같이 이미 만들어져 있는 docker image를 사용하기보다, 간단하게 프로그램으로 만들어서 테스트하는 것이 좋을 것 같아,

a. 파이썬과 FastAPI를 사용해서 간단한 API 프로그램을 만들었다.

from fastapi import FastAPI
from pydantic import BaseModel

app = FastAPI()

class User(BaseModel):
    userid: str

user = User(userid= 'sam')

@app.get("/")
def read_root():
    return {"User": "API Test"}

@app.get("/user/{user_id}")
def exist_user(user_id: str):
    if user_id == user.userid:
        return {"status": "exist"}
    return {"status": "not exist"}

 

내용은, / (root)는 API에 대한 설명을, /user/exist은 userid를 넣으면 확인해 주는 매우 단순한 API 프로그램이다. 이 내용을 "main.py"라는 이름으로 저장한다.

 

이 파일을 쿠버네티스에 배포할 하나의 마이크로서비스로 가정하고,

b. 배포를 위한 docker image로 만들기 위해 아래와 같이 Dockerfile도 만들었다.

FROM python

RUN <<EOF
pip install "fastapi[standard]"
pip install pydantic
EOF
EXPOSE 8000

WORKDIR /app
COPY main.py .

CMD ["fastapi", "dev", "main.py", "--host", "0.0.0.0"]

 

만일, Dockerfile을 작성하는데 필요한 명령어에 대해 알고 싶으면 아래 링크 참고하면 된다.

 

Dockerfile로 만드는 docker image; Dockerfile 명령 총 정리

1. DockerfileDockerfile은 사용자가 정해진 규칙/명령에 따라 Dockerfile을 만들고 docker build명령어로 실행하면 사용자가 원하는 docker image를 만들 수 있는, 일종의 설계도이다. 회사에서 프로그램을 개발

front-it.tistory.com

docker image로 만들기 위해서는 main.py와 Dockerfile을 같은 폴더에 넣고,

c. docker build명령으로 docker image를 생성한다.

docker build -t microservice_a .

 

이제 아래 명령으로

 

docker image list

 

docker image, microservice_a가 만들어진 것을 확인할 수 있다.

4. Container Registry

로컬에서 사용하는 docker명령과는 달리 쿠버네티스는 내가 만든 docker image를 가져올 registry서버가 필요하다.

 

  • Docker Hub (docker.io),
  • Amazon Elastic Container Registry (ECR),
  • Google Container Registry (gcr.io),
  • GitHub Container Registry (ghcr.io),

외에도 많은 곳에서 Docker image registry서비스를 제공하고 있지만, 계획 없이 사용하면 (또는 삭제하지 않고 등록만 한다면) 적지 않은 비용을 지불할 수도 있기 때문에, 노트북에서 개발 테스트 용도로 사용한다면 로컬 registry를 설치하는 것이 좋다. 

a. Docker Registry v2

만일 Docker desktop을 사용해서 쿠버네티스 클러스터를 설치해서 사용하고 있다면, docker registry v2를 설치해야 한다. Docker는 registry라는 이미지와 태그로 2로 설정된 docker registry v2 reference implementation을 제공하고 있으며 다음 명령으로 실행할 수 있다.

 

docker run -d -p 5000:5000 --restart=always --name registry registry:2

 

설치 후 추가 작업 없이 바로 registry를 사용해서 작업을 진행할 수 있다.

b. minikube registry addon

만일 사용하고 있는 쿠버네티스 클러스터가 minikube이면 제공되는 registry addon을 minikube명령으로 enable 하면 사용이 가능하다.

 

minikube.exe addons enable registry

 

minikube registry는 80번 포트로 서비스가 되기 때문에 5000번 포트로 포트포워딩을 해줘야 사용이 가능하다.

 

kubectl port-forward --namespace kube-system service/registry 5000:80

 

registry서비스가 잘 동작하면 catalog조회하는 API를 호출했을 때 비어 있는 repository목록을 json값으로 받을 수 있다.

 

curl http://localhost:5000/v2/_catalog

 

마지막으로, docker가 실행되는 가상머쉰으로 요청되는 5000번 포트의 네트워크 요청을 이 registry서버로 redirect시킨다.

 

docker run --rm -it --network=host alpine ash -c "apk add socat && socat TCP-LISTEN:5000,reuseaddr,fork TCP:host.docker.internal:5000"

c. 로컬 registry에 이미지 등록

  • 먼저 태그를 지정해야 하는데, Dockerfile로 이미지를 만들 때 태그를 지정할 수도 있고
docker build . -t localhost:5000/microservice-a:latest

 

앞에서 만든 이미지에 태그(tag)를 달아도 된다.

 

docker tag microservice-a:latest localhost:5000/microservice-a

 

  • 태그를 단 이미지를 registry에 push 한다.
docker push localhost:5000/microservice-a

 

이제 이미지를 삭제하여도

 

docker image rm localhost:5000/microservice-a

 

Registry에서 pull 하거나 직접 실행(run)할 수 있다.

 

docker pull localhost:5000/microservice-a