EKS 上的 Jenkins 无法作为 Jenkins worker-node 连接到外部 EC2 服务器:错误 `port:50000 is not reachable`
Jenkins on EKS can't connect to external EC2 server as Jenkins worker-node: ERROR `port:50000 is not reachable`
我的主要任务是从 EC2 创建 Jenkins 节点 instance/server。
Jenkins 服务器在通过 jx
部署的 EKS 上
$ jx version
jx 2.0.818
jenkins x platform 2.0.1376
Kubernetes cluster v1.13.12
kubectl v1.17.0
helm client Client: v2.16.1
git 2.23.0
Operating System Mac OS X 10.15.4
我面临的问题:
- Jenkins 的 Helm 图表部署了 2 个名为
jenkins-agent
和 jenkins
的服务。 related issue
- 入口默认配置为仅使用
jenkins
服务作为后端,外部代理无法通过主机访问端口 50000
。
- 我无法编辑
jenkins
入口以指向具有 2 个后端端口 8080
和 50000
的服务 jenkins
(每个入口仅允许一个端口 service/path!)。 related issue
你可以看到这里有 2 个服务:1 个 jenkins
用于 jenkins master,1 个用于 jenkins slave jenkins-agent
,但只有一个入口 jenkins
指向 jenkins
端口 8080
.
上的 svc 后端
$ kubectl get svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S)
heapster ClusterIP ************ <none> 8082/TCP
jenkins ClusterIP ************ <none> 8080/TCP
jenkins-agent ClusterIP ************ <none> 50000/TCP
jenkins-x-chartmuseum ClusterIP ************ <none> 8080/TCP
jenkins-x-docker-registry ClusterIP ************ <none> 5000/TCP
$ kubectl get ingress
NAME HOSTS ADDRESS PORTS
chartmuseum chartmuseum.** ***.amazonaws.com 80
docker-registry docker-registry.** ***.amazonaws.com 80
jenkins jenkins.** ***.amazonaws.com 80
我试图创建另一个特定于 jenkins-agent
svc 的入口并使用类似 alb.ingress.kubernetes.io/group.name: mygroup
的东西。 info link
我未能将 2 个入口绑定在一起,不幸的是 jenkins
入口具有 kubernetes.io/ingress.class: nginx
而 ingress.class
没有此功能...
我检查了安全组以打开端口 50000
。
我尝试继续使用 AWS 并手动添加一个 50000
端口到负载均衡器,但是当我在 EC2 上 运行 时仍然是这个命令:
java -jar agent.jar -jnlpUrl http://JENKINS_URL/computer/****-service/slave-agent.jnlp -secret ****** -workDir "/home/ec2-user/jenkins_home" -failIfWorkDirIsMissing
失败并出现此错误:
provided port:50000 is not reachable
如何将外部 Jenkins Slave 添加到 Jenkins,其中有 2 个服务,一个用于 UI,另一个用于代理。上面的 java
命令要求两个端口都打开!
在同一个 PATH
因为你需要端口 8080 来获取 slave-agent.jnlp
并且在你获取它之后,它会在后台尝试连接到端口 50000
我没主意了...
经过一整天的试验...
我想出了一个解决方案,它不是最好的或直接的,但至少它是有效的。我的奴隶已连接! INFO: Connected
因此,我编辑了 jenkins-agent
服务,并从 type: ClusterIP
更改为 type: LoadBalancer
。这给了我一个新的负载均衡器,在我决定添加端口 8080
之后,因为在服务 yaml 文件中它使用与 jenkins
服务相同的 selector
。
(jenkins-agent 服务 yaml)
spec:
clusterIP: ***
externalTrafficPolicy: Cluster
ports:
- name: slavelistener
nodePort: 30258
port: 50000
protocol: TCP
targetPort: 50000
- name: http
nodePort: 30840
port: 8080
protocol: TCP
targetPort: 8080
selector:
component: jenkins-x-jenkins-master
sessionAffinity: None
type: LoadBalancer
status:
loadBalancer:
ingress:
- hostname: ****
在我的新 jenkins-agent
负载均衡器的末尾添加端口 8080
之后:
java -jar agent.jar -jnlpUrl http://****.elb.amazonaws.com:8080/computer/***-service/slave-agent.jnlp -secret ***** -workDir "/home/ec2-user/jenkins_home" -failIfWorkDirIsMissing
我的主要任务是从 EC2 创建 Jenkins 节点 instance/server。
Jenkins 服务器在通过 jx
$ jx version
jx 2.0.818
jenkins x platform 2.0.1376
Kubernetes cluster v1.13.12
kubectl v1.17.0
helm client Client: v2.16.1
git 2.23.0
Operating System Mac OS X 10.15.4
我面临的问题:
- Jenkins 的 Helm 图表部署了 2 个名为
jenkins-agent
和jenkins
的服务。 related issue - 入口默认配置为仅使用
jenkins
服务作为后端,外部代理无法通过主机访问端口50000
。 - 我无法编辑
jenkins
入口以指向具有 2 个后端端口8080
和50000
的服务jenkins
(每个入口仅允许一个端口 service/path!)。 related issue
你可以看到这里有 2 个服务:1 个 jenkins
用于 jenkins master,1 个用于 jenkins slave jenkins-agent
,但只有一个入口 jenkins
指向 jenkins
端口 8080
.
$ kubectl get svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S)
heapster ClusterIP ************ <none> 8082/TCP
jenkins ClusterIP ************ <none> 8080/TCP
jenkins-agent ClusterIP ************ <none> 50000/TCP
jenkins-x-chartmuseum ClusterIP ************ <none> 8080/TCP
jenkins-x-docker-registry ClusterIP ************ <none> 5000/TCP
$ kubectl get ingress
NAME HOSTS ADDRESS PORTS
chartmuseum chartmuseum.** ***.amazonaws.com 80
docker-registry docker-registry.** ***.amazonaws.com 80
jenkins jenkins.** ***.amazonaws.com 80
我试图创建另一个特定于 jenkins-agent
svc 的入口并使用类似 alb.ingress.kubernetes.io/group.name: mygroup
的东西。 info link
我未能将 2 个入口绑定在一起,不幸的是 jenkins
入口具有 kubernetes.io/ingress.class: nginx
而 ingress.class
没有此功能...
我检查了安全组以打开端口 50000
。
我尝试继续使用 AWS 并手动添加一个 50000
端口到负载均衡器,但是当我在 EC2 上 运行 时仍然是这个命令:
java -jar agent.jar -jnlpUrl http://JENKINS_URL/computer/****-service/slave-agent.jnlp -secret ****** -workDir "/home/ec2-user/jenkins_home" -failIfWorkDirIsMissing
失败并出现此错误:
provided port:50000 is not reachable
如何将外部 Jenkins Slave 添加到 Jenkins,其中有 2 个服务,一个用于 UI,另一个用于代理。上面的 java
命令要求两个端口都打开!
在同一个 PATH
因为你需要端口 8080 来获取 slave-agent.jnlp
并且在你获取它之后,它会在后台尝试连接到端口 50000
我没主意了...
经过一整天的试验...
我想出了一个解决方案,它不是最好的或直接的,但至少它是有效的。我的奴隶已连接! INFO: Connected
因此,我编辑了 jenkins-agent
服务,并从 type: ClusterIP
更改为 type: LoadBalancer
。这给了我一个新的负载均衡器,在我决定添加端口 8080
之后,因为在服务 yaml 文件中它使用与 jenkins
服务相同的 selector
。
(jenkins-agent 服务 yaml)
spec:
clusterIP: ***
externalTrafficPolicy: Cluster
ports:
- name: slavelistener
nodePort: 30258
port: 50000
protocol: TCP
targetPort: 50000
- name: http
nodePort: 30840
port: 8080
protocol: TCP
targetPort: 8080
selector:
component: jenkins-x-jenkins-master
sessionAffinity: None
type: LoadBalancer
status:
loadBalancer:
ingress:
- hostname: ****
在我的新 jenkins-agent
负载均衡器的末尾添加端口 8080
之后:
java -jar agent.jar -jnlpUrl http://****.elb.amazonaws.com:8080/computer/***-service/slave-agent.jnlp -secret ***** -workDir "/home/ec2-user/jenkins_home" -failIfWorkDirIsMissing