[k8s]EKSにGitLab環境をHelmを使ってデプロイしてみた

最近Kubernetes(以下、k8s)をガリガリさわっております。

先日、ローカルのMac環境でHelmを使ってk8sの環境を構築したので、今回はEKSGitLab環境をHelmで構築してみたいと思います。

[k8s]ローカルのMac環境でHelmを使ってKubernetesの環境を構築する | DevelopersIO

ちなみに、GitLabがCloud Nativeな環境としてHelm Chartを利用することを推奨しているため、ほぼ公式ドキュメントに手順が載っています。本ブログでは、その中からざっくりと構築手順を抜粋してご紹介いたします。

GitLab cloud native Helm Chart | GitLab

EKS環境の構築

まずは eksctl を使って、土台となるEKS環境を構築します。検証用でお金がもったいないので、ノードは小さめ少なめで作ります。

$ eksctl version
[ℹ]  version.Info{BuiltAt:"", GitCommit:"", GitTag:"0.1.40"}
$ eksctl create cluster \
  --name sandbox \
  --region us-west-2 \
  --zones us-west-2a,us-west-2b \
  --nodes 2 \
  --nodes-min 2 \
  --nodes-max 2 \
  --node-type t3.medium \
  --node-zones us-west-2a

EKS自体の学習については弊社ブログでチュートリアルの紹介をしているので、ぜひこちらを御覧ください。

【EKSWorkshop】EKSやkubernetes周辺を効率よく学ぶのにオススメなチュートリアル集 | DevelopersIO

構築が終わったら kubectl を使って、コンテキストがEKSに向いていることを確認します。

$ kubectl config get-contexts
CURRENT   NAME                                             CLUSTER                      AUTHINFO                                         NAMESPACE
*         1563852368425461000@sample.us-west-2.eksctl.io   sample.us-west-2.eksctl.io   1563852368425461000@sample.us-west-2.eksctl.io  

kubectl で、Helm用のサービスアカウントを作成します。

$ kubectl --namespace kube-system create serviceaccount tiller
serviceaccount/tiller created

kubectl で、ServiceAccountのtillerにAdmin権限を付与します。

$ kubectl create clusterrolebinding tiller --clusterrole cluster-admin --serviceaccount=kube-system:tiller
clusterrolebinding.rbac.authorization.k8s.io/tiller created

helm を使って、EKSのクラスタに tiller をデプロイします。

$ helm init --service-account tiller --wait

これで、Helmが利用できるk8sクラスタをEKSに構築することができました。

インストール前の確認

執筆時点(2019/07/23)で、以下のバージョンが必要とされているのでバージョンに問題がないか確認します。クラスタのCPUやメモリが少ない点は、起動するpodを減らして対応します。

Installing GitLab using Helm | GitLab

  • kubectl 1.10 or higher, compatible with your cluster (+/- 1 minor release from your cluster).
  • Helm 2.12 or higher. Note Helm 3 is not yet supported.
  • A Kubernetes cluster, version 1.10 or higher. 6vCPU and 16GB of RAM is recommended.
$ kubectl version
Client Version: version.Info{Major:"1", Minor:"15", GitVersion:"v1.15.1", GitCommit:"4485c6f18cee9a5d3c3b4e523bd27972b1b53892", GitTreeState:"clean", BuildDate:"2019-07-18T14:25:20Z", GoVersion:"go1.12.7", Compiler:"gc", Platform:"darwin/amd64"}
Server Version: version.Info{Major:"1", Minor:"13+", GitVersion:"v1.13.7-eks-c57ff8", GitCommit:"c57ff8e35590932c652433fab07988da79265d5b", GitTreeState:"clean", BuildDate:"2019-06-07T20:43:03Z", GoVersion:"go1.11.5", Compiler:"gc", Platform:"linux/amd64"}
$ helm version
Client: &version.Version{SemVer:"v2.14.2", GitCommit:"a8b13cc5ab6a7dbef0a58f5061bcc7c0c61598e7", GitTreeState:"clean"}
Server: &version.Version{SemVer:"v2.14.2", GitCommit:"a8b13cc5ab6a7dbef0a58f5061bcc7c0c61598e7", GitTreeState:"clean"}

GitLabのインストール

まずは、Helmリポジトリに gitlab を追加します。

$ helm repo add gitlab https://charts.gitlab.io/
"gitlab" has been added to your repositories
$ helm repo update
Hang tight while we grab the latest from your chart repositories...
...Skip local chart repository
...Successfully got an update from the "gitlab" chart repository
...Successfully got an update from the "stable" chart repository
Update Complete.

最低限のGitLab環境を作るために、yamlのconfigファイル(gtilab_config.yaml)を作ります。

global.hosts.domain には、自分が所有しているドメインを設定します。

# Minimal settings
global:
  edition: ce
  ingress:
    configureCertmanager: false
  hosts:
    domain: example.com
    https: false
    gitlab:
      https: false
    registry:
      https: false
    minio:
      https: false
# Don't use certmanager, we'll self-sign
certmanager:
  install: false
# Save resources, only 2 CPU
prometheus:
  install: false
# GitLab Runner isn't a big fan of self-signed certificates
gitlab-runner:
  install: false
# Reduce replica counts, reducing CPU & memory requirements
gitlab:
  unicorn:
    minReplicas: 1
    maxReplicas: 1
  sidekiq:
    minReplicas: 1
    maxReplicas: 1
  gitlab-shell:
    minReplicas: 1
    maxReplicas: 1
