Failed to bind to nifi-1.nifi-headless.staging.svc.cluster.local/172.21.1.1:8080
... caused by java.net.BindException: Cannot assign requested address
소켓은 자기 자신이 가진 주소에만 바인딩할 수 있다. 위 오류는 nifi.web.http.host 에 서비스 DNS 이름이나 다른 Pod 의 주소가 들어가 있어, 그 이름이 해석된 IP 가 그 Pod 의 인터페이스에 없을 때 난다. headless Service 의 A 레코드가 여러 Pod IP 를 돌려주는 경우에도 같은 일이 벌어진다.
바인딩 주소와 광고 주소를 분리해서 생각한다. 바인딩은 비워 두어 모든 인터페이스를 잡고, 다른 노드에게 알리는 주소만 Pod 의 FQDN 으로 준다.
nifi.web.http.host=
nifi.web.http.port=8080
nifi.cluster.node.address=nifi-1.nifi-headless.staging.svc.cluster.local
nifi.cluster.node.protocol.port=11443
nifi.cluster.node.address 는 Pod 이름으로 만들어야 하므로, Downward API 로 metadata.name 을 환경변수에 넣고 진입 스크립트에서 치환한다. StatefulSet 이 아닌 Deployment 로 띄우면 Pod 이름이 매번 바뀌어 이 값을 고정할 수 없다.
같은 증상이 클러스터 프로토콜 포트와 로드밸런스 포트에서도 난다. nifi.cluster.node.protocol.port 와 nifi.cluster.load.balance.port 는 Pod 내부에서 여는 포트이므로 headless Service 의 포트 목록에 들어 있어야 다른 노드가 접근한다.
노드가 클러스터에 붙는 과정은 조정자(Cluster Coordinator)에게 자신을 알리고, 플로우 선출 결과를 받아 자신의 flow.json.gz 와 대조하는 순서다. 어느 한 단계가 막히면 상태가 CONNECTING 에서 더 나아가지 않는다.
확인할 것을 순서대로 적는다.
nifi-app.log 에서 Connection Status 또는 Disconnecting node 를 찾아 실제 사유를 본다. 화면의 CONNECTING 만으로는 원인을 알 수 없다.curl -v telnet://nifi-0.nifi-headless.staging.svc.cluster.local:11443 로 확인한다.nifi.cluster.flow.election.max.candidates 가 살아 있는 노드 수보다 크면 max.wait.time 이 다 지나야 넘어간다.Local flow is different than cluster flow 로 연결이 거부된다. 새로 합류시키려는 노드의 flow.json.gz · flow.xml.gz 를 지우고 다시 띄우면 클러스터 플로우를 받아 온다. 운영 중인 정본 노드에서는 절대 지우지 않는다.nifi.cluster.protocol.heartbeat.interval 이며 기본 5 초다.Root Node 가 모든 노드에서 같은지 본다. 하나만 달라도 서로 다른 클러스터가 된다.ERROR [main] org.apache.nifi.runtime.Application Starting NiFi failed
java.lang.IllegalStateException: Unable to create system bundle because nifi.nar.library.directory was null or empty
NiFi 가 nifi.properties 를 읽었으나 nifi.nar.library.directory 값이 없다는 뜻이다. 실제 원인은 대개 셋 중 하나다.
첫째, ConfigMap 으로 만든 nifi.properties 에 그 키가 빠졌다. 기본 배포본의 nifi.properties 를 통째로 베이스로 삼고 필요한 값만 바꿔야 한다. 필요한 키만 골라 쓴 파일은 이런 식으로 빠진 항목이 생긴다.
nifi.nar.library.directory=./lib
nifi.nar.library.autoload.directory=./extensions
nifi.nar.working.directory=./work/nar/
둘째, NIFI_HOME 이 실제 설치 경로와 다르거나 심볼릭 링크가 끊겨 다른 conf/nifi.properties 를 읽었다. readlink -f /opt/nifi 로 확인한다.
셋째, ConfigMap 을 subPath 없이 conf 디렉터리에 마운트해 기존 파일을 통째로 가렸다. 이 경우 nifi.properties 하나만 있고 나머지 설정 파일은 사라진 상태가 된다.
경로는 NIFI_HOME 기준 상대경로로 적는 것이 안전하다. 절대경로로 적으면 이미지 안 경로와 마운트 경로가 어긋날 때 같은 오류가 다시 난다.