2019/01/05

Spinnaker on GKE の本番環境用インストールを Halyard on Docker でどうやるかを検証してみた

一年以上ぶりの投稿は、2018-2019 の年末年始に調べた Spinnaker の Halyard コンテナ経由のインストールについての覚書。

Spinnaker は、PoC 目的とかで検証する程度なら GCP の Cloud Launcher とかで簡単に構築できるのだが、いざ本番運用を考えると Spinnaker のウェブサイトにある Install and Configure Spinnaker に従い構築するほうがベター。しかも、クラウドにサービスを展開するための Continuous Delivery (継続デリバリー)用のツールをローカルのオンプレ環境で構築するのはあまり意味がないので、Spinnaker を GCE 上のコンテナの Halyard から GKE 上にインストールする方法を探る。



そもそも Spinnaker を本番環境用として構築する場合は、Spinnaker の各サービスをマイクロサービスとして Kubernetes(k8s)上に展開することが推奨されている。各サービスを個別に手動でインストールしていくことも可能らしいが、 手間だったり Spinnaker のアップデートなど長期運用を考えると、Halyard という管理サーバーをインストールして hal コマンドで Spinnaker をデプロイしたり、アップデートするのが正解となる。 この Halyard は VM (GCE) 上にインストールすることも可能だが、Docker コンテナとして起動することも可能であり、Halyard 自体のメンテナンス性を考えて Docker コンテナを採用することにした。Halyard は Spinnaker のデプロイ、アップデートの際に使うくらいで、Halyard 自体を Immutable インフラにしておけば、利用時に常に最新環境になるはず。

とはいっても、Docker コンテナを単に GCE の通常の VM インスタンス上に構築するならその VM のメンテナンスも考える必要があるので、今回は Container-Optimized OS (COS) を使用し、Halyard のコンテナイメージからインスタンスを作成する。また設定ファイル等を永続ディスクに残す構成とする。

PD を作成する

Halyard の設定ファイル、kubeconfig ファイル、GCS 用のサービスアカウントのキーを保管しておく用に、永続ディスクを作成しておく。どのくらい必要かわからないのでとりあえず 50GB くらいで作っておく。名前はとりあえず halyvol とかにしておき、HDD で十分。
gcloud compute disks create halyvol --type pd-standard

Halyard コンテナイメージを指定して VM インスタンスを作成する

Spinnaker のウェブサイトにある Install Halyard on Docker を参考にして、こちらにある gcr.io/spinnaker-marketplace/halyard:stable をコンテナイメージとして VM インスタンスを作成する(create-with-container)。その際に、2019年1月現在はベータ機能である Mounting a persistent disk as a data volume で作成した PD をコンテナにマウントさせる。
gcloud beta compute instances create-with-container [インスタンス名] \
--container-image gcr.io/spinnaker-marketplace/halyard:stable \
--container-mount-disk mount-path="/home/spinnaker/.hal",name=halyvol,mode=rw \
--disk name=halyvol,mode=rw \
--network [ネットワーク名] \
--tag spinnaker \
--no-restart-on-failure \
--container-env KUBECONFIG=/home/spinnaker/.hal/kube/config

ちなみに、マウントする PD はファイルシステムがない状態でマウントされると自動的に ext4 形式にフォーマットされるとのこと。検証時は一旦他の VM にアタッチしてフォーマットしたやつを使ったので、自動的にフォーマットされる機能は未確認。

ついでにタグを設定して Firewall で SSH(tcp:22)を通すように別途設定しておくのを忘れずに。

また、コンテナはネットワーク設定がホストモードで起動するので、個別のマッピングは必要ない。

GKE に Spinnaker インストール先となるクラスターを作っておく

上記で作った Halyard のインスタンスとは別に、GKE のクラスターを別途作っておく。後でサービスアカウントを作る都合上、cloud shell とか Cloud SDK の入ったローカルのターミナルで gcloud コマンドから作るほうがいい。環境にあわせてオプションとかは適当になんだけど、Spinnaker の本番環境としての推奨は 4コア、メモリ 8GB 以上となっている。
gcloud container clusters create [クラスター名]

kubernetes Service Account の作成

GKE のクラスターを作ったターミナル(または cloud shell)で、まずは KUBECONFIG 環境変数を設定して、デフォルトとは別の場所に config ファイルを指定する。こうすることで、既存の kubeconfig (~/.kube/config) と混ざらないようにする。
mkdir ~/kube
touch ~/kube/config
KUBECONFIG=~/kube/config

新しく kubeconfig を作成する。
gcloud container clusters get-credentials [クラスター名]
そうしたら、Optional: Create Kubernetes Service Account にしたがい spinnaker-service-account を作成(kubeconfig に書き込まれる)する。その後、~/kube/config (.kube/config ではなく)を Halyard のインスタンスの以下のディレクトに配置する。パーミッションは適宜変更して、コンテナからアクセスできるようにしておく。
/mnt/disks/gce-containers-mounts/gce-persistent-disks/halyvol/kube

GCS へのアクセス用サービスアカウントの作成と JSONキーの作成

GKE のクラスターを作成したのと同じターミナルを使い、Download Credential に従い Spinnaker のクラスターのあるプロジェクト上でサービスアカウントと JSON キーを作成する。手順どおりだと、~/.gcp/gcs-account.json がつくられるので、この gcs-account.json を Halyard のインスタンスの以下のディレクトリ(gcs ディレクトリは作る)にコピーしておく。こちらもパーミッションを適切に設定しておく。
/mnt/disks/gce-containers-mounts/gce-persistent-disks/halyvol/gcs

hal 環境設定

Halyard の VM にアクセスして、Halyard のコンテナに入る。例えばインスタンス名が halyard-vm だとして cloud shell からアクセスする場合、
gcloud compute ssh halyard-vm
# ログインしたらコンテナ一覧で gcr.io/spinnaker-marketplace/halyard:stable のコンテナ名を確認する(klt-halyard-vm-osfl だとする)。
docker container ls
# コンテナにアクセスする
docker exec -it klt-halyard-vm-osfl bash

コンテナ上で Adding an accountEditing Your Storage Settings にある hal の環境設定を行う。
hal config provider kubernetes enable
CONTEXT=$(kubectl config current-context)
hal config provider kubernetes account add my-k8s-v2-account \
--provider-version v2 \
--context $CONTEXT
hal config features edit --artifacts true

PROJECT=[Spinnaker クラスターのある gcp プロジェクト名]
BUCKET_LOCATION=us
SERVICE_ACCOUNT_DEST=/home/spinnaker/.kube/gcs/gcs-account.json
hal config storage gcs edit --project $PROJECT \
--bucket-location $BUCKET_LOCATION \
--json-path $SERVICE_ACCOUNT_DEST
hal config storage edit --type gcs

Spinnaker のデプロイ

Deploy Spinnaker and Connect to the UI に従いデプロイする。
# 利用可能なバージョン一覧を確認する
hal version list
# デプロイするバージョンを指定する
hal config version edit --version $VERSION
# Spinnaker をデプロイする
hal deploy apply
# Spinnaker UI に接続する
hal deploy connect
この状態で Halyard インスタンスでは 9000 ポートで Spinnaker の UI にアクセスできる。ターミナルとかの場合は Halyard インスタンスに SSH トンネル貼り、ブラウザの localhost:9000 とかでアクセスできる。
gcloud compute ssh valyard-vm -- -L 9000:localhost:9000 -L 8084:localhost:8084


0 件のコメント:

コメントを投稿