/ azure

Azure Virtual Machine Scale Set #2 – Custom 이미지로 120대 만들기

Virtual Machine Scale Set(이하 VMSS)의 개요에 대해서는 지난 포스트에 설명이 되어 있다. 여기서는 Azure CLI를 이용해서 실제로 VMSS를 만드는 방법에 대한 내용이다. Custom VM 이미지를 이용해서 VMSS의 VM들을 생성하기 위해서 이미지용 VM을 만들고 스크립트를 통해서 이미지를 만든다.

전체 다이어그램은 아래 그림과 같다.

1. VM 이미지 만들기

1) Azure CLI 2.0 설치 하고  Azure 로그인을 먼저한다.
$ az login
To sign in, use a web browser to open the page https://aka.ms/devicelogin and enter the code G8R712ZTN6 to authenticate.
2) 리소스 그룹을 2개 만든다.
$ az group create --name VMSSImageGroup --location koreacentral

$ az group create --name VMSSGroup --location koreacentral
3) Portal 에서 이미지 생성용 VM을 생성하고 필요한 미들웨어나 Application을 설치 후 잘 작동하는지 확인한다.
4) Windows의 경우 RDP 접속해서 sysprep 한다. 리눅스의 경우 SSH로 접속해서 waagent 명령을 실행한다.
5) 이미지 생성용 VM을 Deallocate / Generalize 시키고 이미지를 생성한다.
$ az vm deallocate -g VMSSImageGroup -n VMSSImageVM1

$ az vm generalize -g VMSSImageGroup -n VMSSImageVM1

$ az image create --name VMSSImage01 --resource-group VMSSImageGroup --source VMSSImageVM1
6) 이미지 생성용 VM을 지운다.
az vm delete -n VMSSImageVM1 -g VMSSImageGroup

2. VMSS 생성

VM들이 들어갈 가상네트워크를 먼저 만들고 방금 만든 이미지로 120개의 VM을 VMSS로 생성한다. 100개 이상의 VM은 Load Balancer를 붙이지 못하고 single-placement-group을 false로 설정하여 생성한다. 가상네트워크의 서브넷 IP 범위를 120개 보다 크게 넉넉히 잡아줘야 한다.

$ az network vnet create --name VMSSVNet --resource-group VMSSGroup --location koreacentral --address-prefix 10.1.0.0/16 --subnet-name VMSSSubnet --subnet-prefix 10.1.0.0/22

$ az vmss create --image /subscriptions/e4723bbb-cd59-41dc-86b7-2e239d536c04/resourceGroups/VMSSImageGroup/providers/Microsoft.Compute/images/VMSSImage0  \
                 --name TestVMSS --resource-group VMSSGroup --authentication-type password \
                 --admin-username kevinoh --admin-password '<pasword>' --single-placement-group false \
                 --load-balancer "" --vm-sku Standard_D1_v2 --instance-count 120 --vnet-name VMSSVNet \
                 --subnet VMSSSubnet --disable-overprovision

명령에서 사용한 파라미터를 몇 가지 살펴보자.

- image: 1에서 생성한 이미지를 포탈에서 보면 Resource ID가 있다. 리소스그룹이 같으면 이미지 이름을 써도 되지만 리소스그룹이 다르기 때문에 ID를 사용한다. Managed Image는 리소스 아이디, Unmanaged image는 Storage Account URL를 사용한다.
- name: VMSS이름
- resource-group: VMSS가 생성될 리소스그룹
- authntication-type: password 로 지정하여 ID/pwd를 입력한다.
- admin-username: admin id
- admin-password: admin pwd
- single-placement-group: 100개 이상을 만들기 위해서 false로 설정한다. 상세 설명은 [개요](http://ilseokoh.com/2017/12/11/azure-virtual-machine-scale-set-1-introduction/) 참조
- load-balancer: single-placement-group false이고 100개 이상을 만드려면 Load Balancer를 만들지 않아야 한다. ""로 명시하지 않으면 오류 발생
- vm-sku: VM 사이즈. 사이즈 선택을 위한 문자열은 [가상 컴퓨터 크기 페이지](https://docs.microsoft.com/ko-kr/azure/virtual-machines/windows/sizes-general) 참조
- instance-count: 생성할 VM 수
- vnet-name: 가상네트워크 이름
- subnet-name: 서브넷 이름
- disable-overprovision: 현재 사용중인 구독의 core limit이 100개로 설정되어 있어서 껐다.

그 외 상세한 파라미터는 az vmss 커멘드 설명을 참조

Azure Portal에서 인스턴스를 확인하면 120개의 인스턴스가 생성된 것을 확인 할 수 있다.


3. 인스턴스 갯수 늘리기/줄이기

# 줄이기
az vmss scale --resource-group VMSSGroup --name TestVMSS --new-capacity 3
# 늘이기
az vmss scale --resource-group VMSSGroup --name TestVMSS --new-capacity 120

인스턴스 갯수를 늘리고 줄이는 명령이다.

4. VM 업데이트

운영을 하다보면 업데이트가 필요하다. VMSS 를 업데이트 하려면 먼저 VM이미지에서 다시 VM을 생성해서 업데이트를 하고 새로운 VM이미지를 만들어야 한다. VM 생성은 Portal에서 할 수 있고 아래 명령으로 VM을 다시 생성할 수 있다. 그리고 다시 1번을 수행해서 이미지를 생성한다.

$ az vm create -n VMSSImageVM3 -g VMSSImageGroup --image VMSSImage01 --vnet-name VMSSI
mageGroup-vnet --subnet default --authentication-type password --admin-username kevinoh --admin-password 'Kevin!3245678' --size Standard_DS1_v2

새로 생성된 이미지 이름이 VMSSImage02라면 아래 명령으로 VMSS 의 이미지를 업데이트 할 수 있다. 그리고 전체 이미지를 즉시 업데이트 할 수 있다. instance-ids "*" 는 전체 업데이트고 인스턴스 아이디를 여러개씩 지정해서 업데이트 할 수도 있다. 100개 이상의 VM을 가지고 있고 Load Blancer가 없는 VMSS 구성은 Rolling Update가 지원되지 않는다. 반대의 경우라면 az vmss rolling-upgrade 명령을 살펴보기 바란다.

$ az vmss update --resource-group VMSSTestGroup --name VMSSTest --set virtualMachineProfile.storageProfile.imageReference.id=/subscriptions/e47f23bb-cd59-41dc-86b7-2e239d536c04/resourceGroups/VMImageGroup/providers/Microsoft.Compute/images/VMSSImage02

$ az vmss update-instances --resource-group VMSSGroup --name TestVMSS --instance-ids "*"

이미지를 변경 후에 Azure Portal에서 인스턴스를 확인해보면 최신모델이 아니오로 표시된다. 업데이트에 성공하면 다시 예로 변경된다.


5. VMSS Dashboard tool 을 사용하여 수동 Rolling Update

python으로 만들어진 VMSS Dashboard tool 이 있다. Github에서 소스를 다운로드 받아서 python vmsseditor.py 를 실행하면 툴이 실행된다. 이 툴을 이용하면 Fault Domain 별로 VM 업데이트를 수동으로 실행 할 수 있다. 만약 VM 이미지를 변경하고 서비스의 중단없이 업데이트를 하려면 Fault Domain 별로 업데이트를 수행하면 된다.