Kubernetes 이야기

DevSpace 본문

Kubernetes/devops

DevSpace

kmaster 2022. 9. 29. 22:49
반응형

DevSpace는 Kubernetes용 클라이언트 전용 오픈 소스 개발자 도구이다.

 

  • Kubernetes 내에서 직접 애플리케이션 빌드, 테스트 및 디버그
  • 핫 리로딩으로 개발 : 이미지를 다시 빌드하거나 컨테이너를 다시 시작하지 않고 실행 중인 컨테이너를 업데이트 한다.
  • 팀 내, 그리고 개발, 스테이징 및 프로덕션 전반에 걸쳐 배포 워크플로 를 통합한다.
  • 이미지 구축 및 배포를 위한 반복 작업 자동화

아키텍처

https://devspace.sh/docs/getting-started/introduction

설치

DevSpace는 client 에서 실행하는 바이너리 파일 한개로 구성된다. (서버쪽에 별도 설치할 구성요소는 없다)

# curl -L -o devspace "https://github.com/loft-sh/devspace/releases/latest/download/devspace-linux-amd64" && sudo install -c -m 0755 devspace /usr/local/bin

시작하기

프로젝트 준비

# git clone https://github.com/kmaster8/flask-helloworld
# cd flask-helloworld

프로젝트 초기화

# devspace init


     %########%
     %###########%       ____                 _____
         %#########%    |  _ \   ___ __   __ / ___/  ____    ____   ____ ___
         %#########%    | | | | / _ \\ \ / / \___ \ |  _ \  / _  | / __// _ \
     %#############%    | |_| |(  __/ \ V /  ____) )| |_) )( (_| |( (__(  __/
     %#############%    |____/  \___|  \_/   \____/ |  __/  \__,_| \___\\___|
 %###############%                                  |_|
 %###########%


info Detecting programming language...

? Select the programming language of this project  [Use arrows to move, type to filter]
  java-maven
  javascript
  php
> python
  ruby
  typescript
  other

프로젝트의 언어를 선택한다.  (Python)

? How do you want to deploy this project?  [Use arrows to move, type to filter]
> helm
  kubectl
  kustomize

배포할 유형을 선택한다. (helm)

? Do you already have a Helm chart for this project?  [Use arrows to move, type to filter]
> No
  Yes

작성된 Helm 차트 유무를 선택한다. (No)

? Do you want to develop this project with DevSpace or just deploy it?  [Use arrows to move, type to filter]  [Use arrows to move, type to filter]
> I want to develop this project and my current working dir contains the source code
  I just want to deploy this project

DevSpace를 초기화할 때 소스 코드의 변경 사항을 모니터링하거나 애플리케이션 배포에 필요한 것만 설정하도록 요청할 수 있다.

? How should DevSpace build the container image for this project?  [Use arrows to move, type to filter]
> Use this existing Dockerfile: ./Dockerfile
  Use a different Dockerfile (e.g. ./backend/Dockerfile)
  Use alternative build tool (e.g. jib, bazel)
  Skip / I don't know

Dockerfile 위치를 선택한다. 기타 registry server 등의 옵션을 선택하면 초기화가 완료된다.

 

개발하기

DevSpace를 사용하면 매우 빠른 핫 리로딩 워크플로를 통해 Kubernetes 클러스터 내에서 직접 애플리케이션을 개발할 수 있다.

DevSpace에서 개발 모드를 시작하기 전에 DevSpace가 올바른 클러스터와 네임스페이스를 사용하는지 확인해야 한다.

# devspace use context

? Which context do you want to use? kubernetes-admin@kubernetes
done Successfully set kube-context to 'kubernetes-admin@kubernetes'

# devspace use namespace test
info The default namespace of your current kube-context 'kubernetes-admin@kubernetes' has been updated to 'test'
         To revert this operation, run: devspace use namespace

done Successfully set default namespace to 'test'

다음 명령을 실행하여 프로젝트를 배포하고 개발 컨테이너를 시작한다.

