GitLab on k8s by Rancher

# はじめに

今回は k8s 環境 (Rancher)でのコンテナイメージ管理についてです。
コンテナのイメージ管理は docker registry が主流かと思います。
そんな中、ソースコード管理で利用される GitLab にもコンテナイメージ管理の機能が追加されていたため、今回は GitLab を利用しようと思います。
 GitLab を用いることで Dockerfile のコード管理に加え、デプロイ時のパイプライン管理などができるかと思います。

# 環境構成

**ホストマシン**

* Windows10
* VirtualBox：6.0.10

**ゲストマシン**

* CentOS：7.6
* docker-ce：18.09
* kubernetes：1.14.6
* Rancher：2.2.8
* Rancher & k8s controller/etcd x1台、k8s worker x3台

※スペックや k8s の基本構成は以下の記事を参照してください
※以下の記事を参考に GlusterFS を構築済みの環境とします
https://qiita.com/t_ume/items/cce5f4cebf77af293b91

※GlusterFS の追加ディスクは 80GB 以上必要です
以下、今回利用する PVC の Volume サイズです。
![qiita12.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/317159/096ebe5a-6daa-ff06-b113-3a230b4194c9.jpeg)


# 前準備

今回は Rancher のカタログアプリから GitLab をデプロイします。
Rancher のカタログアプリは Web 画面からフォーム入力で簡単にアプリをデプロイできる機能です。
裏では コンテナパッケージツールである helm によってデプロイが実現されています。
デフォルトで登録されているアプリは github にある helm の公式で管理しているものと Rancher 公式のリポジトリで管理してているものです。アプリ本体・一覧は helm で管理されたコードであり、git のリポジトリが登録されています。
まずはここに GitLab のリポジトリを登録していきます。

## リポジトリ追加

Rancher 管理コンソールから「ツール」⇒「カタログ」で以下のカタログ管理画面が表示されます。

![qiita01.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/317159/36d2a0c8-fb07-2470-2e7f-1447162a1bae.jpeg)

右上「カタログを追加」をクリックし、以下を入力して GitLab のリポジトリを登録していきます。

名前：gitlab(任意)
URL：https://charts.gitlab.io/
※他はデフォルト

![qiita02.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/317159/eed3198f-32d0-fac9-a0f4-4a0d2f9c9ba6.jpeg)

「作成」をクリックすると登録完了です。コードのダウンロードとカタログの追加に少し時間がかかります。カタログの追加が完了すると、各プロジェクトのカタログアプリから登録したリポジトリのアプリの一覧を参照できるようになります。

![qiita03.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/317159/31aac96a-b1ff-5103-fe66-4007744cfd5f.jpeg)

準備は完了したので次からデプロイに入ります。

# GitLab deploy

## deploy

Rancher の Web 画面での作業となります。
各プロジェクトから、「カタログアプリ」をクリック⇒「起動」をクリック

![qiita04.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/317159/68d2e4fa-29cf-4070-5329-fe8029d24789.jpeg)

カタログアプリを絞り込むため「全てのカタログ」を「GitLab」に選択する。
今回は GitLab 本体をデプロイするため、「gitlab」をクリックする。

![qiita05.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/317159/d9d23dd3-1007-f02a-a1e0-d39a1dafceaa.jpeg)

Gitlab のデプロイ画面が表示されるので以下を入力

名前：gitlab(任意)
テンプレートバージョン：その時点での最新バージョン(任意)
名前空間：gitlab(任意)

![qiita06.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/317159/cc9baf2a-163a-5364-9da0-82d48e14a186.jpeg)

デプロイ時の変数を指定したいため、「アンサー」の「YAMLとして編集」をクリックし、以下 yaml を入力します。
簡単に説明を。

global.edition：gitlabのエディション。今回はce(CommunityEdition)
global.hosts.domain：gitlabの各機能にアクセスする際のドメイン名。lab.invalidと定義した場合、以下のようにイングレスが定義されます

* registry：http://registry.lab.invalid/
* unicorn(gitlab)：http://gitlab.lab.invalid/

※他は最低限の値を指定しています。

```yaml:values.yaml
global:
  edition: ce
  ingress:
    configureCertmanager: false
    class: nginx
    tls:
      enabled: false
  hosts:
    domain: lab.invalid
    https: false
    gitlab:
      https: false
    registry:
      https: false
    minio:
      https: false
certmanager:
  install: false
prometheus:
  install: false
gitlab-runner:
  install: false
gitlab:
  unicorn:
    minReplicas: 1
    maxReplicas: 1
  sidekiq:
    minReplicas: 1
    maxReplicas: 1
  gitlab-shell:
    minReplicas: 1
    maxReplicas: 1
registry:
  minReplicas: 1
  maxReplicas: 1
```

**入力後画面**

![qiita07.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/317159/a6046a53-af95-26fc-e12f-96b82a2dbec9.jpeg)

※今回の設定は最低限のため、変更して適宜カスタマイズしてください
※カスタマイズ時は以下を参考に
https://docs.gitlab.com/charts/charts/
https://docs.gitlab.com/charts/installation/deployment.html

「起動」をクリックするとデプロイが開始されます。
対象カタログアプリをクリックすることで、現在の構築状況が確認できます。

