fbpx

Cloud Native GitLab Helm ChartをAzureで試してみた #GitLab #devops #kubernetes

この記事は1年以上前に投稿されました。情報が古い可能性がありますので、ご注意ください。

GitLab v10.6のリリースでCloud Native GitLab Helm ChartがついにAlpha版で公開されて、色々と検証できるようになりましたのでインストールの手順を簡単にご紹介したいと思います。

始める前に

Cloud Native GitLab Helm Chartとは

https://gitlab.com/charts/gitlab/blob/master/README.md

背景、どんな問題を解決したかったのか

GitLabプロダクトの進化により「all-in-one」のようなomnibusコンテナでは構成管理やスケーラビリティが困難になってきました。

メリット

  • 各サービスのスケーリングがより容易になる
  • 小さくて最適化された複数コンテナイメージ
  • 1サービス内に個別アップグレードやカナリアリリースが可能になる

制限(GitLab v10.7.xの時点)

現時点でGitLab EEP以上のみに対応しており、EESやCore版への対応はObject StorageのCore対応により今後される予定です。

Cloud Native GitLab Helm Chartはでalpha版で本番環境で利用できるレベルではありません。あくまで検証用に使ってください。

事前準備(Mac OS)

> kubectl version
Client Version: version.Info{Major:"1", Minor:"10", GitVersion:"v1.10.2", GitCommit:"81753b10df112992bf51bbc2c2f85208aad78335", GitTreeState:"clean", BuildDate:"2018-05-12T04:12:12Z", GoVersion:"go1.9.6", Compiler:"gc", Platform:"darwin/amd64"}
Server Version: version.Info{Major:"1", Minor:"8", GitVersion:"v1.8.1", GitCommit:"f38e43b221d08850172a9a4ea785a86a3ffa3b3a", GitTreeState:"clean", BuildDate:"2017-10-11T23:16:41Z", GoVersion:"go1.8.3", Compiler:"gc", Platform:"linux/amd64"}
> helm version
Client: &version.Version{SemVer:"v2.9.0", GitCommit:"f6025bb9ee7daf9fee0026541c90a6f557a3e0bc", GitTreeState:"clean"}
Server: &version.Version{SemVer:"v2.8.0", GitCommit:"14af25f1de6832228539259b821949d20069a222", GitTreeState:"clean"}
> az --version
azure-cli (2.0.26)

acr (2.0.20)
acs (2.0.25)
advisor (0.1.1)
appservice (0.1.25)
backup (1.0.6)
batch (3.1.9)
batchai (0.1.5)
billing (0.1.7)
cdn (0.0.12)
cloud (2.0.12)
cognitiveservices (0.1.10)
command-modules-nspkg (2.0.1)
configure (2.0.13)
consumption (0.2.1)
container (0.1.16)
core (2.0.26)
cosmosdb (0.1.17)
dla (0.0.18)
dls (0.0.19)
eventgrid (0.1.9)
extension (0.0.8)
feedback (2.0.8)
find (0.2.8)
interactive (0.3.15)
iot (0.1.16)
keyvault (2.0.17)
lab (0.0.16)
monitor (0.1.1)
network (2.0.22)
nspkg (3.0.1)
profile (2.0.18)
rdbms (0.0.11)
redis (0.2.11)
reservations (0.1.1)
resource (2.0.22)
role (2.0.17)
servicefabric (0.0.9)
sql (2.0.20)
storage (2.0.24)
vm (2.0.25)

Python location '/usr/local/opt/python/bin/python3.6'
Extensions directory '/Users/jb/.azure/cliextensions'

Python (Darwin) 3.6.4 (default, Mar 28 2018, 12:43:57) 
[GCC 4.2.1 Compatible Apple LLVM 9.0.0 (clang-900.0.39.2)]

Legal docs and information: aka.ms/AzureCliLegal

AzureクラウドでKubernetsクラスタを用意する

今回はAzure ウェブコンソールで行います。

