SpinnakerでAzure上に仮想マシンをデプロイ

こんにちは、今回は継続的デリバリープラットフォーム「Spinnaker」を利用し、Azure上に仮想マシンをデプロイしてみました。

Spinnakerとは

Spinnaker とは DevOps というソフトウェア開発手法の1つである継続的デリバリーを実装するプラットフォームです。具体的には、Jenkins や Travis CI などの継続的インテグレーション(CI)によるソフトウェアビルドを起因として、マシンイメージの作成、テスト、リリースを一括で実行することができるソリューションとなります。継続的デリバリーを利用することで非常に高速かつ、高信頼でリリースすることが可能です。

また、Spinnakerの大きな特徴として、以下複数のクラウドプロバイダーへのデプロイに対応しています。
・Microsoft Azure
・AWS EC2
・Google Compute Engine
・Kubernetes
・Openstack

Spinnakerのアーキテクチャ

Spinnakerは以下の独立したサービスで構成されています。公式サイトに関連図がありますので、参照するとイメージが付きやすいかと思います。

サービス名 役割
Deck ブラウザベースのユーザインターフェイス
Gate APIゲートウェイ
Orca 各設定操作や自動化などを管理
Clouddriver クラウドプロバイダーとの連携やリソース配置を管理
Front50 設定などのメタデータを格納するリポジトリ
Rosco マシンイメージ (GCE/AWS AMI/Azure VM)を生成
Igor JenkinsやTravis CIなどの継続的インテグレーションツールをプロセスとして利用できるようにする
Echo Slackやemail、Hipchat、SMSなどの通知やGithubのようなサービスからのWebhookに対応する
Fiat ユーザのアクセス権限を管理

Azureに対して出来ること

SpinnakerがAzureに対して出来ることは主に以下となります。

・セキュリティーグループの作成
・アプリケーションゲートウェイの作成
・スケールセットインスタンスのデプロイ

AzureネットワークやAzureストレージに関しては、事前にポータルサイトやAzure CLI などから作成する必要があります。

Spinnakerの構成

今回、検証した構成は以下となります。

スライド1

Spinnakerでは「アプリケーションゲートウェイ」配下に「スケールセットインスタンス」を配置する構成が通常とのことです。アプリケーションゲートウェイついてはこちらの記事を参考にして頂ければと思います。

Spinnakerの構築

今回は Jenkins などの連携CIツールは利用せず、Spinnaker単体でのインフラデリバリ動作を確認するところまでを実践したいと思います。
構築を進める上で、Azure Active Directory にアクセス可能な権限が必要になります。

リソース構成

【リソースグループ】
SpinnakerResourceGroup

【リージョン/ロケーション】
米国西部(westus)
※Spinnakerは現在(2017/6)、米国西部/米国東部/米国東部2/米国中部のみ対応しています。
 日本などのアジアやヨーロッパなどは対応していないようです。

【インスタンスサイズ】
Standard A3 (4 コア、7 GB メモリ)

【OS】
Ubuntu Server 14.04 LTS
※Spinnakerは現在(2017/6)、「Ubuntu Server 14.04 LTS」のみ対応となっています。
 CentOSや他バージョンではサポートされていません。

パッケージインストール

Spinnakerの構築ツールHalyard と Azure CLI をインストールします。

## Halyardインストール
# curl -O https://raw.githubusercontent.com/spinnaker/halyard/master/install/stable/InstallHalyard.sh
# bash ./InstallHalyard.sh
Would you like to configure halyard to use bash auto-completion? [default=Y]: [エンターキー]
Where is your bash RC? [default=/home/yyamada/.bashrc]: [エンターキー]
# hal -v
0.27.0-8

## Azure CLI インストール
# apt-get install -y libssl-dev libffi-dev python-dev
# curl -L https://aka.ms/InstallAzureCli | bash

ストレージアカウント設定

Spinnakerの設定などのメタデータを格納するために、ストレージアカウントを設定します。

## Azureアカウントにログイン
# az login
# az account list
# SUBSCRIPTION_ID=<サブスクリプションID>
# az account set --subscription $SUBSCRIPTION_ID

