簡體   English   中英

為 Jenkins 啟動 kubernetes pod 的證書問題(托管在該 kubernetes 集群之外)

[英]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 命令。 我試過的圖片

  • jnlp-slave-with-java-build-tools
  • 詹金斯/入站代理
  • 詹金斯/代理

對我的 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

設置細節:

出現此問題是因為最終用戶必須使用 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。

  1. 獲得主Jenkins證書
    $ 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
    $
  1. 將此自簽名證書注入 Jenkins-inbound-agent java cacerts

在入口點腳本之前添加以下內容到您的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
  1. 構建 jenkins-inbound-agent 的自定義 docker 映像
$ docker build . -t myregistery.company.net:5000/company/jenkins-agent:latest
$ docker push myregistery.company.net:5000/company/jenkins-agent:latest
  1. 從私有注冊表中提取自定義 jenkins-agent
  • 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM