티스토리 뷰
[특집 시리즈] Azure DevOps CI/CD 맛보기 3편(최종) - Azure Kubernetes Service(AKS)로 CI/CD 배포하고 Rancher를 통해 모니터링 구현하기
zerobig-k8s 2020. 3. 3. 21:34들어가기에 앞서
이번 글에서는 이전 실습에서 Dockerizing한 서비스를 Azure CI/CD 파이프라인을 통해 AKS에 배포하고, 추가로 Rancher를 통해 간단하고 쉽게 모니터링 환경을 구성해보자 한다.
선행 조건
- Azure 구독 : 준비가 안되었다면 Azure 체험 계정 만들기를 참조한다.
- Azure DevOps 계정 : 아직 계정이 없다면 Azure DevOps 계정 만들기를 참조한다.
- (옵션) Azure DevOps CI/CD 맛보기 수행
- Azure DevOps CI/CD 맛보기 2 수행 (권장)
Azure Container Registry(ACR) 생성 및 이미지 Push
이전 실습 이후 리소스를 모두 제거했다고 가정 하에, 먼저 Azure DevOps CI/CD 맛보기 2 내용 중 Azure Container Registry(ACR) 생성 및 Azure Container Registry(ACR) 이미지 push 섹션을 다시 수행한다.
# Azure 로그인
# 변수선언
# 리소스 그룹 생성
# Azure Container Registry 생성 |
[root@ansible-vmc handson0303]# az login
To sign in, use a web browser to open the page https://microsoft.com/devicelogin and enter the code HC6UC28CG to authenticate.
[
{
"cloudName": "AzureCloud",
"id": "f8764f39-xxxx-xxxx-xxxx-77b286ed971b",
"isDefault": true,
"name": "Visual Studio Enterprise 201907",
"state": "Enabled",
"tenantId": "917bfe84-0ca6-488d-ad3a-236e41ceafe9",
"user": {
"name": "zerobig.kim@gmail.com",
"type": "user"
}
}
]
[root@ansible-vmc handson0303]#
[root@ansible-vmc handson0303]#
[root@ansible-vmc handson0303]# rgName=handson0303
[root@ansible-vmc handson0303]# location=koreacentral
[root@ansible-vmc handson0303]# acrName=zeroacrdemo
[root@ansible-vmc handson0303]#
[root@ansible-vmc handson0303]#
[root@ansible-vmc handson0303]# az group create --name $rgName --location $location
{
"id": "/subscriptions/f8764f39-xxxx-xxxx-xxxx-77b286ed971b/resourceGroups/handson0303",
"location": "koreacentral",
"managedBy": null,
"name": "handson0303",
"properties": {
"provisioningState": "Succeeded"
},
"tags": null,
"type": "Microsoft.Resources/resourceGroups"
}
[root@ansible-vmc handson0303]#
[root@ansible-vmc handson0303]#
[root@ansible-vmc handson0303]# az acr create --name $acrName --resource-group $rgName --sku Basic --admin-enabled true
{
"adminUserEnabled": true,
"creationDate": "2020-03-03T08:45:33.925432+00:00",
"id": "/subscriptions/f8764f39-xxxx-xxxx-xxxx-77b286ed971b/resourceGroups/handson0303/providers/Microsoft.ContainerRegistry/registries/zeroacrdemo",
"location": "koreacentral",
"loginServer": "zeroacrdemo.azurecr.io",
"name": "zeroacrdemo",
"networkRuleSet": null,
"policies": {
"quarantinePolicy": {
"status": "disabled"
},
"retentionPolicy": {
"days": 7,
"lastUpdatedTime": "2020-03-03T08:45:36.746234+00:00",
"status": "disabled"
},
"trustPolicy": {
"status": "disabled",
"type": "Notary"
}
},
"provisioningState": "Succeeded",
"resourceGroup": "handson0303",
"sku": {
"name": "Basic",
"tier": "Basic"
},
"status": null,
"storageAccount": null,
"tags": {},
"type": "Microsoft.ContainerRegistry/registries"
}
git 소스 준비하기
다음 명령을 수행하여 git 소스를 로컬에 clone 하고 webapp4container-cicd-demo 디렉토리로 이동한다.
git clone https://github.com/zer0big/webapp4container-cicd-demo.git cd webapp4container-cicd-demo |
[root@ansible-vmc handson0303]# git clone https://github.com/zer0big/webapp4container-cicd-demo.git
Cloning into 'webapp4container-cicd-demo'...
remote: Enumerating objects: 95, done.
remote: Counting objects: 100% (95/95), done.
remote: Compressing objects: 100% (67/67), done.
remote: Total 95 (delta 22), reused 94 (delta 21), pack-reused 0
Unpacking objects: 100% (95/95), done.
[root@ansible-vmc handson0303]# ls
azure-service-bus webapp4container-cicd-demo
[root@ansible-vmc handson0303]# cd webapp4container-cicd-demo/
k8s/wa4c-deployment.yaml 파일을 열어 각자 상황에 맞게 Deployment와 Service의 metadata name과 app 이름 및 image 명을 수정한다.
vi k8s/wa4c-deployment.yaml |
apiVersion: apps/v1beta1
kind: Deployment
metadata:
name: zerok8sdemo
spec:
replicas: 1
template:
metadata:
labels:
app: zero-k8s-app
spec:
containers:
- name: zero-wa4c-demo
image: zeroacrdemo.azurecr.io/wa4container-demo:latest
ports:
- containerPort: 80
---
apiVersion: v1
kind: Service
metadata:
name: zero-k8s-app
spec:
ports:
- name: http-port
port: 8080
targetPort: 80
selector:
app: zero-k8s-app
type: LoadBalancer
AKS 생성을 위한 서비스 주체 생성
다음 명령을 사용하여 AKS 생성에 사용할 Azure 서비스 주체를 생성한다.
# Service Principal 생성 az ad sp create-for-rbac --name ServicePrincipalName |
결과가 다음과 같은 모습일 것이다.
[root@ansible-vmc webapp4container-cicd-demo]# az ad sp create-for-rbac --name sp4rancher
Changing "sp4rancher" to a valid URI of "http://sp4rancher", which is the required format used for service principal names
Creating a role assignment under the scope of "/subscriptions/f8764f39-xxxx-xxxx-xxxx-77b286ed971b"
Retrying role assignment creation: 1/36
Retrying role assignment creation: 2/36
Retrying role assignment creation: 3/36
Retrying role assignment creation: 4/36
Retrying role assignment creation: 5/36
Retrying role assignment creation: 6/36
Retrying role assignment creation: 7/36
Retrying role assignment creation: 8/36
Retrying role assignment creation: 9/36
Retrying role assignment creation: 10/36
Retrying role assignment creation: 11/36
Retrying role assignment creation: 12/36
{
"appId": "ab314535-8906-4498-99ae-5496847b3980",
"displayName": "sp4rancher",
"name": "http://sp4rancher",
"password": "02b23f3d-xxxx-xxxx-xxxx-0b9c98923a49",
"tenant": "917bfe84-0ca6-488d-ad3a-236e41ceafe9"
}
생성 정보를 기록해 둔다. Rancher 상에서 AKS 생성 시 필요하다.
Rancher 서버 실행 및 접속
다음 명령을 수행하여 Rancher를 실행한다.
docker run -d -v rancher-data:/var/lib/rancher -p 8080:80 -p 443:443 rancher/rancher:v2.3.5 docker ps |
[root@ansible-vmc webapp4container-cicd-demo]# docker run -d -v rancher-data:/var/lib/rancher -p 80:80 -p 443:443 rancher/rancher:v2.3.5
Unable to find image 'rancher/rancher:v2.3.5' locally
v2.3.5: Pulling from rancher/rancher
5c939e3a4d10: Pull complete
c63719cdbe7a: Pull complete
19a861ea6baf: Pull complete
651c9d2d6c4f: Pull complete
6d1c86a401db: Pull complete
c7d485afd256: Pull complete
285d247a5c2b: Pull complete
e7acc0299fc2: Pull complete
7346f9f2da73: Pull complete
91f1fe4c3d21: Pull complete
8b36bf060d06: Pull complete
1e46e34177f8: Pull complete
08aff7247104: Pull complete
bf9b23e67888: Pull complete
Digest: sha256:cdffc4e0d1aff6adb606b0f9f3033bf7667bcda69aa43293355b6bc2701b5c6a
Status: Downloaded newer image for rancher/rancher:v2.3.5
2e3c4044c1663a3c7cb8428e441edfc29d1bd51e626e50f71ba6a9f61440a3bb
[root@ansible-vmc webapp4container-cicd-demo]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
2e3c4044c166 rancher/rancher:v2.3.5 "entrypoint.sh" About a minute ago Up About a minute 0.0.0.0:80->80/tcp, 0.0.0.0:443->443/tcp agitated_booth
다음 명령을 수행하여 자신의 Public IP 정보를 획득한다.
curl ifconfig.me |
[root@ansible-vmc webapp4container-cicd-demo]# curl ifconfig.me
52.141.5.20[root@ansible-vmc webapp4container-cicd-demo]#
획득한 정보를 사용해 웹 브라우저를 통해 Rancher에 접속하고 초기 페이지가 로딩되면 고급을 선택하고 연결을 진행한다.
초기 페이지가 로딩되면 패스워드를 입력하고 Continue를 클릭한다.
Rancher Server URL 주소 입력 창에 주소 또는 URL을 입력하고 Save URL을 입력한다.
만약 필자와 동일하게 Azure VM 상에서 실습을 진행중이라면 해당 VM의 Public IP 또는 DNS 정보를 입력한다.
최초 Rancher 서버의 초기 페이지가 나타난다.
Rancher에 AKS 클러스터 추가
초기 화면 우측에 Add Cluster를 선택하고 클러스터 타입 선택 화면에서 하단에 Azure AKS를 선택한다.
전에 생성했던 Azure 서비스 주체 정보를 사용하여 다음과 같이 정보를 입력한다.
참고로 Client ID는 appId를 의미한다.
Authenticate & configure nodes 화면에서 다음 정보를 입력하고 Create를 클릭한다.
- DNS Prefix : 원하는 내용으로 Unique하게 입력한다.
- Cluster Resource Group : ACR 생성 시 리소스 그룹명과 동일한 정보를 입력한다.
- Node Count : 테스트 목적이니 2개로 설정한다.
- SSH Key : 자신의 ssh key 정보를 입력한다.
이제 다음과 같이 AKS 생성이 시작된다.
정상적으로 진행이 완료되면 다음과 같이 Active 상태가 된다.
일단 기본적인 구성이 준비되었으니 Azure DevOps의 CI/CD 구성으로 넘어간다.
이제 클러스터를 선택한다.
다음과 같이 단순하고도 깔끔한 기본 대시보드를 만날 수 있다.
Azure DevOps 파이프라인 구성
Build 파이프라인 구성
기존에 생성해 둔 프로젝트에서 Build 파이프라인 우측 상단에 Edit을 선택한다.
먼저 Public Artifact을 선택하고 소스의 k8s 이하에 deployment,.yaml 파일 위치를 찾아 선택 후 OK 한다.
Agent job 1 우측의 + 아이콘을 누르고 "docker"라고 입력한 후 결과 중 Docker(buildAndPush)를 선택하여 Add 한다.
buildAndPush를 선택하고 Container Registry 셀랙트 박스 옆에 + New를 선택하고 서비스 커넥션을 구성하고 저장한다.
(ACR을 새로 생성하였기 때문에 새로 생성하도록 하겠다. 필요 시 기존 설정을 삭제해야 할 수도 있다.)
다음과 같이 Tags 정보를 입력해준다.
Agent job 1 우측의 + 아이콘을 누르고 "bash"라고 입력한 후 결과 중 Bash를 선택하여 Add 한다.
Script란에 다음 스크립트를 추가한다.
sed -i "s/latest/$(Build.BuildId)/g" k8s/wa4c-deployment.yaml |
Task를 선택 후 드래그하여 최종적으로 다음과 같이 배치한다.
Save & queue를 선택하여 빌드를 실행하여 구성을 검증한다.
빌드가 정상적으로 이루어졌다면 ACR의 리포지토리 내 push한 이미지가 정상적으로 보여질 것이다.
Release 파이프라인 구성
+ New를 클릭하고 New release pipeline을 선택한다.
템플릿 선택화면에서 Kubernetes로 검색하여 Deploy to a Kubernetes cluster를 선택하고 Apply 한다.
Stage 이름을 임의로(Demo) 수정하고 Add an artifact 화면에서 빌드 파이프라인의 소스 위치를 선택하고 Add 한다.
Demo 스테이지의 1 job, 1 task를 클릭한다.
Kubernetes service connection에서 +New를 선택하고 New service connection을 수행한다.
- Azure 구독 선택 및 인증
- Cluster : 위에서 생성한 AKS 선택
- Namespace : default 선택
- Service connection name : 임의의 이름 입력
다시 Namespace를 default로 선택하고 Command를 apply로 선택하고 Use Configuration files을 체크하고 Configuration 파일의 위치를 찾아 선택한다.
검증을 위해 Save를 누르고 Create release를 선택해 Release를 수행한다.
문제가 없다면 다음과 같이 정상적으로 결과가 출력된다.
AKS 배포 결과 확인
이제 터미널 창에서 watch kubecatl get all 명령을 수행하여 EXTENAL-IP가 생성될 때까지 기다린다.
az aks get-credentials -n c-phwvg -g handson0303 watch kubectl get all |
[root@ansible-vmc webapp4container-cicd-demo]# az aks get-credentials -n c-phwvg -g handson0303
Merged "c-phwvg" as current context in /root/.kube/config
[root@ansible-vmc webapp4container-cicd-demo]# watch kubectl get all
Every 2.0s: kubectl get all Tue Mar 3 10:16:58 2020
NAME READY STATUS RESTARTS AGE
pod/zerok8sdemo-589c6dcc44-stz6g 1/1 Running 0 2m2s
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
service/kubernetes ClusterIP 10.0.0.1 <none> 443/TCP 40m
service/zero-k8s-app LoadBalancer 10.0.142.215 52.231.51.87 8080:31632/TCP 2m2s
NAME READY UP-TO-DATE AVAILABLE AGE
deployment.apps/zerok8sdemo 1/1 1 1 2m2s
NAME DESIRED CURRENT READY AGE
replicaset.apps/zerok8sdemo-589c6dcc44 1 1 1 2m2s
획득한 EXTERNAL-IP를 사용하여 웹 브라우저에서 결과를 검증한다.
참고로 8080포트가 Inbound Port rule에 추가되어 있어야 한다.
결과가 확인 되었으니 이제 Continuous deployment trigger를 활성화 해주고 Save 한다.
CI/CD 구성 검증
이제 터미널 창에서 Views/Home/Index.cshtml 파일을 열어 원하는 문구로 내용을 수정한 후 git add, commit 및 push를 수행한다.
watch kubecatl get all 명령을 수행하여 EXTENAL-IP가 생성될 때까지 기다린다.
vi Views/Home/Index.cshtml |
[root@ansible-vmc webapp4container-cicd-demo]# vi Views/Home/Index.cshtml
@{
ViewData["Title"] = "Home Page";
}
<div class="text-center">
<h1 class="display-4">Awesome Azure DevOps CI/CD</h1>
<p>Learn about <a href="https://docs.microsoft.com/aspnet/core">Let's deploy a dokerizing Web app to AKS</a>.</p>
</div>
~
~
~
~
~
~
"Views/Home/Index.cshtml" 8L, 255C written
[root@ansible-vmc webapp4container-cicd-demo]# git commit -am "Updated Index.cshtml"
[master f22763d] Updated Index.cshtml
1 file changed, 1 insertion(+), 1 deletion(-)
[root@ansible-vmc webapp4container-cicd-demo]# git push -u origin master
Username for 'https://github.com': zer0big
Password for 'https://zer0big@github.com':
Counting objects: 9, done.
Delta compression using up to 2 threads.
Compressing objects: 100% (5/5), done.
Writing objects: 100% (5/5), 497 bytes | 0 bytes/s, done.
Total 5 (delta 3), reused 0 (delta 0)
remote: Resolving deltas: 100% (3/3), completed with 3 local objects.
To https://github.com/zer0big/webapp4container-cicd-demo.git
5047eb4..f22763d master -> master
Branch master set up to track remote branch master from origin.
정상적으로 실습이 이루어 졌다면, Azure DevOps의 Build 파이프라인이 트리거 되어 빌드가 진행됨을 확인할 수 있다.
빌드가 마무리 된 시점에는 ACR에 새로 Push된 이미지가 등록되어 있어야 한다.
빌드가 완료된 후 다시 Release 파이프라인이 트리거 되어 배포가 이루어 진다.
배포가 정상적으로 이루어 지면 다음과 같이 터미널 창에서 파드가 재배포(AGE : 13s) 되어 Running 상태인 것을 확인할 수 있다.
Every 2.0s: kubectl get all Tue Mar 3 11:02:25 2020
NAME READY STATUS RESTARTS AGE
pod/zerok8sdemo-7dc94b59db-vpw6l 1/1 Running 0 13s
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
service/kubernetes ClusterIP 10.0.0.1 <none> 443/TCP 85m
service/zero-k8s-app LoadBalancer 10.0.142.215 52.231.51.87 8080:31632/TCP 47m
NAME READY UP-TO-DATE AVAILABLE AGE
deployment.apps/zerok8sdemo 1/1 1 1 47m
NAME DESIRED CURRENT READY AGE
replicaset.apps/zerok8sdemo-589c6dcc44 0 0 0 47m
replicaset.apps/zerok8sdemo-7dc94b59db 1 1 1 13s
다시 EXTERNAL-IP를 가지고 웹 브라우저 창에서 확인해 본다.
우리가 수정한 내용과 같이 결과가 출력됨을 확인할 수 있다.
축하한다~~!!! 드디어 본 실습의 주요 목적을 이루게 된 것이다.
하지만 보너스로 재미나고 유용한 실습을 하나 더 추가했다.
Rancher를 활용한 AKS 모니터링
초기 화면에서 Tools - Monitoring을 선택한다.
화면 하단에 위치하는 Enable 버튼을 클릭하고 바로 Save 버튼을 클릭한다.
좌측 상단에 프로젝트 이름에 마우스를 갖다 대고 출력된 리스트 중에 등록한 클러스터를 선택한다.
우측 상단에 Kubeconfig File 메뉴 햄버거 아이콘(?)을 클릭하고 Go to Grafana를 선택한다.
짜잔~~~!!! 너무나도 반갑고도 왠지 있어 보이는 Grafana 대시보드가 화면에 전시된다. 완정 짱이다~!!!^^
배포한 zero-wa4c-demo 파드의 모니터링도 근사하게 이루어 지고 있다.
여기까지가 준비한 실습의 모든 것이다.
모쪼록 본 실습을 통해 실무적으로 조금이나마 Insight를 얻어 도움이 되기를 바라며 글을 마친다.
'DevOps 기타' 카테고리의 다른 글
Azure Pipelines의 Terraform 모범 사례 (0) | 2021.08.09 |
---|---|
[특집 시리즈] Azure DevOps CI/CD 맛보기 2편 - Dockerizing하여 CI/CD 배포하기 (2) | 2020.02.23 |
[특집 시리즈] Azure DevOps CI/CD 맛보기 1편 (0) | 2020.02.16 |