Tekton 与 Harbor 集成:实现镜像扫描(Trivy)通过后才允许部署

Tekton 与 Harbor 集成:实现镜像扫描(Trivy)通过后才允许部署

核心目标

在 CI/CD 流水线中实现:

  1. 构建镜像并推送至 Harbor
  2. 自动触发 Trivy 漏洞扫描
  3. 仅当扫描结果无严重漏洞(CRITICAL)时才允许部署

实现步骤

1. 前置条件准备
  • Harbor 配置
    • 启用 Trivy 扫描器(Harbor ≥ 2.0)
    • 创建机器人账户(Robot Account)用于 API 访问(需 Pull/Push/Scan 权限)
  • Tekton 环境
    • 安装 Tekton Pipelines 和 Tekton Triggers
    • 创建 Kubernetes Secret 存储 Harbor 凭证:
      kubectl create secret generic harbor-creds \
        --from-literal=username=<ROBOT_USERNAME> \
        --from-literal=password=<ROBOT_PASSWORD>
      


2. 关键 Pipeline 设计
apiVersion: tekton.dev/v1beta1
kind: Pipeline
metadata:
  name: scan-before-deploy
spec:
  params:
    - name: image
      type: string  # 格式: harbor.example.com/project/repo:tag
  workspaces:
    - name: source-code
  tasks:
    # 阶段1: 构建并推送镜像到 Harbor
    - name: build-and-push
      taskRef:
        name: kaniko
      workspaces:
        - name: source
          workspace: source-code
      params:
        - name: IMAGE
          value: "$(params.image)"

    # 阶段2: 触发 Harbor Trivy 扫描
    - name: trigger-scan
      runAfter: ["build-and-push"]
      taskRef:
        name: trigger-harbor-scan
      params:
        - name: image
          value: "$(params.image)"

    # 阶段3: 验证扫描结果
    - name: verify-scan
      runAfter: ["trigger-scan"]
      taskRef:
        name: check-scan-result
      params:
        - name: image
          value: "$(params.image)"

    # 阶段4: 仅当扫描通过时部署
    - name: deploy
      runAfter: ["verify-scan"]
      when:
        - input: "$(tasks.verify-scan.status)"
          operator: in
          values: ["Succeeded"]
      taskRef:
        name: deploy-manifest


3. 核心 Task 实现
(1) 触发扫描 Task (trigger-harbor-scan)
apiVersion: tekton.dev/v1beta1
kind: Task
metadata:
  name: trigger-harbor-scan
spec:
  params:
    - name: image  # 格式: harbor.example.com/project/repo:tag
      type: string
  steps:
    - name: trigger
      image: curlimages/curl
      env:
        - name: HARBOR_USER
          valueFrom:
            secretKeyRef:
              name: harbor-creds
              key: username
        - name: HARBOR_PASS
          valueFrom:
            secretKeyRef:
              name: harbor-creds
              key: password
      script: |
        # 解析镜像地址
        DOMAIN=$(echo $(params.image) | cut -d/ -f1)
        PROJECT=$(echo $(params.image) | cut -d/ -f2)
        REPO_TAG=$(echo $(params.image) | cut -d/ -f3)
        REPO=$(echo $REPO_TAG | cut -d: -f1)
        TAG=$(echo $REPO_TAG | cut -d: -f2)

        # 调用 Harbor 扫描 API
        curl -u $HARBOR_USER:$HARBOR_PASS -X POST \
          "https://$DOMAIN/api/v2.0/projects/$PROJECT/repositories/$REPO/artifacts/$TAG/scan"

(2) 检查扫描结果 Task (check-scan-result)
apiVersion: tekton.dev/v1beta1
kind: Task
metadata:
  name: check-scan-result
spec:
  params:
    - name: image
      type: string
  steps:
    - name: verify
      image: alpine/curl
      env: [...]  # 同 trigger-scan 的凭证环境变量
      script: |
        # 解析镜像地址(同上)
        ...

        # 轮询扫描结果(最大重试10次)
        for i in {1..10}; do
          REPORT=$(curl -s -u $HARBOR_USER:$HARBOR_PASS \
            "https://$DOMAIN/api/v2.0/projects/$PROJECT/repositories/$REPO/artifacts/$TAG/additions/vulnerabilities")
          
          # 检查扫描状态
          STATUS=$(echo $REPORT | jq -r .scan_status)
          case $STATUS in
            "Success")
              # 检查 CRITICAL 漏洞数量
              CRITICALS=$(echo $REPORT | jq -r '.vulnerabilities[] | select(.severity=="Critical")' | jq -s length)
              if [ $CRITICALS -gt 0 ]; then
                echo "发现 $CRITICALS 个严重漏洞!"
                exit 1
              else
                echo "扫描通过,无严重漏洞"
                exit 0
              fi
              ;;
            "Running"|"Pending")
              sleep 10
              ;;
            *)
              echo "扫描失败: $STATUS"
              exit 1
              ;;
          esac
        done
        echo "扫描超时未完成"
        exit 1


4. 执行流程说明
  1. 镜像推送
    使用 Kaniko 构建镜像并推送到 Harbor
  2. 触发扫描
    通过 Harbor API 启动 Trivy 扫描
  3. 结果验证
    • 轮询扫描结果(约需 1-2 分钟)
    • 检测到 CRITICAL 漏洞时任务失败(exit 1)
  4. 条件部署
    仅当 verify-scan 成功时才执行部署任务

关键优化建议

  1. 超时控制
    check-scan-result Task 中增加 timeout 字段:
    spec:
      timeout: "10m"  # 设置10分钟超时
    

  2. 通知机制
    添加 Task 发送扫描失败通知(如 Slack/邮件)
  3. 参数化安全阈值
    扩展 check-scan-result 支持配置漏洞阈值:
    params:
      - name: max_critical
        type: number
        default: 0  # 默认不允许任何CRITICAL漏洞
    

:Harbor API 响应格式需参考官方文档,实际部署前建议使用 curl 测试 API 调用。

【EI复现】基于主从博弈的新型城镇配电系统产消者竞价策略【IEEE33节点】(Matlab代码实现)内容概要:本文介绍了基于主从博弈理论的新型城镇配电系统中产消者竞价策略的研究,结合IEEE33节点系统,利用Matlab进行仿真代码实现。该研究聚焦于电力市场环境下产消者(既生产又消费电能的主体)之间的博弈行为建模,通过构建主从博弈模型优化竞价策略,提升配电系统运行效率经济性。文中详细阐述了模型构建思路、优化算法设计及Matlab代码实现过程,旨在复现高水平期刊(EI收录)研究成果,适用于电力系统优化、能源互联网及需求响应等领域。; 适合人群:具备电力系统基础知识和一定Matlab编程能力的研究生、科研人员及从事能源系统优化工作的工程技术人员;尤其适合致力于电力市场博弈、分布式能源调度等方向的研究者。; 使用场景及目标:① 掌握主从博弈在电力系统产消者竞价中的建模方法;② 学习Matlab在电力系统优化仿真中的实际应用技巧;③ 复现EI级别论文成果,支撑学术研究或项目开发;④ 深入理解配电系统中分布式能源参市场交易的决策机制。; 阅读建议:建议读者结合IEEE33节点标准系统数据,逐步调试Matlab代码,理解博弈模型的变量设置、目标函数构建求解流程;同时可扩展研究不同市场机制或引入不确定性因素以增强模型实用性。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值