kawabatas技術ブログ

試してみたことを書いていきます

Spinnaker を導入した

概要

GKE のアプリケーションのデプロイに Spinnaker を導入したので、その手順をまとめておく。

halyard のインストール

Try out Halyard on GKE に従い、GCE 上に halyard VM を作り、Kubernetes クラスタに Spinnaker をセットアップしていく。

f:id:kawabatas:20180624134644p:plain

Try out Halyard on GKE の通りに行った。

ただし、複数人が halyard を扱うことを考慮し、~/.hal/config ではなく /opt/config/.hal/config に変更した。

/opt/spinnaker/config/halyard.yml を修正すればよい。

~/.kube/config, ~/.gcp/gcp.json も /opt/config 以下を参照するよう変更した。

あと .hal/config の timezone を Asia/Tokyo に設定した。

Kubernetes Account の設定

https://www.spinnaker.io/setup/install/providers/kubernetes/

GKE の k8s クラスタを扱うには、

  • クラスタのレガシー認証を有効にする
  • Kubernetes RBAC を設定する

どちらかしなければならない。

RBAC を設定する

その前に、GKE の k8s クラスタに追加の Role または ClusterRole 権限を作成する前には、自分の Google ID に cluster-admin の役割を与える RoleBinding を作成する必要があるらしい。

https://cloud.google.com/kubernetes-engine/docs/how-to/role-based-access-control#defining_permissions_in_a_role

一旦、cluster-admins ClusterRoleBinding を作成。

kind: ClusterRoleBinding
apiVersion: rbac.authorization.k8s.io/v1
metadata:
  name: cluster-admins
subjects:
- kind: User
  name: [google アカウント名]
roleRef:
  kind: ClusterRole
  name: cluster-admin
  apiGroup: ""

ClusterRoleBinding, ServiceAccount を作成。

apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
  name: spinnaker-role-binding
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: ClusterRole
  name: cluster-admin
subjects:
- namespace: default
  kind: ServiceAccount
  name: spinnaker-service-account
---
apiVersion: v1
kind: ServiceAccount
metadata:
  name: spinnaker-service-account
  namespace: default

Optional: configure Kubernetes roles (RBAC) の通りに ClusterRole で spinnaker-role を作成したが、エラーでうまく行かず...

https://github.com/spinnaker/spinnaker/issues/2413#issuecomment-391962077

こちらを追加してみてもまだ足りなかった。

よって、cluster-admin を bind した。

ServiceAccount で context を作成する。

https://www.spinnaker.io/setup/install/providers/kubernetes-v2/#optional-create-a-kubernetes-service-account

kubectl config set-credentials spinnaker-service-account-token-user --token XXXX
kubectl config set-context spinnaker-service-account --cluster=[クラスタ] --user spinnaker-service-account-token-user

Kubernetes Account を追加

spinnaker のデプロイには Kubernetes V1 アダプタを使用し、アプリケーションのデプロイには Kubernetes V2 アダプタを使用した。 V2 では manifest-based deployment が可能になる。

hal config provider kubernetes enable

spinnaker(V1)

hal config provider kubernetes account add spinnaker-account \
    --docker-registries my-docker-registry \
    --context spinnaker-service-account

アプリケーション(V2)

hal config provider kubernetes account add app-account \
    --provider-version v2 \
    --context spinnaker-service-account
hal config features edit --artifacts true
hal deploy apply

常時 Spinnaker を使えるように

デフォルトでは hal deploy connect している時しか Spinnaker へアクセスできないので、常時アクセスできるように設定する。

Try out public Spinnaker on GKE に従えば良い。

deck, gate の service の編集で少し補足を。

service の type: LoadBalancer で設定できる loadBalancerIP は region のみ。(global は使えない)

gcloud compute addresses create [NAME] --region=[REGION]

また loadBalancerSourceRanges でIP制限を追加できる。

これで Spinnker へアクセスし、pipeline を作成できる。