假设咱们希望检查部署中的镜像是否总是从可信任的仓库(例如kubeops.net/app:1.0 )中提取。
实施此类检查的config-lint规则如下所示:
一个完整的规则集如下所示:
version: 1 description: Rules for Kubernetes spec files type: Kubernetes files: - "*.yaml" rules: - id: DEPLOYMENT_IMAGE_REPOSITORY severity: FAILURE message: Deployment must use a valid image repository resource: Deployment assertions: - every: key: spec.template.spec.containers expressions: - key: image op: starts-with value: "kubeops.net/"如果要测试检查,可以将规则集另存为check_image_repo.yaml。
然后使用config-lint执行检查
可以看到Every expression fails,检测不通过。
现在我们来改下images地址为image: kubeops.net/http-echo,再来检查一次
输出不报错即为成功。
Config-lint是一个很有前途的框架,可以让你使用YAML DSL为Kubernetes YAML清单编写自定义检查。
但是,如果您想表达更复杂的逻辑和检查该怎么办?
YAML对此是否也有限制?
如果您可以使用真正的编程语言来表达这些检查,该怎么办?接下来看Copper
Copper V2是一个使用自定义检查来验证清单的框架,就像config-lint一样。
但是,Copper不使用YAML定义检查。
相反,测试是用JavaScript编写的,而Copper提供了一个包含一些基本帮助程序的库,以帮助读取Kubernetes对象和报告错误。
安装Copper
https://github.com/cloud66-oss/copper/releases/download/2.0.1/linux_amd64_2.0.1 mv linux_amd64_2.0.1 copper chmod + x copper mv copper /usr/local/bin/与config-lint相似,Copper并没有提供内置检查。
让我们自定义一个检查,以确保部署镜像tag必须非latest。
check_image_repo.js
执行检查
[root@k8s-node001 Test]# copper validate --in=base.yaml --validator=check_image_tag.js Check no_latest failed with severity 1 due to latest is used in http-echo Validation failed现在修改为image: kubeops.net/http-echo:v1.0.0
[root@k8s-node001 Test]# copper validate --in=base.yaml --validator=check_image_tag.js Validation successful更多用法参见
ConftestConftest是用于配置数据的测试框架,可用于检查和验证Kubernetes清单。
测试使用专用查询语言Rego编写的。
安装Conftest
wget https://github.com/open-policy-agent/conftest/releases/download/v0.21.0/conftest_0.21.0_Linux_x86_64.tar.gz tar -xzf conftest_0.21.0_Linux_x86_64.tar.gz mv conftest /usr/local/bin与config-lint和copper类似,conftest没有任何内置检查。
首先创建一个新目录conftest-checks和一个名为check_image_registry.rego的文件,其内容如下:
package main deny[msg] { input.kind == "Deployment" image := input.spec.template.spec.containers[_].image not startswith(image, "kubeops.net/") msg := sprintf("image '%v' doesn't come from kubeops.net repository", [image]) }先修改base.yaml,image: docker.io/http-echo
使用conftest执行检测
再次修改为base.yaml,image: kubeops.net/http-echo
[root@k8s-node001 Test]# conftest test --policy ./conftest-checks base.yaml 2 tests, 2 passed, 0 warnings, 0 failures, 0 exceptions更多用法参见
Polaris最后一个工具了,Polaris既可以安装在集群内部,也可以作为命令行工具来静态分析Kubernetes清单。
作为命令行工具运行时,它包含多个内置检查,涉及诸如安全性和最佳实践等方面,类似于kube-score。
另外,你可以使用它来编写类似于config-lint,copper和conftest的自定义检查。
换句话说,Polaris结合了两类的优点:内置和自定义检查器。