Contents
개요
CI/CD 도구 중 하나인 Spinnaker를 설치해봅시다.
System Requirements
- RAM
- 18 GB
- CPU
- 4 Core
- OS
- Ubuntu 18.04 혹은 그 이상
- Debian 10 혹은 그 이상
사용 포트
서비스명 | 포트 |
Clouddriver | 7002 |
Deck | 9000 |
Echo | 8089 |
Fiat | 7003 |
Front50 | 8080 |
Gate | 8084 |
Halyard | 8064 |
Igor | 8088 |
Kayenta | 8090 |
Orca | 8083 |
Rosco | 8087 |
Keel | 7010 |
설치 작업
설치를 진행해본다. 필자는 아래의 AWS에 구성하였고 아래의 스펙으로 인스턴스를 생성하였다.
- AMI : Ubuntu 22.04
- 인스턴스 유형 : t3a.xlarge
1️⃣ 패키지 설치
1. 초기 셋팅
apt-get update && apt-get install -y gnupg gnupg2 gnupg1 curl wget sudo net-tools
2. halyard 설치
curl -O https://raw.githubusercontent.com/spinnaker/halyard/master/install/debian/InstallHalyard.sh
3. 설치 스크립트 실행
bash InstallHalyard.sh
2️⃣ Cloud Provider 설정
Spinnaker에서 AWS Provider 같은 경우 기본적으로 Role을 Assume하는 방식으로 인증하게 된다. 따라서 다음의 개념을 가진 두 가지 계정이 존재한다.
- Managing Account : Spinnaker가 인증할 때 사용하는 유일한 계정이다.
- Managed Account의 Role을 Assume 할 때 사용한다.
- Managed Account : Spinnaker로 배포하거나 관리되는 계정이다.
- 실질적으로 배포할 수 있는 권한이 있는 Role이 있다.
- 해당 Role은 Managing Account가 Assume 할 수 있게 신뢰정책이 설정되어 있어야 한다.
- Managed Account는 복수개로 존재할 수 있다.
- 실질적으로 배포할 수 있는 권한이 있는 Role이 있다.
이렇게 Spinnaker는 Role 기반으로 동작하기 때문에 사전에 AWS IAM Role 셋팅이 필요하다.
1️⃣ IAM Role 생성 (1)
해당 작업은 Managing Account에서 수행한다.
1. SpinnakerManagingRole IAM Role 생성
- 신뢰정책은 EC2 선택
- 관리형 정책인
PowerUserAccess
Policy 바인딩 BaseIAMPassRole
이름을 가지는 아래의 Custom Policy 추가<AWS_ACCOUNT_ID>
는 Managed Account의 ID를 기입한다.
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"ec2:DescribeAvailabilityZones",
"ec2:DescribeRegions"
],
"Resource": [
"*"
]
},
{
"Action": "sts:AssumeRole",
"Resource": [
"arn:aws:iam::<AWS_ACCOUNT_ID>:role/SpinnakerManagedRole"
],
"Effect": "Allow"
}
]
}
2. Spinnaker EC2에 역할 바인딩
- 위에서 생성한
SpinnakerManagingRole
을 인스턴스 프로파일로 설정한다.
2️⃣ IAM Role 생성 (2)
💡 해당 작업은 Managed Account에서 수행한다.
1. SpinnakerManagedRole IAM Role 생성
- 관리형 정책인
PowerUserAccess
Policy 바인딩. PassRoleandCertificate
이름을 가지는 아래의 Custom Policy 추가
{
"Version": "2012-10-17",
"Statement": [
{
"Action": [
"iam:ListServerCertificates",
"iam:PassRole"
],
"Resource": [
"*"
],
"Effect": "Allow"
}
]
}
2. SpinnakerManagedRole IAM Role 수정
- 다음의 신뢰정책 추가
<AWS_ACCOUNT_ID>
는 Managing Account의 ID를 기입한다.
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"AWS": "arn:aws:iam::<AWS_ACCOUNT_ID>:role/SpinnakerManagingRole",
"Service": [
"ecs.amazonaws.com",
"application-autoscaling.amazonaws.com",
"ecs-tasks.amazonaws.com",
"ec2.amazonaws.com"
]
},
"Action": "sts:AssumeRole"
}
]
}
3️⃣ AWS Provider 활성화
hal cli
를 사용하여 Spinnaker에서 필요한 Provider를 활성화 해준다.
💡 ECS Provider를 사용하려면 먼저 AWS Provider를 구성하고 활성화를 해야한다.
1. AWS Provider에 Managed Acccount계정 추가
<AWS_ACCOUNT_ID>
는 Managed Account의 ID를 기입한다.
export AWS_ACCOUNT_NAME=<aws_account_name>
export AWS_ACCOUNT_ID=<AWS_ACCOUNT_ID>
export AWS_REGION=ap-northeast-2
export ROLE_NAME=role/SpinnakerManagedRole
hal config provider aws account add ${AWS_ACCOUNT_NAME} \
--account-id ${AWS_ACCOUNT_ID} \
--assume-role ${ROLE_NAME} \
--regions ${AWS_REGION}
2. AWS Provider 활성화
hal config provider aws enable
3️⃣ 스토리지 유형 설정 (ExternalStorage)
Spinnaker의 Configuration을 저장하는 스토리지를 지정한다.
- 여러가지 유형이 있는데 AWS를 사용하므로 S3로 지정하자.
- 버킷 생성
- Spinnaker의 저장소로 설정할 S3 버킷을 생성한다.
- S3 설정 및 활성화
export S3_BUCKET_NAME=miridih-cicd-spinnaker
export ROLE_NAME=role/SpinnakerManagedRole
hal config storage s3 edit \
--assume-role ${ROLE_NAME} \
--bucket ${S3_BUCKET_NAME}
hal config storage edit --type s3
4️⃣ Spinnaker 배포
초기 셋팅이 완료되었으면 Spinnaker를 배포할 차례다.
1. Spinnaker 버전 확인
> hal version list
- 1.28.6 (v1.28.6):
Changelog: https://spinnaker.io/changelogs/1.28.6-changelog/
Published: Tue Mar 28 20:36:29 UTC 2023
(Requires Halyard >= 1.45)
- 1.29.4 (v1.29.4):
Changelog: https://spinnaker.io/changelogs/1.29.4-changelog/
Published: Tue Mar 28 23:21:21 UTC 2023
(Requires Halyard >= 1.45)
- 1.30.1 (v1.30.1):
Changelog: https://spinnaker.io/changelogs/1.30.1-changelog/
Published: Fri Apr 07 03:45:44 UTC 2023
(Requires Halyard >= 1.45)
2. Spinnaker 버전 수정
export VERSION=1.30.1
hal config version edit --version $VERSION
3. Spinnaker 배포
hal deploy apply
4. Spinnaker Web UI 연결 설정
hal deploy connect
포트포워딩 (선택)
💡 Spinnaker의 Web UI인 9000 포트는 기본적으로 Spinnaker를 실행중인 서버 즉, 로컬에서만 연결이 가능하다. 원격지에서 접근을 허용하게 설정할 수 있으나 여기서는 포트포워딩으로 설정한다.
- SSH Key를 이용하여 포트포워딩 (택1)
ssh -i ./<public_key>.pem ubuntu@<public_ip> \
-L 9000:127.0.0.1:9000 \
-L 8084:127.0.0.1:8084
- SSM을 이용하여 포트포워딩 (택1)
nohup aws ssm start-session \
--target <instance_id> \
--document-name AWS-StartPortForwardingSessionToRemoteHost \
--parameters '{"host":["localhost"],"portNumber":["8084"], "localPortNumber":["8084"]}' &
nohup aws ssm start-session \
--target <instance_id> \
--document-name AWS-StartPortForwardingSessionToRemoteHost \
--parameters '{"host":["localhost"],"portNumber":["9000"], "localPortNumber":["9000"]}' &
이제 web 포트인 localhost:9000
에 접근하면 Spinnaker의 메인 페이지가 반겨줄 것이다.
5️⃣ AWS 서브넷 보이게 설정하기
Spinnaker UI에서 Cluster 생성에서 서브넷을 선택하는 메뉴가 있는데 무슨 영문인지 선택 가능한 서브넷 출력이 되질 않는다.
권한을 잘 지정했음에도 서브넷이 보이지 않는다면 서브넷에 Tag를 지정하지 않아서 생기는 문제이다.
해결방법은 아래의 사진처럼 태그를 서브넷에 추가하면 된다.
- 추가해야 하는 태그
- Key
immutable_metadata
- Value
{"purpose":"example-purpose"}
- Key
- 태그 설정 후 확인방법
curl http://<SPINNAKER_URL>:8084/subnets/aws
- 만약, Terraform에서 Tag를 넣으려면 아래의 형식으로 넣으면 된다.
immutable_metadata = jsonencode({purpose = "example-subnet"})
마치며
보시다시피 Spinnaker는 VM에 직접 패키지를 설치하고 구성하는 과정이 복잡하다. 따라서 Kubernetes 혹은 ECS Fargate로 Spinnaker를 구성하여 관리하는 것을 고민해보자
Reference
'Devops > CICD' 카테고리의 다른 글
[Github Action] 다양한 이벤트(commit, pr, workflow..)의 알람을 Slack으로 전송하기 (0) | 2023.03.25 |
---|