Я настроил свой собственный кластер с помощью Kubespray в облаке Google: 1 мастер, 1 узел. Я запустил на нем приложение jenkins. Приложение не отображается в браузере, хотя все выглядит правильно. Мой сервис и развертывание (скопировано из статьи в интернете, чтобы не вносить никаких потенциальных ошибок):
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
Все выглядит так, как и ожидалось. Запустите kubectl get pods и убедитесь, что он запущен:
NAME READY STATUS RESTARTS AGE
jenkins-b64d4d96d-4vj48 1/1 Running 0 22m
Запустите kubectl get svc для 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
Если я захожу на <worker node ip >:31794, ничего не появляется. Я проверил порты на рабочем узле, я даже вручную открыл 30000-32767 на рабочем узле на всякий случай (выполнив: sudo iptables -A INPUT -p tcp --dport 30000:32767). Запустите sudo netstat -tulpn | grep LISTEN, чтобы убедиться, что nodeport 31794 открыт:
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 открыт на рабочем узле. Почему же тогда я не могу получить доступ к jenkins в браузере? Вроде все в порядке.
решение1
В Service
спецификации вы должны упомянуть type: LoadBalancer
разрешение доступа из браузера. Когда вы это сделаете, вы увидите внешний ip, появляющийся в kubectl get svc
выводе.
Обратите внимание, что использование type: LoadBalancer
выставит ваше приложение в Интернет. Чтобы ограничить это, вы можете добавить список разрешенных IP-адресов с помощью параметра - loadBalancerSourceRanges
. Ваше окончательное определение службы должно быть примерно таким:
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