如何使用Jenkins将Docker容器部署至Kubernetes集群?含插件、步骤与示例
从Docker容器到Kubernetes部署:完整流程与Jenkins自动化指南
一、基础手动部署流程(先理解核心逻辑)
前提:K8s集群已就绪,kubectl已配置好访问权限,Docker镜像已推送到公共/私有镜像仓库。
- 编写Kubernetes Manifest文件
核心需要两个文件:Deployment.yaml(定义容器副本、镜像等)和Service.yaml(暴露服务访问)。 - 部署到K8s集群
执行命令:kubectl apply -f deployment.yaml kubectl apply -f service.yaml - 验证部署状态
- 查看Pod状态:
kubectl get pods - 查看服务状态:
kubectl get services - 查看Pod日志:
kubectl logs <pod-name>
- 查看Pod状态:
二、Jenkins自动化部署必备插件
直接安装以下插件(通过Jenkins插件市场搜索安装):
- Kubernetes Plugin:实现Jenkins与K8s集群的交互
- Docker Pipeline Plugin:支持Docker镜像的构建、推送操作
- Credentials Binding Plugin:安全管理镜像仓库、K8s集群的凭证
- Pipeline Plugin:编写声明式/脚本式流水线
- Git Plugin:拉取代码仓库中的Dockerfile、Manifest文件(如果需要)
三、Jenkins配置分步指南
1. 配置K8s集群连接
- 进入Jenkins → 系统管理 → 系统配置 → 找到「Cloud」区域,点击「添加一个云」选择「Kubernetes」
- 填写K8s API服务器地址(例如
https://<k8s-master-ip>:6443) - 配置凭证:可选择导入
kubeconfig文件,或使用K8s ServiceAccount的令牌,将凭证添加到Jenkins全局凭证中 - 点击「测试连接」,确认Jenkins能正常访问K8s集群
2. 配置镜像仓库凭证
- 进入Jenkins → 凭证管理 → 全局凭证 → 「添加凭证」
- 选择「用户名和密码」类型,填写镜像仓库的账号密码(如Docker Hub、Harbor),设置唯一ID方便流水线调用
3. 全局工具配置(可选)
如果Jenkins节点未预装kubectl或Docker,可在「全局工具配置」中设置自动安装对应工具,避免手动部署的麻烦。
四、核心文件编写示例
1. Dockerfile(以Node.js应用为例)
FROM node:18-alpine WORKDIR /app COPY package*.json ./ RUN npm install --production COPY . . EXPOSE 3000 CMD ["node", "server.js"]
2. K8s Deployment Manifest(deployment.yaml)
apiVersion: apps/v1 kind: Deployment metadata: name: node-app-deployment labels: app: node-app spec: replicas: 3 selector: matchLabels: app: node-app template: metadata: labels: app: node-app spec: containers: - name: node-app image: your-docker-username/node-app:${BUILD_NUMBER} # 用Jenkins构建号做版本标记 ports: - containerPort: 3000 resources: requests: cpu: "100m" memory: "128Mi" limits: cpu: "500m" memory: "256Mi"
3. K8s Service Manifest(service.yaml)
apiVersion: v1 kind: Service metadata: name: node-app-service spec: type: NodePort # 根据需求选择LoadBalancer/ClusterIP selector: app: node-app ports: - protocol: TCP port: 80 targetPort: 3000 nodePort: 30007 # 可选,指定固定NodePort
五、Jenkins Pipeline可运行示例(声明式)
替换示例中的占位符(如Docker用户名、Git仓库地址、凭证ID)即可直接运行:
pipeline { agent any environment { DOCKER_REGISTRY = "docker.io" DOCKER_REPO = "your-docker-username/node-app" K8S_MANIFEST_DIR = "./k8s" DOCKER_CRED_ID = "dockerhub-creds" // 对应Jenkins中配置的镜像仓库凭证ID K8S_CRED_ID = "k8s-cluster-kubeconfig" // 对应Jenkins中配置的K8s凭证ID } stages { stage('拉取代码') { steps { git url: 'https://github.com/your-username/your-node-app-repo.git', branch: 'main' } } stage('构建并推送Docker镜像') { steps { script { docker.withRegistry("https://${DOCKER_REGISTRY}", "${DOCKER_CRED_ID}") { def appImage = docker.build("${DOCKER_REPO}:${BUILD_NUMBER}") appImage.push() appImage.push("latest") // 同时推送latest标签 } } } } stage('部署到Kubernetes') { steps { withCredentials([file(credentialsId: "${K8S_CRED_ID}", variable: 'KUBECONFIG')]) { sh ''' export KUBECONFIG=$KUBECONFIG # 替换Deployment中的镜像版本 sed -i "s/your-docker-username\\/node-app:\\${BUILD_NUMBER}/${DOCKER_REPO}:${BUILD_NUMBER}/" ${K8S_MANIFEST_DIR}/deployment.yaml # 应用所有Manifest文件 kubectl apply -f ${K8S_MANIFEST_DIR}/ # 等待部署完成 kubectl rollout status deployment/node-app-deployment ''' } } } } post { success { echo "✅ 部署成功!访问地址:http://<your-k8s-node-ip>:30007" } failure { echo "❌ 部署失败,请查看流水线日志排查问题" } } }
关键注意事项
- 确保Jenkins节点能访问K8s API服务器和镜像仓库的网络权限
- 如果使用私有镜像仓库,需在K8s集群中配置
ImagePullSecret,并在Deployment的spec中引用 - 流水线中的
sed命令需根据操作系统调整(如MacOS需用sed -i '')
内容的提问来源于stack exchange,提问作者DHARA SINGH
相关产品推荐
相关产品推荐

