logo

K8s环境下Docker+Harbor私有仓库部署SpringBoot应用全攻略

作者:狼烟四起2025.10.10 18:46浏览量:0

简介:本文详细介绍在Kubernetes环境下搭建Docker与Harbor私有镜像仓库的完整流程,涵盖环境准备、Harbor安装配置、Docker镜像推送及SpringBoot应用部署,提供可落地的操作指南。

一、环境准备与前提条件

1.1 Kubernetes集群基础要求

Kubernetes集群需满足以下核心条件:

  • 版本要求:建议使用1.18+稳定版本,确保支持Ingress、StatefulSet等关键功能
  • 节点资源:至少2个Worker节点(建议4核8G+配置),预留10%资源用于系统组件
  • 网络插件:需部署Calico/Flannel等CNI插件,确保Pod间网络互通
  • 存储方案:配置StorageClass(如NFS/Ceph),为Harbor提供持久化存储

1.2 Docker环境配置

在所有节点执行以下操作:

  1. # 安装Docker CE
  2. curl -fsSL https://get.docker.com | sh
  3. # 配置cgroup驱动(与kubelet一致)
  4. cat > /etc/docker/daemon.json <<EOF
  5. {
  6. "exec-opts": ["native.cgroupdriver=systemd"],
  7. "registry-mirrors": ["https://<mirror>.mirror.aliyuncs.com"]
  8. }
  9. EOF
  10. systemctl restart docker

1.3 Helm安装配置

推荐使用Helm3管理Harbor部署:

  1. # 安装Helm
  2. curl -fsSL -o get_helm.sh https://raw.githubusercontent.com/helm/helm/main/scripts/get-helm-3
  3. chmod 700 get_helm.sh && ./get_helm.sh
  4. # 添加Harbor仓库
  5. helm repo add harbor https://helm.goharbor.io

二、Harbor私有仓库搭建

2.1 部署架构设计

推荐采用高可用架构:

2.2 Helm部署Harbor

创建values-custom.yaml自定义配置:

  1. expose:
  2. type: ingress
  3. tls:
  4. enabled: true
  5. certSource: secret
  6. secret:
  7. secretName: "harbor-tls"
  8. namespace: "harbor"
  9. ingress:
  10. hosts:
  11. - core: harbor.example.com
  12. - notary: notary.example.com
  13. persistence:
  14. persistentVolumeClaim:
  15. registry:
  16. storageClass: "managed-nfs-storage"
  17. accessMode: ReadWriteOnce
  18. size: 100Gi
  19. database:
  20. internal:
  21. password: "Harbor12345"

执行部署命令:

  1. kubectl create ns harbor
  2. helm install harbor harbor/harbor -f values-custom.yaml -n harbor

2.3 关键配置验证

  1. 检查Pod状态:
    1. kubectl get pods -n harbor | grep -v Running | wc -l
  2. 验证Ingress路由:
    1. curl -I https://harbor.example.com
  3. 初始化管理员账户:
    1. kubectl logs -n harbor <harbor-core-pod> | grep "admin password"

三、Docker镜像管理

3.1 镜像推送配置

  1. 配置Docker信任证书:

    1. mkdir -p /etc/docker/certs.d/harbor.example.com
    2. scp root@harbor-server:/path/to/ca.crt /etc/docker/certs.d/harbor.example.com/
  2. 登录Harbor仓库:

    1. docker login harbor.example.com
    2. # 输入用户名/密码(admin/初始化密码)

3.2 镜像构建规范

