Configuré mi propio clúster usando Kubespray en Google Cloud: 1 maestro, 1 nodo. Lancé una aplicación jenkins. La aplicación no aparece en el navegador aunque todo parece estar correcto. Mi servicio e implementación (copiado del artículo en Internet para no introducir ningún error potencial):
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
Todo luce como era de esperar. Ejecute un kubectl get pods y vea que se está ejecutando:
NAME READY STATUS RESTARTS AGE
jenkins-b64d4d96d-4vj48 1/1 Running 0 22m
Ejecute un kubectl get svc para el nodeport:
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
Si visito <IP del nodo trabajador>:31794 no aparece nada. Verifiqué los puertos en el nodo trabajador, incluso abrí manualmente 30000-32767 en el nodo trabajador por si acaso (ejecutando: sudo iptables -A INPUT -p tcp --dport 30000:32767). Ejecute un sudo netstat -tulpn | grep ESCUCHE para verificar que el nodeport 31794 esté abierto:
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
Claramente 31794 está abierto en el nodo trabajador. ¿Por qué entonces no puedo acceder a jenkins en el navegador? Todo parece en orden.
Respuesta1
En la Service
especificación, debes mencionar type: LoadBalancer
permitir el acceso desde el navegador. Cuando haga esto, verá una IP externa en kubectl get svc
la salida.
Tenga en cuenta que el uso type: LoadBalancer
expondrá su aplicación a Internet. Para restringir eso, es posible que desee agregar una lista de IP permitidas usando el parámetro - loadBalancerSourceRanges
. Su definición final de Servicio debería ser similar a la siguiente
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