[英]Certificate issue for launching kubernetes pods for Jenkins (hosted outside of that kubernetes cluster)
我一直在嘗試在我現有的 jenkins 設置(托管在 k8s 集群之外)上配置 jenkins kubernetes 雲代理。 我的 jenkins 托管在 Google Cloud Platform 中的 Windows 虛擬機中。 它暴露在互聯網上,我們添加了 ssl 認證。
我們正在嘗試使用 Jenkins Kubernetes 插件添加雲代理。 與 kubernetes 的連接有效(我已經通過測試連接驗證了這一點。當我的工作嘗試開始時,pods 容器也被添加到集群中)。 我在我的 pod 模板中添加以下配置 - pod 容器從我的 kubernetes 引擎開始。
問題 - 作業沒有運行並不斷創建新的 pod 並刪除舊的 pod。 在正確的方向上需要一些幫助。 我已經搜索了 web 以查找是否有人有類似的問題或設置。 似乎每個人都在 k8s 中托管 jenkins 以及雲代理。
我認為問題在於我們的 jenkins 在我們的 kubernetes 集群之外。
我現在使用默認的基本映像只是為了查看和檢查作業是否運行。 Job 在 Build shell 步驟中只有一個 echo 命令。 我試過的圖片
對我的 kubernetes 集群的身份驗證使用的是服務帳戶 json,它具有所有訪問權限。 我正在使用自由式工作
谷歌堆棧驅動程序日志中的錯誤 -
SEVERE: Failed to connect to https://bflow.br.iq/tcpSlaveAgentListener/: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target`
`java.io.IOException: Failed to connect to https://bflow.br.iq/tcpSlaveAgentListener/: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
at org.jenkinsci.remoting.engine.JnlpAgentEndpointResolver.resolve(JnlpAgentEndpointResolver.java:214)
at hudson.remoting.Engine.innerRun(Engine.java:689)
at hudson.remoting.Engine.run(Engine.java:514)
Caused by: javax.net.ssl.SSLHandshakeException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
at sun.security.ssl.Alert.createSSLException(Alert.java:131)
at sun.security.ssl.TransportContext.fatal(TransportContext.java:324)
at sun.security.ssl.TransportContext.fatal(TransportContext.java:267)
at sun.security.ssl.TransportContext.fatal(TransportContext.java:262)
at sun.security.ssl.CertificateMessage$T12CertificateConsumer.checkServerCerts(CertificateMessage.java:654)
at sun.security.ssl.CertificateMessage$T12CertificateConsumer.onCertificate(CertificateMessage.java:473)
at sun.security.ssl.CertificateMessage$T12CertificateConsumer.consume(CertificateMessage.java:369)
at sun.security.ssl.SSLHandshake.consume(SSLHandshake.java:377)
at sun.security.ssl.HandshakeContext.dispatch(HandshakeContext.java:444)
at sun.security.ssl.HandshakeContext.dispatch(HandshakeContext.java:422)
at sun.security.ssl.TransportContext.dispatch(TransportContext.java:182)
at sun.security.ssl.SSLTransport.decode(SSLTransport.java:149)
at sun.security.ssl.SSLSocketImpl.decode(SSLSocketImpl.java:1143)
at sun.security.ssl.SSLSocketImpl.readHandshakeRecord(SSLSocketImpl.java:1054)
at sun.security.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:394)
at sun.net.www.protocol.https.HttpsClient.afterConnect(HttpsClient.java:559)
at sun.net.www.protocol.https.AbstractDelegateHttpsURLConnection.connect(AbstractDelegateHttpsURLConnection.java:185)
at sun.net.www.protocol.https.HttpsURLConnectionImpl.connect(HttpsURLConnectionImpl.java:167)
at org.jenkinsci.remoting.engine.JnlpAgentEndpointResolver.resolve(JnlpAgentEndpointResolver.java:211)
... 2 more
Caused by: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
at sun.security.validator.PKIXValidator.doBuild(PKIXValidator.java:456)
at sun.security.validator.PKIXValidator.engineValidate(PKIXValidator.java:323)
at sun.security.validator.Validator.validate(Validator.java:271)
at sun.security.ssl.X509TrustManagerImpl.validate(X509TrustManagerImpl.java:315)
at sun.security.ssl.X509TrustManagerImpl.checkTrusted(X509TrustManagerImpl.java:223)
at sun.security.ssl.X509TrustManagerImpl.checkServerTrusted(X509TrustManagerImpl.java:129)
at sun.security.ssl.CertificateMessage$T12CertificateConsumer.checkServerCerts(CertificateMessage.java:638)
... 16 more
Caused by: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
at sun.security.provider.certpath.SunCertPathBuilder.build(SunCertPathBuilder.java:141)
at sun.security.provider.certpath.SunCertPathBuilder.engineBuild(SunCertPathBuilder.java:126)
at java.security.cert.CertPathBuilder.build(CertPathBuilder.java:280)
at sun.security.validator.PKIXValidator.doBuild(PKIXValidator.java:451)
... 22 more
設置細節:
Managed Nodes and Clouds
> Configure Clouds
> Kubernetes
配置了所需的詳細信息。
Kubernetes URL
Kubernetes server certificate key
Kubernetes Namespace
Credentials
WebSocket
出現此問題是因為最終用戶必須使用 Jenkins 和 HTTPS 作為自簽名證書。 因此,當 Kubernetes 插件嘗試啟動基本 jenkins-inbound-agent 容器時,它不會識別主 Jenkins 證書。 因此unable to find valid certification path to requested target
。
解決方案: - 要解決此問題,請將主 Jenkins 證書導入 jenkins-inbound-agent 的 java 信任庫 cacerts。 這意味着在私有注冊表上托管一個自定義 jenkins-inbound-agent。
$ openssl s_client -connect jenkins.my.domain.net:443 -showcerts > jenkins.crt
depth=0 C = IN, ST = , L = Delhi, O = domain, OU = IT Operations, CN = *.jenkins.my.domain.net
verify error:num=20:unable to get local issuer certificate
verify return:1
depth=0 C = IN, ST = , L = Delhi, O = domain, OU = IT Operations, CN = *.jenkins.my.domain.net
verify error:num=21:unable to verify the first certificate
verify return:1
$ ls -lrth jenkins.crt
-rw-rw-r--. 1 jenkins jenkins 3.3K Oct 20 09:52 jenkins.crt
$
在入口點腳本之前添加以下內容到您的Dockerfile中。
COPY jenkins.crt /tmp/jenkins.crt
RUN keytool -import -trustcacerts -keystore /opt/java/openjdk/jre/lib/security/cacerts -storepass ******* -noprompt -alias jenkins-master -file /tmp/jenkins.crt \
&& rm -Rf /tmp/jenkins.crt
$ docker build . -t myregistery.company.net:5000/company/jenkins-agent:latest
$ docker push myregistery.company.net:5000/company/jenkins-agent:latest
Manage Jenkins
> Manage Nodes and Clouds
> Configure Clouds
> Kubernetes Cloud details
Advanced..
> Defaults Provider Template Name
> 設置值default-java
Pod templates
Name
設置為default-java
Container tempalates
Name
設置為jnlp
Docker Image
設置為myregistery.company.net:5000/company/jenkins-agent:latest
Always Pull Image
設置為True
Allocate pseudo-TTY
設置為True
在此之后,創建一個示例管道項目並使用以下代碼在 Kubernetes 集群上測試運行 jenkins-inbound-agent。
pipeline {
agent {
kubernetes {
yaml '''
apiVersion: v1
kind: Pod
'''
}
}
stages {
stage('Run') {
steps {
sh 'date'
sh 'ls -lrth'
}
}
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.