## ストレージアカウント作成
# RESOURCE_GROUP=SpinnakerResourceGroup
# STORAGE_ACCOUNT_NAME=spinnakerresourcegrou001
# az storage account create --resource-group $RESOURCE_GROUP --sku STANDARD_LRS --name $STORAGE_ACCOUNT_NAME

## ストレージアカウントキー取得
# STORAGE_ACCOUNT_KEY=$(az storage account keys list --resource-group $RESOURCE_GROUP --account-name $STORAGE_ACCOUNT_NAME --query [0].value | tr -d '"')

## Halyardにストレージアカウント情報登録
# hal config storage azs edit \
  --storage-account-name $STORAGE_ACCOUNT_NAME \
  --storage-account-key $STORAGE_ACCOUNT_KEY
# hal config storage edit --type azs

クラウドプロバイダー登録

デプロイ先となるクラウドプロバイダーを登録します。今回は Azure を登録します。
外部のアプリケーションからAzureリソースに変更を加えるには、Azure Active Directory からサービスプリンシパルを作成する必要があります。
また、キーボルトを作成してデプロイしたサーバの初期ユーザ/パスワードを指定します。

# サービスプリンシパル作成
# az ad sp create-for-rbac --name "SpinnakerApp"
Retrying role assignment creation: 1/36
{
  "appId": "XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX",
  "displayName": "SpinnakerApp",
  "name": "https://SpinnakerApp",
  "password": "XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX",
  "tenant": "XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX"
}
# APP_ID=<appId>
# TENANT_ID=<tenant>

## キーボルト作成
# VAULT_NAME=<キーボルト名>
# az keyvault create --enabled-for-template-deployment true --resource-group $RESOURCE_GROUP --name $VAULT_NAME
# az keyvault set-policy --secret-permissions get --name $VAULT_NAME --spn $APP_ID
# az keyvault secret set --name VMUsername --vault-name $VAULT_NAME --value <初期ユーザ名>
# az keyvault secret set --name VMPassword --vault-name $VAULT_NAME --value <初期パスワード>

## HalyardにクラウドプロバイダーとしてAzureを利用するように指定
# hal config provider azure enable

## クラウドプロバイダーとしてAzureを利用するために設定する
# hal config provider azure account edit my-azure-account \
  --client-id $APP_ID \
  --tenant-id $TENANT_ID \
  --subscription-id $SUBSCRIPTION_ID \
  --default-key-vault $VAULT_NAME \
  --default-resource-group $RESOURCE_GROUP \
  --packer-resource-group  $RESOURCE_GROUP \
  --packer-storage-account $STORAGE_ACCOUNT_NAME \
  --app-key
The appKey (password) of your service principal.: <サービスプリンシパル作成時の"password">

Spinnakerをデプロイ

HalyardからSpinnakerをローカルにデプロイします。

## Spinnakerのバージョンを確認
# hal version list
+ You are on version "", and the following are available:
 - 1.0.1 (Bombardier):
   Changelog: https://gist.github.com/spinnaker-release/b3515a47abbcdc86f0cfdc2bd6cb8a17
   Published: Tue Jun 13 05:34:52 JST 2017

## Spinnakerのバージョンを指定
# VERSION=1.0.1
# hal config version edit --version $VERSION

## Spinnakerをデプロイ
# hal deploy apply
spinnaker start/running
# netstat -nltp
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name
tcp        0      0 127.0.0.1:9000          0.0.0.0:*               LISTEN      1662/apache2
tcp6       0      0 127.0.0.1:8080          :::*                    LISTEN      1992/java
tcp6       0      0 127.0.0.1:8083          :::*                    LISTEN      2070/java
tcp6       0      0 127.0.0.1:8084          :::*                    LISTEN      2013/java
tcp6       0      0 127.0.0.1:8087          :::*                    LISTEN      2096/java
tcp6       0      0 127.0.0.1:8088          :::*                    LISTEN      2045/java
tcp6       0      0 127.0.0.1:8089          :::*                    LISTEN      1976/java
tcp6       0      0 127.0.0.1:7002          :::*                    LISTEN      1946/java
tcp6       0      0 :::8064                 :::*                    LISTEN      1157/java

自動的に起動され、4,5分程がかかります。起動が完了すると上記ポートがリッスン状態となります。

