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」を使用します。
Kubernetesの特権モードを有効化
ROOKを構築するにはKubernetesの特権モードを有効化しておく必要があります。
JUJUを使用している場合、MasterとWorkerのconfigureからallo-privileged=true
に設定します。
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ブラウザを開き、ポートフォワードしたローカルホストに対し接続します。
今回はひとまずここまで!
次回はSpinnakerのパイプライン設定を行い、Kubernetesへの自動デプロイを実行していきます。