정보 소스에서 구성 파일 정리

이 페이지에서는 정보 소스에서 구성을 정리하는 방법을 설명합니다.

조직이 성장함에 따라 클러스터 Fleet에서 구성을 관리하고 동일한 저장소에서 작업하는 여러 팀을 지원해야 할 수 있습니다. 성공적인 GitOps 전략의 핵심은 구성이 올바른 클러스터에 적용되고 팀이 서로 방해하지 않고 작업할 수 있도록 하는 것입니다.

구성 파일에 대한 정보

구성 동기화는 여러 클러스터를 관리하는 클러스터 운영자용으로 설계되었습니다. 구성 동기화가 제품군에서 네임스페이스, Role, RoleBinding, ResourceQuota, 기타 중요 Kubernetes 객체를 관리하도록 하면 클러스터가 비즈니스 및 규정 준수 표준을 충족할 수 있습니다.

구성 동기화는 이러한 리소스를 관리할 때 등록된 클러스터를 구성 을 사용하여 동기화된 상태로 유지합니다. 구성(config)은 정보 소스의 YAML 또는 JSON 파일입니다. 구성 동기화는 Git 저장소, OCI 이미지, Helm 차트를 정보 소스로 지원합니다. 구성에는 kubectl apply 명령어를 사용하여 클러스터에 수동으로 적용할 수 있는 동일한 유형의 구성 세부정보가 포함되어 있습니다. 클러스터에 있을 수 있는 모든 Kubernetes 객체에 구성을 만들 수 있습니다. 하지만 보안 비밀 등의 일부 Kubernetes 객체에는 정보 소스에 저장하기에 부적절한 민감한 정보가 있습니다. 구성 동기화를 사용하여 이러한 유형의 객체를 관리할지 신중하게 고려하세요.

요구사항 및 제한사항

  • 일부 Kubernetes 리소스에는 배포 객체의 포드 선택기와 같은 변경 불가 필드가 포함되어 있습니다. 정보 소스의 값을 변경하여 구성의 변경 불가 필드를 변경할 수는 없습니다. 이러한 변경을 시도하면 KNV2009 오류가 발생합니다. 변경할 수 없는 필드를 변경해야 하는 경우 정보 소스에서 객체를 삭제하고 구성 동기화에서 클러스터에서 객체를 삭제할 때까지 기다린 다음 업데이트된 정보로 정보 소스에서 객체를 다시 만듭니다.

  • Git 하위 모듈을 사용하는 경우 하위 모듈을 포함한 모든 저장소에 대한 액세스 권한을 구성 동기화에 부여해야 합니다.

  • 구성 동기화를 사용하여 기본 제공 Kubernetes ClusterRole을 직접 관리할 수는 없습니다. GKE에는 일부 기본 제공 사용자 대상 역할, 예: cluster-admin, admin, edit, view이 제공됩니다. 구성 동기화를 사용하여 이러한 ClusterRole을 직접 관리할 수는 없습니다. 그렇지 않으면 구성 동기화가 GKE와 충돌합니다. 기본 제공 ClusterRole에 권한을 추가하려면 역할 집계 를 사용하여 간접적으로 수정합니다. 역할을 수정하려면 적절한 주석이 포함된 정보 소스에서 고유한 이름의 ClusterRole을 만듭니다.

정보 소스 구성

전체 저장소 또는 특정 폴더나 브랜치에서 동기화하도록 구성 동기화를 구성할 수 있습니다. 이러한 유연성 덕분에 팀 또는 조직의 요구사항에 따라 구성 파일을 정리할 수 있습니다.

구성 동기화를 구성할 때 sourceFormatunstructured로 설정하는 것이 좋습니다. 구조화된 (계층적) 소스 유형은 구성을 올바르게 동기화하기 위해 매우 구체적인 폴더 구조가 필요하며 대부분의 경우 불필요한 복잡성을 추가합니다.

이 페이지를 포함한 대부분의 구성 동기화 문서에서는 기본적으로 구조화되지 않은 형식을 사용하지만 필요한 경우 계층적 저장소 사용에서 계층적 형식에 대한 정보를 확인할 수 있습니다.

구조화되지 않은 소스를 사용하면 팀의 워크플로에 맞게 구성을 유연하게 정리할 수 있습니다. 이 섹션에서는 저장소를 구성하기 위한 몇 가지 일반적인 패턴을 제공합니다.

환경 기반 레이아웃

일반적인 방법은 환경별로 저장소를 구성하는 것입니다.

├── cluster-essentials/
│   ├── crds/
│   └── namespace.yaml
├── environments/
│   ├── dev/
│   │   ├── backend/
│   │   └── frontend/
│   ├── staging/
│   │   ├── backend/
│   │   └── frontend/
│   └── prod/
│       ├── backend/
│       └── frontend/
└── system/
    └── monitoring/

이 예시에서 정보 소스는 다음과 같이 구성됩니다.

  • cluster-essentials/: 모든 클러스터에 적용되는 구성을 포함합니다. 환경과 관계없이. 여기에는 커스텀 리소스 정의 (CRD) 및 필수 네임스페이스와 같은 리소스가 포함될 수 있습니다.
  • environments/: 모든 환경별 구성의 상위 디렉터리입니다.
  • system/: 모니터링과 같은 시스템 수준 서비스의 구성을 포함합니다.

이 접근 방식은 이해하고 탐색하기 간단하며 한 환경에서 다른 환경으로 변경사항을 승격하는 명확한 경로를 제공합니다.

