LabHub

CAPA — Argo 프로젝트 인증 어소시에이트 · AppProject·ApplicationSet·멀티테넌시 · 실습

테넌트 경계와 앱 공장 만들기

LabHub 에서 이어서 보기

목표

AppProject 로 테넌트 경계를 선언하고 ApplicationSet 두 종류로 Application 을 찍어내는 매니페스트를 작성한 뒤, 그 경계에 대응하는 실제 네임스페이스와 ResourceQuota 를 클러스터에 올립니다.

왜 중요한가

멀티테넌시는 두 층으로 이뤄집니다. 위층은 "누가 무엇을 선언할 수 있는가" 이고 아래층은 "그 선언이 자원을 얼마나 쓸 수 있는가" 입니다. AppProject 는 위층만 담당합니다. destinations 로 배포 대상을 좁혀도 그 네임스페이스가 노드를 다 먹는 것은 막지 못하고, 그것은 ResourceQuota 의 몫입니다. 반대로 ResourceQuota 만 있으면 테넌트가 남의 저장소를 소스로 걸거나 ClusterRoleBinding 을 만드는 것을 막지 못합니다. 두 층을 같이 세워 봐야 각 도구의 사정거리가 몸에 남습니다.

단계

1. /root/capa-project/ 디렉터리를 만들고 appproject.yaml 에 kind AppProject, metadata.name capa-tenants, metadata.namespace argocd 를 쓰세요. spec.sourceReposhttps://gitea.homelab.internal/platform/* 를, spec.destinations[0] 에 server https://kubernetes.default.svc 와 namespace capa-team-* 를 넣으세요.
2. 같은 파일의 spec.clusterResourceWhitelist 에 group "", kind Namespace 를 넣고, spec.namespaceResourceBlacklist 에는 group ""ResourceQuotaLimitRange 두 종류를 넣으세요.
3. spec.roles[0] 에 name deployer 를 두고, policies 에 p, proj:capa-tenants:deployer, applications, sync, capa-tenants/*, allow 를 포함시키고, groups 에 capa-platform 을 넣으세요.
4. spec.syncWindows 에 kind deny, schedule 0 0 * * 0,6, duration 24h, applications * 인 항목을 하나 만드세요.
5. /root/capa-project/appset-list.yaml 에 kind ApplicationSet, metadata.name capa-tenants-list 를 쓰고 spec.goTemplatetrue 로 켜세요. spec.generators[0].list.elementstenant 키 값이 각각 alpha, bravo, charlie 인 항목 3개를 넣고, spec.template.spec.projectcapa-tenants 로 지정하세요.
6. /root/capa-project/appset-matrix.yaml 에 kind ApplicationSet, metadata.name capa-tenants-matrix 를 쓰고 spec.goTemplatetrue 로 켜세요. spec.generators[0].matrix.generators 에 정확히 두 개를 넣되 하나는 repoURL 이 https://gitea.homelab.internal/platform/tenants.git 이고 directories[0].pathapps/* 인 git 제너레이터, 다른 하나는 원소가 하나 이상인 list 제너레이터로 하세요.
7. 클러스터에 네임스페이스 capa-team-alpha, capa-team-bravo, capa-team-charlie 세 개를 실제로 만들고 각각 라벨 capa.io/tenant 값을 alpha, bravo, charlie 로 붙이세요.
8. 세 네임스페이스 각각에 이름이 tenant-quota 인 ResourceQuota 를 실제로 만드세요. spec.hard.pods10, spec.hard["requests.cpu"]2 입니다.

참고

단계 8개

  1. AppProject 의 허용 소스와 배포 대상
  2. 화이트리스트와 블랙리스트
  3. 프로젝트 역할과 그룹 매핑
  4. 주말에는 동기화를 막기
  5. list 제너레이터와 goTemplate
  6. matrix 제너레이터로 곱집합 만들기
  7. 테넌트 네임스페이스 3개 만들기
  8. 자원 경계를 세우는 ResourceQuota