[k8s]EKSにGitLab環境をHelmを使ってデプロイしてみた
最近Kubernetes(以下、k8s)をガリガリさわっております。
先日、ローカルのMac環境でHelmを使ってk8sの環境を構築したので、今回はEKSにGitLab環境を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にアクセスする
先程ドメイン名をつけたので、ドメイン名でアクセスしてみます。そうすると、ログインページにリダイレクトされます。
ログインのための初期ユーザとパスワードについては、公式サイトに記載されているので、これを参考に取得します。
$ kubectl get secret gitlab-gitlab-initial-root-password \ --namespace $NAMESPACE \ -ojsonpath='{.data.password}' | base64 --decode ; echo
取得したパスワードでrootログインすると、無事GitLabにログインすることができました。
さいごに
EKSにGitLab環境をHelmを使って構築することができました。とりあえずは、第一歩です。
本番運用するには、永続ストレージをどうしようかとかPostgreSQLを外出ししたいとかまだまだ考えることは多そうです。そのあたりも検証していきたいと思います。