毎度、ググっても出てこない小ネタを取り扱っております。
本記事は個人的な見解であり、筆者の所属するいかなる団体も関係ございません。
この記事の機能はGitLabバージョン 16で削除予定です
GitLabとKubernetesを接続するGitLab agent for KubernetesがGitLab 14.5で無料利用できるようになりました。
この記事の方法で接続しない事をお勧めします。
Deprecations by version | GitLab
後継機能のGitLab Agent for Kubernetesについては以下の記事を参照してください。
GitLab Agent for Kubernetesを使ってみる(GitLab Kubernetes Agent改め) - Qiita
GitLab を Kubernetes へ接続(オンプレのKubernetes環境)
0. GitLab と Kubernetes環境の統合
GitLab はバージョン10.1からKubernetes へ接続することができるようになっています。
AutoDevOps機能の延長で開発が進められています。
Add a Kubernetes cluster integration
このプロジェクトに Kubernetes クラスターを関連付けることで、Review Apps の使用、
アプリケーションのデプロイ、パイプラインの実行などを簡単に行うことができます。
とありますが、まだまだ開発中です。
本記事でも、GitLabのメニューからKubernetesへの認証に成功したということだけで、Knativeも動かしていませんし、Runnerも現時点では動かせていません。
1. 環境
GitLab : Community Edition 11.7.5
Kubernetes : v1.13.1
PodSecurityPolicy:false
Docker : 18.9.1
OS : Ubuntu 16.04.5
Kubernetesは、rke でインストールしました。.kube/config を整備して、kubectl で接続できるようにしておいてください。Rancher UIからインストールした場合、Rancher上のkubectl は、Rancher側がKubernetes APIサーバーをラップしているので上手くいきません。rkeが出力した kube_config_cluster.yml
やkubeadm のconfigを使ってKubernetes APIサーバーに直接接続するようにしましょう。
また、tillerが入っているとGitLabからKubernetes接続時にインストールしようとしてエラーになります。現時点では、なるべく作ったばかりのKubernetesクラスターが良いでしょう。現時点では、PodSecurityPolicy
は、Falseにしておく必要があります。
2. Kubernetes側の準備
Index · Clusters · Project · User · ヘルプ · GitLab
Project-level Kubernetes clusters (certificate-based) (DEPRECATED) | GitLab
ゴニョゴニョ書いてありますが、重要なのは Token です。
GitLabへ入力するアカウントとそのTokenの情報を作成するために以下の手順を行います。
- ServiceAccountを作成(gitlabという名前は固定のようです)
- ClusterRoleBindingを作成
- 1のアカウントのToken名を取得
- 3のtoken中身を取得
を行います。
2-1. ServiceAccountを作成
kubectl create -f - <<EOF
apiVersion: v1
kind: ServiceAccount
metadata:
name: gitlab
namespace: default
EOF
2-2. ClusterRoleBindingを作成
kubectl create -f - <<EOF
kind: ClusterRoleBinding
apiVersion: rbac.authorization.k8s.io/v1
metadata:
name: gitlab-cluster-admin
subjects:
- kind: ServiceAccount
name: gitlab
namespace: default
roleRef:
kind: ClusterRole
name: cluster-admin
apiGroup: rbac.authorization.k8s.io
EOF
2-3. 1のアカウントのToken名を取得
kubectl get secrets
NAME TYPE DATA AGE
gitlab-token-XXXXX kubernetes.io/service-account-token 3 59s
gitlab-token-XXXXX
がToken名です。
2-4. token中身を取得
kubectl get secret gitlab-token-XXXXX -o jsonpath="{['data']['token']}" | base64 --decode
<ダラダラっとTokenが表示されるはず>
2-5. Tokenの証明書を取得
kubectl get secret gitlab-token-XXXXX -o jsonpath="{['data']['ca\.crt']}" | base64 --decode
<ダラダラっとca.crtが表示されるはず>
3. GitLab へ設定
- の
Add a Kubernetes cluster integration
画面に各項目を追記します。 - Kubernetes クラスター名:任意
- API URL:kubeconfigの server: 行を貼ります
- CA 証明書:2-5のTokenの証明書 を貼ります
- トークン:2-4のTokenの中身 を貼ります
- プロジェクトの名前空間:空(指定しない場合はgitlab-managed-appsが作成されました)
変更を保存します。
4. 結果
以下のような画面が表示され、「インストール」ボタンが押せるようになります。
(ここでは既にインストールしたので「インストール済み」になっています)
kubectl で確認すると、gitlab-managed-apps というネームスペースが作成されて、tillerとingres-nginxがデプロイされていました。
kubectl get pods --all-namespaces | grep gitlab
NAMESPACE NAME READY STATUS RESTARTS AGE
gitlab-managed-apps ingress-nginx-ingress-default-backend-78fc87c466-5wrdj 1/1 Running 0 21h
gitlab-managed-apps tiller-deploy-7dd47f89cc-x8mxk 1/1 Running 0 21h
恐らく、このネームスペースに各種アプリがAutoDevOpsでデプロイされるものと思われます。
Rancherから見てみました。
PodSecurityPolicyのValidationに引っかかって止まっていました。現時点ではPodSecurityPolicy はFalseの方がよさそうです。
まとめ
残念ながら、ここまでしかまだ実現していません。
続報があれば追記したいと思います。