logo

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

作者:问答酱2025.10.10 18:46浏览量:3

简介:本文详细讲解了在K8s集群中搭建Docker与Harbor私有镜像仓库,并部署SpringBoot应用的完整流程,涵盖环境准备、Harbor安装、Docker镜像推送、K8s部署配置等关键步骤。

一、环境准备与背景介绍

1.1 为什么要搭建私有镜像仓库?

在Kubernetes(K8s)环境下,使用公有云镜像仓库(如Docker Hub)虽然方便,但存在以下问题:

  • 安全性风险:公有仓库可能遭受中间人攻击或镜像篡改
  • 网络依赖:国内访问可能受网络限制影响
  • 成本控制:企业级应用可能产生高额存储费用
  • 合规要求:金融、政府等行业对数据存储有严格规定

私有镜像仓库(如Harbor)能够有效解决这些问题,提供安全可控的镜像管理环境。

1.2 技术栈选择依据

  • Docker:业界标准容器运行时,与K8s深度集成
  • Harbor:CNCF毕业项目,提供RBAC权限控制、镜像复制、漏洞扫描等企业级功能
  • SpringBoot:主流Java微服务框架,与容器化部署完美适配

二、Harbor私有仓库搭建

2.1 安装前准备

硬件要求

组件 最小配置 推荐配置
服务器 2核4G 4核8G+
磁盘空间 40GB(仅存储) 100GB+(含备份)

软件依赖

  1. # CentOS 7示例
  2. sudo yum install -y epel-release
  3. sudo yum install -y docker-ce docker-ce-cli containerd.io
  4. sudo systemctl enable --now docker

2.2 Harbor安装流程

2.2.1 下载安装包

  1. wget https://github.com/goharbor/harbor/releases/download/v2.7.0/harbor-offline-installer-v2.7.0.tgz
  2. tar xvf harbor-offline-installer-v2.7.0.tgz
  3. cd harbor

2.2.2 配置修改

编辑harbor.yml关键配置:

  1. hostname: harbor.example.com # 必须为可解析的域名
  2. http:
  3. port: 80
  4. https:
  5. certificate: /data/cert/server.crt
  6. private_key: /data/cert/server.key
  7. harbor_admin_password: Harbor12345 # 初始管理员密码
  8. database:
  9. password: root123
  10. max_open_conns: 1000
  11. max_idle_conns: 50
  12. storage_service:
  13. redis:
  14. password: redis123

2.2.3 安装执行

  1. sudo ./install.sh --with-trivy # 包含漏洞扫描组件

2.3 基础配置

2.3.1 用户与项目管理

  1. # 登录Harbor CLI
  2. docker login harbor.example.com
  3. # 创建项目(Web界面操作)
  4. # 项目设置要点:
  5. # - 公开/私有权限
  6. # - 镜像自动扫描
  7. # - 内容信任(可选)

2.3.2 复制策略配置

  1. # 示例:将production项目镜像复制到备用仓库
  2. {
  3. "name": "backup-replication",
  4. "dest_namespace": "production-backup",
  5. "dest_registry": {
  6. "url": "https://backup-harbor.example.com",
  7. "insecure": false
  8. },
  9. "triggers": {
  10. "type": "immediate"
  11. },
  12. "filters": [
  13. {
  14. "type": "tag",
  15. "pattern": ".*"
  16. }
  17. ]
  18. }

三、Docker镜像构建与推送

3.1 SpringBoot应用Docker化

3.1.1 多阶段构建示例

  1. # 构建阶段
  2. FROM maven:3.8.6-jdk-11 AS build
  3. WORKDIR /app
  4. COPY pom.xml .
  5. RUN mvn dependency:go-offline
  6. COPY src ./src
  7. RUN mvn package -DskipTests
  8. # 运行阶段
  9. FROM openjdk:11-jre-slim
  10. WORKDIR /app
  11. COPY --from=build /app/target/demo-0.0.1-SNAPSHOT.jar app.jar
  12. EXPOSE 8080
  13. ENTRYPOINT ["java","-jar","app.jar"]

