Help us learn about your current experience with the documentation. Take the survey.

通过集群证书连接现有集群(已弃用)

  • 级别:免费版、高级版、旗舰版
  • 提供方式:GitLab.com、GitLab 自托管

此功能在 GitLab 14.5 中已弃用。 要将集群连接到 GitLab,请改用 GitLab agent for Kubernetes

如果您有现有的 Kubernetes 集群,可以将其添加到项目、群组或实例中,并享受与 GitLab 的集成带来的便利。

前置条件

请参阅以下前置条件,将现有集群添加到 GitLab。

所有集群

要将任何集群添加到 GitLab,您需要:

  • GitLab.com 或 GitLab 自托管实例的账户。
  • 群组级和项目级集群的 Maintainer(维护者)角色。
  • 实例级集群的 Admin(管理员)区域访问权限。
  • 一个 Kubernetes 集群。
  • 使用 kubectl 对集群进行集群管理访问。

您可以在 EKSGKE、本地或其他提供商处托管您的集群。 要在本地或其他提供商处托管它们,请使用 EKS 或 GKE 方法来指导您手动输入集群的设置。

GitLab 不支持 arm64 集群。有关详细信息,请参阅问题 Helm Tiller 在 arm64 集群上安装失败

EKS 集群

要添加现有的 EKS 集群,您需要:

  • 一个已正确配置工作节点的 Amazon EKS 集群。
  • 为访问 EKS 集群而 安装和配置kubectl
  • 确保账户的令牌对集群具有管理员权限。

GKE 集群

要添加现有的 GKE 集群,您需要:

  • 创建集群角色绑定的 container.clusterRoleBindings.create 权限。您可以按照 Google Cloud 文档 授予权限。

如何添加现有集群

要将 Kubernetes 集群添加到您的项目、群组或实例中:

  1. 前往您的:

    1. 项目的 cloud-gear Operate > Kubernetes clusters 页面,用于项目级集群。
    2. 群组的 cloud-gear Kubernetes 页面,用于群组级集群。
    3. Admin 区域的 Kubernetes 页面,用于实例级集群。
  2. Kubernetes clusters 页面,从 Actions 下拉列表中选择 Connect with a certificate 选项。

  3. Connect a cluster 页面,填写详细信息:

    1. Kubernetes cluster name(必需)- 您希望给集群起的名称。

    2. Environment scope(必需)- 与此集群关联的 关联环境

    3. API URL(必需)- 这是 GitLab 用来访问 Kubernetes API 的 URL。Kubernetes 暴露了多个 API,我们想要的是所有 API 共享的"基础"URL。 例如,https://kubernetes.example.com 而不是 https://kubernetes.example.com/api/v1

      通过运行以下命令获取 API URL:

      kubectl cluster-info | grep -E 'Kubernetes master|Kubernetes control plane' | awk '/http/ {print $NF}'
    4. CA certificate(必需)- 需要有效的 Kubernetes 证书来对集群进行身份验证。我们使用默认创建的证书。

      1. 使用 kubectl get secrets 列出 secrets,其中一个应该命名为类似 default-token-xxxxx。复制该令牌名称以供下文使用。

      2. 通过运行以下命令获取证书:

        kubectl get secret <secret name> -o jsonpath="{['data']['ca\.crt']}" | base64 --decode

        如果命令返回整个证书链,您必须复制根 CA 证书和链底部的任何中间证书。 链文件具有以下结构:

           -----BEGIN MY CERTIFICATE-----
           -----END MY CERTIFICATE-----
           -----BEGIN INTERMEDIATE CERTIFICATE-----
           -----END INTERMEDIATE CERTIFICATE-----
           -----BEGIN INTERMEDIATE CERTIFICATE-----
           -----END INTERMEDIATE CERTIFICATE-----
           -----BEGIN ROOT CERTIFICATE-----
           -----END ROOT CERTIFICATE-----
    5. Token - GitLab 使用服务令牌对 Kubernetes 进行身份验证,这些令牌 限定在特定的 namespace 中。 使用的令牌应属于具有 cluster-admin 权限的服务账户。要创建此服务账户:

      1. 创建一个名为 gitlab-admin-service-account.yaml 的文件,内容如下:

        apiVersion: v1
        kind: ServiceAccount
        metadata:
          name: gitlab
          namespace: kube-system
        ---
        apiVersion: rbac.authorization.k8s.io/v1
        kind: ClusterRoleBinding
        metadata:
          name: gitlab-admin
        roleRef:
          apiGroup: rbac.authorization.k8s.io
          kind: ClusterRole
          name: cluster-admin
        subjects:
          - kind: ServiceAccount
            name: gitlab
            namespace: kube-system
      2. 将服务账户和集群角色绑定应用到您的集群:

        kubectl apply -f gitlab-admin-service-account.yaml

        您需要 container.clusterRoleBindings.create 权限 来创建集群级角色。如果您没有此权限, 可以选择启用基本身份验证,然后以管理员身份运行 kubectl apply 命令:

        kubectl apply -f gitlab-admin-service-account.yaml --username=admin --password=<password>

        可以开启基本身份验证,并使用 Google Cloud Console 获取密码凭据。

        输出:

        serviceaccount "gitlab" created
        clusterrolebinding "gitlab-admin" created
      3. 检索 gitlab 服务账户的令牌:

        kubectl -n kube-system describe secret $(kubectl -n kube-system get secret | grep gitlab | awk '{print $1}')

        从输出中复制 <authentication_token> 值:

        Name:         gitlab-token-b5zv4
        Namespace:    kube-system
        Labels:       <none>
        Annotations:  kubernetes.io/service-account.name=gitlab
                     kubernetes.io/service-account.uid=bcfe66ac-39be-11e8-97e8-026dce96b6e8
        
        Type:  kubernetes.io/service-account-token
        
        Data
        ====
        ca.crt:     1025 bytes
        namespace:  11 bytes
        token:      <authentication_token>
    6. GitLab-managed cluster - 如果您希望 GitLab 为此集群管理命名空间和服务账户,请保持选中状态。 有关更多信息,请参阅 Managed clusters section

    7. Project namespace(可选)- 您不必填写此字段。保持 留空,GitLab 会为您创建一个。另外:

      • 每个项目应该有一个唯一的命名空间。
      • 项目命名空间不一定是 secret 的命名空间,如果 您使用的是具有更广泛权限的 secret,例如来自 default 的 secret。
      • 您应该 使用 default 作为项目命名空间。
      • 如果您或某人专门为项目创建了 secret,通常 具有有限权限,secret 的命名空间和项目命名空间可能 是相同的。
  4. 选择 Add Kubernetes cluster 按钮。

