#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 работает на виртуальной машине как контейнер docker.
- Jenkins работает в частной сети.
- Установлен плагин Kubernetes.
- Пространство имен Jenkins, ServiceAccount, роль и привязка ролей созданы в кластере Kubernetes.
- В разделе
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 в cacerts java truststore jenkins-inbound-agent. Это означает наличие пользовательского jenkins-inbound-agent, размещенного в частном реестре.
- Получите главный сертификат 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
$
- Введите этот самозаверяющий сертификат в 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
- Создайте пользовательский образ 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
- Извлеките пользовательский 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'
}
}
}
}