본문으로 바로가기

[Spinnaker] Spinnaker 설치하기 (Local on Ubuntu)

category Devops/CICD 2023. 5. 5. 18:15

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는 복수개로 존재할 수 있다.

    Spinnaker의 AWS Account 유형

     

    이렇게 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로 지정하자.
    1. 버킷 생성
      • Spinnaker의 저장소로 설정할 S3 버킷을 생성한다.
    2. 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를 지정하지 않아서 생기는 문제이다.

    해결방법은 아래의 사진처럼 태그를 서브넷에 추가하면 된다.

    출처 :  https://docs.armory.io/continuous-deployment/armory-admin/aws/aws-subnets-configure/

     

    • 추가해야 하는 태그
      • Key
        • immutable_metadata
      • Value
        • {"purpose":"example-purpose"}
    • 태그 설정 후 확인방법
    curl http://<SPINNAKER_URL>:8084/subnets/aws
    • 만약, Terraform에서 Tag를 넣으려면 아래의 형식으로 넣으면 된다.
    immutable_metadata = jsonencode({purpose = "example-subnet"})

     

    마치며

    보시다시피 Spinnaker는 VM에 직접 패키지를 설치하고 구성하는 과정이 복잡하다. 따라서 Kubernetes 혹은 ECS Fargate로 Spinnaker를 구성하여 관리하는 것을 고민해보자

     

     

    Reference