オンプレGitLabにMicroK8s接続してGitLabのAuto DevOpsを体験する(後半)

毎度、ググっても出てこない小ネタを取り扱っております。
本記事は個人的な見解であり、筆者の所属するいかなる団体にも関係ございません。


::: note alert
こちらの方法はGitLab v14.5から非推奨になり、GitLab v15.0で利用できなくなっています。

Certificate-based Kubernetes integration (DEPRECATED)
https://docs.gitlab.com/ee/user/infrastructure/clusters/#certificate-based-kubernetes-integration-deprecated

:::

::: note info

今後はGitLab Agent for Kubernetesをご利用ください。
利用方法は以下で記事を書きました。

GitLab Agent for Kubernetesを使ってみる(GitLab Kubernetes Agent改め) - Qiita 
https://qiita.com/ynott/items/35e9492d0681ea8ac60a
:::

# 0. はじめに

GitLabにはKubernetesを連携して便利にいろいろできる機能がついています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/15176/c19bb980-af76-2d21-e1b9-4950f93be65d.png)

Kubernetes clusters | GitLab
https://docs.gitlab.com/ee/user/project/clusters/

しかし、問題があります。GKEにしてもEKSにしてもそれなりにいいお値段します。
アプリをちょっとデプロイする環境としては高価です。
しかし、本格的にKubernetesを立てるのも大変だし。。。。

そこで、仮想マシンにMicroK8sを動かして、それをオンプレのGitLabに連携してみます。

長くなったので前半と後半に分けました。

前半は、こちらです。

#前半:[オンプレGitLabにMicroK8s接続してGitLabのAuto DevOpsを体験する(前半) - Qiita](https://qiita.com/ynott/items/f3651e9f3d46b1f088ee)



# 4. GitLabとKubernetesを連携させる
## 4-1. Kubernetesを連携するグループを追加する

現在のGitLab(13.7)では、以下のレベルでKubernetesを追加する事ができます。
1. プロジェクトレベル
2. グループレベル
3. GitLabインスタンスレベル

どれもやり方は同じです。
グループレベルでKubernetesを連携させておけば、プロジェクト単位で毎回連携設定する必要がなくなるので便利かも知れません。今回は、グループレベルで連携してみました。

## 4-2. Kubernetes連携画面を表示

「グループ」--->「Kubernetes」とクリックする

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/15176/b9f9bdbe-eca3-9005-6d61-74b7a602dcfe.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/15176/5c51d4af-f4c1-9dc2-9ac6-e620356f57a8.png)
「`Integrate with a cluster certificate`」をクリックする

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/15176/78832324-6116-866e-8c2e-16e3aac5f6c0.png)
という画面が出るので、上右側のタブで「`Add existing cluster`」をクリックします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/15176/a0f825e4-6498-b366-1631-2a07525312fb.png)

## 4-3. 情報の記入

|項目名|説明|
|-----|-----|
|Kubernetesクラスター名|前半で動かしたMicrok8sの名前を入れます(一意に識別できれば何でも構いません)|
|環境スコープ|ここに"production"や"staging"と入れると.gitlab-ci.ymlで指定する本番用やステージング用として利用できます。"*"だとワイルドカードで.gitlab-ci.ymlでの指定に影響されません|
|API URL|前半`3-1. API URL`で取得した以下の情報を入れます|
|CA証明書|前半`3-2. CA証明書`で取得した以下の情報を入れます|
|サービストークン|前半`3-3. サービストークン`で取得した以下の情報を入れます|
|RBAC有効クラスター|前半のMicrok8s Addonでrbacを有効にしたのでチェックします|
|GitLabマネージドクラスター|GitLab側でKubernetesの必要な設定を管理できるようにします|
|Namespace per environment|AutoDevOpsでアプリをデプロイする環境をネームスペースで分離します|

入力したら、「Kubernetesクラスターを追加」をクリックする

# 5. ベースドメインを作成する

ベースドメインを指定するために、Ingressを有効にしてIngressエンドポイントを有効にする必要がある。

## 5-1. Ingress

連携ができたら、「アプリケーション」タブからIngressをインストールする

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/15176/dfa4827a-6b2b-6d95-40b5-808ebcaf69c8.png)

Ingressがインストールされると`gitlab-managed-apps`というネームスペースにingress-controllerとingress-default-backendが動きます。

```
$ kubectl get all -n gitlab-managed-apps
NAME                                                       READY   STATUS      RESTARTS   AGE
pod/ingress-nginx-ingress-default-backend-c9b59c85-vvm9f   1/1     Running     0          39s
pod/ingress-nginx-ingress-controller-75686bdf76-gcqdr      2/2     Running     0          39s
pod/install-ingress                                        0/1     Completed   0          56s

NAME                                            TYPE           CLUSTER-IP       EXTERNAL-IP     PORT(S)                      AGE
service/ingress-nginx-ingress-default-backend   ClusterIP      10.152.183.240   <none>          80/TCP                       39s
service/ingress-nginx-ingress-controller        LoadBalancer   10.152.183.45    192.168.10.20   80:31012/TCP,443:31903/TCP   39s

NAME                                                    READY   UP-TO-DATE   AVAILABLE   AGE
deployment.apps/ingress-nginx-ingress-default-backend   1/1     1            1           39s
deployment.apps/ingress-nginx-ingress-controller        1/1     1            1           39s

NAME                                                             DESIRED   CURRENT   READY   AGE
replicaset.apps/ingress-nginx-ingress-default-backend-c9b59c85   1         1         1       39s
replicaset.apps/ingress-nginx-ingress-controller-75686bdf76      1         1         1       39s
```

