NAN 0 vote
评分

Self-Hosted 的 GitLab 中可以集成 Kubernetes,但是官方只提供了 Amazon AWS 和 Google Cloud 的一键部署按钮,没有提供 Microsoft Azure 的一键集成。

GitLab 的 Kubernetes

因为正好 Azure 还有一些额度,所以研究了一下怎么把 GitLab 连接到 Azure Kubernetes Serveice (AKS) 上。

首先登录 Azure 控制台,确保自己有一个有效的资源组,例如我这里创建了一个名字叫 gitlab-k8s 的资源组,这一步也可以在命令行完成,只不过因为我已经提前创建过了,所以这里补一张图。

在 Azure 创建资源组

接下来进入 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 中填写集群名称,集群名称就是上面 <集群的名字>

环境范围默认是 *,可以根据自己需要修改。

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-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 配置中的服务令牌处。

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://stackoverflow.com/questions/50749095/how-to-integrate-gitlab-ci-w-azure-kubernetes-kubectl-acr-for-deployments

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

NAN 0 vote
评分