K8s 环境下 Docker+Harbor 私有仓库部署与 SpringBoot 应用指南
2025.10.10 18:46浏览量:0简介:本文详细讲解在 Kubernetes 环境下搭建 Docker 与 Harbor 私有镜像仓库的完整流程,包括 Harbor 安装配置、Docker 镜像推送及 SpringBoot 应用的 K8s 部署实践,帮助开发者实现安全的镜像管理与自动化应用发布。
一、环境准备与前置条件
1.1 Kubernetes 集群基础要求
部署 Harbor 私有仓库前需确保 Kubernetes 集群满足以下条件:
- 节点资源:至少 3 个工作节点(推荐配置:4核CPU/8GB内存/100GB存储)
- 存储类:已配置动态存储供应(如 NFS、Ceph 或云存储)
- 网络插件:支持 ServiceType 为 LoadBalancer 或 NodePort
- Ingress 控制器:推荐使用 Nginx 或 Traefik
通过 kubectl get nodes 验证节点状态,确保所有节点处于 Ready 状态。若使用云厂商托管集群,需额外检查安全组规则是否放行 80/443/6443 端口。
1.2 Docker 环境配置
在所有节点安装 Docker CE 20.10+ 版本:
# 添加 Docker 官方 GPG 密钥curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg# 添加稳定版仓库echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null# 安装 Dockersudo apt-get update && sudo apt-get install docker-ce docker-ce-cli containerd.io
配置 Docker 镜像加速(以阿里云为例):
{"registry-mirrors": ["https://<your-id>.mirror.aliyuncs.com"]}
将配置写入 /etc/docker/daemon.json 后重启服务:
sudo systemctl daemon-reload && sudo systemctl restart docker
二、Harbor 私有仓库搭建
2.1 Harbor 安装方式选择
Harbor 提供三种部署方式:
| 方式 | 适用场景 | 复杂度 |
|——————|———————————————|————|
| 在线安装 | 公网环境,依赖外部仓库 | 低 |
| 离线安装 | 内网环境,需提前下载离线包 | 中 |
| Helm Chart | 已有 Kubernetes 集群 | 高 |
推荐使用 Helm Chart 方式部署,可实现与 K8s 的深度集成。
2.2 Helm 部署 Harbor 详细步骤
添加 Bitnami 仓库:
helm repo add bitnami https://charts.bitnami.com/bitnamihelm repo update
创建持久化存储:
# storage-class.yamlapiVersion: storage.k8s.io/v1kind: StorageClassmetadata:name: harbor-scprovisioner: kubernetes.io/nfsparameters:archiveOnDelete: "false"
应用配置后验证 PVC 绑定状态:
kubectl get pvc -n harbor
部署 Harbor:
helm install harbor bitnami/harbor \--namespace harbor --create-namespace \--set persistence.storageClass=harbor-sc \--set expose.type=ingress \--set expose.ingress.hosts.core=harbor.example.com \--set expose.tls.enabled=true \--set expose.tls.secretName=harbor-tls
访问配置:
- 获取 Ingress 地址:
kubectl get ingress -n harbor - 浏览器访问
https://harbor.example.com - 默认管理员账号:
admin/Harbor12345
2.3 Harbor 核心功能配置
2.3.1 项目与用户管理
2.3.2 复制策略配置
示例:将 library 项目镜像同步至阿里云 CR:
{"name": "sync-to-aliyun","src_registry": {"url": "https://harbor.example.com","username": "admin","password": "encrypted-password"},"dest_registry": {"url": "https://registry.cn-hangzhou.aliyuncs.com","username": "aliyun-user","password": "aliyun-token"},"trigger": {"type": "manual","schedule": null},"filters": [{"type": "name","value": "library/*"}]}
2.3.3 漏洞扫描配置
Harbor 集成 Clair 实现自动化漏洞扫描:
- 在
values.yaml中启用:clair:enabled: trueimage:repository: bitnami/clairtag: 4.3.0-debian-11-r0
- 部署后访问
https://harbor.example.com/clair查看扫描报告
三、SpringBoot 应用 Docker 化
3.1 优化 Dockerfile 编写
示例多阶段构建的 SpringBoot Dockerfile:
# 构建阶段FROM maven:3.8.6-jdk-11 AS buildWORKDIR /appCOPY pom.xml .RUN mvn dependency:go-offlineCOPY src ./srcRUN mvn package -DskipTests# 运行阶段FROM openjdk:11-jre-slimWORKDIR /appCOPY --from=build /app/target/*.jar app.jarEXPOSE 8080ENTRYPOINT ["java","-jar","app.jar"]
关键优化点:
- 使用多阶段构建减少镜像体积(从 1.2GB 降至 300MB)
- 添加
.dockerignore文件排除无关文件 - 指定非 root 用户运行(安全加固)
3.2 镜像构建与推送
构建镜像:
docker build -t harbor.example.com/library/springboot-demo:v1 .
登录 Harbor:
docker login harbor.example.com -u admin -p Harbor12345
推送镜像:
docker push harbor.example.com/library/springboot-demo:v1
验证镜像:
curl -X GET "https://harbor.example.com/api/v2.0/projects/library/repositories/springboot-demo/artifacts" \-H "accept: application/json" \-u admin:Harbor12345
四、K8s 部署 SpringBoot 应用
4.1 部署文件编写
示例 deployment.yaml:
apiVersion: apps/v1kind: Deploymentmetadata:name: springboot-demospec:replicas: 3selector:matchLabels:app: springboot-demotemplate:metadata:labels:app: springboot-demospec:containers:- name: springbootimage: harbor.example.com/library/springboot-demo:v1ports:- containerPort: 8080resources:requests:cpu: "500m"memory: "512Mi"limits:cpu: "1000m"memory: "1Gi"livenessProbe:httpGet:path: /actuator/healthport: 8080initialDelaySeconds: 30periodSeconds: 10
4.2 配置 Service 与 Ingress
# service.yamlapiVersion: v1kind: Servicemetadata:name: springboot-demospec:selector:app: springboot-demoports:- protocol: TCPport: 80targetPort: 8080type: ClusterIP# ingress.yamlapiVersion: networking.k8s.io/v1kind: Ingressmetadata:name: springboot-demoannotations:nginx.ingress.kubernetes.io/rewrite-target: /spec:rules:- host: demo.example.comhttp:paths:- path: /pathType: Prefixbackend:service:name: springboot-demoport:number: 80tls:- hosts:- demo.example.comsecretName: demo-tls
4.3 部署与验证
应用配置:
kubectl apply -f deployment.yamlkubectl apply -f service.yamlkubectl apply -f ingress.yaml
验证部署:
```bash查看 Pod 状态
kubectl get pods -l app=springboot-demo
测试服务可用性
curl -H “Host: demo.example.com” http://
查看日志
kubectl logs -f
# 五、高级配置与最佳实践## 5.1 镜像拉取策略优化在 Deployment 中配置镜像拉取策略:```yamlspec:template:spec:imagePullSecrets:- name: harbor-secretcontainers:- name: springbootimage: harbor.example.com/library/springboot-demo:v1imagePullPolicy: IfNotPresent # 或 Always
创建 Secret:
kubectl create secret docker-registry harbor-secret \--docker-server=harbor.example.com \--docker-username=admin \--docker-password=Harbor12345 \--namespace=default
5.2 自动更新策略
结合 ArgoCD 实现 GitOps 持续部署:
安装 ArgoCD:
kubectl create namespace argocdkubectl apply -n argocd -f https://raw.githubusercontent.com/argoproj/argo-cd/stable/manifests/install.yaml
创建 Application 资源:
apiVersion: argoproj.io/v1alpha1kind: Applicationmetadata:name: springboot-demonamespace: argocdspec:project: defaultsource:repoURL: https://github.com/your-repo/springboot-demo.gittargetRevision: HEADpath: k8sdestination:server: https://kubernetes.default.svcnamespace: defaultsyncPolicy:automated:selfHeal: trueprune: truesyncOptions:- CreateNamespace=true
5.3 监控与日志方案
5.3.1 Prometheus 监控配置
在 values.yaml 中启用 SpringBoot Actuator 指标:
management:endpoints:web:exposure:include: health,info,metrics,prometheusendpoint:prometheus:enabled: true
配置 ServiceMonitor:
apiVersion: monitoring.coreos.com/v1kind: ServiceMonitormetadata:name: springboot-demospec:selector:matchLabels:app: springboot-demoendpoints:- port: webpath: /actuator/prometheusinterval: 30s
5.3.2 日志收集方案
使用 FluentBit 收集日志:
# fluentbit-config.yamlapiVersion: v1kind: ConfigMapmetadata:name: fluentbit-configdata:fluent-bit.conf: |[SERVICE]Flush 1Log_Level infoParsers_File parsers.conf[INPUT]Name tailPath /var/log/containers/*.logParser dockerTag kube.*Mem_Buf_Limit 5MBSkip_Long_Lines On[OUTPUT]Name esMatch *Host elasticsearch.logging.svcPort 9200Logstash_Format OnReplace_Dots OnRetry_Limit False
六、常见问题解决方案
6.1 镜像推送失败处理
现象:Error response from daemon: Get https://harbor.example.com/v2/: x509: certificate signed by unknown authority
解决方案:
将自签名证书添加到 Docker 信任链:
sudo mkdir -p /etc/docker/certs.d/harbor.example.comsudo cp harbor.crt /etc/docker/certs.d/harbor.example.com/ca.crtsudo systemctl restart docker
或在
~/.docker/config.json中配置:{"auths": {"harbor.example.com": {"auth": "base64-encoded-credentials","insecure-registries": ["harbor.example.com"]}}}
6.2 Harbor 性能优化
6.2.1 数据库调优
修改 PostgreSQL 配置(postgresql.conf):
max_connections = 200shared_buffers = 256MBwork_mem = 4MBmaintenance_work_mem = 512MB
6.2.2 缓存配置
在 values.yaml 中启用 Redis 缓存:
redis:enabled: trueusePassword: falsemaster:persistence:enabled: truestorageClass: "harbor-sc"
6.3 K8s 节点镜像拉取失败
现象:Failed to pull image "harbor.example.com/library/springboot-demo:v1": rpc error: code = Unknown desc = Error response from daemon: Head "https://harbor.example.com/v2/library/springboot-demo/manifests/v1": unauthorized: authentication required
解决方案:
检查节点时间同步:
timedatectl status
验证 imagePullSecrets 是否正确应用:
kubectl get pod <pod-name> -o yaml | grep imagePullSecrets
手动测试镜像拉取:
docker pull harbor.example.com/library/springboot-demo:v1 --debug
七、总结与展望
本文系统阐述了在 Kubernetes 环境下搭建 Harbor 私有镜像仓库并部署 SpringBoot 应用的完整流程,涵盖从环境准备、Harbor 部署、镜像管理到 K8s 部署的全生命周期管理。通过实施本方案,企业可实现:
- 镜像安全管控:通过私有仓库实现镜像集中管理
- 部署效率提升:结合 CI/CD 实现自动化发布
- 资源利用率优化:通过容器化实现弹性伸缩
未来可进一步探索:
- Harbor 与 Vault 集成实现镜像加密
- 基于 Service Mesh 的应用流量管理
- AI 驱动的自动化运维方案
建议开发者定期进行以下维护工作:
- 每月执行 Harbor 数据库备份
- 每季度更新基础镜像版本
- 每年进行安全审计与合规检查

发表评论
登录后可评论,请前往 登录 或 注册