This page contains information related to upcoming products, features, and functionality. It is important to note that the information presented is for informational purposes only. Please do not rely on this information for purchasing or planning purposes. The development, release, and timing of any products, features, or functionality may be subject to change or delay and remain at the sole discretion of GitLab Inc.
Status Authors Coach DRIs Owning Stage Created
implemented @shinya.maeda @DylanGriffith @nagyv-gitlab @cbalane @hustewart @hfyngvason devops deploy 2022-11-23

GitLab 에이전트를 통해 배포된 리소스 보기 및 관리

요약

GitLab Kubernetes 대시보드 epic의 일환으로, 사용자들은 GitLab 에이전트를 통해 배포된 리소스를 볼 수 있으며 관리하고 싶어합니다. 사용자들은 환경 인덱스/상세 페이지와 같은 GitLab UI를 통해 해당 리소스와 상호작용할 수 있어야 합니다.

이 청사진은 어떻게 이 연관성이 설정되고, 이 도메인 모델들이 서로 상호작용하는지에 대해 설명합니다.

동기

목표

비목표

제안

개요

  • GitLab 환경과 GitLab 에이전트 간에 1:1 관계가 있습니다.
  • GitLab 환경은 연결된 에이전트에 의해 생성된 모든 리소스를 추적합니다. 이는 매니패스트 파일에 작성된 리소스뿐만 아니라 나중에 생성된 리소스(예: 배포 매니페스트 파일에 의해 생성된 Pod)도 포함됩니다.
  • GitLab 환경은 배포 => 복제본 세트 => Pod와 같은 의존성 그래프를 렌더링합니다. 이는 ArgoCD 스타일의 리소스 뷰를 제공하기 위함입니다.
  • GitLab 환경에는 건강한, 진행 중, 또는 저하된과 같은 리소스 상태의 요약을 나타내는 리소스 상태가 있습니다.
flowchart LR subgraph Kubernetes["Kubernetes"] subgraph ResourceGroupProduction["프로덕션"] direction LR ResourceGroupProductionService(["서비스"]) ResourceGroupProductionDeployment(["배포"]) ResourceGroupProductionPod1(["Pod1"]) ResourceGroupProductionPod2(["Pod2"]) end subgraph ResourceGroupStaging["스테이징"] direction LR ResourceGroupStagingService(["서비스"]) ResourceGroupStagingDeployment(["배포"]) ResourceGroupStagingPod1(["Pod1"]) ResourceGroupStagingPod2(["Pod2"]) end end subgraph GitLab subgraph 조직 subgraph 프로젝트 environment1["프로덕션 환경"] environment2["스테이징 환경"] end end end environment1 --- ResourceGroupProduction environment2 --- ResourceGroupStaging ResourceGroupProductionService -.- ResourceGroupProductionDeployment ResourceGroupProductionDeployment -.- ResourceGroupProductionPod1 ResourceGroupProductionDeployment -.- ResourceGroupProductionPod2 ResourceGroupStagingService -.- ResourceGroupStagingDeployment ResourceGroupStagingDeployment -.- ResourceGroupStagingPod1 ResourceGroupStagingDeployment -.- ResourceGroupStagingPod2

기존 컴포넌트 및 관계

문제점

  • GitLab 환경은 GitLab 에이전트 For Kubernetes의 ID를 외래 키로 가져야 합니다.
  • GitLab 환경은 연결된 클러스터에 속하는 리소스를 그룹화하는 방법을 정의해야 합니다. 예를 들어, namespace, label, 그리고 inventory-id (GitOps 모드에서만)가 매개변수로 전달될 수 있어야 합니다.
  • GitLab 환경은 연관 리소스를 모두 가져올 수 있어야 합니다. 이에는 기본 리소스 종류뿐만 아니라 다른 사용자 정의 리소스도 포함됩니다.
  • GitLab 환경은 의존성 그래프를 이해할 수 있어야 합니다.
  • GitLab 환경은 연관 리소스에서 리소스 상태를 계산할 수 있어야 합니다.

예시

이는 푸시 기반 배포에서 아키텍처가 동작하는 예시입니다. 이 기능은 여기에 CI Access 모드로 문서화되어 있습니다.

