美文网首页
在GitLab中集成Azure Kubernetes

在GitLab中集成Azure Kubernetes

作者: jxtxzzw | 来源:发表于2021-03-13 17:22 被阅读0次

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

    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

    相关文章

      网友评论

          本文标题:在GitLab中集成Azure Kubernetes

          本文链接:https://www.haomeiwen.com/subject/xnbxcltx.html