2016-07-20 8 views
3

Ich versuche, das Jenkins/Kubernetes-Plugin zu verwenden, um Docker-Sklaven mit Jenkins zu orchestrieren.Kubernetes Jenkins Plugin - Sklaven immer offline

Ich benutze dieses Plugin: https://github.com/jenkinsci/kubernetes-plugin

Mein Problem ist, dass alle Sklaven offline sind, so kann der Auftrag nicht ausführen:

Slave status

enter image description here

ich versucht habe, Dies ist auf meiner lokalen Box mit Minikube und auf einem K8-Cluster von unserer Ops-Gruppe gehostet. Ich habe sowohl Jenkins 1.9 als auch Jenkins 2 ausprobiert. Ich bekomme immer das gleiche Ergebnis. Die Screenshots stammen von Jenkins 1.642.4, K8 v1.2.0

Hier ist meine Konfiguration ... beachten Sie, dass, wenn ich auf "Testverbindung" klicke, ich einen Erfolg bekomme. Beachten Sie auch, dass ich keine Anmeldeinformationen benötigt habe (dies ist der einzige Unterschied, den ich im Vergleich zum dokumentierten Beispiel sehen kann).

Jenkins System Configuration

Das Jenkins Protokoll zeigt die folgende über und über:

Waiting for slave to connect (11/100): docker-6b55f1b7fafce 
Jul 20, 2016 5:01:06 PM INFO org.csanchez.jenkins.plugins.kubernetes.KubernetesCloud$ProvisioningCallback call 
Waiting for slave to connect (12/100): docker-6b55f1b7fafce 
Jul 20, 2016 5:01:07 PM INFO org.csanchez.jenkins.plugins.kubernetes.KubernetesCloud$ProvisioningCallback call 
Waiting for slave to connect (13/100): docker-6b55f1b7fafce 
Jul 20, 2016 5:01:08 PM INFO org.csanchez.jenkins.plugins.kubernetes.KubernetesCloud$ProvisioningCallback call 

Als ich kubectl get events betreibe ich sehen:

24s   24s  1   docker-6b3c2ff27dad3 Pod        Normal Scheduled   {default-scheduler }  Successfully assigned docker-6b3c2ff27dad3 to 96.xxx.xx.159 
24s   23s  2   docker-6b3c2ff27dad3 Pod        Warning MissingClusterDNS {kubelet 96.xxx.xx.159} kubelet does not have ClusterDNS IP configured and cannot create Pod using "ClusterFirst" policy. Falling back to DNSDefault policy. 
23s   23s  1   docker-6b3c2ff27dad3 Pod  spec.containers{slave} Normal Pulled    {kubelet 96.xxx.xx.159} Container image "jenkinsci/jnlp-slave" already present on machine 
23s   23s  1   docker-6b3c2ff27dad3 Pod  spec.containers{slave} Normal Created    {kubelet 96.xxx.xx.159} Created container with docker id 82fcf1bd0328 
23s   23s  1   docker-6b3c2ff27dad3 Pod  spec.containers{slave} Normal Started    {kubelet 96.xxx.xx.159} Started container with docker id 82fcf1bd0328 

Irgendwelche Ideen?

UPDATE: weitere Informationen melden Sie sich wie csanchez vorgeschlagen

➜ docker git:(master) ✗ kubectl get pods --namespace default -o wide 
NAME     READY  STATUS RESTARTS AGE  NODE 
docker-6bb647254a2a4 1/1  Running 0   1m  96.x.x.159 

➜ docker git:(master) ✗ kubectl log docker-6bafbac10b392 

    Jul 20, 2016 6:45:10 PM hudson.remoting.jnlp.Main$CuiListener status 
INFO: Connecting to 96.x.x.159:50000 (retrying:10) 
java.net.ConnectException: Connection refused 
    at java.net.PlainSocketImpl.socketConnect(Native Method) 
    at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:350) 
    at java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:206) 
    at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:188) 
    at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:392) 

ich an, was dieser Port 50000 wird verwendet für aussehen müssen werden ??

+0

Sie müssen überprüfen, warum Ihre Pods keine Verbindung herstellen konnten. 'kubectl pods bekommen' und die Logs der fehlerhaften Pods überprüft – csanchez

+0

Hier ist das Logbuch: –

+0

mit Log-Infos aktualisiert, danke! –

Antwort

0

Dank @csanchez ich die Lösung.

enter image description here

Das Problem war, dass ich den jenkins Server in k8 leite und ich habe nicht einen festen Anschluss in K8 (Ich lasse k8 den Port auswählen) angeben. Das Ändern der Konfiguration für den Jenkins-Tunnel löste es also.

Eine bessere Lösung ist es, den Port wie vorgeschlagen zu fixieren und diese Änderung als nächstes vorzunehmen.

1

Ich möchte nur ein bisschen mehr Erklärung zu den obigen Antworten für Anfänger geben.

Während die jenkins UI aussetzt, können Sie auch interne Port 50000 aussetzen müssen, ist hier ein einfaches Service für einen jenkins Einsatz:

apiVersion: v1 
kind: Service 
metadata: 
    name: jenkins 
    namespace: jenkins 
spec: 
    type: NodePort 
    ports: 
    - port: 8080 
     name: "http" 
     nodePort: 30000 
     targetPort: 8080 
    - port: 50000 
     name: "slave" 
     nodePort: 30010 
     targetPort: 50000 
    selector: 
    app: jenkins 

Für den externen Zugriff auf die Jenkins UI, nodePort in die verwendet wird, über Konfiguration. Ich stelle den Port 8080 dem nodePort 30000 aus (die jenkins UI ist jetzt unter node_ip: 30000 verfügbar) und den pod port 50000 dem nodeport 30010.

Sobald die SVC erstellt:

$ kubectl get svc -n jenkins 
NAME  CLUSTER-IP EXTERNAL-IP PORT(S)       AGE 
jenkins 10.233.5.94 <nodes>  8080:30000/TCP,50000:30010/TCP 23m 

Jetzt jenkins_ip:30010 als Jenkins Tunnel hinzufügen.

1

Wenn jenkins in Kubernetes ausgeführt wird, kann der Servicename sowohl vom jenkins-Master als auch von den Slaves aufgelöst werden.

Der beste Weg, dies zu konfigurieren ist als die Verwendung der internen DNS und stellen Sie die jenkins URL:

http://jenkins:8080 

(vorausgesetzt, Sie Ihren Service jenkins genannt, und Ihr Port auf den Dienst ist 8080)

Kein Tunnel erforderlich.

Der Vorteil dieses Ansatzes ist, dass er Neustarts Ihrer Jenkins ohne Neukonfiguration übersteht.

Der sekundäre Vorteil ist, dass Sie Jenkins nicht der Außenwelt aussetzen müssen, wodurch Sicherheitsrisiken begrenzt werden.