Spinnakerの設定

ここからはSpinnakerを利用するための設定となります。

SSHポート転送設定

SSHポート転送設定を実施し、ご自分の作業端末からSpinnakerのポータルサイトにアクセスできるようにします。セキュリティ上の問題などで転送設定が利用出来ない場合は、ご自身の環境にあわせてアクセスしてください。

以下例はTeraTeamを利用した例となります。

①TeraTeamでSpinnakerサーバにSSHログインします。
②上部メニューより、設定⇒SSH転送を指定します。
③追加をクリックし、以下の様に9000を入力し、OKをクリックします。

170619170942

④上記操作を、8080、8084、8087 で繰り返し、OKをクリックします。
⑤以下URLをアクセスし、ポータル画面が表示されることを確認します。
※何故かIEでは正常に表示されないので、Google Chromeでアクセスします。

https://localhost:9000

170619171853

アプリケーション 作成

アプリケーションと聞くとプログラミング言語を書くのかと思いますが、Spinnakerでいうアプリケーションはデプロイを実現するためのシナリオやリソースのグループを指します。
右端の「Actions」をクリックし、プルダウンから「Create Application」をクリックします。

170619182630

「Name」と「Owner Email」に任意の文字列を入力し、下部の「Create」をクリックします。

170619182901

以下の様な画面が表示されます。

170619183023

セキュリティグループ 作成

画面右上の「SECURITY GROUPS」をクリックし、「Create Security Group」をクリックします。

170619183023

画面のように必要事項を入力し、「Create」をクリックします。
「Region」は必ずリソースグループと一致させてください。

170619183656

作成完了すると、以下の様な画面が表示されます。
もし、表示されない場合は「Ctrl + F5」でリロードして下さい。

170619185108

アプリケーションゲートウェイ 作成

Spinnaker上では Load Balancers となっていますが、実際はアプリケーションゲートウェイのことを指しています。Azureのロードバランサではないことをご注意下さい。
まず、上記「Spinnakerの構成」で示したネットワークを作成します。ネットワーク帯は自身の環境にあわせて適宜変更し、ロケーションは必ずリソースグループと一致させてください。

## Azureアカウントにログイン
# az login
# az account list
# SUBSCRIPTION_ID=<サブスクリプションID>
# az account set --subscription $SUBSCRIPTION_ID

## デプロイ用ネットワークとアプリケーションゲートウェイ用サブネットワークを作成
# SPINNAKERNW=<デプロイ用ネットワーク名>
# SPINNAKERSUBNW01=<アプリケーションゲートウェイ用サブネットワーク名>
# az network vnet create \
--name $SPINNAKERNW \
--resource-group $RESOURCE_GROUP \
--location westus \
--address-prefix 10.0.0.0/16 \
--subnet-name $SPINNAKERSUBNW01 \
--subnet-prefix 10.0.0.0/24

## デプロイサーバ用サブネットワーク作成
# SPINNAKERSUBNW02=<デプロイサーバ用サブネットワーク名>

ポータル画面に戻って、画面右上の「LOAD BALANCERS」をクリックし、「Create Load Balancer」をクリックします。

170627144653

画面のように必要事項を入力し、「Create」をクリックします。

Account:アカウント名 (自動入力)
Region:リージョン (自動入力)
Virtual Network:Spinnaker用ネットワーク名を選択
Subnet:Application GateWay用サブネットワーク名を選択
Stack:任意文字列
Detail:任意文字列 (自動入力)

170627145407

170627145529

作成に20分程かかります。作成完了すると、以下の様な画面が表示されます。
もし、表示されない場合は「Ctrl + F5」でリロードして下さい。

170627151710

Azure側から見ても作成されていることがわかります。

1706271504072

パイプライン 作成

パイプラインとは自動処理を行うシナリオを指しています。パイプラインを作成することで、様々な自動処理が可能となります。
今回は、Azureに仮想マシン(スケールセットインスタンス)をデプロイするだけの簡単なパイプラインを作成します。

画面上の「PIPELINES」をクリックし、画面右上の「+」をクリックします。

170627152930

画面のように必要事項を入力し、「Create」をクリックします。

