기존 클러스터를 클러스터 인증서를 통해 연결합니다 (사용 중지됨)

Tier: Free, Premium, Ultimate Offering: GitLab.com, Self-managed
caution
이 기능은 GitLab 14.5에서 사용 중지되었습니다. GitLab에 클러스터를 연결하려면 대신 GitLab 에이전트를 사용하십시오.

기존의 Kubernetes 클러스터가 있으면 해당 클러스터를 프로젝트, 그룹 또는 인스턴스에 추가할 수 있으며 GitLab과의 통합을 활용할 수 있습니다.

필수조건

GitLab에 기존 클러스터를 추가하려면 다음 필수조건이 필요합니다.

모든 클러스터

GitLab에 모든 클러스터를 추가하려면 다음이 필요합니다:

  • GitLab.com 계정 또는 GitLab 12.5 이상을 실행하는 자체 설치 계정 중 하나.
  • 그룹 수준 및 프로젝트 수준 클러스터에 대한 관리자 역할.
  • 인스턴스 수준 클러스터의 관리 영역에 액세스할 수 있어야 함.
  • Kubernetes 클러스터.
  • kubectl을 사용하여 클러스터에 대한 클러스터 관리 액세스.

EKS, GKE, 온프레미스 및 기타 제공업체에서 클러스터를 호스팅할 수 있습니다. 온프레미스 및 기타 제공업체에서 호스팅하려면 EKS 또는 GKE 방법 중 하나를 사용하여 클러스터 설정을 안내받아 클러스터 설정을 매뉴얼으로 입력하십시오.

caution
GitLab은 arm64 클러스터를 지원하지 않습니다. 자세한 내용은 Helm Tiller fails to install on arm64 cluster에서 확인하십시오.

EKS 클러스터

기존 EKS 클러스터를 추가하려면 다음이 필요합니다:

  • 올바르게 구성된 Amazon EKS 워커 노드를 사용하는 Amazon EKS 클러스터.
  • EKS 클러스터에 액세스하기 위해 kubectl설치하고 구성해야 합니다.
  • 클러스터에 대한 관리자 권한이 있는 계정의 토큰을 보장해야 함.

GKE 클러스터

기존 GKE 클러스터를 추가하려면 다음이 필요합니다:

  • 클러스터 역할 바인딩을 만들기 위한 container.clusterRoleBindings.create 권한. 권한을 부여하려면 Google Cloud 문서를 참고하십시오.

기존 클러스터 추가 방법