이 시나리오에서 구성 동기화를 설정할 때 각 클러스터에 여러 RootSync 객체를 만듭니다. 예를 들어 개발 클러스터에는 cluster-essentials/, system/, environments/dev/에서 동기화되는 RootSync 객체가 있습니다.

클러스터 기반 레이아웃

고유한 구성이 있는 개별 클러스터 제품군을 관리하는 데 중점을 두는 경우 클러스터 기반 레이아웃이 더 적합할 수 있습니다.

├── clusters/
│   ├── cluster-a/
│   │   ├── apps/
│   │   └── networking/
│   ├── cluster-b/
│   │   ├── apps/
│   │   └── networking/
│   └── cluster-c/
│       ├── apps/
│       └── networking/
└── shared/
    ├── roles/
    └── policies/

이 예시에서 정보 소스는 다음과 같이 구성됩니다.

  • clusters/: 관리 중인 각 클러스터의 디렉터리를 포함합니다.
  • shared/: RBAC 역할 및 보안 정책과 같이 모든 클러스터에서 공통되는 구성을 포함합니다.

이 접근 방식은 클러스터에 모두 고유한 구성이 있는 경우 여러 클러스터를 관리하는 데 효과적입니다. 구성의 명확한 소유권과 격리를 제공하기 때문입니다. 공유 클러스터 구성이 많은 경우 이 접근 방식을 관리하는 것이 더 복잡할 수 있습니다.

이 시나리오에서 구성 동기화를 설정할 때 RepoSync를 사용하여 각 클러스터가 shared 및 클러스터별 디렉터리 모두에서 동기화되도록 구성할 수 있습니다.

팀 기반 레이아웃

서로 다른 팀이 서로 다른 애플리케이션 또는 서비스를 관리하는 조직의 경우 팀 기반 레이아웃이 효과적일 수 있습니다. 이 접근 방식은 정보 소스 구조를 조직 구조에 맞춥니다.

├── teams/
│   ├── team-alpha/
│   │   ├── app-one/
│   │   └── app-two/
│   ├── team-beta/
│   │   ├── service-a/
│   │   └── service-b/
│   └── team-gamma/
│       ├── data-pipeline/
│       └── dashboard/
└── platform/
    ├── cluster-roles/
    └── storage-classes/

이 예시에서 정보 소스는 다음과 같이 구성됩니다.

  • teams/: 팀별로 구성을 정리합니다. 각 팀은 자체 애플리케이션 및 서비스 구성을 관리합니다.
  • platform/: 중앙 플랫폼팀이 관리하고 모든 팀이 사용하는 클러스터 전체 구성을 포함합니다.

이 접근 방식을 사용하면 팀이 자체 구성 및 출시 주기를 관리할 수 있으며 한 팀의 변경사항이 실수로 다른 팀에 영향을 미칠 가능성을 줄일 수 있습니다. 하지만 이 접근 방식에서는 앱팀과 플랫폼팀 간의 종속성을 신중하게 관리해야 합니다.

이 시나리오에서 구성 동기화를 설정할 때 각 팀 은 RootSync 객체를 사용하여 구성을 동기화합니다. 예를 들어 team-alphateams/team-alpha/에서 동기화합니다.

구성 파일 유효성 검사

정보 소스에서 구성 파일을 만들고, 정리하고, 추가한 후 nomos vet --source-format=unstructured 명령어 를 사용하여 구성의 문법과 유효성을 검사합니다. 이렇게 하면 동기화 중 또는 동기화 후에 오류가 발생하는 것을 방지할 수 있습니다.

객체 변형 무시

구성 동기화가 존재한 이후 클러스터에서 객체 상태를 유지하길 원하지 않는 경우, 구성 동기화로 변형을 무시하려는 객체에 client.lifecycle.config.k8s.io/mutation: ignore 주석을 추가합니다.

다음 예시에서는 객체에 주석을 추가하는 방법을 보여줍니다.

metadata:
  annotations:
    client.lifecycle.config.k8s.io/mutation: ignore 

클러스터의 관리 객체에서 이 주석을 수동으로 수정할 수 없습니다.

계층적 저장소를 구조화되지 않은 저장소로 변환

계층적 저장소를 사용 중이고 이를 구조화되지 않은 저장소로 변환하려면 다음 명령어를 실행합니다.

nomos hydrate PATH

PATH를 디렉터리 경로로 바꿉니다.

이 명령어는 현재 작업 디렉터리에 compiled/ 디렉터리를 만듭니다. 이 디렉터리 내에 등록된 각 클러스터에 대한 하위 디렉터리가 생성됩니다. 이러한 하위 디렉터리에는 완전히 확인된 구성이 포함되어 있으며 구조화되지 않은 저장소에서 사용할 수 있습니다.

자세한 내용은 nomos 명령어를 참조하세요.

저장소를 수동으로 변환하려면 다음 안내를 완료하세요.

  1. Git 저장소의 system/ 디렉터리에서 Repo 구성을 삭제합니다. Repo 리소스는 구조화되지 않은 저장소에 필요하지 않습니다.

  2. 구조화되지 않은 저장소에서는 추상 네임스페이스 디렉터리 가 지원되지 않습니다. 따라서 namespaces/ 디렉터리 및 하위 디렉터리에 원래 포함된 모든 리소스의 네임스페이스를 선언합니다.

  3. 네임스페이스 상속 은 구조화되지 않은 저장소에서 지원되지 않습니다. 따라서 원래 하위 네임스페이스에서 상속된 모든 리소스 (원래 namespaces/ 디렉터리에 있는 리소스)를 선언합니다.

다음 단계