首页 > 解决方案 > 在 Git 存储库中验证 K8s YAML 文件

问题描述

我有一组 K8s YAML 描述符作为项目的一部分,我正在使用 kustomization 来构建它们。我还使用 GitOps 对我的 K8s 集群进行基于拉的部署。

我现在想为我的 YAML 文件添加一些测试,这样如果我有任何错误,我想避免或阻止 Flux 将我的更改拉入集群。所以基本上我想为我的 YAML 文件做一些单元测试。我遇到了 Kubeval,这可以很好地满足我的目的。我只是不确定如何使用它。

有人已经试过了吗?我想基本上做到以下几点:

  1. 一旦我将一些 YAML 文件推送到我的仓库中,Kubeval 就会启动并验证我指定的一组文件夹中的所有 YAML 文件

  2. 如果所有 YAML 文件都通过了 lint 验证,那么我想继续到下一个阶段,我调用 kustomize 来构建部署 YAML。

  3. 如果 YAML 文件未能通过 lint 验证,那么我的 CI 将失败并且不会发生任何事情

关于我如何做到这一点的任何想法?

标签: kubernetes

解决方案


由于我的项目托管在 GitHub 上,因此我能够使用 GitHub 操作和kube-tools获得我想要的东西

所以基本上这就是我所做的!

  1. 在我的 GitHub 项目中,在 project-root/.github/workflows/main.yml 下添加了一个 main.yaml

  2. 我的 main.yaml 的内容是:

    名称:验证KubernetesYAML

    branches: [ master ]   pull_request:
    branches: [ master ]
    
    runs-on: ubuntu-latest
    
    steps:
    - uses: actions/checkout@v2
    - name: Kubeval
      uses: stefanprodan/kube-tools@v1.2.0
      with:
        kubectl: 1.16.2
        kustomize: 3.4.0
        helm: 2.16.1
        helmv3: 3.0.0
        command: |
          echo "Run kubeval"
          kubeval -d base,dev,production --force-color --strict --ignore-missing-schemas
    

现在,当有人向 master 发出拉取请求时,此验证将启动,如果失败,更改不会被提升到 master 分支,这正是我想要的!

以下是此类验证的输出:

Run kubeval
WARN - Set to ignore missing schemas
PASS - base/application/plant-simulator-deployment.yaml contains a valid Deployment
PASS - base/application/plant-simulator-ingress-service.yaml contains a valid Ingress
PASS - base/application/plant-simulator-namespace.yaml contains a valid Namespace
PASS - base/application/plant-simulator-service.yaml contains a valid Service
WARN - base/kustomization.yaml containing a Kustomization was not validated against a schema
PASS - base/monitoring/grafana/grafana-deployment.yaml contains a valid Deployment
PASS - base/monitoring/grafana/grafana-service.yaml contains a valid Service
PASS - base/monitoring/plant-simulator-monitoring-namespace.yaml contains a valid Namespace
PASS - base/monitoring/prometheus/config-map.yaml contains a valid ConfigMap
PASS - base/monitoring/prometheus/prometheus-deployment.yaml contains a valid Deployment
PASS - base/monitoring/prometheus/prometheus-roles.yaml contains a valid ClusterRole
PASS - base/monitoring/prometheus/prometheus-roles.yaml contains a valid ServiceAccount
PASS - base/monitoring/prometheus/prometheus-roles.yaml contains a valid ClusterRoleBinding
PASS - base/monitoring/prometheus/prometheus-service.yaml contains a valid Service
PASS - dev/flux-patch.yaml contains a valid Deployment
WARN - dev/kustomization.yaml containing a Kustomization was not validated against a schema
PASS - production/flux-patch.yaml contains a valid Deployment
WARN - production/kustomization.yaml containing a Kustomization was not validated against a schema

推荐阅读