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 节点安装 kubectl 或 helm
- 配置 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 交付奠定基础。