Jenkins

[k8s] org.jenkinsci.remoting.protocol.impl.ConnectionRefusalException: Unknown client name 에러

비번변경 2022. 3. 16. 19:25

2022.03.07 - [Jenkins] HelmRelease로 설치 시, curl: (60) SSL certificate problem: certificate has expired 에러

이 글에 이어서 Jenkins 관련 문제를 하나 더 정리한다.

 

현상

쿠버네티스 클러스터 환경에서 동작하는 Jenkins에서 Pipeline을 구성하여 빌드했는데, 아래와 같은 출력과 함께 빌드가 완료되지 않았다. Jenkins 웹에서 확인할 수 있는 pipeline build console output 내용이다.

Started by user passwd
[Pipeline] Start of Pipeline
[Pipeline] podTemplate
[Pipeline] {
[Pipeline] node
Created Pod: staging/example-projects-andreas-test-1-x34f1-qzgqg-3cggn
Still waiting to schedule task
Waiting for next available executor
Created Pod: staging/example-projects-andreas-test-1-x34f1-qzgqg-1yvt8
Created Pod: staging/example-projects-andreas-test-1-x34f1-qzgqg-l3t8l
Created Pod: staging/example-projects-andreas-test-1-x34f1-qzgqg-w784y
Created Pod: staging/example-projects-andreas-test-1-x34f1-qzgqg-xb0v1
Created Pod: staging/example-projects-andreas-test-1-x34f1-qzgqg-vs25g
Created Pod: staging/example-projects-andreas-test-1-x34f1-qzgqg-rm9q2
Created Pod: staging/example-projects-andreas-test-1-x34f1-qzgqg-850jp
Created Pod: staging/example-projects-andreas-test-1-x34f1-qzgqg-q2vpj
Created Pod: staging/example-projects-andreas-test-1-x34f1-qzgqg-tv0xn
Aborted by passwd
[Pipeline] // node
[Pipeline] }
[Pipeline] // podTemplate
[Pipeline] End of Pipeline
Finished: ABORTED

 

로그에서 생성되었다고 확인된 포드도 Error 상태로 남아있었다.

에러 상태인 포드 확인

 

describe 명령으로 해당 포드의 상세 정보를 확인하니, 컨테이너 두 개 중에 Jenkins 에이전트를 실행하는 jnlp 컨테이너에 문제가 있음을 알 수 있었다.

jnlp 컨테이너 이상 확인

 

따라서 jnlp 컨테이너의 로그를 확인해본다.

$ kubectl logs <POD> jnlp

[.. 생략 ..]
INFO: Protocol JNLP4-connect encountered an unexpected exception
java.util.concurrent.ExecutionException: org.jenkinsci.remoting.protocol.impl.ConnectionRefusalException: Unknown client name: 
        at org.jenkinsci.remoting.util.SettableFuture.get(SettableFuture.java:223)
        at hudson.remoting.Engine.innerRun(Engine.java:740)
        at hudson.remoting.Engine.run(Engine.java:518)
Caused by: org.jenkinsci.remoting.protocol.impl.ConnectionRefusalException: Unknown client name: staging/example-projects-andreas-test-1-x34f1-qzgqg-3cggn
        at org.jenkinsci.remoting.protocol.impl.ConnectionHeadersFilterLayer.newAbortCause(ConnectionHeadersFilterLayer.java:378)
        at org.jenkinsci.remoting.protocol.impl.ConnectionHeadersFilterLayer.onRecvClosed(ConnectionHeadersFilterLayer.java:433)
        at org.jenkinsci.remoting.protocol.ProtocolStack$Ptr.onRecvClosed(ProtocolStack.java:816)
        at org.jenkinsci.remoting.protocol.FilterLayer.onRecvClosed(FilterLayer.java:287)
        at org.jenkinsci.remoting.protocol.impl.SSLEngineFilterLayer.onRecvClosed(SSLEngineFilterLayer.java:172)
        at org.jenkinsci.remoting.protocol.ProtocolStack$Ptr.onRecvClosed(ProtocolStack.java:816)
        at org.jenkinsci.remoting.protocol.NetworkLayer.onRecvClosed(NetworkLayer.java:154)
        at org.jenkinsci.remoting.protocol.impl.BIONetworkLayer.access$1500(BIONetworkLayer.java:48)
        at org.jenkinsci.remoting.protocol.impl.BIONetworkLayer$Reader.run(BIONetworkLayer.java:247)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
        at hudson.remoting.Engine$1.lambda$newThread$0(Engine.java:117)
        at java.lang.Thread.run(Thread.java:748)
        Suppressed: java.nio.channels.ClosedChannelException
                ... 7 more

Mar 03, 2022 12:40:42 AM hudson.remoting.jnlp.Main$CuiListener error
SEVERE: The server rejected the connection: None of the protocols were accepted
java.lang.Exception: The server rejected the connection: None of the protocols were accepted
        at hudson.remoting.Engine.onConnectionRejected(Engine.java:825)
        at hudson.remoting.Engine.innerRun(Engine.java:765)
        at hudson.remoting.Engine.run(Engine.java:518)

jnlp 에이전트 컨테이너에서 Jenkins 마스터로 연결이 실패한 것을 확인할 수 있다. 그 이유는 마스터가 연결을 거부했기 때문인 것도 확인할 수 있다.

 

 

조치

별도 요인이 없다면 kubernetes 플러그인과 kubernetes-client-api 플러그인 간의 의존성 문제라고 한다.

( kubernetes 플러그인이 kubernetes-client-api 플러그인을 의존한다. )

 

+ 내 경우에는 확인하지 못했지만 Jenkins에서 로그 레코더를 구성하면 좀 더 상세한 로그를 확인할 수 있는 것 같다.

참고 : https://www.jenkins.io/doc/book/system-administration/viewing-logs/

 

이 글의 경우 기존의 jenkins 및 관련 플러그인 버전 정보는 아래와 같았다.

  • Jenkins : 2.303.1
  • kubernetes : 1.25.3
  • kubernetes-client-api : 5.4.2

그리고 kubernetes-client-api:5.4.1 버전 이상 사용하는 경우 kubernetes:1.30.0 이상의 플러그인 버전을 사용해야 하는 것으로 보인다.

https://plugins.jenkins.io/kubernetes/#releases

플러그인 의존성 확인

따라서 kubernetes 플러그인 버전을 1.30.11로 업데이트하였다. 업데이트된 버전은 웹에서 업데이트 시 설치되는 버전이며, 작성일(2022/03/03) 기준 최신 버전인 kubernetes:3538.v6b_005a_ddced1의 경우에는 Jenkins 2.303.3 버전을 요구하는 것으로 보인다.

 

실제 업데이트는 helmRelease 매니페스트 파일을 수정하여 반영했다.

참고 : https://github.com/helm/charts/blob/master/stable/jenkins/values.yaml#L226

  # List of plugins to be install during Jenkins master start
  installPlugins:
    - kubernetes:1.30.11
    - kubernetes-client-api:5.4.2

 

 


참고 문서

https://verifa.io/blog/how-to-debug-failing-build-agent-pods-in-kubernetes-enabled-jenkins/index.html