推荐使用多阶段构建的Dockerfile示例:

  1. # 基础镜像层
  2. FROM eclipse-temurin:17-jdk-jammy as builder
  3. WORKDIR /app
  4. COPY . .
  5. RUN ./gradlew bootJar
  6. # 运行时镜像层
  7. FROM eclipse-temurin:17-jre-jammy
  8. WORKDIR /app
  9. COPY --from=builder /app/build/libs/*.jar app.jar
  10. EXPOSE 8080
  11. ENTRYPOINT ["java","-jar","app.jar"]

3.3 镜像命名规范

遵循以下命名规则:

  1. harbor.example.com/<project>/<app-name>:<version>-<env>
  2. # 示例:
  3. harbor.example.com/devops/user-service:1.0.2-prod

四、SpringBoot应用部署

4.1 Kubernetes部署清单

创建deployment.yaml示例:

  1. apiVersion: apps/v1
  2. kind: Deployment
  3. metadata:
  4. name: user-service
  5. spec:
  6. replicas: 3
  7. selector:
  8. matchLabels:
  9. app: user-service
  10. template:
  11. metadata:
  12. labels:
  13. app: user-service
  14. spec:
  15. containers:
  16. - name: user-service
  17. image: harbor.example.com/devops/user-service:1.0.2-prod
  18. ports:
  19. - containerPort: 8080
  20. resources:
  21. requests:
  22. cpu: "500m"
  23. memory: "512Mi"
  24. limits:
  25. cpu: "1000m"
  26. memory: "1Gi"
  27. envFrom:
  28. - configMapRef:
  29. name: user-service-config
  30. - secretRef:
  31. name: user-service-secrets

4.2 配置管理方案

  1. ConfigMap配置示例:

    1. kubectl create configmap user-service-config \
    2. --from-literal=SPRING_PROFILES_ACTIVE=prod \
    3. --from-literal=SERVER_PORT=8080 \
    4. --from-literal=DB_URL=jdbc:postgresql://db-cluster:5432/userdb
  2. Secret加密配置:

    1. kubectl create secret generic user-service-secrets \
    2. --from-literal=DB_PASSWORD=$(openssl rand -base64 32)

4.3 服务暴露与监控

  1. 创建Service资源:

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

    1. apiVersion: networking.k8s.io/v1
    2. kind: Ingress
    3. metadata:
    4. name: user-service-ingress
    5. annotations:
    6. nginx.ingress.kubernetes.io/rewrite-target: /
    7. spec:
    8. rules:
    9. - host: api.example.com
    10. http:
    11. paths:
    12. - path: /users
    13. pathType: Prefix
    14. backend:
    15. service:
    16. name: user-service
    17. port:
    18. number: 80

五、运维与优化建议

5.1 镜像安全扫描

配置Harbor自动扫描:

  1. 启用Trivy集成:

    1. # 在values-custom.yaml中添加
    2. trivy:
    3. enabled: true
    4. ignoreUnfixed: false
    5. skipUpdate: false
  2. 创建扫描策略:

    1. curl -X POST "https://harbor.example.com/api/v2.0/projects/1/policies/vulnerability" \
    2. -H "accept: application/json" \
    3. -H "Content-Type: application/json" \
    4. -d '{
    5. "name": "critical-only",
    6. "project_id": 1,
    7. "severity": "critical",
    8. "automated": true
    9. }'

5.2 性能优化建议

  1. 镜像优化:
  • 使用Distroless基础镜像
  • 启用Layer缓存
  • 压缩镜像层
  1. 部署优化:
  • 配置PodDisruptionBudget
  • 启用HPA自动扩缩容
    1. apiVersion: autoscaling/v2
    2. kind: HorizontalPodAutoscaler
    3. metadata:
    4. name: user-service-hpa
    5. spec:
    6. scaleTargetRef:
    7. apiVersion: apps/v1
    8. kind: Deployment
    9. name: user-service
    10. minReplicas: 2
    11. maxReplicas: 10
    12. metrics:
    13. - type: Resource
    14. resource:
    15. name: cpu
    16. target:
    17. type: Utilization
    18. averageUtilization: 70

5.3 备份恢复方案

  1. 定期备份配置:
    ```bash

    备份Harbor数据库

    kubectl exec -n harbor — \
    pg_dump -U postgres -h localhost harbor > harbor_backup.sql

备份持久化数据

kubectl cp -n harbor :/storage /backup/harbor_data

  1. 2. 灾难恢复流程:
  2. - 重建K8s集群
  3. - 重新部署Harbor
  4. - 恢复数据库备份
  5. - 导入镜像数据
  6. # 六、常见问题解决方案
  7. ## 6.1 镜像推送失败排查
  8. 1. 检查证书有效性:
  9. ```bash
  10. openssl s_client -connect harbor.example.com:443 -showcerts
  1. 验证权限配置:
    1. kubectl logs -n harbor <harbor-core-pod> | grep "permission denied"

6.2 Pod启动异常处理

  1. 检查镜像拉取:

    1. kubectl describe pod <pod-name> | grep "Failed to pull image"
  2. 查看容器日志

    1. kubectl logs -n <namespace> <pod-name> --previous

6.3 性能瓶颈分析

  1. 资源监控:

    1. kubectl top pods -n <namespace> --containers
  2. 网络诊断:

    1. kubectl get endpoints <service-name>
    2. kubectl describe svc <service-name>

通过以上完整方案,开发者可以在Kubernetes环境中构建安全、高效的Docker+Harbor私有镜像仓库,并实现SpringBoot应用的标准化部署。建议结合具体业务场景调整参数配置,定期进行安全审计和性能优化。

相关文章推荐

发表评论

活动