CAPA — Argo 프로젝트 인증 어소시에이트 · AppProject·ApplicationSet·멀티테넌시 · 실습
테넌트 경계와 앱 공장 만들기
목표
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.sourceRepos 에 https://gitea.homelab.internal/platform/* 를, spec.destinations[0] 에 server https://kubernetes.default.svc 와 namespace capa-team-* 를 넣으세요.
2. 같은 파일의 spec.clusterResourceWhitelist 에 group "", kind Namespace 를 넣고, spec.namespaceResourceBlacklist 에는 group "" 의 ResourceQuota 와 LimitRange 두 종류를 넣으세요.
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.goTemplate 를 true 로 켜세요. spec.generators[0].list.elements 에 tenant 키 값이 각각 alpha, bravo, charlie 인 항목 3개를 넣고, spec.template.spec.project 를 capa-tenants 로 지정하세요.
6. /root/capa-project/appset-matrix.yaml 에 kind ApplicationSet, metadata.name capa-tenants-matrix 를 쓰고 spec.goTemplate 를 true 로 켜세요. spec.generators[0].matrix.generators 에 정확히 두 개를 넣되 하나는 repoURL 이 https://gitea.homelab.internal/platform/tenants.git 이고 directories[0].path 가 apps/* 인 git 제너레이터, 다른 하나는 원소가 하나 이상인 list 제너레이터로 하세요.
7. 클러스터에 네임스페이스 capa-team-alpha, capa-team-bravo, capa-team-charlie 세 개를 실제로 만들고 각각 라벨 capa.io/tenant 값을 alpha, bravo, charlie 로 붙이세요.
8. 세 네임스페이스 각각에 이름이 tenant-quota 인 ResourceQuota 를 실제로 만드세요. spec.hard.pods 는 10, spec.hard["requests.cpu"] 는 2 입니다.
참고
kubectl create quota tenant-quota --hard=pods=10,requests.cpu=2 -n <네임스페이스>로 빠르게 만들 수 있습니다.- 매니페스트 검증은
yq '.spec.clusterResourceWhitelist' /root/capa-project/appproject.yaml처럼 필드만 뽑아 보세요. - 흔한 실수 1: 화이트리스트와 블랙리스트에 같은 종류를 넣는 것. 두 필드는 스코프가 다릅니다.
- 흔한 실수 2: matrix 아래에 제너레이터를 하나만 넣는 것. 곱집합은 두 개일 때만 성립합니다.
단계 8개
- AppProject 의 허용 소스와 배포 대상
- 화이트리스트와 블랙리스트
- 프로젝트 역할과 그룹 매핑
- 주말에는 동기화를 막기
- list 제너레이터와 goTemplate
- matrix 제너레이터로 곱집합 만들기
- 테넌트 네임스페이스 3개 만들기
- 자원 경계를 세우는 ResourceQuota