# devspace dev
info Using namespace 'test'
info Using kube context 'kubernetes-admin@kubernetes'
deploy:app Deploying chart /root/.devspace/component-chart/component-chart-0.8.5.tgz (app) with helm...
deploy:app Deployed helm chart (Release revision: 1)
deploy:app Successfully deployed app with helm
dev:app Waiting for pod to become ready...
dev:app DevSpace is waiting, because Pod app-devspace-7c8fbb95f5-2qmkl has status: ContainerCreating
dev:app Selected pod app-devspace-7c8fbb95f5-2qmkl
dev:app open  Opening 'http://localhost:8080' as soon as application will be started
dev:app ports Port forwarding started on: 8080 -> 8080
dev:app sync  Sync started on: ./ <-> ./
dev:app sync  Waiting for initial sync to complete
dev:app sync  Initial sync completed
dev:app ssh   Port forwarding started on: 10273 -> 8022
dev:app proxy Port forwarding started on: 10813 <- 10567
dev:app ssh   Use 'ssh app.flask-helloworld.devspace' to connect via SSH
dev:app term  Opening shell to container-0:app-devspace-7c8fbb95f5-2qmkl (pod:container)

     %########%
     %###########%       ____                 _____
         %#########%    |  _ \   ___ __   __ / ___/  ____    ____   ____ ___
         %#########%    | | | | / _ \\ \ / / \___ \ |  _ \  / _  | / __// _ \
     %#############%    | |_| |(  __/ \ V /  ____) )| |_) )( (_| |( (__(  __/
     %#############%    |____/  \___|  \_/   \____/ |  __/  \__,_| \___\\___|
 %###############%                                  |_|
 %###########%


Welcome to your development container!

This is how you can work with it:
- Files will be synchronized between your local machine and this container
- Some ports will be forwarded, so you can access this container via localhost
- Run `python main.py` to start the application

devspace ./app #

개발 컨테이너에 대한 터미널이 열리면 명령을 실행하여 애플리케이션을 시작한다.

# k get all
NAME                                READY   STATUS    RESTARTS   AGE
pod/app-devspace-5b7f968d78-k6zgt   1/1     Running   0          70s

NAME          TYPE        CLUSTER-IP     EXTERNAL-IP   PORT(S)    AGE
service/app   ClusterIP   10.103.218.7   <none>        8080/TCP   71s

NAME                           READY   UP-TO-DATE   AVAILABLE   AGE
deployment.apps/app            0/0     0            0           71s
deployment.apps/app-devspace   1/1     1            1           70s

NAME                                      DESIRED   CURRENT   READY   AGE
replicaset.apps/app-6f9f978d88            0         0         0       71s
replicaset.apps/app-devspace-5b7f968d78   1         1         1       70s

 

# pip install --no-cache-dir -r requirements.txt
# python app.py

이제 app.py를 수정하게 되면 로컬의 app.py가 동일하게 수정된다. 작업이 모두 완료되면 deploy를 진행한다.

# devspace deploy
info Using namespace 'test'
info Using kube context 'kubernetes-admin@kubernetes'
build:app Couldn't find a running docker daemon. Will fallback to kaniko
build:app Ensuring image pull secret for registry: ghcr.io...
build:app Created image pull secret test/devspace-pull-secrets
build:app Rebuild image  because tag is missing
build:app Building image 'ghcr.io/kmaster8/flask-helloworld/app:52e4a79' with engine 'kaniko'
build:app Waiting for build init container to start...
build:app Uploading files to build container...
build:app Uploaded files to container
build:app Waiting for kaniko container to start...
build:app Build pod has started
build:app Printing logs of pod:container devspace-build-kaniko-5l7wp:kaniko
build:app INFO[0000] Retrieving image manifest python:3.10-alpine
build:app INFO[0000] Retrieving image python:3.10-alpine from registry index.docker.io
build:app INFO[0005] Retrieving image manifest python:3.10-alpine
build:app INFO[0005] Returning cached image manifest
build:app INFO[0005] Built cross stage deps: map[]
...

다음과 같이 배포가 완료됨을 알 수 있다.

# k get deployments
NAME                      READY   UP-TO-DATE   AVAILABLE   AGE
app                       1/1     1            1           19m
app-devspace              1/1     1            1           19m

 

https://devspace.sh/docs/getting-started/

반응형

'Kubernetes > devops' 카테고리의 다른 글

Backstage  (0) 2022.10.02
dapr  (0) 2022.09.30
Tekton Trigger  (0) 2022.09.14
Tekton을 이용한 CI/CD  (0) 2022.09.12
Jenkins와 Keycloak을 이용한 OIDC 연동  (0) 2022.09.10
Comments