我在 google cloud 上使用 Kubespray 设置了自己的集群: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:
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
如果我访问 < 工作节点 ip >:31794,什么也不会出现。我检查了工作节点上的端口,甚至在工作节点上手动打开了 30000-32767,以防万一(通过运行:sudo iptables -A INPUT -p tcp --dport 30000:32767)。运行 sudo netstat -tulpn | grep LISTEN 以验证节点端口 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