본문으로 건너뛰기

Zot

목적

Zot은 Lumie의 프라이빗 컨테이너 레지스트리입니다. 클러스터 워크로드는 반드시 여기서 이미지를 가져와야 하며, 동시에 스택의 다른 영역에서 강제하는 zot.lumie-infra.com/* 이미지 정책을 유지할 수 있도록 선택된 업스트림 레지스트리를 온디맨드로 미러링합니다.

이 페이지는 레지스트리 auth, 업스트림 미러 범위, MinIO 스토리지, build 및 deploy 이미지 경로를 변경하는 개발자를 위한 reference 문서입니다.

소스 경로

경로역할
lumie-infra/bootstrap/zot/argocd.yamlZot용 Argo CD 애플리케이션
lumie-infra/bootstrap/zot/common-values.yamlVault 기반 htpasswd, OIDC, MinIO 자격 증명 projection
lumie-infra/bootstrap/zot/helm-values.yamlZot 배포, ingress, 렌더링된 config, 미러 정책, auth 설정
lumie-infra/bootstrap/minio/**Zot이 S3 백엔드로 사용하는 오브젝트 스토리지
lumie-infra/applications/tekton/ci-cd/manifests/secrets/zot-registry-credentials.yamlzot.lumie-infra.com에 대한 Tekton push 자격 증명

퍼블릭 표면

표면계약
외부 URLhttps://zot.lumie-infra.com
인클러스터 Servicezot 서비스가 노출하는 포트 5000
스토리지 백엔드http://minio.minio.svc.cluster.local:9000의 S3 호환 MinIO 버킷 zot
인증 방식htpasswd와 Keycloak OIDC
메트릭/metrics의 Prometheus 엔드포인트

저장소 접근은 의도적으로 비대칭입니다.

  • 익명 사용자는 읽기 접근을 받습니다.
  • admins 그룹 구성원과 admin 사용자는 create, update, delete 권한을 받습니다.

런타임 흐름

구성 하이라이트

활성 config 계약은 ConfigMap 템플릿과 Vault가 투영한 OIDC client secret으로 렌더링됩니다.

"auth": {
"htpasswd": {
"path": "/etc/zot/htpasswd"
},
"openid": {
"providers": {
"oidc": {
"clientid": "zot",
"clientsecret": "__OIDC_CLIENT_SECRET__"
}
}
}
}

bootstrap/zot/helm-values.yaml의 중요한 동작은 다음과 같습니다.

  • init container가 라이브 OIDC client secret을 템플릿에 치환해 /etc/zot/config.json을 렌더링합니다.
  • 스토리지는 PVC가 아니라 S3 백엔드를 사용합니다.
  • ingress는 cert-manager가 발급한 TLS 시크릿과 함께 zot.lumie-infra.com에 퍼블릭으로 노출됩니다.
  • retention은 referrer를 삭제하면서 가장 최근에 push된 태그만 유지합니다.

업스트림 미러 정책

특정 레지스트리와 prefix에 대해 온디맨드 sync가 활성화되어 있습니다.

레지스트리예시 prefix
Docker Hublibrary/**, bitnami/**, gitea/**, rabbitmqoperator/**, minio/**, timberio/**
GHCRcloudnative-pg/**, kyverno/**, tektoncd/**, openclaw/**, kedacore/**
Quayprometheus/**, thanos/**, prometheus-operator/**, keycloak/**
Public ECRgravitational/**
registry.k8s.iokube-state-metrics/**, autoscaling/**
gcr.iokaniko-project/**

업스트림 네임스페이스가 목록에 없으면 Zot은 해당 이미지 경로를 온디맨드로 미러링하지 않으며, 스택의 다른 정책 계층에서 해당 pull이 실패할 것으로 예상해야 합니다.

시크릿 및 의존성 흐름

Secret소스 경로소비자
zot-htpasswdbootstrap/zot/common-values.yaml로컬 htpasswd auth
zot-oidc-secretbootstrap/zot/common-values.yamlinit-container 렌더 단계
minio-s3-credentialsbootstrap/zot/common-values.yaml메인 Zot 컨테이너 S3 client

세 리소스 모두 공유 vault/vault-auth identity를 통해 VaultStaticSecret으로 구체화됩니다.

장애 지점

장애 지점동작
zot-oidc-secret 누락init container가 config.json을 렌더링할 수 없어 pod가 정상 시작하지 못함
MinIO 장애Zot pod가 정상이어도 레지스트리 읽기/쓰기가 실패
allowlist된 prefix 누락Zot이 해당 업스트림 이미지 경로 미러링을 거부해 온디맨드 pull 실패
TLS 또는 ingress 문제인클러스터 service가 정상이어도 zot.lumie-infra.com 외부 pull 실패

검증

cd lumie-infra
rg -n "zot.lumie-infra.com|regionendpoint|onDemand|tektoncd/|clientsecret" \
bootstrap/zot applications/tekton/ci-cd
kubectl get application zot -n argocd -o yaml
kubectl get deploy,svc,ingress -n zot
kubectl get secret zot-htpasswd zot-oidc-secret minio-s3-credentials -n zot