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

온프레미스에 배포하던 Multi-factor Authentication 솔루션을 클라우드로 전환하면서 SaaS 서비스를 준비하고 있는 에어큐브(주)와 함께 해커톤을 이틀간 진행했었다. 에어큐브는 SaaS를 준비하면서 기존 아키텍쳐를 마이크로서비스 아키텍쳐로 변환했다. 총9개의 서비스가 관리 운영되어야 하는데 서비스가 많아지다 보니 관리, 운영, 배포가 문제가 되었다. 이를 컨테이너 서비스로 해결을 하려고 고민했고 이틀간의 해커톤으로 그 문제를 해결했던 사례를 공유한다. 설명할 내용을 요약하면 아래와 같다.

Azure Container Service로 Kubernetes 클러스터와 Private Registry인 Azure Container Registry를 사용하여 서비스를 운영할 인프라를 만들었다. 개발자들은 자신의 로컬 개발환경에서 Docker를 이용하여 컨테이너 이미지를 만들고 Docker-Compose를 이용하여 여러개의 서비스를 한꺼번에 실행하여 테스트를 한다. 개발자들이 테스트 완료된 소스코드를 소스코드 리파지토리에 커밋하면 Visual Studio Team Service에서 자동으로 빌드하고 자동으로 배포해서 새로운 버전의 컨테이너 애플리케이션을 Kubernetes 클러스터에 Rolling Update 한다.

총 3개의 포스팅이 연결되어 있다.

Azure Container Service (Kubernetes)와 DevOps 구현 사례 #2 – 로컬 개발환경

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

Azure Container Service (Kubernetes)

Azure에서 컨테이너로 만든 애플리케이션을 운영하는 가장 좋은 방법은 Azure Container Service (ACS)를 이용하는 것이다. 우리가 Kubernetes 클러스터를 만들기 위해서 관련 내용을 찾아 공부하고 Azure 환경에 최적으로 만들어 내려면 아마도 많은 시간이 걸릴 것이다. Azure Container Services는 인프라에 대한 고민을 하지 않도록 도와준다. Azure Portal에서 마스터노드의 개수, 에이전트 노드의 개수 등 몇 가지만 정해주면 약 5분안에 우리가 원하는 Kubernetes 클러스터를 만들어준다. 우리는 Kubernetes의 사용법을 공부해서 즉시 배포하고 운영에 들어가면 된다. 이런게 Managed Service의 장점이다. Azure Container Services는 Kubernetes, DC/OS, Docker Swamp 이렇게 3가지 Ochestration을 지원한다. 이 중에서 Kubernetes를 선택하면 아래 그림과 같이 Azure의 인프라스트럭쳐와 가상머신을 이용하여 클러스터를 만들어준다.

Azure Portal에서 Kubernetes 클러스터 만들기

Azure CLI로 ACS를 만드는 방법은 문서에 잘 설명되어 있다. Azure Portal에서도 쉽게 만들 수 있다. 아래 화면캡쳐처럼 Azure Container Service를 선택하고 몇 가지 주요 설정을 해주면 된다. 몇 가지만 살펴보자.

  • 위치: 2017-11-22 현재 한국 데이터센터에는 ACS를 만들 수 없다. 로드맵에 이미 들어가 있고 몇 달 안에 들어올 것으로 예상된다. 여기서는 일본서부에서 만들었다.
  • Orchestration: Kubernetes, DC/OS, Docker Swamp 중에 선택한다. 여기서는 Kubernetes를 선택한다.
  • DNS name prefix: DNS 호스트이름 앞부분에 쓰인다. 만약 opencloud라서 설정하면 opencloudmgmt.japanwest.cloudapp.azure.com 도메인이 생성된다.
  • Master Count: 설정한 수 만큼 Master Node VM을 생성한다. Master Node는 홀수로 만들어야 하기 때문에 1,3,5를 선택하게 되어있다.
  • Master Credential : Linux VM에 SSH를 접속하는 용도
  • Service Principle: ACS를 만들면 Azure 인프라의 여러 리소스를 API를 통해서 생성하게 되는데 이때 인증 방법이 필요하다. Azure Service Principle를 만들고 Application ID와 Secret를 적어준다. Azure Service Principle을 만드는 방법은 문서를 참조하면 된다.
  • Agent Count: Agent Node의 개수를 정해주면 그 수 많큼 VM을 생성해준다.
  • Operating System: Linux로 선택한다. Windows는 현재 Preview.

