FTL unable to retrieve a list of IP associated to the host
error="lookup tasks.portainer-agent on 10.96.0.10:53: no such host"
tasks.<서비스명> 은 Docker Swarm 의 DNS 규칙이다. Kubernetes 에는 그런 이름이 없다. Swarm 용 매니페스트를 가져다 쓰면 이 지점에서 멈춘다.
Agent 는 서로를 찾기 위해 자신이 속한 그룹의 주소를 헤드리스 서비스로 조회한다. Kubernetes 에서는 clusterIP: None 서비스를 만들고 그 이름을 준다.
apiVersion: v1
kind: Service
metadata:
name: portainer-agent
namespace: portainer
spec:
clusterIP: None
selector:
app: portainer-agent
ports:
- port: 9001
targetPort: 9001
env:
- name: AGENT_CLUSTER_ADDR
value: "portainer-agent"
ports:
- containerPort: 9001
error="lookup portainer-agent.portainer.svc.cluster.local on 10.96.0.10:53: no such host"
이번에는 이름 규칙은 맞다. CoreDNS 가 그 이름을 모른다는 뜻이므로 서비스가 없거나 엔드포인트가 비어 있다.
kubectl -n portainer get svc portainer-agent
kubectl -n portainer get endpoints portainer-agent
kubectl -n portainer get pod --show-labels
엔드포인트가 <none> 이면 서비스의 셀렉터와 파드 라벨이 어긋났거나 파드가 아직 Ready 가 아니다. 헤드리스 서비스는 준비되지 않은 파드를 기본적으로 DNS 에 넣지 않는다. 기동 중에도 서로를 찾아야 하는 구성이라면 이 동작을 명시적으로 켠다.
spec:
publishNotReadyAddresses: true
KUBERNETES_SERVICE_HOST 와 KUBERNETES_SERVICE_PORT 는 자동으로 들어오지만 파드 자신의 IP 는 그렇지 않다. Downward API 로 넣는다.
env:
- name: KUBERNETES_POD_IP
valueFrom:
fieldRef:
fieldPath: status.podIP
같은 방식으로 metadata.name(파드 이름), metadata.namespace, spec.nodeName 을 받을 수 있다.
Portainer 와는 별개로, 같은 클러스터에서 이 증상이 함께 나오는 경우가 있다.
error sending request: Post "https://192.168.11.103:10250/exec/...": remote error: tls: internal error
curl -k https://192.168.11.103:10250/healthz
curl: (35) error:0A000438:SSL routines::tlsv1 alert internal error
-k 로 검증을 껐는데도 실패하므로 CA 신뢰 문제가 아니라 그 노드 kubelet 의 서빙 인증서 자체가 없거나 깨진 것이다. serverTLSBootstrap: true 로 인증서를 발급받는 구성에서 CSR 이 승인되지 않으면 이 상태가 된다.
kubectl get csr
kubectl certificate approve <csr 이름>
journalctl -u kubelet -n 100 | grep -i tls
kubelet 인증서 갱신은 Kubernetes 인증서 만료 처리 에 있다. 10250 포트가 컨트롤 플레인에서 열려 있는지도 함께 본다.