我在 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?一切似乎都正常。
更新:
我使用负载均衡器类型重新部署了它。负载均衡器的 IP 始终处于待处理状态,因此我认为集群上的外部网络已失效。这不应该,因为我在 terraform 脚本中输入了默认网络。有人知道如何解决这个问题吗?
更新2:
在没有 terraform 的情况下手动重新部署集群,它像往常一样工作。如果我在 tf 代码中指定了正确的网络(默认),为什么 terraform 会破坏我的网络?
答案1
我修复了我的问题。我在 GCP 中创建了一个名为“nodeports”的自定义网络标签,范围为 30000-32767,并将其添加到我的 terraform 代码中。我最初认为我不需要这样做,因为我认为 kubespray 会为我打开端口,而且我之前测试时端口是打开的。
我现在可以通过浏览器访问 Jenkins。