一、环境准备与架构概述
1.1 基础环境要求
在K8s集群中部署Docker+Harbor私有镜像仓库前,需确保以下基础条件:
- K8s集群:建议使用1.20+版本,可通过kubeadm、minikube或云服务商提供的托管服务搭建
- 存储类:配置动态存储供应(StorageClass),推荐使用NFS、Ceph或云存储
- 网络插件:确保Calico、Flannel等网络插件正常运行
- Docker环境:所有节点需安装Docker CE 19.03+版本
1.2 架构设计
典型部署架构包含:
- Harbor核心组件:
- Proxy服务(Nginx反向代理)
- Core服务(API接口)
- Database(PostgreSQL)
- Registry(Docker镜像存储)
- Clair(漏洞扫描,可选)
- K8s集成点:
- 通过NodePort或Ingress暴露Harbor服务
- 使用Secret管理镜像仓库认证
- 配置ImagePullSecrets实现私有镜像拉取
二、Harbor私有仓库搭建
2.1 安装前配置
2.1.1 准备持久化存储
# 创建NFS共享目录(示例)mkdir -p /data/harbor# 在K8s中创建PV(PersistentVolume)cat <<EOF | kubectl apply -f -apiVersion: v1kind: PersistentVolumemetadata:name: harbor-pvspec:capacity:storage: 100GiaccessModes:- ReadWriteOncenfs:path: /data/harborserver: 192.168.1.100EOF
2.1.2 配置HTTPS证书
生成自签名证书(生产环境建议使用CA签发):
openssl req -x509 -nodes -days 365 -newkey rsa:2048 \-keyout harbor.key -out harbor.crt \-subj "/CN=harbor.example.com"
2.2 Harbor部署流程
2.2.1 使用Helm安装
# 添加Harbor Helm仓库helm repo add harbor https://helm.goharbor.io# 创建values.yaml定制配置cat <<EOF > values.yamlexpose:type: ingresstls:enabled: truecertSource: secretsecret:secretName: harbor-tlscertificate: harbor.crtkey: harbor.keyingress:hosts:- host: harbor.example.compaths:- path: /pathType: ImplementationSpecificpersistence:persistentVolumeClaim:registry:storageClass: "nfs-client"accessMode: ReadWriteOncesize: 50GiEOF# 安装Harborhelm install harbor harbor/harbor -f values.yaml
2.2.2 验证部署
# 获取服务状态kubectl get pods -n default | grep harbor# 访问Web界面https://harbor.example.com
2.3 安全配置
2.3.1 用户权限管理
- 创建项目时启用内容信任(Content Trust)
- 配置RBAC策略:
# 示例:创建只读用户harbor-cli user create --username reader --password ReadOnly123!harbor-cli project create --name devops --public falseharbor-cli project add-member --name devops --username reader --role guest
2.3.2 镜像签名配置
- 安装Notary客户端
- 在项目中启用”Enable Content Trust”
- 推送镜像时使用
--disable-content-trust=false
三、SpringBoot应用部署
3.1 镜像构建与推送
3.1.1 Dockerfile优化
# 多阶段构建示例FROM maven:3.8.4-jdk-11 AS buildWORKDIR /appCOPY pom.xml .RUN mvn dependency:go-offlineCOPY src ./srcRUN mvn package -DskipTestsFROM openjdk:11-jre-slimWORKDIR /appCOPY --from=build /app/target/demo-0.0.1-SNAPSHOT.jar app.jarEXPOSE 8080ENTRYPOINT ["java","-jar","app.jar"]
3.1.2 推送到Harbor
# 登录Harbordocker login harbor.example.com --username admin --password Harbor12345# 标记并推送镜像docker tag demo-app:latest harbor.example.com/devops/demo-app:v1docker push harbor.example.com/devops/demo-app:v1
3.2 K8s部署配置
3.2.1 创建ImagePullSecret
kubectl create secret docker-registry harbor-secret \--docker-server=harbor.example.com \--docker-username=admin \--docker-password=Harbor12345 \--docker-email=admin@example.com
3.2.2 Deployment配置示例
apiVersion: apps/v1kind: Deploymentmetadata:name: demo-appspec:replicas: 3selector:matchLabels:app: demo-apptemplate:metadata:labels:app: demo-appspec:imagePullSecrets:- name: harbor-secretcontainers:- name: demo-appimage: harbor.example.com/devops/demo-app:v1ports:- containerPort: 8080resources:requests:cpu: "500m"memory: "512Mi"limits:cpu: "1000m"memory: "1Gi"
3.2.3 Service与Ingress配置
apiVersion: v1kind: Servicemetadata:name: demo-servicespec:selector:app: demo-appports:- protocol: TCPport: 80targetPort: 8080---apiVersion: networking.k8s.io/v1kind: Ingressmetadata:name: demo-ingressspec:rules:- host: demo.example.comhttp:paths:- path: /pathType: Prefixbackend:service:name: demo-serviceport:number: 80
四、运维与监控
4.1 日志管理
配置EFK(Elasticsearch-Fluentd-Kibana)栈收集容器日志,示例Fluentd配置:
<match harbor.**>@type elasticsearchhost elasticsearchport 9200logstash_format true<buffer>@type filepath /var/log/fluentd-buffers/harbor.buffertimekey 1dtimekey_wait 10m</buffer></match>
4.2 性能监控
使用Prometheus+Grafana监控Harbor指标:
- 启用Harbor的Prometheus端点
- 配置ServiceMonitor:
apiVersion: monitoring.coreos.com/v1kind: ServiceMonitormetadata:name: harbor-monitorspec:selector:matchLabels:app: harborendpoints:- port: httppath: /metricsinterval: 30s
4.3 备份策略
-
数据库备份:
# 定期备份PostgreSQLkubectl exec -it harbor-core -- pg_dump -U postgres -F c registry > registry_backup.dump
-
镜像备份:
# 使用skopeo同步镜像skopeo copy docker://harbor.example.com/devops/demo-app:v1 \docker://backup-registry.example.com/devops/demo-app:v1
五、常见问题处理
5.1 镜像拉取失败
- 现象:
Failed to pull image "harbor.example.com/devops/demo-app:v1": rpc error: code = Unknown desc = Error response from daemon: Get https://harbor.example.com/v2/: x509: certificate signed by unknown authority - 解决方案:
- 在所有节点添加CA证书到
/etc/docker/certs.d/harbor.example.com - 或在K8s中配置Insecure Registry(仅测试环境)
- 在所有节点添加CA证书到
5.2 Harbor性能优化
- 数据库调优:
-- 修改PostgreSQL配置ALTER SYSTEM SET max_connections = 300;ALTER SYSTEM SET shared_buffers = 256MB;
- Registry存储优化:
- 启用存储驱动分层(overlay2)
- 配置定期垃圾回收:
# 每周日凌晨执行0 0 * * 0 kubectl exec -it harbor-registry -- /usr/local/bin/registry garbage-collect /etc/registry/config.yml
六、最佳实践建议
-
镜像命名规范:
- 采用
<项目>/<应用>:<版本>-<环境>格式 - 示例:
devops/demo-app:1.2.0-prod
- 采用
-
CI/CD集成:
- 在Jenkins/GitLab CI中配置Harbor凭证
- 使用
docker buildx实现多平台镜像构建
-
安全加固:
- 定期轮换管理员密码
- 启用审计日志(Audit Log)
- 限制外部网络访问
-
高可用方案:
- 使用Harbor集群模式(需共享存储)
- 配置多个副本的Registry服务
通过以上完整流程,开发者可以在K8s环境中构建安全、高效的私有镜像仓库,并实现SpringBoot应用的自动化部署。实际生产环境中,建议结合具体业务需求进行定制化配置,并建立完善的运维监控体系。