Ingressのインストールが終わるとエンドポイントのIPアドレスが入ります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/15176/b838b3bc-41bd-ba3c-8558-9023ce1f521a.png)


## 5-2. ベースドメインを設定

`詳細タブ`に戻って、IngressエンドポイントをDNSに登録するかして、ベースドメインを作成します。
今回は、社内DNSに登録せずにxipを利用しました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/15176/12776f19-e32a-250f-20b1-e9b4970c1f25.png)

変更を保存しておきます。

# 6. Auto DevOpsアプリをデプロイ

## 6-1. Auto DevOpsを有効にする

今回は、グループレベルでAuto DevOpsを有効にしておきます

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/15176/f23fa90f-5fae-dcd0-8e50-9727000cefdb.png)

## 6-2. `NodeJS Express`プロジェクトをテンプレートから作成

今回はAuto DevOpsをテストするアプリとしてgitlab の`NodeJS Express`テンプレートを使います。

「新規プロジェクト」--->「テンプレートから作成」とクリックして、「`NodeJS Express`」の「テンプレートを使用」をクリックします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/15176/98dd7dec-5fd9-1904-bb65-b7341e173bf2.png)

適当なプロジェクト名を入力して「プロジェクトを作成」をクリックします

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/15176/5665a23f-034b-e6d8-85ab-dbb3d090d5bb.png)

## 6-3. Auto DevOpsを有効にする

Auto DevOpsを有効にするかどうか聞いてくるので「設定」をクリックして`Auto DevOps`を有効にする

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/15176/a7badb33-acda-c81e-f1f2-c002b8749e92.png)

## 6-4. Auto DevOpsのデプロイ戦略を設定する

Auto DevOpsが有効になっても`デプロイ戦略`を指定しないとパイプラインは実行されないので`本番環境への継続的デプロイ`を選択して「変更を保存」をクリックする

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/15176/d755ad54-afda-7264-2d9e-25a7cab64451.png)


# 7. Auto DevOpsの実行を確認する

## 7-1. パイプライン実行確認

5-4で`デプロイ戦略`を変更保存するとパイプラインが開始される。
「CI/CD」--->「パイプライン」でパイプラインが実行されているのが確認できる

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/15176/cb09c1b2-b33c-71e0-ab37-da786fd8cf5e.png)

「Code Quality」と「パフォーマンス」はマシンに負荷がかかるので :no_entry_sign: を押してキャンセルしておく

## 7-2. デプロイ状況を確認する

「オペレーション」--->「環境」を開く

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/15176/0ba54fc5-8253-c1a3-a8a0-683ec02e4dfa.png)

外向き矢印アイコンをクリックするとブラウザーでタブが開いて、実行状況を確認できる

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/15176/91fc4dec-f527-6b46-b751-d35d784ed3a5.png)

# 8. Auto DevOpsで動かしたデプロイを停止する

レビューが終了したら、環境画面の環境で一番右側の赤い枠の■を押して環境を終了する

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/15176/02eacbad-5caf-6209-5b48-f60e5aaedb2c.png)

# 9. まとめ

Microk8sを使ってAuto DevOpsの検証を行う事ができた。
k3sでも同様にできるか確認したい。

SpringテンプレートがAuto DevOpsで動かないのをなんとかして欲しい。
Incorrect file permission when using built-in project template to create Spring project (#63246) · 課題 · GitLab.org / GitLab FOSS · GitLab
https://gitlab.com/gitlab-org/gitlab-foss/-/issues/63246

# 10. 参考
* [Adding and removing Kubernetes clusters | GitLab](https://docs.gitlab.com/ee/user/project/clusters/add_remove_clusters.html)
* [Index · Clusters · Project · User · ヘルプ · GitLab](
https://gitlab.stylez.co.jp/help/user/project/clusters/index.md#installing-applications)
* [microk8sを使ってkubernetesクラスタを構築してみる + metallbアドオンお試し | NTTテクノクロスブログ](https://www.ntt-tx.co.jp/column/tec/20200904/)
* [Debugging DNS Resolution | Kubernetes](https://kubernetes.io/docs/tasks/administer-cluster/dns-debugging-resolution/)
* [GitLab Auto DevOps with MicroK8s on an Raspberry Pi 4 | by Jason McNeal | Medium](https://medium.com/@jasonmcneal/gitlab-auto-devops-with-microk8s-on-an-raspberry-pi-4-db4c1b2b1768)
* [UbuntuにMicroK8sを導入する - Qiita](https://qiita.com/nykym/items/32c17bf0547be63107ac)
* [MicroK8sを外部のクライアントからkubectlで接続する - Qiita](https://qiita.com/ynott/items/84541559ef6a6db0ee74)
* [RancherをMicroK8s(Kubernetes 1.17.0)で動かす - Qiita](https://qiita.com/ynott/items/ef4d9956dff163b9fbc7)
* [GitLab CI/CDパイプラインとContainer Engine for Kubernetesを統合する | Oracle Technology Network Japan Blog](
https://blogs.oracle.com/otnjp/using-the-gitlab-cicd-pipelines-integrated-workflow-to-build-2c-test-2c-deploy-2c-and-monitor-your-code-with-container-engine-for-kubernetes-and-registry-ja)