如何通过Jenkins指定Spring Boot微服务在Kubernetes集群的部署节点?
如何在Jenkins部署微服务时指定Kubernetes节点
嘿,刚好我在3主15从的K8s集群里用Jenkins部署过Spring Boot微服务,这个问题我门儿清~其实核心逻辑是:Jenkins只是负责触发部署动作,真正指定节点的规则是在Kubernetes的资源配置里定义的,当然Jenkins的K8s插件也能辅助配置Agent的节点位置,下面给你拆解几种常用方式:
1. 最基础:NodeSelector(节点选择器)
这是最简单直接的方式,先给目标Worker节点打标签,然后在Deployment的Pod模板里指定要匹配的标签。
步骤:
- 给Worker节点打标签(比如给专门部署订单服务的节点打标签):
kubectl label nodes worker-03 worker-04 app=order-service - 在你的Spring Boot微服务的Deployment.yaml里添加
nodeSelector配置:apiVersion: apps/v1 kind: Deployment metadata: name: order-service spec: replicas: 3 selector: matchLabels: app: order-service template: metadata: labels: app: order-service spec: nodeSelector: # 这里指定要调度到的节点标签 app: order-service containers: - name: order-service image: your-registry/order-service:v1.0.0 ports: - containerPort: 8080
Jenkins部署时只要执行kubectl apply -f deployment.yaml,K8s就会把Pod调度到带有app=order-service标签的节点上。
2. 更灵活:NodeAffinity(节点亲和性)
如果需要更复杂的调度规则(比如"优先部署到某个节点组,不行的话再选其他",或者多标签匹配),就用节点亲和性,支持硬性规则(必须满足)和软性规则(优先满足)。
比如下面的配置,要求Pod必须部署在带有region=cn-north标签的节点,同时优先选择带有zone=cn-north-1的节点:
spec: template: spec: affinity: nodeAffinity: requiredDuringSchedulingIgnoredDuringExecution: # 硬性规则,必须满足 nodeSelectorTerms: - matchExpressions: - key: region operator: In values: - cn-north preferredDuringSchedulingIgnoredDuringExecution: # 软性规则,优先满足 - weight: 100 preference: matchExpressions: - key: zone operator: In values: - cn-north-1
3. 专属节点:Taints & Tolerations(污点与容忍)
如果有些节点是专门给核心微服务预留的(比如支付服务),可以给这些节点打污点,这样普通Pod无法调度上去,只有带有对应容忍的Pod才能部署。
步骤:
- 给核心节点打污点:
kubectl taint nodes worker-08 worker-09 dedicated=payment-service:NoSchedule - 在支付服务的Deployment里添加容忍配置:
spec: template: spec: tolerations: - key: "dedicated" operator: "Equal" value: "payment-service" effect: "NoSchedule" # 配合nodeSelector更精准,确保只调度到这些专属节点 nodeSelector: dedicated: payment-service
4. Jenkins K8s插件的Agent节点指定
如果你的Jenkins是跑在K8s集群里的,并且用K8s插件动态生成构建Agent,也可以在Jenkins Pipeline里指定Agent要运行的节点:
pipeline { agent { kubernetes { yaml ''' apiVersion: v1 kind: Pod spec: containers: - name: maven-build image: maven:3.8.6-jdk-11 command: ["sleep"] args: ["99d"] nodeSelector: # 指定构建Agent要跑的节点 role: jenkins-agent ''' } } stages { stage('Build Spring Boot') { steps { container('maven-build') { sh 'mvn clean package -DskipTests' } } } stage('Deploy to K8s') { steps { sh 'kubectl apply -f k8s/deployment.yaml' } } } }
总结一下
- 微服务的部署节点指定,核心是在K8s的Deployment/Pod模板里配置调度规则(NodeSelector、NodeAffinity、Taints&Tolerations),Jenkins只是执行部署命令;
- Master节点默认带有
node-role.kubernetes.io/master:NoSchedule污点,所以微服务默认不会调度到Master上,不用额外配置; - 如果需要精细化控制,结合节点标签和调度规则就能实现不同微服务部署到指定Worker节点的需求。
内容的提问来源于stack exchange,提问作者Mr.DevEng
相关产品推荐
相关产品推荐

