Проблема с сертификатом для запуска модулей kubernetes для Jenkins (размещенных за пределами этого кластера kubernetes)

#jenkins #jenkins-docker #jenkins-kubernetes #kubernetes-jenkins-plugin

#дженкинс #дженкинс-докер #jenkins-kubernetes #kubernetes-jenkins-plugin

Вопрос:

Я пытался настроить облачные агенты jenkins kubernetes на моей существующей установке jenkins (которая размещена за пределами кластера k8s). Мой jenkins размещен в Google Cloud Platform на виртуальной машине Windows. Он доступен для Интернета, и к нему добавлена сертификация ssl.

Мы пытаемся добавить облачные агенты с помощью плагина Jenkins Kubernetes. Подключение к kubernetes работает (я проверил это с помощью тестового подключения. Также контейнер pods добавляется в кластер, когда моя работа пытается запуститься). Я добавляю следующую конфигурацию в свой шаблон pod — контейнер pod запускается в моем движке kubernetes.

Проблема — задание не выполняется и продолжает создавать новые модули и удалять старые модули. Нужна помощь в правильном направлении. Я просмотрел Интернет, чтобы найти, была ли у кого-нибудь подобная проблема или настройка. Похоже, что все размещают jenkins в k8s вместе с облачными агентами.

Я думаю, проблема в том, что наш jenkins находится за пределами нашего кластера kubernetes.

Пока я использую базовый образ по умолчанию, просто чтобы посмотреть и проверить, выполняется ли задание. Задание просто содержит команду echo на этапе сборки оболочки. Изображения, которые я пробовал

  • jnlp-slave-with-java-build-tools
  • jenkins / inbound-agent
  • дженкинс / агент

Для аутентификации в моем кластере kubernetes используется учетная запись службы json, которая имеет для всех all access. Я использую задание Freestyle

Ошибка в журналах Google stackdriver —

 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
 

Комментарии:

1. Столкнулся с той же проблемой. Есть успехи?

Ответ №1:

Сведения о настройке:

Эта проблема возникает из-за того, что конечный пользователь должен использовать Jenkins с HTTPS в качестве самозаверяющего сертификата. Поэтому, когда плагин Kubernetes пытается запустить базовый контейнер jenkins-inbound-agent, он не идентифицирует главный сертификат Jenkins. отсюда unable to find valid certification path to requested target и ошибка.

Решение: — Чтобы устранить эту проблему, импортируйте главный сертификат Jenkins в cacerts java truststore jenkins-inbound-agent. Это означает наличие пользовательского 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. Введите этот самозаверяющий сертификат в java cacerts Jenkins-inbound-agent.

Добавьте ниже в свой файл 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 
     amp;amp; rm -Rf /tmp/jenkins.crt
 
  1. Создайте пользовательский образ docker для jenkins-inbound-agent
 $ 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

После этого создайте один пример проекта конвейера и используйте приведенный ниже код для тестирования запуска jenkins-inbound-agent в кластере Kubernetes «на лету».

 pipeline {
  agent {
    kubernetes {
      yaml '''
        apiVersion: v1
        kind: Pod
        '''
    }
  }
  stages {
    stage('Run') {
      steps {
            sh 'date'
            sh 'ls -lrth'
        
      }
    }
  }
}