계층적 저장소 사용

이 페이지에서는 구성 동기화가 계층적 정보 소스에서 구성을 읽어 클러스터에 자동으로 결과 구성을 적용하는 방법을 설명합니다.

구조 유연성을 더 많이 원하는 경우(예: 리소스의 하위 폴더를 만들려는 경우) 구조화되지 않은 정보 소스를 만들면 됩니다. 구조화되지 않은 정보 소스는 대부분의 사용 사례에 권장됩니다. 이미 계층적 정보 소스를 사용하는 경우 구조화되지 않은 정보 소스로 변환할 수 있습니다.

구성 동기화가 계층적 저장소를 사용하는 방법을 이해하려면 Git 저장소와 git 명령줄 인터페이스를 잘 알고 있는 것이 도움이 됩니다.

디렉터리 구조

계층적 소스의 경우 구성 동기화는 파일 시스템과 같은 구조를 활용하고 디렉터리를 이용해서 구성이 관련된 클러스터 또는 네임스페이스를 확인합니다.

namespaces/

namespaces/ 디렉터리에는 네임스페이스 및 네임스페이스 범위 객체의 구성이 포함되어 있습니다. namespaces/ 내 구조는 네임스페이스 상속을 유도하는 메커니즘입니다. NamespaceSelector를 사용하면 구성을 상속할 수 있는 네임스페이스를 제한할 수 있습니다.

cluster/

cluster/ 디렉터리에는 네임스페이스가 아닌 전체 클러스터에 적용되는 구성이 포함됩니다. 기본적으로 cluster/ 디렉터리의 모든 구성은 구성 동기화에 등록된 모든 클러스터에 적용됩니다. ClusterSelector를 사용하면 구성이 영향을 줄 수 있는 클러스터를 제한할 수 있습니다.

clusterregistry/

clusterregistry/ 디렉터리는 선택사항이며, 여기에는 ClusterSelector 구성이 포함됩니다. ClusterSelector는 구성이 적용되는 클러스터를 제한하며, cluster/namespaces/ 디렉터리에 있는 구성에서 참조됩니다.

system/

system/ 디렉터리에는 Operator 구성이 포함됩니다.

계층적 정보 소스 예시

다음 디렉터리 구조는 구성 동기화 계층적 정보 소스를 사용하여 team-1team-2라는 두 팀에서 공유하는 Kubernetes 클러스터를 구성하는 방법을 보여줍니다.

  • 팀마다 자체 Kubernetes 네임스페이스, Kubernetes 서비스 계정, 리소스 할당량, 네트워크 정책, rolebinding이 있습니다.
  • 클러스터 관리자는 namespaces/limit-range.yaml에서 정책을 설정하여 두 네임스페이스의 리소스 할당(포드 또는 컨테이너)을 제한합니다.
  • 또한 클러스터 관리자는 ClusterRole 및 ClusterRoleBindings를 설정합니다.

유효한 구성 동기화 계층적 소스에는 cluster/, namespaces/, system/ 등 하위 디렉터리가 3개 있어야 합니다.

cluster/ 디렉터리에는 네임스페이스가 아닌 전체 클러스터(예: ClusterRole, ClusterRoleBinding)에 적용되는 구성이 포함됩니다.

namespaces/ 디렉터리에는 네임스페이스 객체의 구성과 네임스페이스 범위 객체의 구성이 포함됩니다. namespaces/ 아래의 하위 디렉터리마다 네임스페이스 객체의 구성과 네임스페이스 아래의 모든 네임스페이스 범위 객체의 구성이 포함됩니다. 하위 디렉터리 이름은 네임스페이스 객체 이름과 동일해야 합니다. 네임스페이스마다 객체를 만들어야 하는 네임스페이스 범위 객체를 namespaces/(예: namespaces/limit-range.yaml) 아래에 직접 넣을 수 있습니다.

system/ 디렉터리에는 ConfigManagement Operator 구성이 포함됩니다.

├── cluster
│   ├── clusterrolebinding-namespace-reader.yaml
│   ├── clusterrole-namespace-reader.yaml
│   ├── clusterrole-secret-admin.yaml
│   └── clusterrole-secret-reader.yaml
├── namespaces
│   ├── limit-range.yaml
│   ├── team-1
│   │   ├── namespace.yaml
│   │   ├── network-policy-default-deny-egress.yaml
│   │   ├── resource-quota-pvc.yaml
│   │   ├── rolebinding-secret-reader.yaml
│   │   └── sa.yaml
│   └── team-2
│       ├── namespace.yaml
│       ├── network-policy-default-deny-all.yaml
│       ├── resource-quota-pvc.yaml
│       ├── rolebinding-secret-admin.yaml
│       └── sa.yaml
├── README.md
└── system
    └── repo.yaml