Kubernetesサービス(AKS)を作成

  • サービスメニューより Kubernetes servicesを選択し、Createを選択
  • クラスタ名に情報を記入(gitlab-kube-native
  • DNS prefixに記入(cluster
  • Create a new Resource groupを選択し、新規グループ名を記入(gitlab-kube-native-group
  • Locationを選択(East US
  • Review and Createボタンを選択

構築時間は15分程度かかります。

CLIでクラスタに接続する

これからはターミナルのコマンドラインで進めていきます。

  • クラスタへの接続を行う
> az aks get-credentials --resource-group gitlab-kube-native-group --name gitlab-kube-native
Merged "gitlab-kube-native" as current context in /Users/jb/.kube/config
  • クラスタ接続後の稼働状況を確認する
> kubectl get nodes
NAME                       STATUS    ROLES     AGE       VERSION
aks-agentpool-11243670-0   Ready     agent     10m       v1.9.6
aks-agentpool-11243670-1   Ready     agent     10m       v1.9.6
aks-agentpool-11243670-2   Ready     agent     10m       v1.9.6
aks-agentpool-11243670-3   Ready     agent     10m       v1.9.6
> kubectl get deployments --all-namespaces
NAMESPACE     NAME                   DESIRED   CURRENT   UP-TO-DATE   AVAILABLE   AGE
kube-system   heapster               1         1         1            1           34m
kube-system   kube-dns-v20           2         2         2            2           34m
kube-system   kubernetes-dashboard   1         1         1            1           34m
kube-system   tunnelfront            1         1         1            1           34m

GitLabをデプロイする

Cloud Native GitLab Helm Chartのレポジトリをダウンロードする

> git clone git@gitlab.com:charts/gitlab.git
Cloning into 'gitlab'...
remote: Counting objects: 6467, done.
remote: Compressing objects: 100% (2554/2554), done.
remote: Total 6467 (delta 4322), reused 5624 (delta 3703)
Receiving objects: 100% (6467/6467), 1.07 MiB | 269.00 KiB/s, done.
Resolving deltas: 100% (4322/4322), done.

> cd gitlab
> ls
CHANGELOG.md      Dockerfile        bin               ci                requirements.yaml values.yaml
CONTRIBUTING.md   LICENSE.md        changelogs        dependencies      scripts
Chart.yaml        README.md         charts            doc               templates

RBAC admin-roleを追加する

Azure Kubernetes serviceではcluster-adminのroleは作られていないので手動で作成します。

cluster-admin-role.yamlの新規ファイルを作成し:

apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
  creationTimestamp: null
  name: cluster-admin
  annotations:
    rbac.authorization.kubernetes.io/autoupdate: "true"
rules:
- apiGroups:
  - '*'
  resources:
  - '*'
  verbs:
  - '*'
- nonResourceURLs:
  - '*'
  verbs:
  - '*'

そしてクラスタ内に作成します。

> kubectl --namespace kube-system apply -f cluster-admin-role.yaml 
clusterrole.rbac.authorization.k8s.io "cluster-admin" created

RBAC configを作成する

> curl -L -w '%{http_code}' -o rbac-config.yaml -s "https://gitlab.com/charts/gitlab/raw/master/doc/helm/examples/rbac-config.yaml"
> kubectl create -f rbac-config.yaml
serviceaccount "tiller" created
clusterrolebinding.rbac.authorization.k8s.io "tiller" created

Helmの依存パッケージをインストールする

> helm dependencies update
                               
Hang tight while we grab the latest from your chart repositories...
...Unable to get an update from the "local" chart repository (http://127.0.0.1:8879/charts):
    Get http://127.0.0.1:8879/charts/index.yaml: dial tcp 127.0.0.1:8879: connect: connection refused
...Successfully got an update from the "gitlab" chart repository
...Successfully got an update from the "stable" chart repository
Update Complete. ⎈Happy Helming!⎈
Saving 3 charts
Downloading cert-manager from repo https://kubernetes-charts.storage.googleapis.com/
Downloading prometheus from repo https://kubernetes-charts.storage.googleapis.com/
Deleting outdated charts

HelmにTillerコンポーネントをインストールする

> helm init --wait --service-account tiller
$HELM_HOME has been configured at /Users/jb/.helm.

Tiller (the Helm server-side component) has been installed into your Kubernetes Cluster.

Please note: by default, Tiller is deployed with an insecure 'allow unauthenticated users' policy.
For more information on securing your installation see: https://docs.helm.sh/using_helm/#securing-your-helm-installation
Happy Helming!

Chartをデプロイする

以下のページに詳細な設定が説明されています。今回はシンプルな構成で行きますので、postgresやredisをクラスタ内のサービスをクラスタ内に構築します(デフォルト)。

https://gitlab.com/charts/gitlab/blob/master/doc/installation/deployment.md

> helm upgrade --install gitlab . \
                                 --timeout 600 \
                                 --set global.hosts.domain=yourdomain.io \
                                 --set gitlab.migrations.initialRootPassword="xxx" \
                                 --set certmanager-issuer.email=xxx@mail.com
Release "gitlab" does not exist. Installing it now.
NAME:   gitlab
LAST DEPLOYED: Wed May 16 09:13:06 2018
NAMESPACE: default
STATUS: DEPLOYED

RESOURCES:
==> v1/Job
NAME                           DESIRED  SUCCESSFUL  AGE
gitlab-issuer.1                1        0           3s
gitlab-migrations.1            1        0           3s
gitlab-minio-create-buckets.1  1        0           3s

==> v1/Secret
NAME               TYPE    DATA  AGE
gitlab-postgresql  Opaque  0     4s

==> v1/ConfigMap
NAME                                   DATA  AGE
gitlab-certmanager-issuer-certmanager  2     4s
gitlab-gitaly                          3     4s
gitlab-gitlab-runner                   3     4s
gitlab-gitlab-shell                    2     4s
gitlab-migrations                      4     4s
gitlab-sidekiq-all-in-1                1     4s
gitlab-sidekiq                         5     4s
gitlab-unicorn                         7     4s
gitlab-minio-config-cm                 3     4s
gitlab-nginx-tcp                       1     4s
gitlab-nginx                           7     4s
gitlab-prometheus-server               3     4s
gitlab-redis                           2     4s
gitlab-registry                        2     4s

==> v1/PersistentVolumeClaim
NAME                      STATUS   VOLUME   CAPACITY  ACCESS MODES  STORAGECLASS  AGE
gitlab-minio              Pending  default  4s
gitlab-postgresql         Pending  default  4s
gitlab-prometheus-server  Pending  default  4s
gitlab-redis              Pending  default  4s

==> v1beta1/RoleBinding
NAME                  AGE
gitlab-gitlab-runner  3s
gitlab-nginx          3s

==> v1beta2/StatefulSet
NAME           DESIRED  CURRENT  AGE
gitlab-gitaly  1        1        3s

==> v1beta1/CustomResourceDefinition
NAME                               AGE
certificates.certmanager.k8s.io    4s
clusterissuers.certmanager.k8s.io  4s
issuers.certmanager.k8s.io         4s

==> v1beta1/ClusterRole
certmanager-gitlab                    4s
gitlab-nginx                          4s
gitlab-prometheus-kube-state-metrics  4s
gitlab-prometheus-server              4s

==> v1beta1/ClusterRoleBinding
NAME                                  AGE
gitlab-certmanager-issuer-admin       4s
certmanager-gitlab                    4s
gitlab-nginx                          4s
gitlab-prometheus-alertmanager        3s
gitlab-prometheus-kube-state-metrics  3s
gitlab-prometheus-node-exporter       3s
gitlab-prometheus-server              3s

==> v1beta1/DaemonSet
NAME          DESIRED  CURRENT  READY  UP-TO-DATE  AVAILABLE  NODE SELECTOR  AGE
gitlab-nginx  4        4        0      4           0                   3s

==> v1beta1/Ingress
NAME             HOSTS                 ADDRESS  PORTS  AGE
gitlab-unicorn   gitlab.yourdomain.io    80, 443  3s
gitlab-minio     minio.yourdomain.io     80, 443  3s
gitlab-registry  registry.yourdomain.io  80, 443  3s

==> v1/Pod(related)
NAME                                           READY  STATUS             RESTARTS  AGE
gitlab-nginx-5t29l                             0/1    ContainerCreating  0         3s
gitlab-nginx-c7zkn                             0/1    ContainerCreating  0         3s
gitlab-nginx-fkbgb                             0/1    ContainerCreating  0         3s
gitlab-nginx-q77wc                             0/1    ContainerCreating  0         3s
certmanager-gitlab-56f5486fdb-xzk94            0/2    ContainerCreating  0         3s
gitlab-gitlab-runner-5b64646b46-mrqh8          0/1    Init:0/1           0         3s
gitlab-gitlab-shell-7c9df464c6-bxbkt           0/1    Init:0/1           0         3s
gitlab-sidekiq-all-in-1-6584797cc-pjsdn        0/1    Init:0/2         

新規CTA