프로젝트, 그룹 또는 인스턴스에 Kubernetes 클러스터를 추가하려면 다음 단계를 따르십시오:

  1. 다음 위치로 이동하십시오:
    1. 프로젝트 수준 클러스터의 운영 > Kubernetes 클러스터 페이지에서 프로젝트의 를 선택하십시오.
    2. 그룹 수준 클러스터의 그룹의 Kubernetes 페이지에서 를 선택하십시오.
    3. 인스턴스 수준 클러스터의 관리자 영역의 Kubernetes 페이지에서 를 선택하십시오.
  2. Kubernetes 클러스터 페이지에서 작업 드롭다운 디렉터리에서 인증서로 연결 옵션을 선택하십시오.
  3. 클러스터 연결 페이지에서 다음 세부 정보를 입력하십시오:
    1. Kubernetes 클러스터 이름 (필수) - 클러스터에 지정하려는 이름.
    2. 환경 범위 (필수) - 연관된 환경에 대한 정보를 입력하십시오.
    3. API URL (필수) - GitLab이 Kubernetes API에 액세스하는 데 사용되는 URL입니다. Kubernetes는 여러 API를 노출하는데, 우리는 모든 API에 공통적인 “베이스” URL인 것을 원합니다. 예를 들어, https://kubernetes.example.com/api/v1이 아닌 https://kubernetes.example.com입니다.

      다음 명령을 실행하여 API URL을 얻을 수 있습니다:

      kubectl cluster-info | grep -E 'Kubernetes master|Kubernetes control plane' | awk '/http/ {print $NF}'
      
    4. CA 인증서 (필수) - 클러스터에 인증을 하기 위해 유효한 Kubernetes 인증서가 필요합니다. 우리는 기본으로 생성된 인증서를 사용합니다.
      1. kubectl get 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. 토큰 - GitLab은 특정 namespace에 대해 범위가 지정된 서비스 토큰을 사용하여 Kubernetes에 대해 인증합니다. 사용되는 토큰은 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 권한이 필요합니다. 이 권한이 없는 경우 Basic Authentication을 활성화한 다음 관리자로써 kubectl apply 명령어를 실행할 수 있습니다:

        kubectl apply -f gitlab-admin-service-account.yaml --username=admin --password=<password>
        
        note
        Basic Authentication은 활성화할 수 있으며, 비밀번호 자격 증명은 Google Cloud 콘솔을 사용하여 얻을 수 있습니다.

        결과:

        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에서 관리되는 클러스터 - 이 옵션을 선택하면 GitLab이 이 클러스터의 네임스페이스와 서비스 계정을 관리합니다. 자세한 내용은 관리형 클러스터 섹션을 참조하십시오.
    7. 프로젝트 네임스페이스 (선택 사항) - 이를 입력할 필요가 없습니다. 공란으로 두면 GitLab이 대신 생성합니다. 또한:
      • 각 프로젝트는 고유한 네임스페이스를 가져야 합니다.
      • 프로젝트 네임스페이스는 비밀의 네임스페이스가 아닐 수도 있습니다. 만약 넓은 권한을 가진 시크릿을 사용한다면, 기본값과 같은 시크릿을 사용한다면 프로젝트 네임스페이스는 시크릿의 네임스페이스와 같을 수 있습니다.
      • 프로젝트 네임스페이스를 default로 사용해서는 안됩니다.
      • 프로젝트를 위해 특별히 시크릿을 생성했다면, 보통 제한된 권한을 가진 시크릿을 사용한다면, 시크릿의 네임스페이스와 프로젝트 네임스페이스가 같을 수 있습니다.
  4. Kubernetes 클러스터 추가 버튼을 선택하십시오.

약 10분 후에 클러스터가 준비됩니다.

Role-Based Access Control (RBAC) 비활성화 (옵션)

GitLab 통합을 통해 클러스터를 연결할 때, 해당 클러스터가 RBAC(역할 기반 액세스 제어)가 활성화되었는지 여부를 지정할 수 있습니다. 이는 GitLab이 특정 작업을 수행하는 방식에 영향을 미칩니다. 생성 시 RBAC가 활성화된 클러스터 확인란을 선택하지 않았다면, GitLab은 클러스터와 상호 작용할 때 RBAC가 비활성화된 것으로 간주합니다. 그렇다면 통합이 올바르게 작동하려면 클러스터에서 RBAC를 비활성화해야 합니다.

RBAC

caution
RBAC를 비활성화하면 클러스터에서 실행되는 모든 응용 프로그램 또는 클러스터에 인증할 수 있는 사용자가 전체 API 액세스 권한을 갖습니다. 이는 보안 상의 고려 사항이며 원하는 바가 아닐 수 있습니다.

RBAC를 효과적으로 비활성화하려면 전체 액세스를 부여하는 전역 권한을 적용할 수 있습니다:

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

문제 해결

클러스터 인증에 문제가 있습니다. CA 인증서 및 토큰이 유효한지 확인하십시오

Kubernetes 클러스터를 연결하는 동안 이러한 오류가 발생하면, 서비스 토큰을 올바르게 붙여넣고 있는지 확인하십시오. 일부 쉘은 서비스 토큰에 줄 바꿈을 추가하여 유효하지 않게 만들 수 있습니다. 토큰을 편집기에 붙여넣고 추가 공백을 제거하여 줄 바꿈이 없는지 확인하십시오.

인증서가 유효하지 않은 경우도 이 오류를 경험할 수 있습니다. 클러스터의 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.comkubernetes.example.com:443가 됩니다. -servername 인수는 URI 없이 도메인을 예상합니다. 예를 들어 kubernetes.example.com입니다.