1. 项目概述
在云原生技术快速发展的今天,Kubernetes已经成为容器编排的事实标准。作为DevOps流程中的关键环节,Harbor和Jenkins的集成搭建对于企业级持续集成/持续部署(CI/CD)至关重要。Harbor提供了企业级的容器镜像仓库管理能力,而Jenkins则是自动化构建和部署的核心工具。
这套技术栈的典型应用场景包括:
- 微服务架构下的多环境镜像管理
- 自动化构建流水线的建立
- 安全合规的镜像扫描与分发
- 多集群环境下的统一部署管理
2. 环境准备与规划
2.1 基础架构设计
在Kubernetes集群中部署Harbor和Jenkins时,建议采用以下架构设计:
code复制Ingress Controller
├── Harbor
│ ├── Core
│ ├── Registry
│ ├── Database (PostgreSQL)
│ └── Redis
└── Jenkins
├── Master
└── Agent Pods
这种架构的优势在于:
- 通过Ingress统一管理访问入口
- 资源隔离但又能互相通信
- 便于扩展和升级
2.2 硬件资源配置建议
根据实践经验,建议的最低资源配置:
| 组件 | CPU | 内存 | 存储 |
|---|---|---|---|
| Harbor | 4核 | 8GB | 100GB |
| Jenkins | 2核 | 4GB | 50GB |
注意:实际配置应根据镜像数量和构建频率调整。高并发场景下,Jenkins Master需要更多资源。
3. Harbor部署详解
3.1 Helm方式部署Harbor
推荐使用Helm进行部署,便于后续管理和升级:
bash复制helm repo add harbor https://helm.goharbor.io
helm install my-harbor harbor/harbor \
--namespace harbor-system \
--create-namespace \
--set expose.type=ingress \
--set expose.ingress.hosts.core=harbor.example.com \
--set persistence.enabled=true \
--set externalURL=https://harbor.example.com
关键参数说明:
expose.type: 选择ingress方式暴露服务persistence.enabled: 必须开启持久化存储externalURL: 设置正确的外部访问地址
3.2 安全配置最佳实践
- TLS证书配置:
- 使用Let's Encrypt自动签发
- 或上传企业级CA签发的证书
bash复制--set expose.tls.secretName=harbor-tls-cert
-
认证集成:
- 建议对接LDAP/AD统一认证
- 配置OIDC支持SSO登录
-
漏洞扫描:
- 启用Clair扫描器
- 定期更新漏洞数据库
yaml复制# values.yaml 部分配置
clair:
enabled: true
updatersInterval: "12h"
4. Jenkins部署与配置
4.1 Jenkins Operator部署
推荐使用Jenkins Operator管理Jenkins实例:
bash复制kubectl apply -f https://raw.githubusercontent.com/jenkinsci/kubernetes-operator/master/deploy/crds/jenkins_v1alpha2_jenkins_crd.yaml
kubectl apply -f https://raw.githubusercontent.com/jenkinsci/kubernetes-operator/master/deploy/all-in-one-v1alpha2.yaml
4.2 关键插件安装
必须安装的核心插件列表:
- Kubernetes Plugin
- Pipeline
- Blue Ocean
- Git
- Docker Pipeline
- Harbor Plugin
安装方法:
groovy复制// Jenkinsfile 示例
stage('Install Plugins') {
steps {
installPlugins([
'kubernetes:1.30.0',
'workflow-aggregator:2.6',
'docker-workflow:1.26',
'harbor-devops-plugin:1.5.0'
])
}
}
4.3 Kubernetes Cloud配置
在Jenkins中配置Kubernetes云:
- 进入"Manage Jenkins" -> "Manage Nodes and Clouds"
- 添加Kubernetes Cloud
- 关键配置项:
- Kubernetes URL: https://kubernetes.default.svc
- Jenkins URL: http://jenkins-service:8080
- Pod Template: 配置构建代理的容器镜像
5. 集成与流水线实践
5.1 Harbor与Jenkins认证集成
在Jenkins中配置Harbor凭据:
- 创建"Username with password"类型凭据
- 在Pipeline中使用:
groovy复制withCredentials([usernamePassword(
credentialsId: 'harbor-creds',
usernameVariable: 'HARBOR_USER',
passwordVariable: 'HARBOR_PASS'
)]) {
sh 'docker login -u $HARBOR_USER -p $HARBOR_PASS harbor.example.com'
}
5.2 完整CI/CD流水线示例
groovy复制pipeline {
agent {
kubernetes {
label 'jenkins-agent'
yaml """
apiVersion: v1
kind: Pod
spec:
containers:
- name: jnlp
image: jenkins/inbound-agent:4.3-4
- name: docker
image: docker:19.03
command: ['cat']
tty: true
volumeMounts:
- mountPath: /var/run/docker.sock
name: docker-sock
volumes:
- name: docker-sock
hostPath:
path: /var/run/docker.sock
"""
}
}
stages {
stage('Checkout') {
steps {
git branch: 'main', url: 'https://github.com/your-repo.git'
}
}
stage('Build') {
steps {
container('docker') {
sh 'docker build -t harbor.example.com/my-project/app:${BUILD_NUMBER} .'
}
}
}
stage('Scan') {
steps {
harborScan artifact: 'harbor.example.com/my-project/app:${BUILD_NUMBER}'
}
}
stage('Push') {
steps {
withCredentials([usernamePassword(
credentialsId: 'harbor-creds',
usernameVariable: 'HARBOR_USER',
passwordVariable: 'HARBOR_PASS'
)]) {
container('docker') {
sh '''
docker login -u $HARBOR_USER -p $HARBOR_PASS harbor.example.com
docker push harbor.example.com/my-project/app:${BUILD_NUMBER}
'''
}
}
}
}
stage('Deploy') {
steps {
sh 'kubectl set image deployment/my-app app=harbor.example.com/my-project/app:${BUILD_NUMBER}'
}
}
}
}
6. 运维与问题排查
6.1 常见问题解决方案
| 问题现象 | 可能原因 | 解决方案 |
|---|---|---|
| Harbor无法拉取镜像 | 证书问题/网络策略 | 检查ingress配置和网络策略 |
| Jenkins Agent无法启动 | 资源不足/RBAC问题 | 检查资源配额和ServiceAccount权限 |
| 流水线卡在Pending状态 | Pod模板配置错误 | 检查yaml定义和资源限制 |
| 镜像扫描失败 | Clair服务异常 | 检查Clair Pod状态和日志 |
6.2 监控与日志收集
建议配置的监控指标:
-
Harbor:
- 镜像推送/拉取速率
- 存储空间使用率
- 扫描任务队列长度
-
Jenkins:
- 构建队列等待时间
- 构建成功率
- 节点资源利用率
日志收集方案:
bash复制# 查看Harbor核心组件日志
kubectl logs -n harbor-system deploy/my-harbor-core
# Jenkins Master日志
kubectl logs -n jenkins deploy/jenkins-operator
7. 高级配置与优化
7.1 Harbor高可用部署
对于生产环境,建议配置Harbor高可用:
yaml复制# values.yaml
exposureType: ingress
persistence:
enabled: true
resourcePolicy: "keep"
persistentVolumeClaim:
registry:
storageClass: "ceph-rbd"
accessMode: ReadWriteMany
size: 100Gi
redis:
type: external
external:
addr: "redis-ha:6379"
database:
type: external
external:
host: "postgresql-ha"
port: "5432"
username: "harbor"
password: "password"
7.2 Jenkins性能优化
- 调整JVM参数:
yaml复制# Jenkins CRD配置
spec:
master:
javaOpts: "-Xms2g -Xmx4g -XX:MaxRAMPercentage=70.0"
- 启用缓存:
groovy复制// Jenkinsfile
stage('Build') {
steps {
cache(path: '/home/jenkins/.m2', includes: '**/*', key: 'm2-${BUILD_NUMBER}') {
sh 'mvn clean package'
}
}
}
- 分布式构建:
- 配置多个Kubernetes Pod模板
- 根据构建类型自动选择匹配的Agent
8. 安全加固措施
8.1 Harbor安全配置
- 内容信任:
bash复制# 启用内容信任
export DOCKER_CONTENT_TRUST=1
docker push harbor.example.com/my-project/app:trusted
- 网络策略:
yaml复制apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: harbor-ingress-policy
spec:
podSelector:
matchLabels:
app: harbor
ingress:
- from:
- namespaceSelector:
matchLabels:
name: jenkins
8.2 Jenkins安全实践
- RBAC配置:
yaml复制apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
namespace: build
rules:
- apiGroups: [""]
resources: ["pods"]
verbs: ["create","delete","get","list","patch","update","watch"]
-
凭证管理:
- 使用HashiCorp Vault集成
- 定期轮换访问令牌
-
审计日志:
bash复制# 启用详细审计日志
kubectl edit cm jenkins-operator -n jenkins
# 添加
handlerCounts:
audit: "1000"
9. 备份与恢复策略
9.1 Harbor数据备份
完整的备份方案应包括:
- 数据库备份
- 镜像存储备份
- 配置文件备份
备份脚本示例:
bash复制# 备份PostgreSQL
PGPASSWORD=$HARBOR_DB_PASSWORD pg_dump -h $HARBOR_DB_HOST -U $HARBOR_DB_USER $HARBOR_DB_NAME > harbor-db-backup.sql
# 备份镜像存储
kubectl exec -n harbor-system deploy/my-harbor-registry -- tar czf - /storage > registry-data-backup.tar.gz
# 备份配置
helm get values my-harbor -n harbor-system > harbor-values-backup.yaml
9.2 Jenkins配置备份
推荐方案:
- 使用Configuration as Code插件
- 定期导出Job配置
- 备份JENKINS_HOME目录
bash复制# 备份Jenkins Home
kubectl exec -n jenkins deploy/jenkins -- tar czf - /var/jenkins_home > jenkins-home-backup.tar.gz
# 导出Job配置
java -jar jenkins-cli.jar -s http://jenkins:8080 list-jobs > jobs.list
while read job; do
java -jar jenkins-cli.jar -s http://jenkins:8080 get-job "$job" > "${job}.xml"
done < jobs.list
10. 版本升级指南
10.1 Harbor升级步骤
- 检查版本兼容性
- 备份当前部署
- 更新Helm仓库
- 执行升级
bash复制helm repo update
helm upgrade my-harbor harbor/harbor \
--namespace harbor-system \
--version 2.5.0 \
--reuse-values
10.2 Jenkins升级策略
- 测试环境验证
- 备份关键数据
- 更新Operator版本
- 滚动更新实例
bash复制kubectl apply -f https://raw.githubusercontent.com/jenkinsci/kubernetes-operator/master/deploy/all-in-one-v1alpha2.yaml
kubectl patch jenkins jenkins -n jenkins --type='json' -p='[{"op": "replace", "path": "/spec/master/image", "value":"jenkins/jenkins:2.346.1-lts"}]'
升级注意事项:
- 先升级Operator再升级实例
- 保持至少一个稳定版本的回退能力
- 在低峰期执行升级操作