네임스페이스 상속 및 추상 네임스페이스 사용

계층적 정보 소스를 사용하면 네임스페이스 상속 개념을 사용하여 해당 네임스페이스가 있는 (또는 존재해야 하는) 모든 클러스터에서 네임스페이스 그룹에 구성을 자동으로 적용할 수 있습니다.

네임스페이스 상속은 계층적 저장소의 namespaces/ 디렉터리 및 모든 해당 하위 디렉터리에 적용됩니다. 저장소의 다른 디렉터리(예: cluster/)에 있는 구성은 상속되지 않습니다.

계층적 정보 소스에서 namespaces/ 디렉터리에는 다음 두 가지 유형의 하위 디렉터리가 포함될 수 있습니다.

  • 네임스페이스 디렉터리에는 네임스페이스 구성이 포함됩니다. 구성이 포함된 파일의 이름은 중요하지 않지만 구성에는 kind: Namespace가 있어야 합니다. 또한 네임스페이스 디렉터리에는 다른 종류의 Kubernetes 객체 구성도 포함될 수 있습니다. 네임스페이스 디렉터리에는 하위 디렉터리가 포함될 수 없습니다. 네임스페이스 구성은 클러스터의 실제 네임스페이스를 나타냅니다.

  • 추상 네임스페이스 디렉터리에는 네임스페이스 디렉터리가 포함됩니다. 또한 다른 Kubernetes 객체 구성도 포함될 수 있지만 네임스페이스 구성이 직접 포함될 수는 없습니다. 추상 네임스페이스 디렉터리는 Kubernetes 클러스터의 객체를 나타내지 않지만 하위 네임스페이스 디렉터리는 이러한 객체를 나타냅니다.

네임스페이스와 추상 네임스페이스 소스의 구성 및 구조 유형이 올바른지 확인하기 위해 문제 발생 시 KNV1003: IllegalNamespaceSubdirectoryError 오류가 보고됩니다.

네임스페이스 디렉터리에 있는 구성은 해당 네임스페이스에만 적용되지만 추상 네임스페이스 디렉터리에 있는 구성은 해당 추상 네임스페이스의 모든 하위 네임스페이스 디렉터리(또는 구성의 NamespaceSelector와 일치하는 하위 네임스페이스(있는 경우))에 적용되기 때문입니다.

namespaces/ 디렉터리의 구성 상속은 주로 정보 소스의 디렉터리 트리 내 위치에 기반합니다. 특정 클러스터의 지정된 네임스페이스에 적용되는 구성을 이해하려면 네임스페이스 상속 예시 저장소를 살펴볼 수 있습니다.

제한된 네임스페이스

config-management-system은 제한된 네임스페이스입니다. 추상 네임스페이스 디렉터리로 사용할 수 없습니다. config-management-system 네임스페이스를 정의할 수 있지만 config-management-system 네임스페이스에 허용되는 유일한 리소스 유형은 RootSync입니다.

정보 소스에서 변경

namespaces/ 디렉터리 내에서 네임스페이스 디렉터리를 만들거나 삭제하는 정보 소스를 변경하면 작업에 따라 예기치 않은 결과가 발생할 수 있습니다.

  • 디렉터리 만들기: 유효한 namespaces/ 계층 구조가 정보 소스에 커밋되면 구성 동기화는 네임스페이스를 만든 후 네임스페이스 디렉터리에 있거나 상속되는 각 구성의 관련 네임스페이스에 Kubernetes 객체를 만듭니다.
  • 디렉터리 삭제: 네임스페이스 디렉터리 삭제는 파괴적인 작업입니다. 네임스페이스가 있는 구성 동기화에서 관리하는 모든 클러스터에서 네임스페이스와 해당 콘텐츠가 삭제됩니다. 하위 네임스페이스 디렉터리가 있는 추상 네임스페이스 디렉터리를 삭제하면 구성 동기화가 관리하는 모든 클러스터에서 이 네임스페이스와 해당 콘텐츠가 모두 삭제됩니다.
  • 디렉터리 이름 변경: 네임스페이스 디렉터리 이름 바꾸기는 삭제 후 생성되는 것으로, 파괴적인 작업으로 간주됩니다. 추상 네임스페이스 디렉터리 이름을 바꿔도 외부에서 보이는 영향이 없습니다.

  • 디렉터리 이동: namespaces/ 내에서 네임스페이스 또는 추상 네임스페이스 디렉터리를 이동해도 네임스페이스나 그 안에 있는 객체는 삭제되지 않습니다. 단, 계층 구조 변경으로 인해 네임스페이스가 추상 네임스페이스 디렉터리에서 구성 상속을 시작 또는 중지하는 경우는 예외입니다.

다음 단계