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

如何配置Jenkins Kubernetes插件默认使用main容器运行任务

问题需求

Kubernetes插件中,Jenkins代理的命令默认会在jnlp容器中运行。目前必须用container('main')块包裹任务代码,才能让任务在main容器执行:

当前可行的流水线代码

node('node-agent'){
  container('main'){
    sh "ls -la"
  }
}

希望简化流水线代码,无需手动指定容器块,让任务默认直接在main容器中执行,即运行以下代码时:

期望的简化流水线代码

node('node-agent'){
  sh "ls -la"
}

任务自动在main容器而非jnlp容器中执行。


当前Jenkins即代码配置

Jenkins:cluster: non-prod
  Jenkins:secrets:
    create: true
    secretsList:
      - name: jenkins-github-token-non-prod
        value: /us-west-2-non-prod/jenkins/secrets/github-token
      - name: jenkins-slack-token-non-prod
        value: /us-west-2-non-prod/jenkins/secrets/slack-token
  Jenkins:config:
    chart: jenkins
    namespace: default
    repo: https://charts.jenkins.io
    values:
      agent:
        enabled: true
        podTemplates:
          jenkins-slave-pod: |
            - name: jenkins-slave-pod
              label: jenkins-slave-pod
              containers:
                - name: main
                  image: '805787217936.dkr.ecr.us-west-2.amazonaws.com/aba-jenkins-slave:ecs-global-node_master_57'
                  command: "sleep"
                  args: "30d"
                  privileged: true
        master.JCasC.enabled: true
        master.JCasC.defaultConfig: true
        kubernetesConnectTimeout: 5
        kubernetesReadTimeout: 15
        maxRequestsPerHostStr: "32"
        namespace: default
        image: "805787217936.dkr.ecr.us-west-2.amazonaws.com/aba-jenkins-slave"
        tag: "ecs-global-node_master_57"
        workingDir: "/home/jenkins/agent"
        nodeUsageMode: "NORMAL"
        # name of the secret to be used for image pulling
        imagePullSecretName:
        componentName: "eks-global-slave"
        websocket: false
        privileged: false
        runAsUser:
        runAsGroup:
        resources:
          requests:
            cpu: "512m"
            memory: "512Mi"
          limits:
            cpu: "512m"
            memory: "512Mi"
        podRetention: "Never"
        volumes: [ ]
        workspaceVolume: { }
        envVars: [ ]
        # - name: PATH
        #   value: /usr/local/bin
        command:
        args: "${computer.jnlpmac} ${computer.name}"
        # Side container name
        sideContainerName: "jnlp"
        # Doesn't allocate pseudo TTY by default
        TTYEnabled: true
        # Max number of spawned agent
        containerCap: 10
        # Pod name
        podName: "jnlp"
        # Allows the Pod to remain active for reuse until the configured number of
        # minutes has passed since the last step was executed on it.
        idleMinutes: 0
        # Timeout in seconds for an agent to be online
        connectTimeout: 100
      serviceAccount:
        annotations: {}
      controller:
        numExecutors: 1
        additionalExistingSecrets: []
        JCasC:
          securityRealm: |
            local:
                  allowsSignup: false
                  users:
                    - id: "aba"
                      password: "aba"
