一、环境准备与架构设计
1.1 基础设施规划
在 Kubernetes 集群中部署私有镜像仓库需考虑高可用架构,典型方案包括:
- 节点分布:Harbor 组件(Core、Database、JobService、Registry)应分散部署在至少3个工作节点
- 存储配置:推荐使用 PersistentVolumeClaim 绑定云存储(如 AWS EBS、阿里云盘)或 Ceph 分布式存储
- 网络要求:需开放 80(HTTP)、443(HTTPS)、22(SSH)端口,建议通过 Ingress 统一暴露服务
1.2 组件版本兼容性
| 组件 | 推荐版本 | 兼容性说明 |
|---|---|---|
| Kubernetes | 1.24+ | 支持 StatefulSet 动态扩容 |
| Docker | 20.10+ | 需启用 BuildKit 加速构建 |
| Harbor | 2.6+ | 集成 Clair 漏洞扫描组件 |
| SpringBoot | 2.7.x/3.0.x | 提供标准化 Dockerfile 模板 |
二、Harbor 私有仓库搭建
2.1 安装方式对比
| 方案 | 适用场景 | 部署复杂度 |
|---|---|---|
| Helm Chart | 生产环境,需高可用 | ★★★☆ |
| 离线包 | 内网环境,无互联网访问 | ★★☆☆ |
| Operator | 自动化运维,需 CRD 管理 | ★★★★ |
推荐方案:使用 Helm Chart 部署(需提前安装 Helm v3.10+)
# 添加 Bitnami 仓库helm repo add bitnami https://charts.bitnami.com/bitnami# 创建命名空间kubectl create ns harbor# 部署 Harbor(带 HTTPS 配置)helm install harbor bitnami/harbor \--namespace harbor \--set expose.type=ingress \--set expose.tls.enabled=true \--set expose.tls.certSource=secret \--set expose.tls.secretName=harbor-tls
2.2 核心配置项
-
存储类配置:
# storageclass.yaml 示例apiVersion: storage.k8s.io/v1kind: StorageClassmetadata:name: harbor-scprovisioner: kubernetes.io/aws-ebs # 根据云厂商调整parameters:type: gp3fsType: xfs
-
数据库持久化:
# 创建 PostgreSQL PVCkubectl apply -f - <<EOFapiVersion: v1kind: PersistentVolumeClaimmetadata:name: postgresql-pv-claimnamespace: harborspec:accessModes:- ReadWriteOnceresources:requests:storage: 50GistorageClassName: harbor-scEOF
三、Docker 镜像构建优化
3.1 SpringBoot 应用标准化
推荐 Dockerfile 模板:
# 使用多阶段构建减小镜像体积FROM eclipse-temurin:17-jdk-jammy as builderWORKDIR /appCOPY gradlew build.gradle.kts settings.gradle.kts ./COPY src src/RUN ./gradlew bootJar --no-daemonFROM eclipse-temurin:17-jre-jammyWORKDIR /appCOPY --from=builder /app/build/libs/*.jar app.jarEXPOSE 8080ENTRYPOINT ["java", "-jar", "app.jar"]
构建优化技巧:
- 使用
--build-arg动态传递版本号 - 启用 BuildKit 加速(
DOCKER_BUILDKIT=1) - 通过
.dockerignore排除无关文件
3.2 镜像安全加固
-
漏洞扫描:集成 Clair 或 Trivy
# 使用 Trivy 扫描镜像trivy image --severity CRITICAL,HIGH your-image:tag
-
签名验证:配置 Cosign 进行镜像签名
```bash生成密钥对
cosign generate-key-pair
签名镜像
cosign sign —key cosign.key your-image:tag
# 四、K8s 部署 SpringBoot 应用## 4.1 标准化部署清单**deployment.yaml 示例**:```yamlapiVersion: apps/v1kind: Deploymentmetadata:name: springboot-appspec:replicas: 3selector:matchLabels:app: springboottemplate:metadata:labels:app: springbootspec:containers:- name: springbootimage: harbor.example.com/library/springboot:1.0.0ports:- containerPort: 8080resources:requests:cpu: "500m"memory: "512Mi"limits:cpu: "1000m"memory: "1Gi"livenessProbe:httpGet:path: /actuator/healthport: 8080initialDelaySeconds: 30periodSeconds: 10
4.2 持续集成流程
- 代码提交:触发 GitLab CI/CD 流水线
-
镜像构建:
# .gitlab-ci.yml 片段build:stage: buildscript:- docker build -t $HARBOR_HOST/$PROJECT_NAME/$IMAGE_NAME:$CI_COMMIT_SHORT_SHA .- docker push $HARBOR_HOST/$PROJECT_NAME/$IMAGE_NAME:$CI_COMMIT_SHORT_SHA
-
滚动更新策略:
# 部署策略配置strategy:type: RollingUpdaterollingUpdate:maxSurge: 25%maxUnavailable: 25%
五、运维监控体系
5.1 日志收集方案
-
EFK 栈部署:
# 使用 Helm 部署 Elasticsearchhelm install elasticsearch elastic/elasticsearch --namespace logging \--set replicas=3 \--set minimumMasterNodes=2
-
Fluentd 配置:
<match springboot.**>@type elasticsearchhost "elasticsearch-master"port 9200index_name "springboot-${tag}"</match>
5.2 性能监控指标
- Prometheus 配置:
# ServiceMonitor 示例apiVersion: monitoring.coreos.com/v1kind: ServiceMonitormetadata:name: springboot-monitorspec:selector:matchLabels:app: springbootendpoints:- port: webinterval: 30spath: /actuator/prometheus
六、故障排查指南
6.1 常见问题处理
| 现象 | 排查步骤 |
|---|---|
| 镜像拉取失败 | 检查 kubectl describe pod 中的 Events,验证 Harbor 证书配置 |
| 容器频繁重启 | 查看日志 kubectl logs -f <pod-name>,检查内存限制是否合理 |
| 健康检查失败 | 确认 /actuator/health 端点是否暴露,调整 initialDelaySeconds 参数 |
6.2 性能调优建议
-
JVM 参数优化:
ENV JAVA_OPTS="-XX:MaxRAMPercentage=75.0 -XX:+UseG1GC"ENTRYPOINT ["sh", "-c", "java ${JAVA_OPTS} -jar app.jar"]
-
K8s 资源限制:
- CPU 请求值建议设为容器实际使用的120%
- 内存限制需包含 JVM 堆外内存(建议比 Xmx 大20%)
七、安全最佳实践
-
网络策略:
# 限制 Pod 间通信apiVersion: networking.k8s.io/v1kind: NetworkPolicymetadata:name: restrict-springbootspec:podSelector:matchLabels:app: springbootpolicyTypes:- Ingressingress:- from:- namespaceSelector:matchLabels:name: ingress-nginxports:- protocol: TCPport: 8080
-
镜像推送权限:
# 创建 Harbor 机器人账号curl -X POST "https://harbor.example.com/api/v2.0/robots" \-H "accept: application/json" \-H "Content-Type: application/json" \-d '{"name": "k8s-robot","description": "Used for CI/CD","expires_in": 86400,"permissions": [{"project_id": 1, "access": ["push"]}]}'
通过本文提供的完整方案,开发者可在 Kubernetes 环境中快速构建企业级 Docker+Harbor 镜像管理体系,实现 SpringBoot 应用的安全、高效部署。实际实施时建议先在测试环境验证所有组件的兼容性,再逐步推广到生产环境。