GitLabにはCI/CDを実行する機能が標準で搭載されています。 あとはRunnerというものを追加してGitLabと紐づけすることで、CI/CDを実現することができます。
最近のGitLabはKubernetesと連携する機能も標準で搭載されており、関連付けしたKubernetes上でRunnerを実行できます。
GitLabとKubernetesクラスターの関連付けは次のドキュメントに書かれている方法で行います。「Creating the cluster」の方法はGoogle Kubernetes Engineを使う方法で、「Add existing Kubernetes cluster」の方がオンプレのKubernetesを使う方法です。
オンプレのKubernetesは最低限のKubertnetesの構成で構いません。例えばk3sも使うことができます。
今回はk3sでKubernetesをセットアップし、そのKubernetesをGitLab CI/CDで使ってみたいと思います。 なお、GitLabのインストールや初期設定はすんでいる前提での解説になっています。
k3sノードのセットアップ
まず、十分なスペックを持つx86_64なLinux環境を用意します。Linuxディストリビューションは特に問いません。好きなものを使ってください。 OSをセットアップ後、システムをアップデートしておきます。
このあと、k3sの導入に移るわけですが、k3sの使い方は公式サイトに書かれている通りです。ただし、一点だけ注意事項があります。 k3sを使ったKubernetes環境のデプロイは次のコマンド二つでできるのですが、
# curl -sfL https://get.k3s.io | sh - # k3s kubectl get node
Kubeconfigのserver行をlocalhostからBind IPかFQDNアドレスに修正する必要があります(もちろんですが、FQDNアドレスでそのノードにアクセスする環境は名前引きができるようにする必要があります)。
k3sでは/etc/rancher/k3s/k3s.yaml
にKubeconfigが保存されるので、このファイルを開いて次のように修正してください。
apiVersion: v1 clusters: - cluster: certificate-authority-data: hogehogehugahuga (略) server: https://localhost:6443 #このように書かれているので、この行を server: https://esxinode3.maas:6443 #次のようにノードのIPアドレスかFQDNアドレスに書き換える name: default contexts: (略)
このファイルを編集後にcat /etc/rancher/k3s/k3s.yaml > ~/.kube/config
コマンドで書き込んでください。
Kubernetesのセットアップについてはここで終了です。
GitLabにKubernetesを追加する
このあと、今回の例では「Add existing Kubernetes cluster」の方法でクラスターを追加するわけですが、この手順だとプロジェクトの「Operations > Kubernetes page」を開いて設定するように書かれています。
GitLabの管理者アカウントでログインしてAdmin Areaを開き、サイドメニューのKubernetesを開いてこの画面からKubernetesクラスターを追加すると、すべてのユーザーのプロジェクトで利用できるKubernetesクラスターとして追加できます。
次を参考に、API URLとかCA certificateとかトークンキーとかをコマンドを実行して調べたものを入力していくだけです。思ったより簡単ですね。
また、「is blocked: Requests to the local network are not allowed」のようなエラーが出る場合は、次のように設定変更します。
入力後、次のような画面に切り替わるので、Applicationsの項目の「Helm Tiller」をインストールしたあと、「GitLab Runner」をインストールしてください。ここでインストールしたGitLab RunnerがShared Runnerになります。
このような感じで、Runnerが登録されます。
GitLabのOutbound requestsの処理方法を変更
ローカルIPアドレスを持つノードをGitLabで使うには設定変更が必要です。
先に挙げたブログにも書かれているように、設定を変更します。esxinode3.maas
というノードでk3sによるKubernetesコンテナーが動いているのを例とします。「Save changes」ボタンを押して設定を適用してください。
ここまでできたらGitLabのCI/CD機能でKubernetesを使うための設定は終わりです。あとはこちらのドキュメントのようにGitリポジトリー上に表記ルールに従った.gitlab-ci.yml
を用意すれば、CIおよびCDができるようになります。
タグはRunnerに設定されていたタグ(本例ではkubernetes)を指定します。
以下はJavaのソースをApache Antでビルドして実行する際の.gitlab-ci.yml
の例です。
stages: - buildrun build-run: image: centos:7 stage: buildrun script: - yum install -y java-1.8.0-openjdk-devel.x86_64 ant git - ant tags: - kubernetes
以下はパイプラインの画面です。.gitlab-ci.yml
にジョブを書けば書くほど、複雑なマップがこちらに表示されます。
あとは.gitlab-ci.yml
に色々書いていけば、今回省略した「CD」の方も自動化できます。
以下は実行結果のログです。処理が正常に行われれば次のステージの処理に移ります。失敗するとそこで止まります。
今回の例は一つのステージしか定義していませんので、ant
コマンドが正常に通ったら緑色のチェックマークがコミットにつくでしょう。
このように、GitLabでは簡単にKubernetesを使うことができます。 また、k3sでデプロイしたKubernetesクラスターであってもGitLabで使えることがわかりました。
k3sの使い道がまた増えたので、良かったと思います。