3.1.2 构建优化技巧

  • 使用.dockerignore排除无关文件
  • 合理设置JAVA_OPTS环境变量
  • 示例:
    1. ENV JAVA_OPTS="-Xms512m -Xmx1024m -XX:+UseG1GC"
    2. ENTRYPOINT ["sh","-c","java ${JAVA_OPTS} -jar app.jar"]

3.2 镜像推送流程

3.2.1 标签与推送命令

  1. # 构建镜像
  2. docker build -t harbor.example.com/production/demo:v1.0.0 .
  3. # 推送镜像(需先登录)
  4. docker push harbor.example.com/production/demo:v1.0.0

3.2.2 常见问题处理

  • 证书问题

    1. # 将Harbor CA证书添加到Docker信任链
    2. sudo mkdir -p /etc/docker/certs.d/harbor.example.com
    3. sudo cp harbor.crt /etc/docker/certs.d/harbor.example.com/ca.crt
    4. sudo systemctl restart docker
  • 权限拒绝:检查Harbor项目中的机器人账号权限

四、K8s部署配置

4.1 镜像拉取配置

4.1.1 创建Secret

  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

4.1.2 Pod配置示例

  1. apiVersion: v1
  2. kind: Pod
  3. metadata:
  4. name: demo-app
  5. spec:
  6. containers:
  7. - name: demo
  8. image: harbor.example.com/production/demo:v1.0.0
  9. imagePullPolicy: IfNotPresent
  10. imagePullSecrets:
  11. - name: regcred

4.2 Deployment完整示例

  1. apiVersion: apps/v1
  2. kind: Deployment
  3. metadata:
  4. name: demo-deployment
  5. spec:
  6. replicas: 3
  7. selector:
  8. matchLabels:
  9. app: demo
  10. template:
  11. metadata:
  12. labels:
  13. app: demo
  14. spec:
  15. containers:
  16. - name: demo
  17. image: harbor.example.com/production/demo:v1.0.0
  18. ports:
  19. - containerPort: 8080
  20. resources:
  21. requests:
  22. cpu: "500m"
  23. memory: "512Mi"
  24. limits:
  25. cpu: "1000m"
  26. memory: "1024Mi"
  27. livenessProbe:
  28. httpGet:
  29. path: /actuator/health
  30. port: 8080
  31. initialDelaySeconds: 30
  32. periodSeconds: 10
  33. readinessProbe:
  34. httpGet:
  35. path: /actuator/info
  36. port: 8080
  37. initialDelaySeconds: 5
  38. periodSeconds: 5
  39. imagePullSecrets:
  40. - name: regcred

4.3 高级部署策略

4.3.1 蓝绿部署实现

  1. # 蓝色环境(当前稳定版)
  2. apiVersion: v1
  3. kind: Service
  4. metadata:
  5. name: demo-service
  6. spec:
  7. selector:
  8. version: blue
  9. ports:
  10. - protocol: TCP
  11. port: 80
  12. targetPort: 8080
  13. # 绿色环境(新版本)
  14. apiVersion: apps/v1
  15. kind: Deployment
  16. metadata:
  17. name: demo-green
  18. spec:
  19. replicas: 3
  20. template:
  21. metadata:
  22. labels:
  23. app: demo
  24. version: green
  25. spec:
  26. containers:
  27. - name: demo
  28. image: harbor.example.com/production/demo:v2.0.0
  29. # ...其他配置

4.3.2 金丝雀发布配置

  1. apiVersion: flagger.app/v1beta1
  2. kind: Canary
  3. metadata:
  4. name: demo-canary
  5. spec:
  6. targetRef:
  7. apiVersion: apps/v1
  8. kind: Deployment
  9. name: demo
  10. service:
  11. port: 8080
  12. analysis:
  13. interval: 1m
  14. threshold: 5
  15. maxWeight: 50
  16. stepWeight: 10
  17. metrics:
  18. - name: request-success-rate
  19. threshold: 99
  20. interval: 1m
  21. - name: request-duration
  22. threshold: 500
  23. interval: 1m

五、运维监控配置

5.1 日志收集方案

