클러스터 인증서를 통한 기존 클러스터 연결 (더 이상 지원하지 않음)

Tier: Free, Premium, Ultimate Offering: GitLab.com, Self-managed
caution
이 기능은 GitLab 14.5에서 더 이상 지원하지 않음입니다.
GitLab에 클러스터를 연결하려면 GitLab agent를 사용하세요.

기존 Kubernetes 클러스터가 있는 경우, 이를 프로젝트, 그룹 또는 인스턴스에 추가하고 GitLab과 통합의 이점을 누릴 수 있습니다.

전제 조건

기존 클러스터를 GitLab에 추가하기 위한 전제 조건은 아래를 참조하세요.

모든 클러스터

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

  • GitLab.com 계정 또는 자가 관리형 설치 계정 중 하나
  • 그룹 수준 및 프로젝트 수준 클러스터에 대한 Maintainer 역할
  • 인스턴스 수준 클러스터에 대한 Admin 영역 접근 권한
  • Kubernetes 클러스터
  • kubectl을 사용하여 클러스터에 대한 클러스터 관리 접근 권한

클러스터는 EKS, GKE,
온프레미스 및 기타 공급자에서 호스팅할 수 있습니다.
온프레미스 및 기타 공급자에서 호스팅하려면,
EKS 또는 GKE 방법을 사용하여 진행하고 클러스터의 설정을 수동으로 입력하세요.

caution
GitLab은 arm64 클러스터를 지원하지 않습니다.
자세한 내용은 arm64 클러스터에 Helm Tiller 설치 실패 이슈를 참조하세요.

EKS 클러스터

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

  • 작업 노드가 올바르게 구성된 Amazon EKS 클러스터
  • EKS 클러스터에 접근하기 위해 kubectl 설치 및 구성
  • 계정의 토큰이 클러스터에 대한 관리자 권한을 가지고 있는지 확인

GKE 클러스터

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

  • 클러스터 역할 바인딩을 만들기 위한 container.clusterRoleBindings.create 권한.
    접근 권한을 부여하려면 Google Cloud 문서를 참조하세요.

기존 클러스터 추가 방법

Kubernetes 클러스터를 프로젝트, 그룹 또는 인스턴스에 추가하려면:

  1. 다음 중 하나로 이동하세요:
    1. 프로젝트의 운영 > Kubernetes 클러스터 페이지 (프로젝트 수준 클러스터의 경우).
    2. 그룹의 Kubernetes 페이지 (그룹 수준 클러스터의 경우).
    3. Admin 영역의 Kubernetes 페이지 (인스턴스 수준 클러스터의 경우).
  2. Kubernetes 클러스터 페이지에서 Connect with a certificate 옵션을 Actions 드롭다운 목록에서 선택하세요.

  3. Connect a cluster 페이지에서 세부 정보를 입력하세요:
    1. Kubernetes 클러스터 이름 (필수) - 클러스터에 부여할 이름.
    2. 환경 범위 (필수) - 이 클러스터에 대한 연관된 환경.
    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 인증서 (필수) - 클러스터에 인증하기 위해 유효한 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 권한이 필요합니다.
        이 권한이 없는 경우, 기본 인증을 활성화한 후 관리자로 kubectl apply 명령어를 실행할 수 있습니다:

        kubectl apply -f gitlab-admin-service-account.yaml --username=admin --password=<password>  
        
        note
        기본 인증을 켤 수 있으며 비밀번호 자격 증명은 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 관리 클러스터 - 이 옵션을 선택하면 GitLab이 이 클러스터의 네임스페이스 및 서비스 계정을 관리합니다.
      추가 정보는 Managed clusters 섹션을 참조하세요.
    7. 프로젝트 네임스페이스 (선택 사항) - 이 항목은 입력할 필요가 없습니다.
      공란으로 두면 GitLab이 하나를 생성합니다. 또한:
      • 각 프로젝트에는 고유한 네임스페이스가 있어야 합니다.
      • 프로젝트 네임스페이스는 비밀의 네임스페이스와 반드시 동일하지 않습니다.
        더 넓은 권한을 가진 비밀(예: 기본 default 비밀)을 사용하는 경우.
      • 프로젝트 네임스페이스로 default를 사용해서는 안 됩니다.
      • 프로젝트를 위해 특정한 비밀을 누군가 생성한 경우, 일반적으로 제한된 권한으로 그 비밀의 네임스페이스와 프로젝트 네임스페이스가 동일할 수 있습니다.
  4. Add Kubernetes cluster 버튼을 선택하세요.

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

역할 기반 액세스 제어(RBAC) 비활성화 (선택 사항)

GitLab 통합을 통해 클러스터에 연결할 때 클러스터가 RBAC가 활성화되어 있는지 여부를 지정할 수 있습니다. 이는 특정 작업에서 GitLab이 클러스터와 상호 작용하는 방식에 영향을 미칩니다. 생성 시 RBAC가 활성화된 클러스터 체크박스를 선택하지 않은 경우, 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 인증서와 토큰이 유효한지 확인하십시오.

서비스 토큰을 올바르게 붙여넣고 있는지 확인하십시오. 일부 셸은 서비스 토큰에 줄 바꿈을 추가하여 유효성을 떨어뜨릴 수 있습니다. 편집기에 토큰을 붙여넣고 추가 공백을 제거하여 줄 바꿈이 없는지 확인하세요.

인증서가 유효하지 않은 경우에도 이 오류가 발생할 수 있습니다. 인증서의 주체 대체 이름이 클러스터의 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입니다.