Self-Hosted 的 GitLab 中可以集成 Kubernetes,但是官方只提供了 Amazon AWS 和 Google Cloud 的一键部署按钮,没有提供 Microsoft Azure 的一键集成。
GitLab 的 Kubernetes因为正好 Azure 还有一些额度,所以研究了一下怎么把 GitLab 连接到 Azure Kubernetes Serveice (AKS) 上。
首先登录 Azure 控制台,确保自己有一个有效的资源组,例如我这里创建了一个名字叫 gitlab-k8s
的资源组,这一步也可以在命令行完成,只不过因为我已经提前创建过了,所以这里补一张图。
接下来进入 Azure Cloud Shell。如果是在非网页版终端上的话就先用 az login
登录,你可能需要先安装 Azure Cloud Shell 的相关工具。
第一步要创建的是基于角色的访问控制(RBAC),启用这个选项可以使 GitLab 在启用 RBAC 的群集上安装应用程序,执行:
az ad sp create-for-rbac --skip-assignment
这个命令会创建一些配置,并允许访问 Azure 的资源。
然后创建 Kubernetes 集群,命令是:
az aks create --resource-group <资源组的名字> --name <集群的名字> --node-count <结点的数量> --generate-ssh-keys
这里资源组的名字换成刚才创建的资源组的名字,集群的名字自己取一个,结点的数量根据自己的情况(以及费用)决定。我把名字命名成 `gitlab-k8s 并决定使用 3 个结点,那么这个命令就是:
az aks create --resource-group gitlab-k8s --name gitlab-k8s --node-count 3 --generate-ssh-keys
这个命令很花时间,耐心等待。
然后执行下面这个命令,集群和资源组的名字同上。
az aks get-credentials -n <集群的名字> -g <资源组的名字>
这时候基本上已经完成了 Azure 上 Kubernetes 的配置了,要把这个服务集成到 GitLab 中。
首先在 GitLab 中填写集群名称,集群名称就是上面 <集群的名字>
。
环境范围默认是 *
,可以根据自己需要修改。
通过 kubectl
查看 secret
是什么,运行:
kubectl get secrets
记下形如 default-token-<随机字符串>
的内容,然后运行:
kubectl get secrets default-token-<随机字符串> -o jsonpath="{['data']['ca\.crt']}" | base64 --decode
运行之后会输出一段 CA 证书,复制全部,保存到一边,后面会需要填写到 GitLab 的 CA 证书中,以便 GitLab 能够连接到 Kubernetes 集群。这段 CA 证书类似于:
-----BEGIN CERTIFICATE-----
MIIE6DCCAtCgAwIBAgIQLYDJG1C9ElHhMT43OppC/DANBgkqhkiG9w0BAQsFADAN
.......
.......
-----END CERTIFICATE-----
填写到 GitLab 配置中的这个位置:
GitLab CA然后创建一个名为 gitlab-admin-service-account.yaml
的文件,内容是:
apiVersion: v1
kind: ServiceAccount
metadata:
name: gitlab-admin
namespace: kube-system
---
apiVersion: rbac.authorization.k8s.io/v1beta1
kind: ClusterRoleBinding
metadata:
name: gitlab-admin
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: ClusterRole
name: cluster-admin
subjects:
- kind: ServiceAccount
name: gitlab-admin
namespace: kube-system
以及一个 gitlab-admin-cluster-role-binding.yaml
的文件,内容是:
apiVersion: rbac.authorization.k8s.io/v1beta1
kind: ClusterRoleBinding
metadata:
name: gitlab-admin
subjects:
- kind: ServiceAccount
name: gitlab-admin
namespace: kube-system
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: ClusterRole
name: cluster-admin
---
apiVersion: rbac.authorization.k8s.io/v1beta1
kind: ClusterRoleBinding
metadata:
name: gitlab-managed-apps-admin
subjects:
- kind: ServiceAccount
name: default
namespace: gitlab-managed-apps
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: ClusterRole
name: cluster-admin
运行这两个服务,以确保 GitLab 能够获得访问集群的权限。
kubectl apply -f ./gitlab-admin-service-account.yaml
kubectl apply -f ./gitlab-admin-cluster-role-binding.yaml
等待服务运行,然后为 GitLab 生成服务令牌:
kubectl -n kube-system describe secret $(kubectl -n kube-system get secret | grep gitlab-admin | awk '{print $1}')
Azure 生成的 GitLab 的服务令牌
复制 token:
后面这一段文本,即 eyJh
开头的那一段,填写到 GitLab 配置中的服务令牌处。
最后,让我们测试一下集群,并从仪表盘访问这个集群。首先我们需要创建一个角色。
kubectl create clusterrolebinding kubernetes-dashboard --clusterrole=cluster-admin --serviceaccount=kube-system:kubernetes-dashboard
然后可以在 Azure 控制台选择 Kubernetes 进入仪表盘进行一些测试,顺便复制 API 地址。
你可以在网页版登录 Azure 控制台选择 Kubernetes。
Azure 控制台也可以在命令行输入下面这个命令,在完成身份校验后,控制台会输出一个访问地址,点击地址也可以访问仪表盘(你可能需要登录)。
az aks browse --resource-group <资源组的名字> --name <集群的名字>
获得仪表盘地址
进入仪表盘之后你可以检查一些设置项,然后记录下 API 地址,填写到 GitLab 的配置中。
API 服务器地址 配置 GitLab 的 API 服务器地址其余选项保留默认就好,你可以根据自己的需要修改。我们需要打开 RBAC。
其余选项保留默认这里还有一个大坑。
有时候 GitLab 会遇到权限问题 (Permission Errors),为了修复这些权限问题,在 Azure 控制台执行:
kubectl create clusterrolebinding permissive-binding \
--clusterrole=cluster-admin \
--user=admin \
--user=kubelet \
--group=system:serviceaccounts
大功告成,点击添加 Kubernetes 集群。
添加集群之后就可以在 GitLab 中管理。
GitLab 中管理集群进入集群,选择“应用”选项卡,安装一些你需要的应用。
GitLab Kubernetes 集群应用例如 Ingress 和 Cert-Manager 可以自动处理路由和 SSL 证书,推荐安装,但个人使用的话,不要也可以。
Prometheus 监控服务也可以装,不过 GitLab 私有化部署的实例默认有单机 Prometheus 来监控 GitLab 的运行情况,所以不安装问题也不大。
GitLab Runner 是铁定要安装的了,不然费这么大劲来玩 Kubernetes 是为了啥。
JupyterHub 也是一键安装的,像这里的 Jupyter Notebook 这些应用都是使用 GitLab 统一身份认证的。
统一身份认证那么,使用愉快。
参考文献:
https://kubernetes.io/docs/reference/access-authn-authz/rbac/
https://kubernetes.io/docs/tasks/access-application-cluster/access-cluster/
https://medium.com/@jonathanjfshaw/connecting-gitlab-to-your-azure-kubernetes-cluster-cefcaeb54c1f
https://makinhs.medium.com/azure-kubernetes-aks-gitlab-ci-a-short-guide-to-integrate-it-e62a4df5c86a
https://docs.gitlab.com/ee/user/project/clusters/#adding-an-existing-kubernetes-cluster
网友评论