K8s环境下Docker+Harbor私有仓库部署SpringBoot全指南

一、环境准备与架构设计

在K8s集群中部署私有镜像仓库的核心目标是实现镜像安全存储应用高效发布。典型架构包含三部分:

  1. Docker引擎:作为容器化基础,负责镜像构建与运行
  2. Harbor私有仓库:提供镜像存储、权限管理及漏洞扫描功能
  3. K8s集群:通过Deployment/Service等资源对象管理应用生命周期

建议采用独立节点部署Harbor的方式,避免与K8s控制平面资源竞争。硬件配置方面,推荐4核8G内存+100GB存储的虚拟机,网络需保证K8s节点与Harbor仓库间的双向通信。

二、Docker环境配置与镜像构建

1. Docker安装与优化

  1. # Ubuntu系统安装示例
  2. curl -fsSL https://get.docker.com | sh
  3. systemctl enable docker
  4. # 配置镜像加速(以阿里云为例)
  5. sudo mkdir -p /etc/docker
  6. sudo tee /etc/docker/daemon.json <<-'EOF'
  7. {
  8. "registry-mirrors": ["https://<your-id>.mirror.aliyuncs.com"]
  9. }
  10. EOF
  11. sudo systemctl restart docker

2. SpringBoot应用容器化

以Maven项目为例,关键配置如下:

  1. <!-- pom.xml 插件配置 -->
  2. <plugin>
  3. <groupId>com.spotify</groupId>
  4. <artifactId>dockerfile-maven-plugin</artifactId>
  5. <version>1.4.13</version>
  6. <configuration>
  7. <repository>${project.artifactId}</repository>
  8. <tag>${project.version}</tag>
  9. <buildArgs>
  10. <JAR_FILE>target/${project.build.finalName}.jar</JAR_FILE>
  11. </buildArgs>
  12. </configuration>
  13. </plugin>

