Eu configurei meu próprio cluster usando Kubespray no Google Cloud: 1 mestre, 1 nó. Eu lancei um aplicativo Jenkins nele. O aplicativo não aparece no navegador, embora tudo pareça estar correto. Meu serviço e implantação (copiado do artigo na internet para não introduzir possíveis erros):
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
Tudo parece como você esperaria. Execute um kubectl get pods e veja se ele está em execução:
NAME READY STATUS RESTARTS AGE
jenkins-b64d4d96d-4vj48 1/1 Running 0 22m
Execute um kubectl get svc para o 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
Se eu visitar <worker node ip >:31794 nada aparece. Eu verifiquei as portas no nó de trabalho, até abri manualmente 30000-32767 no nó de trabalho para garantir (executando: sudo iptables -A INPUT -p tcp --dport 30000:32767). Execute um sudo netstat -tulpn | grep LISTEN para verificar se o nodeport 31794 está aberto:
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
Então, claramente, 31794 está aberto no nó de trabalho. Por que então não consigo acessar o Jenkins no navegador? Tudo parece em ordem.
Responder1
Nas Service
especificações, você deve mencionar type: LoadBalancer
para permitir o acesso do navegador. Ao fazer isso, você verá um IP externo aparecendo na kubectl get svc
saída.
Observe que o uso type: LoadBalancer
exporá seu aplicativo à Internet. Para restringir isso, você pode adicionar uma lista de IPs permitidos usando o parâmetro - loadBalancerSourceRanges
. Sua definição final de serviço deve ser algo como abaixo
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