はじめに

こんにちは、enzaプラットフォーム事業本部でSREチームのエンジニアをやっている橘田です。 運用しているプロダクトにて Spinnaker を使用して Continuous Delivery そして、Canary Release を行なってきて、ひと段落してきましたので良い機会として、これまでやってきた対応をまとめてみようと思います。 そうは言っても Spinnaker とは何かっという読者の方もいらっしゃるかと思いますので、何回かの記事に分けて説明していけたら良いなっと思っています。
今回は Spinnaker 自体のセッティングを行っていくところまでとなりますのでよろしくお願いします。

Spinnaker ってなんだろう?

Spinnaker は、Netflixが開発したマルチクラウド環境へのContinuous Delivery 用のツールとなります。 以前に私が記載した CI、CD、そしてPDにて に Spinnaker の説明をしていますので、どのようなもの下記になる方は読んでみてください。

想定環境

想定している環境は下記の図のような環境を想定しています。
Spinnaker 自体とデプロイする環境は別々の EKS のワーカーで動いている状態となります。

Halyard のセッティング

Spinnaker をインストールするためには Halyard のようなツール使用していく必要があります。 今回は Halyard を動かすための Docker 環境を用意していくことにしましょう。
なぜ Docker 環境を用意したかと言うと Halyard は Java Runtime を使用していますが、ローカル環境に作成しますと、他の環境と衝突する可能性があるためです。 ※Halyard に関しては、Spinnaker v1.23.0 以降から、Kleat への置き換えを行う動きがあります。
私たちの場合はドキュメントの切り替え前などで Halyard の利用をしていますが、今後非推奨になる場合がありますので気をつけてください。
version: '3'
services:
  halyard:
    build: .
    volumes:
      - ./.hal:/home/halyard/.hal
      - ./.kube:/home/halyard/.kube
      - ./.aws:/home/halyard/.aws
      - ./k8s:/home/halyard/k8s
    tty: true
docker-compose.yml として用意するのは上記となります。
Halyard を使用するために、Halyard ユーザーが設定を自由に管理できるように home ディレクトリ配下に隠しディレクトリを用意しておきます。
FROM ubuntu:bionic

ENV KUBECTL_RELEASE=1.15.10
ENV AWS_BINARY_RELEASE_DATE=2020-02-22
ENV AWS_CLI_VERSION=1.18.18

RUN apt-get update && \
    apt-get upgrade -y && \
    apt-get install -y \
      openjdk-11-jre-headless \
      curl \
      python-pip \
    && pip install awscli==${AWS_CLI_VERSION} --upgrade \
    && useradd --system halyard \
    && curl -f -LO --retry 3 --retry-delay 3 https://storage.googleapis.com/kubernetes-release/release/v${KUBECTL_RELEASE}/bin/linux/amd64/kubectl \
    && chmod +x ./kubectl \
    && mv ./kubectl /usr/local/bin/kubectl \
    && curl -f -o /usr/local/bin/aws-iam-authenticator https://amazon-eks.s3-us-west-2.amazonaws.com/${KUBECTL_RELEASE}/${AWS_BINARY_RELEASE_DATE}/bin/linux/amd64/aws-iam-authenticator \
    && chmod +x /usr/local/bin/aws-iam-authenticator \
    && curl -O https://raw.githubusercontent.com/spinnaker/halyard/master/install/macos/InstallHalyard.sh \
    && chmod +x InstallHalyard.sh \
    && bash InstallHalyard.sh --user halyard -y

USER halyard
Dockerfile は上記となります。
Kubernetes にアクセスできるように kubectl や AWS自体にアクセスできるように awscli コマンドのインストールがメインになってきます。
こちらのDockerfile自体に関しては、今年の2021年3月時点に記載したものとなりますので、バージョンは適宜変更していただければと思います。 DockerImage として ubuntu:bionic を使用しております。alpineなどの軽量のイメージですと、 halyard を動かすために使用するライブラリなどが対応していないため、標準の ubuntu イメージを使用しています。 調整すればもう少し軽量なイメージも使えるかもしれませんね。

Spinnaker のセッティング

Spinnaker のセッティングをしていきます。
上記で作成したDockerコンテナにログインし、下記のコマンドを実行していくことで作成可能です。
何を行なっていくか見ていきましょう。
#halyard が入っているか確認
#halyard の起動自体に時間がかかるので、 version 表示などの表示をしておくと、その後がスムーズに進みます
hal --version

#タイムゾーン設定
hal config edit --timezone Asia/Tokyo

#awsのクレデンシャル情報の設定
hal config provider aws edit --access-key-id XXXXXXX --secret-access-key XXXXXXXXXX
hal config provider aws enable
まずは、インストールされた halyard のバージョンを確認しています。 これはコメントにも記載してありますが、 halyard を起動する事態に時間がかかってしまうため、まずはバージョンを確認することで、その後の halyard のコマンドを叩いたときの待ち時間をなくすためとなります。
特に気にされない方は気にせずにコマンドを実行しても問題はないかと思います。 終わりましたら、タイムゾーンの設定と、AWSのクレデンシャル情報の設定を行い、AWSへアクセスできるように準備を進めて第一段階は完了となります。
#Kubernetes の設定を enable にする
hal config provider kubernetes enable

