logo

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

作者:渣渣辉2025.10.10 18:46浏览量:1

简介:本文详细阐述在K8s集群中搭建Docker与Harbor私有镜像仓库的完整流程,并指导如何将SpringBoot应用部署至该环境,涵盖环境准备、Harbor安装、Docker镜像推送、K8s资源编排及运维优化等关键步骤。

一、环境准备与架构设计

1.1 基础设施要求

K8s集群需满足以下条件:

  • 节点操作系统:CentOS 7/8或Ubuntu 20.04+
  • 容器运行时:Docker 20.10+或containerd 1.6+
  • 网络插件:Calico/Flannel实现Pod网络互通
  • 存储类:配置动态存储卷(如NFS/Ceph)

典型架构设计:

  1. [开发终端] [Harbor仓库] [K8s Master]
  2. [Docker镜像] [Worker节点] [SpringBoot Pod]

1.2 组件版本选择

组件 推荐版本 关键特性
Kubernetes 1.24+ 移除Dockershim,支持CRI标准
Harbor 2.6+ 增强OAuth2集成,支持镜像复制
Docker 20.10.17 优化BuildKit性能,改进安全扫描

二、Harbor私有仓库搭建

2.1 安装前配置

  1. # 修改主机名(所有节点)
  2. hostnamectl set-hostname harbor-server
  3. # 配置/etc/hosts
  4. echo "192.168.1.10 harbor-server" >> /etc/hosts
  5. # 安装依赖包
  6. yum install -y conntrack ntpdate ipset jq iptables curl sysstat wget socat

2.2 Harbor部署流程

  1. 下载安装包

    1. wget https://github.com/goharbor/harbor/releases/download/v2.6.2/harbor-online-installer-v2.6.2.tgz
    2. tar xzf harbor-online-installer-v2.6.2.tgz
    3. cd harbor
  2. 配置修改(harbor.yml):

    1. hostname: harbor-server
    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_idle_conns: 50
    11. max_open_conns: 100
  3. 安装执行

    1. ./prepare
    2. ./install.sh --with-trivy # 启用漏洞扫描

2.3 高级配置技巧

  • 镜像复制:配置多地域仓库同步

    1. # 在harbor.yml中添加
    2. replication:
    3. - name: aliyun-mirror
    4. disabled: false
    5. filters:
    6. - project: "**"
    7. repository: "**"
    8. tag: "**"
    9. destinations:
    10. - url: https://registry-vpc.cn-hangzhou.aliyuncs.com
    11. password: "ALIYUN_PASSWORD"
  • 存储优化:使用对象存储(如MinIO)

    1. # 修改common/config/registry/config.yml
    2. storage:
    3. cache:
    4. layerinfo: redis
    5. s3:
    6. accesskey: minioadmin
    7. secretkey: minioadmin
    8. region: us-east-1
    9. bucket: harbor-registry
    10. encrypt: false

三、Docker镜像构建与推送

3.1 SpringBoot应用Docker化

  1. 多阶段构建示例(Dockerfile):
    ```dockerfile

    构建阶段

    FROM maven:3.8.6-jdk11 AS build
    WORKDIR /app
    COPY pom.xml .
    RUN mvn dependency:go-offline
    COPY src ./src
    RUN mvn package -DskipTests

运行阶段

FROM openjdk:11-jre-slim
WORKDIR /app
COPY —from=build /app/target/*.jar app.jar
EXPOSE 8080
ENTRYPOINT [“java”,”-jar”,”app.jar”]

  1. 2. **构建优化技巧**:
  2. - 使用`.dockerignore`文件排除无关文件
  3. - 启用BuildKit加速构建:
  4. ```bash
  5. export DOCKER_BUILDKIT=1
  6. docker build --progress=plain -t myapp:1.0 .

3.2 镜像推送流程

  1. 登录Harbor

    1. docker login harbor-server --username=admin --password=Harbor12345
  2. 标记并推送

    1. docker tag myapp:1.0 harbor-server/library/myapp:1.0
    2. docker push harbor-server/library/myapp:1.0
  3. 漏洞扫描
    ```bash

    使用Trivy扫描本地镜像

    trivy image —severity CRITICAL myapp:1.0

Harbor界面自动扫描配置

在Project设置中启用自动扫描策略

  1. # 四、K8s环境部署
  2. ## 4.1 资源定义文件示例
  3. 1. **Deployment配置**(myapp-deployment.yaml):
  4. ```yaml
  5. apiVersion: apps/v1
  6. kind: Deployment
  7. metadata:
  8. name: myapp
  9. spec:
  10. replicas: 3
  11. selector:
  12. matchLabels:
  13. app: myapp
  14. template:
  15. metadata:
  16. labels:
  17. app: myapp
  18. spec:
  19. containers:
  20. - name: myapp
  21. image: harbor-server/library/myapp:1.0
  22. ports:
  23. - containerPort: 8080
  24. resources:
  25. requests:
  26. cpu: "500m"
  27. memory: "512Mi"
  28. limits:
  29. cpu: "1000m"
  30. memory: "1Gi"
  31. livenessProbe:
  32. httpGet:
  33. path: /actuator/health
  34. port: 8080
  35. initialDelaySeconds: 30
  36. periodSeconds: 10
  1. Service配置(myapp-service.yaml):
    1. apiVersion: v1
    2. kind: Service
    3. metadata:
    4. name: myapp-service
    5. spec:
    6. selector:
    7. app: myapp
    8. ports:
    9. - protocol: TCP
    10. port: 80
    11. targetPort: 8080
    12. type: ClusterIP