![qiita08.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/317159/757afd73-331a-7d8b-053a-22face0b8cf7.jpeg)

全てのアプリケーション、リソースがデプロイされると以下のように「Active」に変わります。
※デプロイにはスペック、環境にもよりますが、15～30分くらいかかりました
※失敗した場合は部分的に再デプロイや、カタログをアプリをけしてから再デプロイを試してみてください。

![qiita09.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/317159/2c3a98ee-4a98-bc36-b444-ba41dd3b68b1.jpeg)

## 追加設定

VirtualBox 上でデプロイすると Service の設定で一部が Pending します。
Type：LoadBalancer が払い出せないため、こちらは削除しました。

![qiita10.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/317159/d2e2afda-adbf-3d5d-b5a5-75a39e454aab.jpeg)

コンテナレジストリの動作確認のため、以下を設定します。

gitlab-registry の ingress に証明書を設定します。
「ワークロード」⇒「ロードバランサー」⇒「gitlab-registry」を編集します。

![qiita15.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/317159/d83153fe-df23-c7fc-655f-e35d1a4d6ec0.jpeg)

「SSL/TLS 証明書」で「証明書を追加」⇒ホストに「registry.local」を入力して保存してください。

![qiita16.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/317159/c51ddec4-61a8-ef02-bbf2-6db2c77758dd.jpeg)

また docker build / push コマンドを実行するサーバで以下を設定し、docker デーモンを再起動します。

```json:/etc/docker/daemon.json
{
  "insecure-registries": ["registry.lab.invalid"]
}

# docker デーモン再起動
$ systemctl stop docker.service
$ systemctl start docker.service
```
# 動作確認

デプロイが完了したので機能の確認をしていきましょう。
※動作確認前に名前解決(DNS へのレコード登録、または hosts)の設定は行っておきましょう

## ログイン

まずは GitLab にアクセスする際のアカウントとパスワードを確認します。
※gitlab namespaceで以下コマンドを実行するとパスワードが確認できます
※コマンドは secret の内容を取得し、base64 デコードを実行しています

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

パスワードが確認できたところで早速 Web画面 からログインします。

アクセスURL：```http://gitlab.<global.hosts.domain>/```
※上記 yaml で指定した場合は ```http://gitlab.lab.invalid/``` になります。

**ログイン画面**
![qiita11.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/317159/29b97733-5c9c-86f1-882d-e7c04b3a1312.jpeg)

Username：root
Password：上記で確認したパスワード

**ホーム画面**
![qiita14.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/317159/40d39f02-3f5b-d8bd-90ff-f0a4fe7d8ee4.jpeg)

## git 機能

以下、機能は確認しましょう。

* Project作成<br>⇒ホーム画面の「Create a project」から作成できます
* git で clone してみる<br>```git clone <リポジトリURL>```でcloneしましょう<br>※git コマンド実行する際は名前解決を忘れないように
* git で push/pull してみる<br>ファイルを追加してpush/pullをしてみましょう<br>※デフォルトで作成したプロジェクトではpushした後に自動でCI/CDが動き出しました。<br>　不要であれば設定で自動起動を止めておきましょう

## docker registry 機能

今回、試したかった機能です。

早速ログインしてみましょう
```docker login``` コマンドを実行するとアカウント情報を要求してくるので、GitLab にログインした時と同じ情報を入力しましょう。

```
$ docker login registry.lab.invalid
Username: root
Password:

Login Succeeded
```

docker build / push を確認します。

```
$ cat Dockerfile
FROM alpine:latest

# コンテナイメージ作成
# -t：タグ名(<registry の URL>/アカウント名/プロジェクト名/イメージ名)
$ docker build -t registry.lab.invalid/root/myproject/alpine .
Sending build context to Docker daemon  68.49MB
Step 1/1 : FROM alpine:latest
latest: Pulling from library/alpine
・・・
Successfully built 961769676411
Successfully tagged registry.lab.invalid/root/myproject/alpine:latest

# docker registry に push
$ docker push registry.lab.invalid/root/myproject/alpine:latest
The push refers to repository [registry.lab.invalid/root/myproject/alpine]
03901b4a2ea8: Pushed
latest: digest: sha256:・・・ size: 528
```

無事に push できたでしょうか。
GitLab の Web 画面からも push されたイメージを確認できます。
作成した git プロジェクト⇒左メニューの「パッケージ」⇒「コンテナレジストリ」

![qiita17.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/317159/0f827c95-a75b-403c-1b44-df0ce15713e5.jpeg)

# まとめ
今回は k8s 上に GitLab を構築してみました。
最近の GitLab は本当に機能が豊富で使いこなすのも一苦労かと思いますが、必要な機能のみ取捨選択して利用していくのが一番かと思います。
helm で導入でき、また Rancher を使うことで Web 画面から簡単にデプロイすることがよかったです。

次回はコンテナレジストリを使ったアプリ開発でもできればなと思っています。

# おまけ

glusterfs / nginx-ingress / gitlab を立てた状態でのクラスタリソースの使用率は以下の通りです。
ご参考までに。

![qiita13.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/317159/f1d87c6e-afb8-763e-d7d2-df86eaf3eef6.jpeg)