RKE2 를 설치한 직후 kube-system 네임스페이스에 helm-install-rke2-ingress-nginx-xxxxx 라는 파드가 생겼다가 반복해서 실패한다. 로그에는 Proxy Error 와 Service Unavailable 한 줄만 남고, 인그레스 컨트롤러가 끝내 뜨지 않는다.
RKE2 는 helm 바이너리를 사람이 직접 실행하도록 두지 않는다. 서버 노드에 helm-controller 가 함께 뜨고, /var/lib/rancher/rke2/server/manifests/ 아래에 놓인 HelmChart 사용자 정의 리소스를 읽어 차트마다 Job 을 하나씩 만든다. 그 Job 이 만드는 파드가 helm-install-<차트이름>-xxxxx 이다. 즉 이 파드는 애플리케이션이 아니라 설치 작업 그 자체이며, 실패하면 Job 의 backoff 정책에 따라 다시 생성된다.
기본으로 배치되는 매니페스트는 다음과 같다.
ls -l /var/lib/rancher/rke2/server/manifests/
# rke2-ingress-nginx.yaml, rke2-coredns.yaml, rke2-metrics-server.yaml ...
차트 tarball 자체는 인터넷에서 받지 않고 노드 안에 미리 들어 있다.
ls -l /var/lib/rancher/rke2/server/static/charts/
따라서 차트를 못 받아서 실패하는 경우는 드물고, 실패 원인은 대부분 Job 파드가 API 서버에 붙지 못하거나 이미지를 못 받는 것이다.
Job 은 실패한 파드를 남기므로, 지운 파드가 아니라 모든 파드를 봐야 한다.
kubectl -n kube-system get job | grep helm-install
kubectl -n kube-system get pod --field-selector=status.phase!=Running -o wide
kubectl -n kube-system describe job helm-install-rke2-ingress-nginx
파드 로그는 한 줄만 나오더라도 --previous 와 이벤트를 함께 본다. 실제 원인은 로그가 아니라 이벤트에 적혀 있는 경우가 많다.
kubectl -n kube-system logs job/helm-install-rke2-ingress-nginx
kubectl -n kube-system get events --sort-by='.metadata.creationTimestamp' | tail -40
HelmChart 리소스 자체의 상태도 확인한다. 여기에 helm 이 남긴 마지막 오류가 기록된다.
kubectl -n kube-system get helmchart rke2-ingress-nginx -o yaml
이 두 문구는 helm 이 낸 메시지가 아니라 중간에 낀 HTTP 프록시가 돌려준 응답 본문이다. helm-install 파드가 https://kubernetes.default.svc:443 또는 차트 저장소로 나가는 요청이 프록시를 타면서 프록시가 502·503 을 돌려주면, helm 은 그 HTML 본문을 그대로 오류로 출력한다.
확인할 것은 세 가지다.
첫째, 노드의 프록시 환경변수가 클러스터 내부 주소까지 프록시로 보내고 있지 않은지 본다. NO_PROXY 에 서비스 CIDR · 파드 CIDR · .svc · .cluster.local · 노드 IP 가 모두 들어 있어야 한다.
systemctl show rke2-server --property=Environment
cat /etc/systemd/system/rke2-server.service.d/*.conf
[Service]
Environment="HTTP_PROXY=http://proxy.example.com:3128"
Environment="HTTPS_PROXY=http://proxy.example.com:3128"
Environment="NO_PROXY=localhost,127.0.0.1,10.42.0.0/16,10.43.0.0/16,.svc,.cluster.local,<노드IP대역>"
둘째, 폐쇄망이라면 차트가 참조하는 컨테이너 이미지가 사설 레지스트리로 미러돼 있어야 한다. RKE2 는 /etc/rancher/rke2/registries.yaml 로 미러를 설정한다.
셋째, API 서버가 정상인지 본다. API 서버가 흔들리면 helm-install 파드는 Service Unavailable 을 그대로 받는다.
curl -k https://127.0.0.1:6443/readyz?verbose
기본 매니페스트를 직접 고치면 RKE2 재기동 시 덮어써진다. 값을 바꿀 때는 HelmChartConfig 를 같은 이름으로 따로 둔다.
apiVersion: helm.cattle.io/v1
kind: HelmChartConfig
metadata:
name: rke2-ingress-nginx
namespace: kube-system
spec:
valuesContent: |-
controller:
hostNetwork: true
이 파일을 /var/lib/rancher/rke2/server/manifests/ 에 놓으면 helm-controller 가 감지해 Job 을 다시 만든다. 인그레스를 아예 쓰지 않으려면 /etc/rancher/rke2/config.yaml 에 disable: rke2-ingress-nginx 를 적는다.
helm list 로는 이 릴리스가 보이지 않을 수 있다. helm-controller 가 릴리스 시크릿을 kube-system 에 두므로 helm -n kube-system list 로 봐야 한다.
실패한 Job 을 지우면 helm-controller 가 곧바로 새 Job 을 만든다. 원인을 고치기 전에 지우면 같은 실패가 반복될 뿐이므로, 실패한 파드를 남긴 채 이벤트부터 읽는다.