Type:Pipeline
Pipeline Name:任意

170627153306

作成完了すると、以下の様な画面が表示されます。

170627153506

「Add stage」をクリックし、画面のように必要事項を入力します。

Type:Bake
Stage Name:Bake (自動入力)
Regions:リージョン (自動入力)
Package:パッケージ名 ※ここにはビルドされたソフトウェア名を入力するが、例ではパッケージ名を指定
Base OS:ubuntu (v14.05) ※他にも centos(7) と windows-2012-r2(2012 R2) が選択可能だが、ubuntu 以外を選択するとデプロイ時にエラーとなる。

170627154833

170627155312

再度「Add stage」をクリックし、画面のように必要事項を入力します。

Type:Bake
Stage Name:Bake (自動入力)

170627160043

画面下にある「Add server group」をクリック、「Continue without a template」します。

170627160118

画面のように必要事項を入力します。

Account:プルダウンより選択
Region:プルダウンより選択
Stack:任意文字
Detail:任意文字
Load Balancers:プルダウンより選択
Subnets:プルダウンより選択
Security Groups:プルダウンより選択

170627161511

170627160911

170627161039

「Add」をクリックし、追加されていることを確認します。

170627161727

「Save Changes」をクリックします。※警告が表示されていますが、無視します。

Spinnakerの動作確認

画面上の「PIPELINES」をクリックし、作成したバイプライン右の「Start Manual Execution」をクリックします。

170627162048

「Run」をクリックすると、デプロイが開始されます。

170627162244

170627165445

デプロイ完了が完了すると以下様な画面になります。画面から23分程時間がかかっているのがわかります。

170627165312

Azure側から見ると、このように Spinnaker用ネットワーク配下に「スケールセットインスタンス」をしてデプロイされていることがわかります。

1706271657042

1706271657302

Spinnakerサーバを踏み台にするなどにして、ローカルIPアドレスでデプロイサーバにログインすることも可能です。
ユーザ/パスワードはキーボルト作成時に設定しているはずです。

Welcome to Ubuntu 14.04.5 LTS (GNU/Linux 4.4.0-78-generic x86_64)

 * Documentation:  https://help.ubuntu.com/

  System information as of Tue Jun 27 07:44:38 UTC 2017

  System load: 0.16              Memory usage: 3%   Processes:       83
  Usage of /:  3.1% of 29.50GB   Swap usage:   0%   Users logged in: 0

  Graph this data and manage this system at:
    https://landscape.canonical.com/

  Get cloud support with Ubuntu Advantage Cloud Guest:
    https://www.ubuntu.com/business/services/cloud

Your Hardware Enablement Stack (HWE) is supported until April 2019.


The programs included with the Ubuntu system are free software;
the exact distribution terms for each program are described in the
individual files in /usr/share/doc/*/copyright.

Ubuntu comes with ABSOLUTELY NO WARRANTY, to the extent permitted by
applicable law.

@siostest01-0:~$

最後に

今回はSpinnakerを利用して、Azure上に仮想マシンをデプロイする方法のみをご紹介しました。
冒頭にも記載がありますが、本来は Jenkins や Travis CI などの継続的インテグレーション(CI)ツールと連携して利用するのが本来の利用方法となりますので、今後の記事で連携方法もご紹介できればと思っています。
実際やってみて最も疑問だったのが、OS が Ubuntu 14.04.5 LTS しか選択できなかったということです。Azureのスケールセットイメージでは逆に Ubuntu 14.04.5 LTS は選べず、Ubuntu 16.04 LTS が選択可能です。恐らく、Spinnakerが独自でスケールセットイメージを持っているのだと考えられます。この場合、OSのバージョンはSpinnaker次第ということになってしまうため、懸念が残りました。もしかすると自由にカスタマイズ出来るかもしれないので、もう少し調べて見たいと思います。
継続的デリバリーは今後のソフトウェア開発において、需要が高まってくると思いますので足がかりとして Spinnaker 触れてみては如何でしょうか。

サイオステクノロジー株式会社 山田

ご覧いただきありがとうございます! この投稿はお役に立ちましたか?

役に立った 役に立たなかった

0人がこの投稿は役に立ったと言っています。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です