registry:
  minReplicas: 1
  maxReplicas: 1

設定についてざっくり説明すると、動かさなくてもGitLabが動くオプションサービスを全部廃止し、各podの起動を1つに制限しています。

設定値の詳細はドキュメント、または設定ファイルのサンプルを御覧ください。

configファイルを作成したら、helmコマンドでGitLabをデプロイします。

$ NAMESPACE=gitlab
$ helm upgrade --install gitlab gitlab/gitlab \
  --namespace $NAMESPACE \
  --version=2.1.0 \
  --values gitlab_config.yaml

しばらくしたら、podが起動しているか確認してみます。

$ kubectl get --namespace $NAMESPACE pods
NAME                                                   READY   STATUS      RESTARTS   AGE
gitlab-gitaly-0                                        1/1     Running     0          6m27s
gitlab-gitlab-monitor-769444477f-tmfrx                 1/1     Running     0          6m27s
gitlab-gitlab-shell-548659f6d4-vkj65                   1/1     Running     0          6m27s
gitlab-migrations.1-wcv8w                              0/1     Completed   0          6m27s
gitlab-minio-c64f9694b-tsvt9                           1/1     Running     0          6m27s
gitlab-minio-create-buckets.1-74nx5                    0/1     Completed   0          6m27s
gitlab-nginx-ingress-controller-78fb4c686b-24nj8       1/1     Running     0          6m27s
gitlab-nginx-ingress-controller-78fb4c686b-b4lpb       1/1     Running     0          6m27s
gitlab-nginx-ingress-controller-78fb4c686b-k4qkz       1/1     Running     0          6m27s
gitlab-nginx-ingress-default-backend-7f87d67c8-8w2zl   1/1     Running     0          6m27s
gitlab-nginx-ingress-default-backend-7f87d67c8-h9grw   1/1     Running     0          6m26s
gitlab-postgresql-cb4c58788-qsljc                      2/2     Running     0          6m26s
gitlab-redis-5b95c867c6-bl98s                          2/2     Running     0          6m26s
gitlab-registry-5db79d4cdd-np2vd                       1/1     Running     0          6m26s
gitlab-sidekiq-all-in-1-7d56c4d96f-7svbp               1/1     Running     0          6m27s
gitlab-task-runner-6598b68bd5-5jsgt                    1/1     Running     0          6m27s
gitlab-unicorn-54c6b46c5-gd8hz                         2/2     Running     0          6m27s

接続用にELBができているはずなので、serviceを見て確認してみます。

$ kubectl get --namespace $NAMESPACE services
NAME                                      TYPE           CLUSTER-IP       EXTERNAL-IP                                                               PORT(S)                                   AGE
gitlab-gitaly                             ClusterIP      None             <none>                                                                    8075/TCP,9236/TCP                         7m46s
gitlab-gitlab-monitor                     ClusterIP      10.100.175.45    <none>                                                                    9168/TCP                                  7m46s
gitlab-gitlab-shell                       ClusterIP      10.100.243.78    <none>                                                                    22/TCP                                    7m46s
gitlab-minio-svc                          ClusterIP      10.100.27.102    <none>                                                                    9000/TCP                                  7m46s
gitlab-nginx-ingress-controller           LoadBalancer   10.100.137.20    xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx-xxxxxxxxxx.us-west-2.elb.amazonaws.com   80:31204/TCP,443:32323/TCP,22:32382/TCP   7m46s
gitlab-nginx-ingress-controller-metrics   ClusterIP      10.100.3.73      <none>                                                                    9913/TCP                                  7m46s
gitlab-nginx-ingress-controller-stats     ClusterIP      10.100.160.181   <none>                                                                    18080/TCP                                 7m46s
gitlab-nginx-ingress-default-backend      ClusterIP      10.100.216.212   <none>                                                                    80/TCP                                    7m46s
gitlab-postgresql                         ClusterIP      10.100.37.52     <none>                                                                    5432/TCP                                  7m46s
gitlab-redis                              ClusterIP      10.100.156.4     <none>                                                                    6379/TCP,9121/TCP                         7m46s
gitlab-registry                           ClusterIP      10.100.221.243   <none>                                                                    5000/TCP                                  7m46s
gitlab-unicorn                            ClusterIP      10.100.253.183   <none>                                                                    8080/TCP,8181/TCP                         7m46s

gitlab-nginx-ingress-controller にELBのアドレスが記載されています。

次に、ドメインでGitLabにアクセスできるよう、Route53でレコードの設定をします。

名前は、「gitlab. + gitlab_config.yamlで設定したドメイン名」にして、先程確認したELBのアドレスのエイリアスに設定します。

これで、一通りの構築ができました。

GitLabにアクセスする

先程ドメイン名をつけたので、ドメイン名でアクセスしてみます。そうすると、ログインページにリダイレクトされます。

ログインのための初期ユーザとパスワードについては、公式サイトに記載されているので、これを参考に取得します。

Deployment Guide | GitLab

$ kubectl get secret gitlab-gitlab-initial-root-password \
  --namespace $NAMESPACE \
  -ojsonpath='{.data.password}' | base64 --decode ; echo

取得したパスワードでrootログインすると、無事GitLabにログインすることができました。

さいごに

EKSにGitLab環境をHelmを使って構築することができました。とりあえずは、第一歩です。

本番運用するには、永続ストレージをどうしようかとかPostgreSQLを外出ししたいとかまだまだ考えることは多そうです。そのあたりも検証していきたいと思います。