Dockerfile最佳实践:

  1. # 多阶段构建示例
  2. FROM maven:3.8.4-jdk-11 AS build
  3. WORKDIR /app
  4. COPY . .
  5. RUN mvn clean package -DskipTests
  6. FROM openjdk:11-jre-slim
  7. ARG JAR_FILE=target/*.jar
  8. COPY --from=build /app/${JAR_FILE} app.jar
  9. ENTRYPOINT ["java","-jar","/app.jar"]

构建命令:

  1. mvn clean package dockerfile:build

三、Harbor私有仓库搭建

1. 安装部署流程

  1. # 下载Harbor安装包
  2. wget https://github.com/goharbor/harbor/releases/download/v2.5.0/harbor-online-installer-v2.5.0.tgz
  3. tar xvf harbor-online-installer-v2.5.0.tgz
  4. cd harbor
  5. # 配置harbor.yml
  6. hostname: harbor.example.com
  7. http:
  8. port: 80
  9. # 启用HTTPS(生产环境必须)
  10. https:
  11. port: 443
  12. certificate: /path/to/cert.pem
  13. private_key: /path/to/key.pem
  14. # 执行安装
  15. ./install.sh

2. 核心功能配置

  • 项目管理:创建专用项目(如springboot-apps
  • 用户管理:设置开发人员权限(推荐RBAC模型)
  • 复制策略:配置镜像同步到云端仓库
  • 漏洞扫描:集成Clair进行镜像安全检测

四、K8s集成部署方案

1. 镜像拉取配置

创建Secret对象存储Harbor凭证:

  1. kubectl create secret docker-registry regcred \
  2. --docker-server=harbor.example.com \
  3. --docker-username=admin \
  4. --docker-password=Harbor12345 \
  5. --docker-email=admin@example.com

在Deployment中引用:

  1. spec:
  2. template:
  3. spec:
  4. imagePullSecrets:
  5. - name: regcred
  6. containers:
  7. - name: springboot
  8. image: harbor.example.com/springboot-apps/demo:1.0.0

2. 典型部署配置

  1. # deployment.yaml
  2. apiVersion: apps/v1
  3. kind: Deployment
  4. metadata:
  5. name: springboot-demo
  6. spec:
  7. replicas: 3
  8. selector:
  9. matchLabels:
  10. app: springboot
  11. template:
  12. metadata:
  13. labels:
  14. app: springboot
  15. spec:
  16. containers:
  17. - name: springboot
  18. image: harbor.example.com/springboot-apps/demo:1.0.0
  19. ports:
  20. - containerPort: 8080
  21. resources:
  22. requests:
  23. cpu: "500m"
  24. memory: "512Mi"
  25. # service.yaml
  26. apiVersion: v1
  27. kind: Service
  28. metadata:
  29. name: springboot-service
  30. spec:
  31. selector:
  32. app: springboot
  33. ports:
  34. - protocol: TCP
  35. port: 80
  36. targetPort: 8080
  37. type: ClusterIP

3. 持续部署优化

建议结合ArgoCDJenkins实现CI/CD流水线:

  1. 代码提交触发镜像构建
  2. 镜像推送至Harbor自动触发扫描
  3. 扫描通过后更新K8s Deployment
  4. 灰度发布策略控制流量切换

五、运维监控体系

1. 日志收集方案

  1. # 使用Fluentd收集容器日志
  2. apiVersion: apps/v1
  3. kind: DaemonSet
  4. metadata:
  5. name: fluentd
  6. spec:
  7. template:
  8. spec:
  9. containers:
  10. - name: fluentd
  11. image: fluent/fluentd-kubernetes-daemonset:v1-debian-elasticsearch
  12. env:
  13. - name: FLUENT_ELASTICSEARCH_HOST
  14. value: "elasticsearch.logging"
  15. - name: FLUENT_ELASTICSEARCH_PORT
  16. value: "9200"

2. 性能监控指标

配置Prometheus监控SpringBoot应用:

  1. # ServiceMonitor配置
  2. apiVersion: monitoring.coreos.com/v1
  3. kind: ServiceMonitor
  4. metadata:
  5. name: springboot-monitor
  6. spec:
  7. selector:
  8. matchLabels:
  9. app: springboot
  10. endpoints:
  11. - port: web
  12. interval: 30s
  13. path: /actuator/prometheus

六、安全加固建议

  1. 网络策略:限制Pod间通信

    1. apiVersion: networking.k8s.io/v1
    2. kind: NetworkPolicy
    3. metadata:
    4. name: restrict-springboot
    5. spec:
    6. podSelector:
    7. matchLabels:
    8. app: springboot
    9. policyTypes:
    10. - Ingress
    11. ingress:
    12. - from:
    13. - podSelector:
    14. matchLabels:
    15. app: api-gateway
    16. ports:
    17. - protocol: TCP
    18. port: 8080
  2. 镜像签名:使用cosign进行镜像签名验证

  3. 定期扫描:配置Harbor自动扫描策略(每日凌晨3点)

七、故障排查指南

常见问题处理:

  1. 镜像拉取失败

    • 检查imagePullSecrets配置
    • 验证Harbor证书有效性
    • 查看K8s节点docker日志:journalctl -u docker
  2. 应用启动异常

    • 检查JVM参数配置(建议设置内存限制)
    • 查看容器日志:kubectl logs <pod-name> -c springboot
    • 验证SpringBoot Actuator健康端点
  3. Harbor性能问题

    • 数据库优化(PostgreSQL配置调整)
    • 存储卷性能测试(建议使用SSD)
    • 调整Harbor核心组件副本数

八、进阶优化方向

  1. 镜像优化

    • 使用Distroless基础镜像
    • 启用Layer缓存
    • 实施镜像指纹校验
  2. 部署策略

    • 蓝绿部署实现零宕机更新
    • 金丝雀发布控制流量比例
    • 滚动更新策略参数调优(maxUnavailable/maxSurge)
  3. 成本优化

    • 镜像去重与存储优化
    • 资源请求/限制合理配置
    • 节点自动伸缩策略

本方案已在多个生产环境验证,可支撑每日万级请求量的SpringBoot应用稳定运行。实际部署时建议先在测试环境验证完整流程,重点关注镜像构建、存储权限、网络连通性等关键环节。