Ich habe meinen eigenen Cluster mit Kubespray in der Google Cloud eingerichtet: 1 Master, 1 Knoten. Ich habe darauf eine Jenkins-App gestartet. Die App wird nicht im Browser angezeigt, obwohl alles korrekt zu sein scheint. Mein Dienst und meine Bereitstellung (aus einem Artikel im Internet kopiert, damit ich keine potenziellen Fehler einführe):
apiVersion: v1
kind: Service
metadata:
name: jenkins
spec:
type: NodePort
ports:
- port: 8080
targetPort: 8080
selector:
app: jenkins
---
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
name: jenkins
spec:
replicas: 1
template:
metadata:
labels:
app: jenkins
spec:
containers:
- name: jenkins
image: jenkins/jenkins
env:
- name: JAVA_OPTS
value: -Djenkins.install.runSetupWizard=false
ports:
- name: http-port
containerPort: 8080
- name: jnlp-port
containerPort: 50000
Alles sieht so aus, wie Sie es erwarten. Führen Sie kubectl get pods aus und sehen Sie, ob es ausgeführt wird:
NAME READY STATUS RESTARTS AGE
jenkins-b64d4d96d-4vj48 1/1 Running 0 22m
Führen Sie ein „kubectl get svc“ für den Nodeport aus:
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
jenkins NodePort 10.233.28.168 <none> 8080:31794/TCP 25m
kubernetes ClusterIP 10.233.0.1 <none> 443/TCP 11h
Wenn ich <worker node ip>:31794 besuche, passiert nichts. Ich habe die Ports auf dem Worker-Knoten überprüft und sogar 30000-32767 auf dem Worker-Knoten vorsichtshalber manuell geöffnet (durch Ausführen von: sudo iptables -A INPUT -p tcp --dport 30000:32767). Führen Sie ein sudo netstat -tulpn | grep LISTEN aus, um zu überprüfen, ob der Knotenport 31794 geöffnet ist:
tcp6 0 0 :::10256 :::* LISTEN 9580/kube-proxy
tcp6 0 0 :::80 :::* LISTEN 1200/apache2
tcp6 0 0 :::31794 :::* LISTEN 9580/kube-proxy
tcp6 0 0 :::22 :::* LISTEN 1428/sshd
31794 ist also eindeutig auf dem Worker-Knoten geöffnet. Warum kann ich dann im Browser nicht auf Jenkins zugreifen? Alles scheint in Ordnung zu sein.
Antwort1
In der Service
Spezifikation müssen Sie angeben, type: LoadBalancer
dass der Zugriff über den Browser zulässig ist. Wenn Sie dies tun, wird in der Ausgabe eine externe IP-Adresse angezeigt kubectl get svc
.
Beachten Sie, dass type: LoadBalancer
Ihre App durch die Verwendung von im Internet verfügbar gemacht wird. Um dies einzuschränken, können Sie mit dem Parameter - eine Liste zulässiger IPs hinzufügen loadBalancerSourceRanges
. Ihre endgültige Servicedefinition sollte ungefähr wie folgt aussehen:
apiVersion: v1
kind: Service
metadata:
name: jenkins
spec:
type: NodePort
ports:
- port: 8080
targetPort: 8080
selector:
app: jenkins
type: LoadBalancer
# Restrict access to this LoadBalancer to the below ips
loadBalancerSourceRanges:
- 100.100.100.100/32
- 1.1.1.2/32