仮想化通信

日本仮想化技術株式会社の公式エンジニアブログ

KubernetesクラスタへSpinnakerを構築

Kubernetesはコンテナアプリケーションのオーケストレーターです。

yamlによるサービス構築がkubectlコマンドで実行できますが、 さらに自動化されたデプロイ環境が欲しくなってくるのではないでしょうか。

そこで前回構築したKubernetesにContinuous Delivery Platformである 「Spinnaker」を動作させ、パイプラインによる自動デプロイを行いました。

筆者: コムシス情報システム株式会社 山本 聡(やまもと さとる)

Kubernetesクラスタ環境の用意

まずはKubernetesクラスタを用意します。

以前当ブログにおいてJUJU+MAASでの環境構築を行っていますので、以下のエントリーを参考ください。

http://tech.virtualtech.jp/entry/2018/03/29/104216

Kubernetes永続ボリューム設定

SpinnakerをKubernetes上にデプロイするにあたって、ポッドが永続ボリューム要求を出します。

これを処理するため、ブロックストレージ等によるバックエンドの構築を行い、Kubernetesにストレージクラスを設定します。

永続ボリューム用のストレージ選定

Kubernetesの永続ボリュームに使用できるストレージはいくつかありますが、今回はCephを選びました。

中でもKubernetes対応のCephストレージソフトウェアである「ROOK」を使用します。

https://rook.io

Kubernetesの特権モードを有効化

ROOKを構築するにはKubernetesの特権モードを有効化しておく必要があります。

JUJUを使用している場合、MasterとWorkerのconfigureからallo-privileged=trueに設定します。

f:id:virtualtech:20180523133945p:plain

ROOKのダウンロード

ROOKをGithubからクローンでダウンロードします。

$ git clone https://github.com/rook/rook.git
$ cd rook/cluster/examples/kubernetes/

ROOK Operatorのデプロイ

始めにROOK Operatorをデプロイします。

kubectl create -f rook-operator.yaml

正常にデプロイできたかをポッドの一覧から確認します。

$ kubectl -n rook-system get pod
NAME                             READY     STATUS    RESTARTS   AGE
rook-agent-4ljgl                 1/1       Running   0          1m
rook-agent-988kd                 1/1       Running   0          1m
rook-operator-7cdfdb4bdc-ksg4b   1/1       Running   0          1m

ROOK Clusterのデプロイ

次にROOK Clusterをデプロイします。

kubectl create -f rook-cluster.yaml

こちらも正常にデプロイできたかをポッドの一覧から確認します。 ceph-osdやceph-monがworker数分作成されています。

$ kubectl -n rook get pod
NAME                              READY     STATUS    RESTARTS   AGE
rook-api-7f9df6fdfd-ph96w         1/1       Running   0          1m
rook-ceph-mgr0-67df677685-mzxvd   1/1       Running   0          1m
rook-ceph-mon0-5c66f              1/1       Running   0          1m
rook-ceph-mon1-qfn6h              1/1       Running   0          1m
rook-ceph-osd-pj4wk               1/1       Running   0          1m
rook-ceph-osd-q4xp7               1/1       Running   0          1m

ROOK Storage Class設定

ここまででバックエンドストレージが出来上がっていますので、最後にストレージクラスをKubernetesに設定します。

$ kubectl create -f rook-storageclass.yaml

作成確認します。

$ kubectl get storageclass
NAME                   PROVISIONER     AGE
rook-block (default)   rook.io/block   1m

規定のストレージクラス設定

Kubernetesでは永続ボリューム要求をする際にストレージクラスを指定します。

例えば以下のように

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: mysql-pv-claim
  labels:
    app: wordpress
spec:
  storageClassName: rook-block
  accessModes:
  - ReadWriteOnce
  resources:
    requests:
      storage: 20Gi

ところがyamlファイルの作りによってはstorageClassNameを指定していないものもあります。

後述するhelmによるspinnakerのデプロイもその一つでした。

したがって、明示的なストレージの指定がない場合の動作を規定しておく必要があります。

$ kubectl get storageclass
NAME         PROVISIONER     AGE
rook-block   rook.io/block   1m

$ kubectl patch storageclass rook-block -p '{"metadata": {"annotations":{"storageclass.kubernetes.io/is-default-class":"true"}}}'

$ kubectl get storageclass
NAME                   PROVISIONER     AGE
rook-block (default)   rook.io/block   3m

ストレージクラス名の横に(default)が付与されていればOKです。

Spinnakerのデプロイ

helmインストール

Spinnakerのデプロイにはkubernetesパッケージマネージャーhelmを使用して行います。

コマンド単体で公開されているので、PATHが通っている場所に展開します。

$ wget https://storage.googleapis.com/kubernetes-helm/helm-v2.8.2-linux-amd64.tar.gz
$ tar zxvf helm-v2.8.2-linux-amd64.tar.gz
$ sudo cp linux-amd64/helm /bin/