#develop 環境にアクセスする際に使用するユーザー。
DEVELOP_K8S_ACCOUNT='develop-user'

#Spinnaker の機能フラグを true にする
hal config features edit --artifacts true

#Kubernetes にアクセスするアカウントの追加
#この際に aws のクレデンシャルは default でアクセスできる状態になっているのが望ましいです。
#kubectl config current-context でアクセスする先のk8s の情報を設定しておくが、上で設定した awsのクレデンシャル情報はdefault で設定されるためとなります。
hal config provider kubernetes account add ${DEVELOP_K8S_ACCOUNT} --provider-version v2 --context $(kubectl config current-context)
上記では Spinnaker を用意した後にブラウザの画面でデプロイで Kubernetes へアクセスする際のユーザーの作成と登録を実施します。
今回は develop 環境へアクセスするための develop-user を Spinnaker 自体に反映するために設定を行いました。
#aws のアクセスキーを設定する
ACCESS_KEY_ID=XXXXXXXXXXXXXXXXXXXXx

#Spinnaker上の設定ファイルをS3に置く設定をする
#デプロイの設定などがS3に上がっていく
hal config storage s3 edit --access-key-id $ACCESS_KEY_ID --secret-access-key --region ap-northeast-1 --bucket xxxxxxxxxxxxxx

#上記の設定を適応#
hal config storage edit --type s3

#デプロイのアカウント紐付け
SPINNAKER_K8S_ACCOUNT='spinnaker-account'
hal config deploy edit --type distributed --account-name ${SPINNAKER_K8S_ACCOUNT}
上記では、AWSのS3へアクセスするための アクセスキー の設定を実施し、その後に Kubernetes へ Spinnaker をデプロイする際のアカウント情報の紐付けを実施します。
#何も設定しないと Spinnaker は localhost を参照してしまうため
#override-base-url に NodePort の URL を設定することによって、外部から参照できるようにする<
hal config security ui edit --override-base-url http://xxxxxxxxxxxxxxxxx:9000
hal config security api edit --override-base-url http://xxxxxxxxxxxxxxxxx:8084
Spinnaker 自体をそのままデプロイしますと、上記のコメントに記載の通り localhost を参照してしまい Kubernetes 環境のドメインとは別のドメインが認識されてしまいます。
ここでは Kubernetes 環境のドメインを記載し override-base-url で上書きしてあげることによってブラウザからアクセスできるようにしていますので、適宜環境に合わせて URL を設定してください。
#ECRを使用するように設定を行う
REGION=ap-northeast-1
ADDRESS=https://XXXXXXXXXXXXXXXX.dkr.ecr.ap-northeast-1.amazonaws.com

#docker-registry を使用できるように開放する
hal config provider docker-registry enable

#ECRにアクセスするための設定を行う
hal config provider docker-registry account add sample-app --address $ADDRESS --username AWS --password-command "aws --region $REGION ecr get-authorization-token --output text --query 'authorizationData[].authorizationToken' | base64 -d | sed 's/^AWS://'"
Spinnaker が Kubernetes へデプロイするコンテナイメージを参照する元の設定を実施します。
今回はECRを使用しますので ECR のリポジトリ名の設定とアクセスする際の設定を実施しています。
#Spinnaker のバージョン取得
hal version list

#デプロイするバージョンを設定する
#現在は、1.23.2 をデプロイしている。 1.24 系だと aws コマンドが Python3 を参照しているが、Python3 がイメージに入っていないため
#ECR へのアクセスあたりで失敗してしまうため
hal config version edit --version 1.23.2

#実際のデプロイ
#デプロイすることによって、自動的に Spinnaker の pod の作成を行ってくれる

hal deploy apply
最後に使用する Spinnaker のバージョンを設定し、 hal deploy apply を実施して Spinnaker のインストールを実施していきます。
コメントに記載されていますが、 2021年3月時点では、 1.24 系 は Python3 を参照していますが、 Python3 がイメージとして入っていないため、うまく動かない状態となっていました。
Python3 が使用できるように PR 自体はありましたので現状は、 1.24系以降でも動くかもしれませんので、最新版を使ってみるのも良いかもしれません。 hal deploy apply を実施し後、現状参照している Kubernetes の Pod状態を確認して Spinnaker の Pod が動いていれば成功です。 上記記載の通り、 hal deploy apply を実施すると、 kube/config で設定されている環境へとデプロイを実施されますので、複数環境を Kubernetes で動かしている場合には予期していない環境へとデプロイしてしまう可能性がありますので注意が必要です。

最後に

今回は Spinnaker のインストール方法に関して記載していきました。
Spinnaker などの Continuous Delivery ツールに関しては、日本語の記事も少なくて、インストールする際に私自身が困ったことが多かったためにも、この記事を記載する運びとなりました。
少しでも誰かの役に立ちましたら幸いです。
次回以降の記事では、 Spinnaker を使っての Kubernetes へのデプロイフローに関しての説明ができれば良いかと考えております。
ドリコムでは一緒に働くメンバーを募集しています!
募集一覧はコチラを御覧ください!