Tencent cloud Auto Scaling
Auto Scaling은 클라우드 시스템 자원을 필요에 따라 자동으로 추가하고 제거하는 스케일링 시스템이다. 이 글에서는 간단한 실습을 통해 콘솔에서 Tencent cloud Auto Scaling을 체험하는 내용을 담았다.
트래픽을 먹고사는 복제토끼🐰
Scale-out의 결과를 시각적으로 구현하기로 한다. 우선 CVM 인스턴스 1대를 토끼 한 마리로 가정한다. Auto Scaling 설정을 완료하고, 인위적으로 서버에 트래픽을 날려 부하를 준 뒤 스케일링을 통해 인스턴스가 추가되면 추가된 인스턴스 수에 따라 클라이언트의 웹 페이지에 토끼가 한 마리씩 추가되는 로직이다. 매우 간단한 시각화를 통해 Tencent cloud의 CVM이나COS 같은 다른 서비스도 자연스럽게 체험할 수 있다.
토끼 복제 과정🐰
먼저 COS 버킷에 토끼 이미지를 저장하고 Tencent cloud CVM으로 간단한 웹서버를 띄운 뒤 해당서버를 기준으로 Auto Scaling 을 세팅하고, 서버에 Auto Scaling 인스턴스의 갯수에 따라 토끼이미지를 렌더링하는 웹페이지 코드를 구현한다.
최종적으로 서버 퍼포먼스 테스트 툴을 (이 글에서는 wrk 사용) 이용하여 인위적으로 서버에 부하를 주어 늘어난 인스턴스 수에 따라 토끼의 수가 증가하는지 확인한다.
COS Bucket에 토끼 이미지 저장하기🐰
COS Bucket에 인스턴스의 수를 나타낼 토끼 이미지를 업로드 한다. Tencent cloud 콘솔 , COS Browser , TCCLI등 방법을 이용한다. 이 글에서는 TCCLI 커맨드 명령어를 소개한다.
coscmd config -a <SecretID> -s <SecretKey> -b <버킷이름> -r <리전>
coscmd upload <로컬 파일 경로> <버킷 이름>
이렇게 해서 토끼에 대한 COS 버킷의 엔드포인트를 얻었으면 웹서버를 생성한다.
간단한 웹서버 구현하기 (CVM)
Tencent cloud의 가상머신 CVM을 이용하여 가벼운 스펙의 테스트용 서버를 생성한다. 이 글은 CentOS 7.9 를 기준으로 한다.
서버 생성이 완료되면 접속하여 기본적인 세팅을 시작한다.
서버에 nodejs 기준으로 각종 패키지 및 express 모듈을 설치한다. 또한 오토스케일링을 통한 CVM 인스턴스 수의 정보를 실시간으로 알려줄 API 호출을 위해 Tencent API 의 APIExplorer (https://console.tencentcloud.com/api/explorer?Product=as&Version=2018-04-19&Action=DescribeAutoScalingGroups)를 참고하면 코드 예제를 얻을 수 있다. 코드 예시를 보면 tencentcloud-sdk-nodejs-intl-en 패키지의 설치가 필요함을 알 수 있다.
마지막으로 CVM의 Security group 설정에서 웹서버 포트로 지정할 port:3000에 대한 인바운드트래픽을 허용해주면 준비는 끝난다.
소스코드
여기까지의 웹 서버의 코드는 다음과 같다.
const express = require('express');
const tencentcloud = require("tencentcloud-sdk-nodejs-intl-en");
const AsClient = tencentcloud.as.v20180419.Client;
const models = tencentcloud.as.v20180419.Models;
const Credential = tencentcloud.common.Credential;
const ClientProfile = tencentcloud.common.ClientProfile;
const HttpProfile = tencentcloud.common.HttpProfile;
let cred = new Credential("IKIDAEA0mU6hEi3LXZRBpMnHhBTp4XXXXXXX", "c8hHuYBtjsgMAnR9xrjyAKc3dXXXXXX");
let httpProfile = new HttpProfile();
httpProfile.endpoint = "as.tencentcloudapi.com";
let clientProfile = new ClientProfile();
clientProfile.httpProfile = httpProfile;
let client = new AsClient(cred, "ap-seoul", clientProfile);
const app = express();
const port = 3000; //사전에 CVM의 Security group 설정 확인
async function getInstanceCount() {
return new Promise((resolve, reject) => {
let req = new models.DescribeAutoScalingGroupsRequest();
let params = {
AutoScalingGroupIds: ["XXXXXXX"] //Auto Scaling 설정이 끝나면 Scaling group ID를 넣는다.
};
req.from_json_string(JSON.stringify(params));
client.DescribeAutoScalingGroups(req, function(err, response) {
if (err) {
reject(err);
return;
}
resolve(response.AutoScalingGroupSet[0].InstanceCount);
});
});
}
app.get('/', async (req, res) => {
try {
const instanceCount = await getInstanceCount();
let rabbitsHtml = '';
for (let i = 0; i < instanceCount; i++) {
rabbitsHtml += '<img src="https://rabbit-1316520384.cos.ap-seoul.myqcloud.com/rabbit-1316520384" alt="Rabbit" width="300" height="300">';
} //COS 버킷의 이미지경로
res.send(`<html><body>${rabbitsHtml}</body></html>`);
} catch (error) {
res.status(500).send(`Error : ${error}`);
}
});
app.listen(port, () => {
console.log(`Example app listening at http://localhost:${port}`);
});
웹 서버를 실행시키고
브라우저에 CVM의 public IP:3000 을 입력해보면
다소곳한 토끼 한 마리를 볼 수 있다. 해당 서버의 인스턴스 수가 1대라는 뜻이기도 하다.
Auto Scaling 설정
1) Launch Configuration
먼저 Tencent cloud 콘솔의 Auto Scaling 섹션에서 Launch Configuration을 설정한다. Scale-out시 추가 생성될 서버의 스펙을 정하는 단계이다. 테스트용이니 만만한 스펙으로 적당히 설정한다.
2) Security Group
Security group을 설정한다.
초기 capacity의 설정이 AWS Auto Scaling의 그것과 약간 다르다. desired capacity 대신 Initial capacity를 입력하는 것으로 되어있는데, 추후 스케일링 그룹 생성 후 옵션에서 desired capacity를 설정할 수 있다. 이 실습에서는 각각 1, 2, 10으로 설정하였다. 토끼의 과도한 번식 현장을 목격하고 싶지 않다면 적절하게 Max capacity를 설정한다. 또한 실전에서는 인스턴스가 분배될 VPC 영역 설정은 다중 서브넷을 이용한 구성을 추천하지만 생략한다.
3) Alarm policy 설정
이제 어떤 조건에서 Scale-out이 진행될건지를 정해야한다. CPU Utilization, Public bandwidth, Private bandwidth, TCP Connection 등의 지표로 판단기준을 정한다. 있고 정책은 판단기준이 어떤 방식으로 특정값에 도달하는지에 따라 capacity의 서버 대수 만큼 서버를 추가할 것인지를 정한다.
예를들어 위와 같은 조건이라면 CPU utilization 이 1분동안, 평균 70%이상 측정된 구간이 연속적으로 3번 감지되면, 서버 1대를 추가한다는 의미이다. (스케일링이 한 번 진행된 후 cooldown 시간 이내에는 다음 스케일링이 발생하지 않는다.) 이번에는 최대한 적은 수고로 순식간에 Scale-out 효과를 체험하기 위해 if값에 각각 public bandwidth , MAX 2Mbps , 1을 입력하였다.
let params = {
AutoScalingGroupIds: ["XXXXXXX"] //Auto Scaling group ID
};
req.from_json_string(JSON.stringify(params));
마지막으로 완성된 Scaling group에 서버 CVM 인스턴스를 추가하고 Scaling group ID를 웹서버 코드 해당 부분에 입력한다.
토끼 복제하기
이제 모든 준비가 끝났다. 인위적으로 웹 서버에 부하를 발생시켜서 Scale-out을 진행한다. 여기서는 wrk를 이용하여 간단하게 트래픽을 발생시킨다.
1분 후 토끼우리를 확인하면
👏👏👏👏 서버가 10대로 늘어난 것을 확인할 수 있다.
콘솔에서 토끼들의 건강상태도 아주 좋은 것을 확인할 수 있다. (Tencent cloud는 Auto Scaling Group에서 주기적으로 서버에 ping 명령을 날려 1분안에 응답이 리턴되지 않으면 scale-in 하는 헬스체크 방식을 사용한다.)
마치며
이 글을 통해 실무적이고 정교한 설계는 아니지만 간단한 조작을 통해 클라우드의 유연한 특성을 가장 많이 가지고 있는 Auto Scaling을 Tencent cloud의 상품으로 구현해보는 방법을 소개하였다. 기존 AWS를 사용하던 유저들도 학습부담 없이 콘솔상에서 충분히 체험이 가능하다.