helm初期化

helmを初期化します

$ helm init

deploymentsにtiller-deployが作成されているかを確認します。

kubectl get deployments --namespace=kube-system
NAME                             DESIRED   CURRENT   UP-TO-DATE   AVAILABLE   AGE
heapster-v1.5.2                  1         1         1            1           10d
kube-dns                         1         1         1            1           10d
kubernetes-dashboard             1         1         1            1           10d
metrics-server-v0.2.1            1         1         1            1           10d
monitoring-influxdb-grafana-v4   1         1         1            1           10d
tiller-deploy                    1         1         1            1           10d

helmリポジトリアップデート

helmのリポジトリをアップデートします。

アップデートしない場合のstable/spinnaker CHART VERSIONは0.4.0になっており、

当該バージョンではデプロイに失敗していました。

当方の環境ではCHART VERSION 0.4.1でデプロイと動作確認しています。

$ helm search spinnaker
NAME                CHART VERSION   APP VERSION DESCRIPTION                                       
stable/spinnaker    0.4.0           1.6.0       Open source, multi-cloud continuous delivery pl...

$ helm repo update
Hang tight while we grab the latest from your chart repositories...
...Skip local chart repository
...Successfully got an update from the "stable" chart repository
Update Complete. ⎈ Happy Helming!⎈ 

$ helm search spinnaker
NAME                CHART VERSION   APP VERSION DESCRIPTION                                       
stable/spinnaker    0.4.1           1.6.0       Open source, multi-cloud continuous delivery pl...

Spinnakerデプロイ

helmコマンドでspinnakerをデプロイします。

$ helm install stable/spinnaker

プロンプトが返却されるのに時間がかかりますので、しばらく待ちます。

WEB UI への接続

デプロイしたSpinnakerのWEB UIにアクセスします。

方法は様々ですが、一番容易な方法としてローカルPCへkubectlをインストールし、port-forwardで接続することにしました。

ローカルPCはmacにて作業しています。

$ curl -LO https://storage.googleapis.com/kubernetes-release/release/$(curl -s https://storage.googleapis.com/kubernetes-release/release/stable.txt)/bin/darwin/amd64/kubectl
$ chmod 755 kubectl
$ mkdir .kube

kubectlがkubernetesクラスタへ接続するために、.kubeディレクトリ内へconfigという名前のコンフィグファイルを、既にkubectlが動作している環境(Masterノード等)からコピーしてください。

$ pwd
/Users/user/.kube

$ ls -l
total 8
-rw-r--r--   1 user  user  1961  5 11 17:29 config

kubectlが実行可能か、ポッドの一覧を取得して確認します。

$ ./kubectl get pod
NAME                                                   READY     STATUS      RESTARTS   AGE
default-http-backend-2wz6k                             1/1       Running     0          10d
nginx-ingress-kubernetes-worker-controller-6jr2k       1/1       Running     0          10d
nginx-ingress-kubernetes-worker-controller-twgsw       1/1       Running     0          10d
wishing-camel-create-bucket-hl5d7                      0/1       Completed   2          6d
wishing-camel-jenkins-6f7c98bf8f-xg2nx                 1/1       Running     0          5d
wishing-camel-minio-6cffcc6db8-vz4tw                   1/1       Running     0          6d
wishing-camel-redis-67968d58bf-9tnkm                   1/1       Running     0          6d
wishing-camel-spinnaker-clouddriver-6849758946-tnlgt   1/1       Running     0          6d
wishing-camel-spinnaker-deck-94bd44446-gllp7           1/1       Running     0          6d
wishing-camel-spinnaker-echo-6c8d594b58-d9g5l          1/1       Running     0          6d
wishing-camel-spinnaker-front50-5c96c6fb8-sxfsz        1/1       Running     0          6d
wishing-camel-spinnaker-gate-5bbb8f5f44-4g8vc          1/1       Running     0          6d
wishing-camel-spinnaker-igor-76f485774f-x5fjd          1/1       Running     0          6d
wishing-camel-spinnaker-orca-5d55699b75-p4vl7          1/1       Running     0          6d
wishing-camel-spinnaker-rosco-fbb775b59-z7pqf          1/1       Running     0          6d
wishing-camel-upload-build-image-dx295                 0/1       Completed   0          6d
wishing-camel-upload-run-pipeline-z8lpf                0/1       Completed   0          6d
wishing-camel-upload-run-script-bdllh                  0/1       Completed   0          6d

spinnaker-deck というポッドにport-forwardします。

$ ./kubectl port-forward wistful-crab-spinnaker-deck-74976bbcf9-x48dc 9000

WEBブラウザを開き、ポートフォワードしたローカルホストに対し接続します。

f:id:virtualtech:20180523134012p:plain

今回はひとまずここまで!

次回はSpinnakerのパイプライン設定を行い、Kubernetesへの自動デプロイを実行していきます。