logo

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

作者:快去debug2025.10.10 18:46浏览量:2

简介:本文详细介绍了在 Kubernetes 环境下搭建 Docker 容器与 Harbor 私有镜像仓库的完整流程,并提供了 SpringBoot 应用的部署与配置指南,帮助开发者实现高效、安全的容器化应用管理。

一、背景与需求分析

在 Kubernetes(K8s)环境下,容器化应用的部署与管理已成为企业IT架构的主流趋势。Docker 作为容器技术的标杆,提供了轻量级、可移植的应用运行环境;而 Harbor 作为开源的企业级私有镜像仓库,则为容器镜像的安全存储与分发提供了可靠保障。结合 SpringBoot 应用的快速开发特性,三者共同构成了现代化应用部署的黄金组合。

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

  • 安全性:避免将敏感镜像暴露在公共仓库(如 Docker Hub)中,降低数据泄露风险。
  • 效率:私有仓库可部署在企业内网,加速镜像拉取速度,提升部署效率。
  • 合规性:满足金融、医疗等行业对数据隐私的严格要求。

1.2 Kubernetes 与 Docker 的协同优势

  • 资源隔离:K8s 通过 Pod 实现应用资源的隔离与调度。
  • 弹性伸缩:基于 Horizontal Pod Autoscaler(HPA)动态调整应用实例数量。
  • 高可用:通过多节点部署与健康检查机制确保应用持续可用。

二、环境准备与工具安装

2.1 基础环境要求

  • Kubernetes 集群:至少 1 个 Master 节点与 2 个 Worker 节点(生产环境建议更多)。
  • Docker:版本 19.03+(支持 BuildKit 加速镜像构建)。
  • Harbor:版本 2.0+(支持 Helm Chart 存储与漏洞扫描)。
  • 存储后端:NFS、Ceph 或云存储(如 AWS EBS、阿里云盘)。

2.2 工具安装步骤

2.2.1 安装 Docker

  1. # Ubuntu 示例
  2. sudo apt-get update
  3. sudo apt-get install -y docker-ce docker-ce-cli containerd.io
  4. sudo systemctl enable docker
  5. sudo systemctl start docker

2.2.2 安装 Helm(用于 Harbor 部署)

  1. curl -fsSL -o get_helm.sh https://raw.githubusercontent.com/helm/helm/main/scripts/get-helm-3
  2. chmod 700 get_helm.sh
  3. ./get_helm.sh

三、Harbor 私有镜像仓库搭建

3.1 Harbor 核心组件

  • Core Services:提供 API 与用户界面。
  • Registry:存储与分发镜像。
  • Database:存储元数据(如项目、用户、标签)。
  • Job Service:执行异步任务(如镜像复制、垃圾回收)。

3.2 部署 Harbor(Helm 方式)

3.2.1 添加 Harbor Helm 仓库

  1. helm repo add harbor https://helm.goharbor.io
  2. helm repo update

3.2.2 创建命名空间与持久化存储

  1. kubectl create namespace harbor
  2. # 使用 NFS 示例(需提前配置 NFS 服务器)
  3. kubectl create -f nfs-storageclass.yaml

3.2.3 自定义 Values 文件

编辑 harbor-values.yaml,关键配置如下:

  1. expose:
  2. type: ingress
  3. tls:
  4. enabled: true
  5. certSource: secret
  6. secret:
  7. secretName: "harbor-tls"
  8. namespace: "harbor"
  9. persistence:
  10. persistentVolumeClaim:
  11. registry:
  12. storageClass: "nfs-client"
  13. accessMode: ReadWriteOnce
  14. size: 10Gi
  15. chartmuseum:
  16. storageClass: "nfs-client"
  17. size: 5Gi
  18. database:
  19. internal:
  20. password: "Harbor12345" # 生产环境使用 Secret
  21. adminPassword: "Admin12345" # 初始管理员密码

3.2.4 部署 Harbor

  1. helm install harbor harbor/harbor -n harbor -f harbor-values.yaml

3.2.5 验证部署

  1. kubectl get pods -n harbor
  2. # 等待所有 Pod 状态变为 Running

