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

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

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

구성 파일에 대한 정보

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

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

요구사항 및 제한사항

  • 일부 Kubernetes 리소스에는 변경 불가능한 필드가 포함되어 있습니다(예: Deployment 객체의 포드 선택기). 정보 소스의 값을 변경하여 구성의 변경 불가 필드를 변경할 수는 없습니다. 이러한 변경을 시도하면 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 객체가 있습니다.

클러스터 기반 레이아웃

별도의 구성이 있는 개별 클러스터의 Fleet 관리에 중점을 두는 경우 클러스터 기반 레이아웃이 더 적합할 수 있습니다.

├── 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/ 디렉터리에 있는 리소스)를 선언합니다.

다음 단계