18.6.5 容器与云原生集成插件

容器与云原生集成插件#

本节聚焦 Jenkins 与容器、云原生生态的集成插件,覆盖镜像构建、Kubernetes 动态构建节点、部署发布与凭据管理等关键能力,形成可复制的 CI/CD 容器化实践路径。

1. 原理草图与数据流#

文章图片

2. 关键插件与安装(示例)#

插件安装路径:Jenkins → Manage Jenkins → Manage Plugins → Available
必装示例:Docker Pipeline、Kubernetes、Kubernetes CLI、Credentials Binding、Git

离线安装示例(含校验)

# 假设 Jenkins 插件目录
JENKINS_HOME=/var/lib/jenkins
PLUGINS=$JENKINS_HOME/plugins

# 下载插件(示例版本)
wget -O $PLUGINS/docker-workflow.hpi \
  https://updates.jenkins.io/download/plugins/docker-workflow/1.29/docker-workflow.hpi

wget -O $PLUGINS/kubernetes.hpi \
  https://updates.jenkins.io/download/plugins/kubernetes/1.31.3/kubernetes.hpi

# 重启 Jenkins 生效
systemctl restart jenkins

# 预期:系统管理界面中可见插件并启用

3. 容器化构建与镜像推送(Pipeline 示例)#

前置条件:Jenkins 节点已安装 Docker CLI;已创建凭据 dockerhub-creds
示例仓库结构
- /workspace/app/Dockerfile
- /workspace/app/app.py

Jenkinsfile

pipeline {
  agent any
  environment {
    REGISTRY = "docker.io"
    IMAGE = "myorg/demo-app"
    TAG = "${env.BUILD_NUMBER}"
  }
  stages {
    stage('Checkout') {
      steps { checkout scm }
    }
    stage('Build Image') {
      steps {
        sh '''
          cd app
          docker build -t $REGISTRY/$IMAGE:$TAG .
        '''
      }
    }
    stage('Push Image') {
      steps {
        withCredentials([usernamePassword(
          credentialsId: 'dockerhub-creds',
          usernameVariable: 'DOCKER_USER',
          passwordVariable: 'DOCKER_PASS'
        )]) {
          sh '''
            echo "$DOCKER_PASS" | docker login -u "$DOCKER_USER" --password-stdin $REGISTRY
            docker push $REGISTRY/$IMAGE:$TAG
          '''
        }
      }
    }
  }
  post {
    always { sh 'docker logout $REGISTRY || true' }
  }
}

命令解释
- docker build -t:构建并打标签,作为镜像制品。
- docker login:凭据绑定,避免明文。
- docker push:推送镜像,供部署使用。

4. Kubernetes 动态 Agent(Pod 模板示例)#

插件:Kubernetes
用途:动态拉起 Pod 作为 Jenkins Agent,按需扩缩容。

Pod 模板(Jenkins 配置 → Clouds → Kubernetes)

apiVersion: v1
kind: Pod
metadata:
  labels:
    jenkins: agent
spec:
  containers:
  - name: jnlp
    image: jenkins/inbound-agent:3206.vb_15dcf73f6a_9-1
    args: ['$(JENKINS_SECRET)', '$(JENKINS_NAME)']
  - name: tools
    image: alpine:3.19
    command: ['sh', '-c', 'cat']
    tty: true

Pipeline 绑定示例

pipeline {
  agent {
    kubernetes {
      label 'k8s-agent'
      defaultContainer 'tools'
    }
  }
  stages {
    stage('Run on K8s Agent') {
      steps {
        sh 'apk add --no-cache curl && curl -I https://www.example.com'
      }
    }
  }
}

5. Kubernetes 部署发布(kubectl/helm 示例)#

前置条件
- Jenkins 节点安装 kubectlhelm
- 配置 kubeconfig(建议使用凭据注入)

kubeconfig 凭据注入示例

withCredentials([file(credentialsId: 'kubeconfig-prod', variable: 'KUBECONFIG')]) {
  sh '''
    kubectl --kubeconfig=$KUBECONFIG get ns
    kubectl --kubeconfig=$KUBECONFIG apply -f k8s/deploy.yaml
  '''
}

部署清单(k8s/deploy.yaml)

apiVersion: apps/v1
kind: Deployment
metadata:
  name: demo-app
spec:
  replicas: 2
  selector:
    matchLabels:
      app: demo-app
  template:
    metadata:
      labels:
        app: demo-app
    spec:
      containers:
      - name: demo-app
        image: docker.io/myorg/demo-app:{{TAG}}
        ports:
        - containerPort: 8080

Helm 示例

# 预期:发布或升级 release
helm upgrade --install demo-app ./chart \
  --set image.repository=docker.io/myorg/demo-app \
  --set image.tag=${BUILD_NUMBER} \
  --namespace=prod --create-namespace

6. 常见问题与排错(含命令)#

问题 1:K8s Agent 创建失败
排查步骤:

# Jenkins Master 访问 K8s API 是否通
curl -k https://<k8s-apiserver>/healthz

# 查看 Jenkins 创建的 Pod 事件
kubectl get pod -n jenkins
kubectl describe pod <pod-name> -n jenkins

可能原因
- RBAC 权限不足 → 需绑定 ServiceAccount
- Pod 模板镜像拉取失败 → 检查镜像仓库/Secret

问题 2:镜像推送失败(401/403)
排查步骤:

docker login docker.io
docker push docker.io/myorg/demo-app:1

可能原因
- 凭据错误 → 重新配置 Jenkins Credentials
- 镜像命名不规范 → 确认仓库存在与权限

问题 3:部署后拉取镜像失败
排查步骤:

kubectl describe pod <pod> -n prod | grep -A3 "Failed"
kubectl get secret -n prod

可能原因
- 镜像标签不存在 → 确认构建与推送成功
- Secret 未绑定 → 在 Deployment 中配置 imagePullSecrets

7. 练习与实操任务#

1) 基础练习
- 安装 Docker Pipeline 与 Kubernetes 插件
- 构建并推送 hello-world 镜像
- 验证:docker pull 能拉取成功

2) 提升练习
- 使用 K8s 动态 Agent 执行 kubectl get pods
- 将构建号作为镜像标签并部署到 K8s
- 验证:kubectl rollout status deploy/demo-app 成功

3) 排错练习
- 故意使用错误仓库密码,定位 401 问题
- 故意删除镜像标签,观察 Pod ImagePullBackOff 处理

通过容器与云原生集成插件,Jenkins 可实现从构建到部署的全链路自动化,同时保持环境一致性、扩展性与安全可控,为现代化 DevOps 交付奠定基础。