CGOA — GitOps 인증 어소시에이트 · 자동화를 끄는 위치: 부모와 자식의 조정 루프 · 실습
자동화를 껐는데 누가 다시 켰을까
목표
ApplicationSet이 Application을 맞추는 루프와 Application이 Git을 실제 객체에 맞추는 루프를 구별합니다.
왜 중요한가
자식에서 자동화를 껐는데 부모가 다시 켤 수 있고, 자동 적용을 꺼도 수동 요청은 적용될 수 있습니다.
운영 LabHub나 외부 저장소를 변경하지 않습니다. 개인 VM의 cgoa-appset-ownership Namespace,
부모 하나·자식 하나·독립 Application 하나·작은 ConfigMap 두 개만 사용합니다.
Namespace·ApplicationSet·Application을 삭제하지 마세요. 전역 컨트롤러·RBAC·네트워크·보안 설정도 바꾸지 않습니다.
55분 실습입니다. 만료 전에 필요하면 시간을 연장하고 관측을 보관하세요. 세션 종료 시 VM과 파일은 회수됩니다.
준비된 환경과 도우미
부모는 cgoa-appset-ownership, 자식은 cgoa-appset-ownership-alpha, 독립 대조군은 cgoa-appset-ownership-sentinel입니다.
Git은 /srv/cgoa-appset-ownership, VM 내부 원격은 /srv/bare/cgoa-appset-ownership.git입니다.
자식은 apps/alpha, 대조군은 sentinel 디렉터리를 읽습니다. 외부 Git이나 운영 API를 쓰지 않습니다.
부모 ApplicationSet 자체는 /root/cgoa-appset-ownership-source.json을 도우미가 직접 적용하는 부트스트랩입니다.
부모까지 상위 Application이 Git으로 관리하는 세 번째 루프를 구현한 환경은 아닙니다.
학생 파일은 /root/cgoa-appset에 있습니다. 과제의 key=value는 설명이며 JSON 파일은 형식 예시를 따르세요.
python3 /opt/fixtures/cgoa_appset_lab.py observe는 현재 부모·자식·Git·ConfigMap을 읽습니다.
complete N은 작성한 답안을 검토하고 한정된 동작과 실제 관측을 기록합니다.
2는 자식 토글, 3은 부모 중지, 4는 Git 변경, 5는 수동 적용, 6은 부모의 좁은 예외, 7은 예외 종료와 새 Git입니다.
git show로 변경한 파일과 커밋 계보를 확인하세요. Git 변경은 4·7단계에만 일어납니다.
solve N은 정답 보기와 동일하며 없는 현재 답안만 채웁니다. 기존 오답·부분 답안은 수정하지 않습니다.
prepare N은 앞 단계만 준비하고 현재 답안은 만들지 않습니다. grade N은 읽기만 하며 변경을 재실행하지 않습니다.
단계
1. baseline.json에서 parent.uid와 child.uid를 읽으세요. ownership.json의 parent_uid와 child_uid에 해당 문자열을 적고 complete 1을 실행합니다. observation-1.json에서 child.owners가 같은 부모 UID를 가리키고, sentinel은 독립 Application인지 확인하세요. ConfigMap의 추적 주석은 어느 Application이 관리하는지 보여 줍니다.
2. child.json에 target_uid=기준 child UID 문자열, enabled=false와 expected_reverted=true 불리언을 적고 complete 2를 실행하세요. effect.patch_receipt의 false와 result.snapshot.child의 true를 비교합니다. 같은 UID인데 resourceVersion이 다른지 확인하세요. 요청 자체가 거부된 경우와 부모가 되돌린 경우를 구별합니다.
3. parent.json에 change_source=parent-template 문자열, enabled=false 불리언을 적고 complete 3을 실행하세요. 도우미가 부모 원본 선언 파일을 수정해 적용합니다. 부모와 자식의 enabled가 모두 false이고 데이터 one이 유지되는 세 표본을 읽으세요. 독립 sentinel의 정책과 데이터는 바뀌면 안 됩니다.
4. git.json에 release=two, expected_live=one 문자열, will_apply_automatically=false 불리언을 적고 complete 4를 실행하세요. Git의 apps/alpha/config.json만 바뀝니다. 새 SHA가 child.status.sync.revision에 나타나지만 OutOfSync이고 실제 값은 one인 세 표본을 확인합니다. 새 커밋을 읽지 못한 장애와 다릅니다.
5. observation-4.json의 result.snapshot.revision을 읽으세요. manual.json에 revision=그 SHA, child_uid=기준 자식 UID 문자열, manual_allowed=true 불리언을 적고 complete 5를 실행합니다. 검토한 커밋에 대한 수동 operation을 요청합니다. effect.request_receipt와 실제 데이터 two, 계속 false인 enabled를 대조하세요. 요청 메타데이터만으로 사용자 인증을 증명하지 않습니다.
6. exception.json에 app_name=cgoa-appset-ownership-alpha, json_pointer=/spec/syncPolicy/automated/enabled 문자열, parent_enabled=true와 child_enabled=false 불리언을 적고 complete 6을 실행하세요. 부모 템플릿은 true지만 이름이 지정된 한 필드 예외 때문에 자식은 false로 남습니다. 부모의 ignoreApplicationDifferences와 세 관측을 읽으세요.
7. resume.json에 remove_exception=true 불리언과 release=three 문자열을 적고 complete 7을 실행합니다. 예외 제거 후 부모·자식 enabled가 true인 것을 확인하고 새 Git 커밋을 만듭니다. 실제 데이터 three와 현재 커밋의 operation 성공을 확인하세요. 예전 수동 성공이나 기존 Synced만으로 자동화 복귀를 판정하지 않습니다.
8. decision.json에 automatic_resumed=true, manual_blocked=false, all_paths_frozen=false, samples_guarantee=false 불리언을 적고 complete 8을 실행하세요. 부모·자식·ConfigMap UID와 독립 sentinel이 보존됐는지 확인합니다. 자동화 중지, 전체 변경 금지, 짧은 표본과 장기 보장을 구분해 보고하세요.
참고와 한계
완료 입력과 관측을 직접 고치지 마세요. 이전 단계의 파일도 나중 채점의 근거입니다.
pending 저널이 남으면 중단된 요청을 자동 재실행하지 않습니다. 자료를 보관하고 새 실습에서 시작하세요.
요청은 완료됐지만 관측만 실패했다면 같은 커밋에서 관측만 다시 시도하며 같은 적용을 반복하지 않습니다.
3·4·6단계는 간격을 둔 세 표본입니다. 이것이 모든 경로의 변경 금지나 무기한 유지보수 보장은 아닙니다.
initiatedBy는 요청 메타데이터입니다. 수동 여부는 요청 영수증·정책·같은 커밋의 실제 변경을 함께 보고 판단합니다.
해시는 실수로 기록을 덮어쓴 것을 탐지하지만 같은 VM root의 모든 위조를 막는 보안 보증이 아닙니다.
채점은 60초, 이전 단계 준비는 90초 예산입니다. 기다리는 일은 complete가 담당합니다.
[ApplicationSet 변경 제어](https://argo-cd.readthedocs.io/en/stable/operator-manual/applicationset/Controlling-Resource-Modification/) ·
[kubectl 동기화 요청](https://argo-cd.readthedocs.io/en/stable/user-guide/sync-kubectl/).
단계 8개
- 두 조정 루프의 소유자 확인하기
- 자식에서 껐는데 다시 켜지는 현상 관측하기
- 부모 템플릿에서 자동화 중지하기
- Git 비교와 자동 적용의 차이 확인하기
- 자동화를 끈 채 수동 동기화하기
- 특정 자식의 한 필드만 임시 예외로 두기
- 예외를 제거하고 새 변경으로 자동화 검증하기
- 유지보수 모드의 범위와 한계 보고하기