flowchart LR subgraph ProductionKubernetes["Production Kubernetes"] subgraph ResourceGroupProductionFrontend["Production"] direction LR ResourceGroupProductionFrontendService(["서비스"]) ResourceGroupProductionFrontendDeployment(["배포"]) ResourceGroupProductionFrontendPod1(["Pod1"]) ResourceGroupProductionFrontendPod2(["Pod2"]) end subgraph ResourceGroupProductionBackend["Staging"] direction LR ResourceGroupProductionBackendService(["서비스"]) ResourceGroupProductionBackendDeployment(["배포"]) ResourceGroupProductionBackendPod1(["Pod1"]) ResourceGroupProductionBackendPod2(["Pod2"]) end subgraph ResourceGroupProductionPrometheus["모니터링"] direction LR ResourceGroupProductionPrometheusService(["서비스"]) ResourceGroupProductionPrometheusDeployment(["배포"]) ResourceGroupProductionPrometheusPod1(["Pod1"]) ResourceGroupProductionPrometheusPod2(["Pod2"]) end end subgraph GitLab subgraph 조직 subgraph 운영 그룹 subgraph 에이전트 관리 프로젝트 AgentManagementAgentProduction["프로덕션 에이전트"] AgentManagementManifestFiles["Kubernetes 매니페스트 파일"] AgentManagementEnvironmentProductionPrometheus["프로덕션 프로메테우스 환경"] AgentManagementPipelines["CI/CD 파이프라인"] end end subgraph 개발 그룹 subgraph 프론트엔드 앱 프로젝트 FrontendAppCode["VueJS"] FrontendDockerfile["도커 파일"] end subgraph 백엔드 앱 프로젝트 BackendAppCode["Golang"] BackendDockerfile["도커 파일"] end subgraph 배포 프로젝트 DeploymentManifestFiles["Kubernetes 매니페스트 파일"] DeploymentPipelines["CI/CD 파이프라인"] DeploymentEnvironmentProductionFrontend["프로덕션 프론트엔드 환경"] DeploymentEnvironmentProductionBackend["프로덕션 백엔드 환경"] end end end end DeploymentEnvironmentProductionFrontend --- ResourceGroupProductionFrontend DeploymentEnvironmentProductionBackend --- ResourceGroupProductionBackend AgentManagementEnvironmentProductionPrometheus --- ResourceGroupProductionPrometheus ResourceGroupProductionFrontendService -.- ResourceGroupProductionFrontendDeployment ResourceGroupProductionFrontendDeployment -.- ResourceGroupProductionFrontendPod1 ResourceGroupProductionFrontendDeployment -.- ResourceGroupProductionFrontendPod2 ResourceGroupProductionBackendService -.- ResourceGroupProductionBackendDeployment ResourceGroupProductionBackendDeployment -.- ResourceGroupProductionBackendPod1 ResourceGroupProductionBackendDeployment -.- ResourceGroupProductionBackendPod2 ResourceGroupProductionPrometheusService -.- ResourceGroupProductionPrometheusDeployment ResourceGroupProductionPrometheusDeployment -.- ResourceGroupProductionPrometheusPod1 ResourceGroupProductionPrometheusDeployment -.- ResourceGroupProductionPrometheusPod2 AgentManagementAgentProduction -- 공유됨 --> DeploymentProject DeploymentPipelines -- "배포" --> ResourceGroupProductionFrontend DeploymentPipelines -- "배포" --> ResourceGroupProductionBackend AgentManagementPipelines -- "배포" --> ResourceGroupProductionPrometheus

추가 세부 정보

다중 프로젝트 배포 파이프라인

multi-project 배포 파이프라인을 통해 마이크로서비스 프로젝트 설정을 개선할 수 있습니다:

  • 배포 프로젝트는 상위 응용 프로그램 프로젝트 및 환경을위한 공유 배포 엔진으로 작동할 수 있습니다.
  • 응용 프로그램 프로젝트 내에서 환경을 생성할 수 있습니다. 이는 개발자에게 환경의 더 많은 가시성을 제공합니다.
  • 배포 프로젝트는 Operator 그룹에서 관리할 수 있습니다. 근무의 분리가 가능합니다.
  • 사용자는 RBAC를 설정하지 않아도 CI/CD 작업을 제한할 필요가 없습니다.
  • 이는 리뷰 앱과 같은 동적 환경에 특히 유용합니다.
