こんにちは、今回は継続的デリバリープラットフォーム「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の構成
今回、検証した構成は以下となります。
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をクリックします。
④上記操作を、8080、8084、8087 で繰り返し、OKをクリックします。
⑤以下URLをアクセスし、ポータル画面が表示されることを確認します。
※何故かIEでは正常に表示されないので、Google Chromeでアクセスします。
アプリケーション 作成
アプリケーションと聞くとプログラミング言語を書くのかと思いますが、Spinnakerでいうアプリケーションはデプロイを実現するためのシナリオやリソースのグループを指します。
右端の「Actions」をクリックし、プルダウンから「Create Application」をクリックします。
「Name」と「Owner Email」に任意の文字列を入力し、下部の「Create」をクリックします。
以下の様な画面が表示されます。
セキュリティグループ 作成
画面右上の「SECURITY GROUPS」をクリックし、「Create Security Group」をクリックします。
画面のように必要事項を入力し、「Create」をクリックします。
「Region」は必ずリソースグループと一致させてください。
作成完了すると、以下の様な画面が表示されます。
もし、表示されない場合は「Ctrl + F5」でリロードして下さい。
アプリケーションゲートウェイ 作成
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」をクリックします。
画面のように必要事項を入力し、「Create」をクリックします。
Account:アカウント名 (自動入力)
Region:リージョン (自動入力)
Virtual Network:Spinnaker用ネットワーク名を選択
Subnet:Application GateWay用サブネットワーク名を選択
Stack:任意文字列
Detail:任意文字列 (自動入力)
作成に20分程かかります。作成完了すると、以下の様な画面が表示されます。
もし、表示されない場合は「Ctrl + F5」でリロードして下さい。
Azure側から見ても作成されていることがわかります。
パイプライン 作成
パイプラインとは自動処理を行うシナリオを指しています。パイプラインを作成することで、様々な自動処理が可能となります。
今回は、Azureに仮想マシン(スケールセットインスタンス)をデプロイするだけの簡単なパイプラインを作成します。
画面上の「PIPELINES」をクリックし、画面右上の「+」をクリックします。
画面のように必要事項を入力し、「Create」をクリックします。
Type:Pipeline
Pipeline Name:任意
作成完了すると、以下の様な画面が表示されます。
「Add stage」をクリックし、画面のように必要事項を入力します。
Type:Bake
Stage Name:Bake (自動入力)
Regions:リージョン (自動入力)
Package:パッケージ名 ※ここにはビルドされたソフトウェア名を入力するが、例ではパッケージ名を指定
Base OS:ubuntu (v14.05) ※他にも centos(7) と windows-2012-r2(2012 R2) が選択可能だが、ubuntu 以外を選択するとデプロイ時にエラーとなる。
再度「Add stage」をクリックし、画面のように必要事項を入力します。
Type:Bake
Stage Name:Bake (自動入力)
画面下にある「Add server group」をクリック、「Continue without a template」します。
画面のように必要事項を入力します。
Account:プルダウンより選択
Region:プルダウンより選択
Stack:任意文字
Detail:任意文字
Load Balancers:プルダウンより選択
Subnets:プルダウンより選択
Security Groups:プルダウンより選択
「Add」をクリックし、追加されていることを確認します。
「Save Changes」をクリックします。※警告が表示されていますが、無視します。
Spinnakerの動作確認
画面上の「PIPELINES」をクリックし、作成したバイプライン右の「Start Manual Execution」をクリックします。
「Run」をクリックすると、デプロイが開始されます。
デプロイ完了が完了すると以下様な画面になります。画面から23分程時間がかかっているのがわかります。
Azure側から見ると、このように Spinnaker用ネットワーク配下に「スケールセットインスタンス」をしてデプロイされていることがわかります。
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 触れてみては如何でしょうか。
サイオステクノロジー株式会社 山田