5.1.1 使用Fluentd收集日志

  1. # fluentd-daemonset.yaml 示例
  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"
  17. volumeMounts:
  18. - name: varlog
  19. mountPath: /var/log
  20. - name: varlibdockercontainers
  21. mountPath: /var/lib/docker/containers
  22. readOnly: true
  23. volumes:
  24. - name: varlog
  25. hostPath:
  26. path: /var/log
  27. - name: varlibdockercontainers
  28. hostPath:
  29. path: /var/lib/docker/containers

5.2 监控指标配置

5.2.1 Prometheus Operator配置

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

5.2.2 关键指标告警规则

  1. # prometheus-rule.yaml 示例
  2. apiVersion: monitoring.coreos.com/v1
  3. kind: PrometheusRule
  4. metadata:
  5. name: demo-rules
  6. spec:
  7. groups:
  8. - name: demo.rules
  9. rules:
  10. - alert: HighErrorRate
  11. expr: rate(http_server_requests_seconds_count{status="5xx"}[1m]) > 0.1
  12. for: 5m
  13. labels:
  14. severity: critical
  15. annotations:
  16. summary: "High error rate on {{ $labels.instance }}"

六、最佳实践与优化建议

6.1 镜像管理策略

  1. 版本控制规范

    • 使用语义化版本:v1.0.0
    • 避免使用latest标签
    • 示例命名:<仓库>/<项目>:<版本>-<环境>
  2. 镜像清理策略

    1. # 使用Harbor API清理未标记镜像
    2. curl -X DELETE "https://harbor.example.com/api/v2.0/projects/production/repositories/demo/artifacts?tag=untagged" \
    3. -H "accept: application/json" \
    4. -H "authorization: Basic $(echo -n "admin:Harbor12345" | base64)"

6.2 安全加固建议

  1. Harbor安全配置

    • 启用HTTPS强制跳转
    • 配置审计日志
    • 设置镜像保留策略
  2. K8s安全上下文

    1. # deployment示例中的安全配置
    2. securityContext:
    3. runAsUser: 1000
    4. runAsGroup: 1000
    5. fsGroup: 1000
    6. readOnlyRootFilesystem: true
    7. capabilities:
    8. drop:
    9. - ALL

6.3 性能优化技巧

  1. 镜像下载加速

    • 配置镜像加速器(如阿里云、腾讯云)
    • 使用P2P分发工具(如Dragonfly)
  2. K8s调度优化
    ```yaml

    nodeSelector示例

    nodeSelector:
    disktype: ssd
    accelerator: nvidia-tesla-t4

资源请求设置

resources:
requests:
cpu: “500m”
memory: “512Mi”
limits:
cpu: “1000m”
memory: “1024Mi”
```

七、常见问题解决方案

7.1 镜像推送失败排查

  1. 证书问题

    • 检查/etc/docker/certs.d/目录配置
    • 使用docker info | grep Insecure验证不安全注册表配置
  2. 权限问题

    • 确认Harbor项目中的机器人账号具有push权限
    • 检查K8s Secret中的凭据是否正确

7.2 Pod启动失败处理

  1. ImagePullBackOff错误

    • 验证镜像路径是否正确
    • 检查K8s节点能否访问Harbor仓库
    • 确认imagePullSecrets配置
  2. CrashLoopBackOff错误

    • 查看容器日志:kubectl logs <pod-name> --previous
    • 检查应用健康检查配置
    • 验证资源限制是否合理

八、总结与展望

本文系统阐述了在K8s环境下搭建Docker+Harbor私有镜像仓库,并部署SpringBoot应用的完整流程。关键收获包括:

  1. 私有仓库优势:提升安全性、控制成本、满足合规要求
  2. Harbor核心功能:RBAC权限控制、镜像复制、漏洞扫描
  3. K8s集成要点:imagePullSecrets配置、资源限制设置、健康检查
  4. 运维优化方向:日志监控、金丝雀发布、安全加固

未来发展方向:

  • 结合Service Mesh实现更精细的流量管理
  • 探索Serverless容器部署模式
  • 集成AI进行异常检测和自动扩缩容

通过实施本文方案,企业可构建安全、高效、可控的容器化应用交付体系,为数字化转型奠定坚实基础。

相关文章推荐

发表评论

活动