flowchart LR subgraph ProductionKubernetes["프로덕션 쿠버네티스"] subgraph ResourceGroupProductionFrontend["프론트엔드"] direction LR ResourceGroupProductionFrontendService(["서비스"]) ResourceGroupProductionFrontendDeployment(["배포"]) ResourceGroupProductionFrontendPod1(["Pod1"]) ResourceGroupProductionFrontendPod2(["Pod2"]) end subgraph ResourceGroupProductionBackend["백엔드"] direction LR ResourceGroupProductionBackendService(["서비스"]) ResourceGroupProductionBackendDeployment(["배포"]) ResourceGroupProductionBackendPod1(["Pod1"]) ResourceGroupProductionBackendPod2(["Pod2"]) end subgraph ResourceGroupProductionPrometheus["모니터링"] direction LR ResourceGroupProductionPrometheusService(["서비스"]) ResourceGroupProductionPrometheusDeployment(["배포"]) ResourceGroupProductionPrometheusPod1(["Pod1"]) ResourceGroupProductionPrometheusPod2(["Pod2"]) end end subgraph GitLab subgraph Organization subgraph OperationGroup subgraph DeploymentProject DeploymentAgentProduction["프로덕션 에이전트"] DeploymentManifestFiles["쿠버네티스 매니페스트 파일"] DeploymentEnvironmentProductionPrometheus["프로덕션 프로메테우스 환경"] DeploymentPipelines["CI/CD 파이프라인"] end end subgraph DevelopmentGroup subgraph FrontendAppProject FrontendDeploymentPipelines["CI/CD 파이프라인"] FrontendEnvironmentProduction["프로덕션 환경"] end subgraph BackendAppProject BackendDeploymentPipelines["CI/CD 파이프라인"] BackendEnvironmentProduction["프로덕션 환경"] end end end end FrontendEnvironmentProduction --- ResourceGroupProductionFrontend BackendEnvironmentProduction --- ResourceGroupProductionBackend DeploymentEnvironmentProductionPrometheus --- ResourceGroupProductionPrometheus ResourceGroupProductionFrontendService -.- ResourceGroupProductionFrontendDeployment ResourceGroupProductionFrontendDeployment -.- ResourceGroupProductionFrontendPod1 ResourceGroupProductionFrontendDeployment -.- ResourceGroupProductionFrontendPod2 ResourceGroupProductionBackendService -.- ResourceGroupProductionBackendDeployment ResourceGroupProductionBackendDeployment -.- ResourceGroupProductionBackendPod1 ResourceGroupProductionBackendDeployment -.- ResourceGroupProductionBackendPod2 ResourceGroupProductionPrometheusService -.- ResourceGroupProductionPrometheusDeployment ResourceGroupProductionPrometheusDeployment -.- ResourceGroupProductionPrometheusPod1 ResourceGroupProductionPrometheusDeployment -.- ResourceGroupProductionPrometheusPod2 FrontendDeploymentPipelines -- "하위 파이프라인 트리거" --> DeploymentProject BackendDeploymentPipelines -- "하위 파이프라인 트리거" --> DeploymentProject DeploymentPipelines -- "배포" --> ResourceGroupProductionFrontend DeploymentPipelines -- "배포" --> ResourceGroupProductionBackend

디자인 및 구현 세부 정보

에이전트와 환경 연결

사용자는 설정 UI에서 명시적으로 Kubernetes에 대한 GitLab 에이전트를 GitLab 환경에 지정할 수 있습니다. Frontend는 이러한 연관된 에이전트를 사용하여 사용자 액세스를 인증/권한 부여 할 것입니다. 이에 관한 설명은 이후 섹션에서 설명됩니다.

우리는 DeclarivePolicy에서 외부 프로젝트(에이전트 관리 프로젝트라고도 함)에 의해 공유되는 에이전트를 지원하기 위해 read_cluster_agent 권한을 조정해야 합니다.

user_access를 통한 리소스 가져오기

사용자가 환경 페이지를 방문할 때, GitLab Frontend는 GraphQL을 통해 환경을 가져옵니다. Frontend는 추가로 연관된 에이전트 ID 및 네임스페이스를 가져옵니다.

다음은 GraphQL 쿼리의 예시입니다:

{
  project(fullPath: "group/project") {
    id
    environment(name: "<environment-name>") {
      slug
      kubernetesNamespace
      clusterAgent {
        id
        name
        project {
          name
        }
      }
    }
  }
}

GitLab Frontend는 브라우저 쿠키로 사용자 액세스를 인증/권한 부여합니다. 액세스가 금지된 경우 Frontend는 “이 환경에 배포 한 에이전트에 액세스 권한이 없습니다. “user_access”에서 허용되는 경우 에이전트 관리자에게 문의하십시오. <해결 방법="" 문서="" 링크="">를 참조하십시오"라는 오류 메시지를 표시합니다.해결>

사용자가 에이전트에 액세스 권한을 획들한 후, GitLab Frontend는 쿠버네티스의 특정 리소스 유형(예: Deployment, Pod)을 다음과 같은 매개변수로 가져옵니다:

  • namespace#{environment.kubernetesNamespace}

리소스가 없는 경우, 사용자가 이러한 label을 자원에 포함시키지 않았을 가능성이 높습니다. 이 경우 Frontend는 “환경에 대한 리소스를 찾을 수 없습니다. 리소스에 GitLab 보존 레이블이 있는지 확인하십시오. <해결 방법="" 문서="" 링크="">를 참조하십시오"라는 경고 메시지를 표시합니다.해결>

의존성 그래프

  • GitLab Frontend는 리소스 간의 의존성을 식별하기 위해 Owner References를 사용합니다. 이것들은 metadata.ownerReferences 필드에 리소스에 포함됩니다.
  • 소유자 참조가 없는 리소스의 경우, Well-Known Labels, Annotations and Taints를 보완하여 사용할 수 있습니다. 예를 들어 EndpointSlicemetadata.ownerReferences를 가지고 있지 않지만 부모 Service 리소스를 참조하는 kubernetes.io/service-name를 사용할 수 있습니다.

리소스의 상태

  • GitLab Frontend는 가져온 리소스에서 상태 요약을 계산합니다. 예를 들어 ArgoCD의 리소스 상태와 유사하게 정상, 진행 중, 장애, 중지됨 등이 있을 수 있습니다. 이 공식은 아직 결정되지 않았습니다.