You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 03:54:07