이 글에 이어서 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 컨테이너의 로그를 확인해본다.
$ 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
참고 문서