Node 개수에 따라 다르지만 약 5분정도 걸리고 아래 그림처럼 Azure의 네트워크, 가상머신 등을 사용한 건 볼 수 있다. ACS 자체는 무료다. 대신 사용한 VM에 대한 과금을 한다. 즉 Node를 많이 만들면 VM수가 많아 지기 때문에 VM크기와 갯수에 따른 비용이 발생한다.

kubectl 로 Kubernetes 관리

Kubernetes 클러스터를 만들었으니 접속해보자. 빠른 시작 문서에 설명되어 있는데 Azure CLI를 통해서 kubectl 툴을 설치하고 Kubernetes 접속을 위한 config를 얻어 올 수 있다.

# kubectl 설치
$  az acs kubernetes install-cli

# 자격증명 다운로드 
az acs kubernetes get-credentials --resource-group=OpenCloudDemo --name=OpenCloudACS

자격증명은 ~/.kube/config 파일에 저장된다. 공동 개발자나 관리자에게 공유해서 협업을 할 수 있다. kubectl은 다른 방법을 설치해도 좋다. 즉, 기존 사용하던 오픈소스 툴을 그대로 사용하면 된다. kubectl로 Azure 에 생성된 내용과 데모를 위해 배포된 서비스들을 살펴볼 수 있다.

KevinMac:~ Kevin$ kubectl get nodes
NAME                    STATUS    ROLES     AGE       VERSION
k8s-agent-4491db0a-0    Ready     agent     6d        v1.7.7
k8s-agent-4491db0a-1    Ready     agent     6d        v1.7.7
k8s-agent-4491db0a-2    Ready     agent     22h       v1.7.7
k8s-master-4491db0a-0   Ready     master    6d        v1.7.7

$ kubectl get pods
NAME                         READY     STATUS    RESTARTS   AGE
api-demo-1039156325-fmt1w    1/1       Running   0          4d
view-demo-2794589291-g6rsj   1/1       Running   0          10h

$ kubectl get deployments
NAME        DESIRED   CURRENT   UP-TO-DATE   AVAILABLE   AGE
api-demo    1         1         1            1           4d
view-demo   1         1         1            1           4d

$ kubectl get services
NAME         TYPE           CLUSTER-IP     EXTERNAL-IP     PORT(S)         AGE
api-demo     ClusterIP      10.0.219.24    <none>          8080/TCP        4d
kubernetes   ClusterIP      10.0.0.1       <none>          443/TCP         6d
view-demo    LoadBalancer   10.0.253.107   104.215.31.15   443:31586/TCP   4d

kubectl의 상세한 사용법은 Kubernetes Documentation을 참조하면 된다. kubectl이 좋은 툴이지만 웹 기반의 관리툴이 더 편하다. ACS가 이미 셋업을 해놨다. proxy명령으로 proxy를 설정하고 localhost로 접속할 수 있다.

$ kubectl proxy
Starting to serve on 127.0.0.1:8001

접속주소는 http://127.0.0.1:8001/ui 이고 접속하면 http://127.0.0.1:8001/api/v1/namespaces/kube-system/services/kubernetes-dashboard/proxy 로 리다이렉션되는데 Kubernetes 1.7.7의 버그인지 리다이렉션 주소에 슬래시(/)를 하나 더 붙여줘야 접속된다. Kubernetes 포탈을 이용해서 전체 클러스터에 대한 관리나 서비스, 애플리케이션의 관리가 가능하다.

Azure Container Registry 만들기

Docker Hub 같은 공개된 Container Registry를 사용할 수 없는 경우 Private Registry를 사용하면 된다. 물론 내 로컬 서버에 설치할 수 도 있고 Azure VM을 만들어서 설치하거나 Container 이미지를 Kubernete에 배포해서 운영해도 되겠지만 Azure Container Registry는 사용할 수 있다. Azure Portal에서 이름 정도만 정해주면 만들 수 있다. Standard 를 선택하면 100GB의 저장공간을 제공한다. 2017년 11월 22일 현재 Korea DC에 만들 수 없고 아직 언제 가능하지 모르지만 가까운 일본 DC에 만들어도 운영에 문제가 되지는 않는다.

여기까지 Azure에 컨테이너 애플리케이션을 배포해서 운영할 수 있는 환경을 Azure Container Service와 Kubernetes를 이용해서 만들었다. 다음은 개발자들의 로컬 개발환경 설정에 대한 내용이다.