jenkins部署手册(helm版本)

Jenkins on Kubernetes Helm 部署指南

概述

本文档介绍如何使用 Helm 在 Kubernetes 集群中部署生产就绪的 Jenkins 实例。

前置要求

  • Kubernetes 集群 (v1.19+)
  • Helm 3.x
  • Ingress 控制器 (如 Nginx Ingress)
  • 持久化存储 (StorageClass)

部署步骤

1. 添加 Jenkins Helm 仓库

helm repo add jenkinsci https://charts.jenkins.io
helm repo update

2.创建命名空间

kubectl create namespace jenkins

3.创建管理员密码 Secret

#jenkins-admin-secret.yaml
apiVersion: v1
kind: Secret
metadata:
  name: jenkins-admin-secret
  namespace: jenkins # 确保与Jenkins安装在同一个命名空间
type: Opaque
data:
  admin-user: YWRtaW4=     # Base64编码的 "admin"
  admin-password: amVua2luczEyMzQ1 # Base64编码的 "jenkins12345"

应用配置:

kubectl apply -f jenkins-admin-secret.yaml

4.自定义 values 配置

创建 jenkins-values.yaml 文件,内容如下:

# jenkins-values.yaml (Production-Ready)

## 1. 控制器(Jenkins Master)配置
controller:
  componentName: "jenkins-controller"

  # 使用稳定的LTS版本标签,而非latest
  image:
    registry: "swr.cn-north-4.myhuaweicloud.com"
    repository: "ddn-k8s/docker.io/jenkins/jenkins"
    tag: "2.516.3-lts-jdk21" # ✅ 确保此标签存在
    pullPolicy: "IfNotPresent" # 生产环境建议IfNotPresent

  # 资源限制:根据集群规模调整
  resources:
    requests:
      cpu: "200m"
      memory: "512Mi"
    limits:
      cpu: "2000m"
      memory: "4Gi"

  # 必须设置管理员密码!从K8s Secret获取,不要明文。
  admin:
    existingSecret: "jenkins-admin-secret" # 预先创建包含用户名和密码的Secret
    userKey: "admin-user"
    passwordKey: "admin-password"

  # 启用健康检查
  healthProbes: true
  probes:
    # ✅ 新增:启动探针,防止慢启动被杀死
    startupProbe:
      failureThreshold: 30 # 允许最多5分钟启动时间
      periodSeconds: 10
      httpGet:
        path: /login
        port: http
    livenessProbe:
      failureThreshold: 5
      periodSeconds: 10
    readinessProbe:
      failureThreshold: 3
      periodSeconds: 5

  # 要安装的核心插件列表
  installPlugins:
    - kubernetes:4384.v1b_6367f393d9
    - workflow-aggregator:608.v67378e9d3db_1
    - git:5.8.0
    - configuration-as-code:1998.v3e50e6e9d9d3

  # ✅ 重要:允许安装最新版本以满足插件间的依赖关系
  installLatestPlugins: true

  # JCasC (Configuration as Code)
  JCasC:
    defaultConfig: true
    overwriteConfiguration: true

  sidecars:
    enabled: true
    image:
        # -- Registry for the image that triggers the reload
        registry: swr.cn-north-4.myhuaweicloud.com
        # -- Repository of the image that triggers the reload
        repository: ddn-k8s/docker.io/kiwigrid/k8s-sidecar
        # -- Tag for the image that triggers the reload
        tag: 1.30.7
    imagePullPolicy: IfNotPresent
    resources:
      requests:
        cpu: "50m"
        memory: "64Mi"
      limits:
        cpu: "100m"
        memory: "128Mi" 

  # 通过Ingress暴露服务
  ingress:
    enabled: true
    apiVersion: "networking.k8s.io/v1" # 使用较新的API版本
    annotations:
      kubernetes.io/ingress.class: "nginx"
    ingressClassName: nginx
    hostName: "jenkins.your_domain.com" # 改成你的域名

# 持久化存储配置
persistence:
  enabled: true
  storageClass: "nfs-sc" # ✅ 强烈建议:替换为高性能SSD存储类
  accessMode: ReadWriteOnce
  size: 20Gi # 根据需求调整大小

## 2. Agent(构建代理)配置
agent:
  enabled: true
  image:
    registry: "swr.cn-north-4.myhuaweicloud.com"  # 只写registry域名
    repository: "ddn-k8s/docker.io/jenkins/inbound-agent"  # 组织/命名空间/镜像路径
    tag: "3327.v868139a_d00e0-6"
  resources:
    requests:
      cpu: "200m"
      memory: "512Mi"
    limits:
      cpu: "1000m"
      memory: "2Gi"

  # 添加一个常用的Pod模板(例如用于Maven构建)
  podTemplates:
    maven: |
      - name: maven
        label: maven
        containers:
          - name: maven
            image: maven:3.9.6-eclipse-temurin-17
            command: "cat"
            ttyEnabled: true
            resourceRequestCpu: "1000m"
            resourceRequestMemory: "2Gi"
            resourceLimitCpu: "2000m"
            resourceLimitMemory: "4Gi"

## 3. RBAC和服务账户配置
rbac:
  create: true # 创建必要的RBAC角色

serviceAccount:
  create: true
  name: "jenkins" # 指定一个明确的名字
  annotations: {}