大约 10 分钟后,您的集群就准备好了。

禁用基于角色的访问控制 (RBAC)(可选)

通过 GitLab 集成连接集群时,您可以指定集群是否启用了 RBAC。 这会影响 GitLab 与集群在特定操作中的交互方式。如果您在创建时 没有选中 RBAC-enabled cluster 复选框,GitLab 在与集群交互时会 假定您的集群已禁用 RBAC。如果是这样,您必须在集群上禁用 RBAC, 以便集成正常工作。

RBAC

禁用 RBAC 意味着在集群中运行的任何应用程序, 或可以身份验证到集群的用户,都具有完整的 API 访问权限。这是一个 安全问题, 可能不是理想的。

要有效禁用 RBAC,可以应用授予完全访问权限的全局权限:

kubectl create clusterrolebinding permissive-binding \
  --clusterrole=cluster-admin \
  --user=admin \
  --user=kubelet \
  --group=system:serviceaccounts

故障排除

身份验证过程中的 CA 证书和令牌错误

在连接 Kubernetes 集群时遇到此错误:

与您的集群身份验证时出现问题。
请确保您的 CA 证书和令牌有效

确保您正确粘贴了服务令牌。某些 shell 可能会在服务令牌中添加换行符, 使其无效。通过将令牌粘贴到编辑器中并删除任何额外的空格来确保没有换行符。

如果您的证书无效,您也可能会遇到此错误。要检查您的证书 主题备用名称是否包含集群 API 的正确域名,请运行以下命令:

echo | openssl s_client -showcerts -connect kubernetes.example.com:443 -servername kubernetes.example.com 2>/dev/null |
openssl x509 -inform pem -noout -text

-connect 参数期望 host:port 组合。例如,https://kubernetes.example.com 将是 kubernetes.example.com:443-servername 参数期望一个没有任何 URI 的域名,例如 kubernetes.example.com