#          securityRealm: |
#            saml:
#              binding: "urn:oasis:names:tc:SAML:2.0:bindings:HTTP-Redirect"
#              displayNameAttributeName: "http://schemas.xmlsoap.org/ws/2005/05/identity/claims/name"
#              groupsAttributeName: "http://schemas.xmlsoap.org/claims/Group"
#              idpMetadataConfiguration:
#                period: 0
#                url: "https://aba.onelogin.com/saml/metadata/34349e62-799f-4378-9d2a-03b870cbd965"
#              maximumAuthenticationLifetime: 86400
#              usernameCaseConversion: "none"
#          authorizationStrategy: |-
#            roleBased:
#              forceExistingJobs: true
          configScripts:
            credentials: |
              credentials:
                system:
                  domainCredentials:
                    - credentials:
                        - string:
                            scope: GLOBAL
                            id: slack-token
                            description: "Slack access token"
                            secret: "${jenkins-slack-token-non-prod-value}"
                        - usernamePassword:
                            id: "github-credentials"
                            password: "aba"
                            scope: GLOBAL
                            username: "aba"
            plugin-config: |
              jenkins:
                disabledAdministrativeMonitors:
                  - "hudson.model.UpdateCenter$CoreUpdateMonitor"
                  - "jenkins.diagnostics.ControllerExecutorsNoAgents"
              security:
                updateSiteWarningsConfiguration:
                  ignoredWarnings:
                    - "core-2_263"
                    - "SECURITY-2617-extended-choice-parameter"
                    - "SECURITY-2170"
                    - "SECURITY-2796"
                    - "SECURITY-2169"
                    - "SECURITY-2332"
                    - "SECURITY-2232"
                    - "SECURITY-1351"
                    - "SECURITY-1350"
                    - "SECURITY-2888"
              unclassified:
                slackNotifier:
                  teamDomain: "superops"
                  baseUrl: "https://superops.slack.com/services/hooks/jenkins-ci/"
                  tokenCredentialId: "slack-token"
                globalLibraries:
                  libraries:
                    - defaultVersion: "master"
                      allowVersionOverride: true
                      name: "aba-jenkins-library"
                      implicit: true
                      retriever:
                        modernSCM:
                          scm:
                            git:
                              credentialsId: "github-credentials"
                              id: "shared-library-creds"
                              remote: "https://github.com/aba-aba/aba-jenkins-library.git"
                              traits:
                                - "gitBranchDiscovery"
                                - "cleanBeforeCheckoutTrait"
                                - "ignoreOnPushNotificationTrait"
        additionalPlugins:
        - junit:1119.1121.vc43d0fc45561
        - prometheus:2.0.11
        - saml:4.352.vb_722786ea_79d
        - role-strategy:546.ve16648865996
        - blueocean-web:1.25.5
        - github-branch-source:1677.v731f745ea_0cf
        - git-changelog:3.23
        - scriptler:3.5
        - sshd:3.249.v2dc2ea_416e33
        - rich-text-publisher-plugin:1.4
        - matrix-project:785.v06b_7f47b_c631
        - build-failure-analyzer:2.3.0
        - testng-plugin:555.va0d5f66521e3
        - allure-jenkins-plugin:2.30.2
        - timestamper:1.18
        - ws-cleanup:0.42
        - build-timeout:1.21
        - slack:616.v03b_1e98d13dd
        - email-ext:2.91
        - docker-commons:1.19
        - docker-workflow:521.v1a_a_dd2073b_2e
        - rundeck:3.6.11
        - parameter-separator:1.3
        - extended-choice-parameter:346.vd87693c5a_86c
        - uno-choice:2.6.3
        adminPassword: ""
        ingress:
          enabled: true
          hostName: jenkins.non-prod.us-west-2.int.isappcloud.com
          ingressClassName: nginx-int
        installPlugins:
        - kubernetes:3883.v4d70a_a_a_df034
        - workflow-aggregator:590.v6a_d052e5a_a_b_5
        - git:5.0.0
        - configuration-as-code:1569.vb_72405b_80249
        jenkinsUrlProtocol: https
        prometheus:
          enabled: true
        resources:
          limits:
            cpu: "4"
            memory: 8Gi
          requests:
            cpu: "2"
            memory: 4Gi
        sidecars:
          configAutoReload:
            resources:
              requests:
                cpu: 128m
                memory: 256Mi
        statefulSetAnnotations:
          pulumi.com/patchForce: "true"
          Name: eks-non-prod-us-west-2-jenkins
          department: aba
          division: enterprise
          environment: non-prod
          owner: devops
          project: eks-non-prod-us-west-2-jenkins
          team: infra
        tag: 2.362-jdk11
    version: 4.1.13
  Jenkins:stackTags:
    Name: eks-non-prod-us-west-2-jenkins
    department: aba
    division: enterprise
    environment: non-prod
    owner: devops
    project: eks-non-prod-us-west-2-jenkins
    team: infra
  aws:region: us-west-2

解决方案

要实现默认在main容器执行任务,需要修改Pod模板配置,指定默认容器为main,并确保jnlp容器作为通信sidecar存在。

1. 修改Pod模板配置

在agent.podTemplates.jenkins-slave-pod的Pod定义中添加defaultContainer: main,同时补充jnlp容器的配置(用于Jenkins代理通信):

jenkins-slave-pod: |
  - name: jenkins-slave-pod
    label: jenkins-slave-pod
    defaultContainer: main  # 指定默认执行容器为main
    containers:
      - name: main
        image: '805787217936.dkr.ecr.us-west-2.amazonaws.com/aba-jenkins-slave:ecs-global-node_master_57'
        command: "sleep"
        args: "30d"
        privileged: true
      - name: jnlp  # 保留jnlp容器作为通信sidecar
        image: "805787217936.dkr.ecr.us-west-2.amazonaws.com/aba-jenkins-slave:ecs-global-node_master_57"
        args: "${computer.jnlpmac} ${computer.name}"
        workingDir: "/home/jenkins/agent"

2. 保留全局sidecar配置

全局的agent.sideContainerName保持为jnlp,确保Jenkins识别该容器为代理通信的sidecar,不影响任务执行容器的默认设置。

3. 验证修改

应用配置后,运行简化的流水线代码:

node('jenkins-slave-pod'){
  sh "ls -la"
}

任务会自动在main容器中执行,无需手动添加container('main')块。


内容的提问来源于stack exchange,提问作者EilonA

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.30 05:23:12