helmtest:
  # A testing framework for bash
  bats:
    # Bash Automated Testing System (BATS)
    image:
      # -- Registry of the image used to test the framework
      registry: "swr.cn-north-4.myhuaweicloud.com"
      # -- Repository of the image used to test the framework
      repository: "ddn-k8s/docker.io/bats/bats"
      # -- Tag of the image to test the framework
      tag: "1.12.0"

5.安装 Jenkins

helm upgrade --install jenkins jenkins/jenkins \
  --namespace jenkins \
  --create-namespace \
  --values jenkins-values.yaml \
  --version 5.8.99

6.访问 Jenkins

通过浏览器访问配置的域名:https://jenkins.your_domain.com

7.0 CI/CD(tfs举例)

7.1 构建tee镜像

在部署前,建议预先构建一个包含 TEE CLI(Team Explorer Everywhere) 的 Jenkins Agent 镜像,用于从 Azure DevOps Server / TFS 拉取代码。

构建自定义 TEE Agent 镜像(Dockerfile 示例)

# 创建Dockerfile.tee-agent文件
# 使用 Ubuntu 22.04 作为基础镜像
FROM ubuntu:22.04

# 避免交互式安装提示
ENV DEBIAN_FRONTEND=noninteractive

# 安装基础依赖
RUN apt-get update && \
    apt-get install -y --no-install-recommends \
        openjdk-11-jre-headless \
        wget \
        unzip \
        ca-certificates \
        git \
        curl \
        jq && \
    rm -rf /var/lib/apt/lists/*

# 设置 TF CLI 版本
ENV TF_VERSION=14.135.0
ENV TF_HOME=/opt/tf

# 下载并安装 TEE(修复 URL 空格和 v 前缀)
RUN mkdir -p ${TF_HOME} && \
    wget -q "https://github.com/microsoft/team-explorer-everywhere/releases/download/${TF_VERSION}/TEE-CLC-${TF_VERSION}.zip" -O /tmp/tee.zip && \
    unzip /tmp/tee.zip -d ${TF_HOME} && \
    rm /tmp/tee.zip

# 查找并设置 tf 可执行文件权限
RUN find ${TF_HOME}/TEE-CLC-${TF_VERSION} -name "tf" -type f -exec chmod +x {} \; && \
    # 验证安装 - 使用正确的版本检查方式
    echo "验证 TEE-CLC 安装:" && \
    ${TF_HOME}/TEE-CLC-${TF_VERSION}/tf | head -2

# 修正 PATH 指向实际 tf 目录
ENV PATH="${TF_HOME}/TEE-CLC-${TF_VERSION}:${PATH}"

# 设置默认编码
ENV LANG=C.UTF-8

# 创建工作目录
WORKDIR /workspace

# 创建非 root 用户并授权所有必要目录
RUN groupadd -r tfuser && \
    useradd -r -g tfuser -d /workspace tfuser && \
    chown -R tfuser:tfuser /workspace ${TF_HOME}

USER tfuser

# 用于 Jenkins 持久化运行
CMD ["sleep", "infinity"]

构建并推送镜像(示例)

docker build -t your-registry/your-namespace/jenkins-agent-tee:14.135.0 -f Dockerfile.tee-agent .
docker push your-registry/your-namespace/jenkins-agent-tee:14.135.0

7.2 调整podTemplates

# === 关键:定义专用 Pipeline Pod Template ===
  podTemplates:
    tfs-dotnet-pipeline: |
      - name: tfs-dotnet-pipeline
        label: tfs-dotnet-pipeline
        serviceAccount: jenkins

        volumes:
          - emptyDirVolume:
              mountPath: "/cache"
              memory: false
          - secretVolume:
              mountPath: "/kaniko/.docker"
              secretName: docker-registry-secret #需要创建一个secret,供Kaniko pod推送镜像到镜像仓库(如harbor等)

        containers:
          # ───────────────────────────────
          # 第一步:拉取 TFS 代码(使用自建 tf 镜像)
          # ───────────────────────────────
          - name: tfs
            image: your-project/jenkins-agent-tee:1.0:latest  # ← 替换为你的实际镜像路径
            command: "sleep"
            args: "infinity"
            ttyEnabled: true
            resourceRequestCpu: "200m"
            resourceRequestMemory: "128Mi"
            resourceLimitCpu: "500m"
            resourceLimitMemory: "4Gi"

          # ───────────────────────────────
          # 第二步:构建并推送 Docker 镜像(Kaniko)
          # ───────────────────────────────
          - name: kaniko
            image: swr.cn-north-4.myhuaweicloud.com/ddn-k8s/gcr.io/kaniko-project/executor:v1.23.2-debug
            command: "sleep"
            args: "infinity"
            ttyEnabled: true
            resourceRequestCpu: "200m"
            resourceRequestMemory: "128Mi"
            resourceLimitCpu: "500m"
            resourceLimitMemory: "4Gi"

          # ───────────────────────────────
          # 第三步:部署到 Kubernetes
          # ───────────────────────────────
          - name: kubectl
            image: swr.cn-north-4.myhuaweicloud.com/ddn-k8s/gcr.io/cloud-builders/kubectl:latest
            command: "sleep"
            args: "infinity"
            ttyEnabled: true
            resourceRequestCpu: "200m"
            resourceRequestMemory: "128Mi"
            resourceLimitCpu: "500m"
            resourceLimitMemory: "4Gi"
posted @ 2025-09-16 16:03  怀恋小时候  阅读(143)  评论(0)    收藏  举报