사내 레지스트리에 차트를 올릴 때 인증서 검증에서 막힌다.
Error: failed to do request: ... x509: certificate signed by unknown authority
Helm 3 에서 차트를 올리는 경로는 둘이고, 신뢰 설정을 두는 자리가 다르다.
| 방식 | 주소 | 신뢰 설정 |
|---|---|---|
| OCI 레지스트리 | oci://registry.example.com/charts |
Helm 이 직접 HTTPS 로 붙는다. 시스템 CA 또는 명령 옵션 |
| ChartMuseum 등 HTTP 저장소 | helm repo add 로 등록한 주소 |
저장소 등록·명령 옵션 |
helm version
helm repo list
helm plugin list
helm push 는 Helm 3.8 부터 OCI 용으로 내장됐다. 그 전에는 helm-push 플러그인(ChartMuseum 용)이 같은 이름을 쓰고 있어서, 어느 쪽이 실행되는지에 따라 쓸 수 있는 옵션이 다르다. 옵션 이름을 추측하지 말고 확인한다.
helm push --help
helm registry login --help
버전마다
--ca-file·--insecure-skip-tls-verify·--plain-http의 유무가 다르다. 쓰는 Helm 버전의 도움말이 기준이다. 확인 필요.
Helm 은 Go 로 만들어져 OS 의 신뢰 저장소를 읽는다. 사내 CA 를 여기에 넣으면 Helm 뿐 아니라 같은 호스트의 다른 도구도 함께 해결된다.
# RHEL 계열
cp ca.crt /etc/pki/ca-trust/source/anchors/
update-ca-trust
# 데비안 계열
cp ca.crt /usr/local/share/ca-certificates/company-ca.crt
update-ca-certificates
openssl s_client -connect registry.example.com:443 -showcerts </dev/null
curl -v https://registry.example.com/v2/
curl 이 통과하면 Helm 도 통과한다. 여기서 unable to get local issuer certificate 가 나오면 서버가 중간 CA 를 빼고 leaf 인증서만 주고 있는 것이다. 클라이언트에 넣을 파일을 바꾸는 대신 서버가 full chain 을 제공하도록 고친다.
자주 하는 착각이다. /etc/docker/certs.d/ 는 Docker 데몬이 읽는 자리이고, /etc/containerd/certs.d/ 는 containerd 가 읽는 자리다. Helm 은 둘 다 보지 않는다. Helm 이 붙는 경로에서 x509 가 나면 Helm 이 읽는 신뢰 저장소를 고쳐야 한다.
반대로 클러스터가 그 레지스트리에서 이미지를 받지 못하는 문제라면 그때는 containerd 쪽을 고친다. 두 문제를 섞지 않는다. 각각의 설정은 사설 레지스트리 TLS 신뢰 문제 진단 에 있다.
helm registry login registry.example.com -u <사용자> --password-stdin <<< "${REGISTRY_PASSWORD}"
helm package .
helm push mychart-1.2.0.tgz oci://registry.example.com/charts
인증은 ~/.config/helm/registry/config.json 에 저장된다. Docker 의 config.json 과는 별개의 파일이라, docker login 을 했다고 Helm 이 인증되지는 않는다.
Harbor 에 올린다면 대상 프로젝트가 먼저 있어야 하고 계정에 push 권한이 있어야 한다. 이 부분은 이미지와 같다.