Azure Container Service (Kubernetes)와 DevOps 구현 사례 #3 – DevOps

마이크로소프트 아키텍쳐로 만들어진 애플리케이션을 개발하거나 SaaS 애플리케이션을 개발한다면 DevOps는 어쩌면 필수다. 개발자가 최신 소스를 소스 저장소에 올리면 자동으로 빌드를 하고 Unit 테스트 등 기본 테스트를 자동으로 진행하는 CI(Continuous Integration), 빌드가 성공하면 테스트 환경에 자동으로 배포가 되는 CD(Continuous Deployment) 가 없으면 실수가 많아지고 개발자가 코드에 집중하지 못하는 등 어려움이 많아진다.

Visual Studio Team Services

Visual Studio 패밀리 중에 Visual Studio Team Services (VSTS)가 있다. 기존 TFS (Team Foundation Server)의 클라우드 버전이고 가입하면 바로 쓸 수 있는 SaaS 서비스이다. 처음 5명에 대해서는 무료 사용이 가능하다. 가입을 하면 사이트가 하나 생기기 프로젝트를 만들수 있다. 사실 VSTS에는 소프트웨어 라이프사이클 전체를 관리할 수 있는 모든 기능이 있지만 여기서는 Build와 Release에 집중하겠다.

Build 설정

빌드는 개발자가 Github 마스터 브랜치에 소스를 커밋하면 시작하도록 설정할 수 있다. 즉 트리거링을 소스코드 커밋으로 할 수 있다. 빌드가 시작되면 3가지 작업을 수행하도록 설정해 놨다.

  1. Maven pom.xml : 로컬 개발할 때와 마찬가지로 maven 으로 빌드를 실행하고 이미지를 만든다.
  2. Push an image: Private registry에 만든 이미지를 push (업로드) 한다.
  3. Publish Artifact: kubcofig : Kubernetes 배포에 사용하는 view-demo.yaml 파일을 VSTS에 업로드 해둔다.

VSTS의 특징이라면 UI를 통해서 설정을 직관적으로 할 수 있는 것이다. 필요한 작업을 하나 끌어다 한 단계씩 설정을 해나가면 실제 빌드 될 때 그대로 실행된다.

빌드 실행

소스코드를 commit 하면 시작되도록 trigger를 설정해 놓았다. VSTS에서는 로그를 보면서 실행되는 내용을 확인 할 수 있다. 빌드는 Hosted Agent라는 빌드 머신에서 수행이 되는데 Hosted Agent는 VSTS가 제공하는 클라우드에 있는 빌드 머신이다. 여기에는 기본적인 개발환경이 설치되어 있지만 그 외에는 빈통이다. 따라서 제일 처음에 소스 저장소에서 소스를 가져온 후에 우리가 만들어 놓은 빌드 태스크를 하나씩 실행한다.

빌드 결과 화면은 아래와 같다.

Release 설정

빌드가 성공하면 개발/테스트 서버 환경에 배포를 자동으로 수행 할 수 있다. 릴리즈 작업은 하나만 설정해놨다. view-demo.yml 파일의 설정 그대로 Kubernetes 클러스터에 배포를 하는 작업이다.

릴리즈 실행 결과 로그파일을 볼 수 있다.

view-demo.yml 

apiVersion: apps/v1beta1
kind: Deployment
metadata:
  name: view-demo
spec:
  replicas: 1
  minReadySeconds: 30
  strategy:
    type: RollingUpdate
    rollingUpdate:
      maxUnavailable:
      maxSurge: 1
  template:
    metadata:
      labels:
        app: view-demo
    spec:
      #imagePullSecrets:
      #  - name: 
      containers:
      - name: view-demo
        image: opencloudregistry.azurecr.io/clouddemo/view-demo:2
        ports:
        - containerPort: 8443
        name : view-demo

Kubernetes 배포에 사용할 yaml 파일이다. replicas 의 숫자를 높이면 서비스 인스턴스가 늘어난다. RollingUpdate 를 하면 새 버전의 pod를 만들고 기존버전의 pod를 종료하는 식으로 업데이트가 되기 때문에 서비스가 정지되지 않고 업데이트 된다. 이 과정에서 minReadySeconds 만큼 기다리게 할 수 있다. 애플리케이션이 올라가는 시간만큼 기다리게 할 수 있다. 상세한 설정은 Kubernetes Deployment 문서를 참조하기 바란다.

개발자의 로컬 개발환경에서 테스트 완료된 코드는 소스 저장소로 커밋되고 다시 VSTS에서 빌드와 배포까지 자동화 할 수 있다. 이렇게 되면 개발자들은 코드에 집중 할 수 있게된다.