4.2 部署最佳实践

  1. 镜像拉取策略

    1. spec:
    2. containers:
    3. - image: harbor-server/library/myapp:1.0
    4. imagePullPolicy: IfNotPresent # 生产环境建议Always
  2. 配置管理

    1. # 使用ConfigMap存储配置
    2. apiVersion: v1
    3. kind: ConfigMap
    4. metadata:
    5. name: app-config
    6. data:
    7. application.properties: |
    8. spring.datasource.url=jdbc:mysql://mysql-service:3306/db
  3. HPA自动扩缩容

    1. apiVersion: autoscaling/v2
    2. kind: HorizontalPodAutoscaler
    3. metadata:
    4. name: myapp-hpa
    5. spec:
    6. scaleTargetRef:
    7. apiVersion: apps/v1
    8. kind: Deployment
    9. name: myapp
    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.1 监控体系搭建

  1. Prometheus配置

    1. # 添加ServiceMonitor
    2. apiVersion: monitoring.coreos.com/v1
    3. kind: ServiceMonitor
    4. metadata:
    5. name: myapp-monitor
    6. spec:
    7. selector:
    8. matchLabels:
    9. app: myapp
    10. endpoints:
    11. - port: web
    12. interval: 30s
    13. path: /actuator/prometheus
  2. Grafana仪表盘

  • 导入SpringBoot Actuator模板(ID:3151)
  • 关键监控指标:
    • JVM内存使用率
    • 请求吞吐量(requests/sec)
    • 错误率(5xx占比)

5.2 持续集成流程

  1. Jenkins流水线示例
    1. pipeline {
    2. agent any
    3. stages {
    4. stage('Build') {
    5. steps {
    6. sh 'mvn clean package'
    7. sh 'docker build -t myapp:${BUILD_NUMBER} .'
    8. }
    9. }
    10. stage('Scan') {
    11. steps {
    12. sh 'trivy image --severity CRITICAL myapp:${BUILD_NUMBER}'
    13. }
    14. }
    15. stage('Push') {
    16. steps {
    17. withCredentials([usernamePassword(credentialsId: 'harbor-cred',
    18. usernameVariable: 'USER', passwordVariable: 'PASS')]) {
    19. sh 'docker login harbor-server -u $USER -p $PASS'
    20. sh 'docker tag myapp:${BUILD_NUMBER} harbor-server/library/myapp:${BUILD_NUMBER}'
    21. sh 'docker push harbor-server/library/myapp:${BUILD_NUMBER}'
    22. }
    23. }
    24. }
    25. stage('Deploy') {
    26. steps {
    27. sh 'kubectl set image deployment/myapp myapp=harbor-server/library/myapp:${BUILD_NUMBER}'
    28. }
    29. }
    30. }
    31. }

5.3 故障排查指南

  1. 镜像拉取失败

    1. # 检查节点docker日志
    2. journalctl -u docker -n 100 --no-pager
    3. # 验证insecure-registries配置
    4. cat /etc/docker/daemon.json
  2. Pod启动异常

    1. # 获取详细事件
    2. kubectl describe pod <pod-name>
    3. # 查看容器日志
    4. kubectl logs <pod-name> -c myapp --previous
  3. Harbor性能优化

  • 数据库调优:修改/harbor/common/config/database/core.env
    1. DB_CONNECTION_POOL_SIZE=100
    2. DB_MAX_IDLE_CONNS=50
  • 缓存配置:调整Redis内存策略
    1. # 在Redis节点执行
    2. config set maxmemory 2gb
    3. config set maxmemory-policy allkeys-lru

六、安全加固建议

6.1 网络策略实施

  1. apiVersion: networking.k8s.io/v1
  2. kind: NetworkPolicy
  3. metadata:
  4. name: restrict-myapp
  5. spec:
  6. podSelector:
  7. matchLabels:
  8. app: myapp
  9. policyTypes:
  10. - Ingress
  11. ingress:
  12. - from:
  13. - podSelector:
  14. matchLabels:
  15. app: ingress-nginx
  16. ports:
  17. - protocol: TCP
  18. port: 8080

6.2 镜像签名验证

  1. 生成签名密钥

    1. cosign generate-key-pair
  2. 签名镜像

    1. cosign sign --key cosign.key harbor-server/library/myapp:1.0
  3. K8s验证配置

    1. # 在Deployment中添加注解
    2. annotations:
    3. seccomp.security.alpha.kubernetes.io/pod: runtime/default
    4. container.apparmor.security.beta.kubernetes.io/myapp: runtime/default
    5. cosign.sigstore.dev/signature: "eyJhbGciOiJFUzI1NiIsImtpZCI6..."

通过上述完整流程,开发者可在K8s环境中构建起企业级的Docker镜像管理体系,实现SpringBoot应用的高效部署与运维。实际实施时需根据具体业务场景调整参数配置,建议先在测试环境验证后再迁移至生产环境。

相关文章推荐

发表评论

活动