访问 Harbor UI:https://<harbor-ingress-ip>,使用默认账号 admin 与配置的密码登录。

四、Docker 镜像构建与推送

4.1 构建 SpringBoot 应用镜像

4.1.1 编写 Dockerfile

  1. # 使用多阶段构建减少镜像体积
  2. FROM maven:3.8.4-openjdk-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. FROM openjdk:11-jre-slim
  9. WORKDIR /app
  10. COPY --from=build /app/target/springboot-demo.jar .
  11. EXPOSE 8080
  12. ENTRYPOINT ["java", "-jar", "springboot-demo.jar"]

4.1.2 构建镜像

  1. docker build -t springboot-demo:latest .

4.2 推送镜像到 Harbor

4.2.1 登录 Harbor

  1. docker login https://<harbor-domain>
  2. # 输入用户名与密码

4.2.2 标记并推送镜像

  1. docker tag springboot-demo:latest <harbor-domain>/library/springboot-demo:latest
  2. docker push <harbor-domain>/library/springboot-demo:latest

五、K8s 部署 SpringBoot 应用

5.1 创建 Deployment 与 Service

5.1.1 Deployment YAML 示例

  1. apiVersion: apps/v1
  2. kind: Deployment
  3. metadata:
  4. name: springboot-demo
  5. spec:
  6. replicas: 3
  7. selector:
  8. matchLabels:
  9. app: springboot-demo
  10. template:
  11. metadata:
  12. labels:
  13. app: springboot-demo
  14. spec:
  15. containers:
  16. - name: springboot
  17. image: <harbor-domain>/library/springboot-demo:latest
  18. ports:
  19. - containerPort: 8080
  20. resources:
  21. requests:
  22. cpu: "100m"
  23. memory: "256Mi"
  24. limits:
  25. cpu: "500m"
  26. memory: "512Mi"

5.1.2 Service YAML 示例

  1. apiVersion: v1
  2. kind: Service
  3. metadata:
  4. name: springboot-demo-service
  5. spec:
  6. selector:
  7. app: springboot-demo
  8. ports:
  9. - protocol: TCP
  10. port: 80
  11. targetPort: 8080
  12. type: ClusterIP

5.2 部署与验证

  1. kubectl apply -f deployment.yaml
  2. kubectl apply -f service.yaml
  3. kubectl get pods # 检查 Pod 状态
  4. kubectl port-forward svc/springboot-demo-service 8080:80 # 本地访问测试

六、高级配置与优化

6.1 镜像拉取策略

在 Deployment 中配置 imagePullPolicy

  1. spec:
  2. containers:
  3. - name: springboot
  4. image: <harbor-domain>/library/springboot-demo:latest
  5. imagePullPolicy: IfNotPresent # 或 Always

6.2 Harbor 镜像自动扫描

在 Harbor 中启用漏洞扫描:

  1. 部署 Clair 或 Trivy 扫描器。
  2. 在项目设置中启用“自动扫描”。

6.3 K8s 镜像拉取 Secret

若 Harbor 使用自签名证书,需创建 Secret:

  1. kubectl create secret docker-registry regcred \
  2. --docker-server=<harbor-domain> \
  3. --docker-username=<username> \
  4. --docker-password=<password> \
  5. --docker-email=<email>

在 Deployment 中引用 Secret:

  1. spec:
  2. imagePullSecrets:
  3. - name: regcred

七、总结与最佳实践

  1. 安全优先:启用 Harbor 的 HTTPS、RBAC 权限控制与镜像签名。
  2. 自动化流程:集成 CI/CD 工具(如 Jenkins、GitLab CI)实现镜像自动构建与推送。
  3. 监控告警:通过 Prometheus + Grafana 监控 Harbor 与 SpringBoot 应用的性能指标。
  4. 备份策略:定期备份 Harbor 的数据库与存储卷,防止数据丢失。

通过本文的指南,开发者可在 K8s 环境下高效搭建 Docker + Harbor 私有镜像仓库,并完成 SpringBoot 应用的容器化部署,为企业的数字化转型提供坚实的技术支撑。

相关文章推荐

发表评论

活动