Kubernetes工作负载最常用YAML格式的文件来定义。
YAML的问题之一就是很难描述清单文件之间的约束或关系。
如果你希望检查是否已从受信任的注册表中提取部署到群集中的所有映像,该怎么办?
如何防止没有Pod安全策略的工作负载提交到集群?
集成静态检查可以在更接近开发生命周期的时间内捕获错误和违反策略的行为。
并且由于改善了资源定义的有效性和安全性,因此你可以相信生产工作负载遵循最佳实践。
Kubernetes YAML文件的静态检查生态系统可以分为以下几类:
- API验证程序:此类工具针对Kubernetes API服务器验证给定的YAML清单。
- 内置检查器:此类工具捆绑了针对安全性,最佳实践等的自觉检查。
- 自定义验证器:此类工具允许使用多种语言(例如python和Javascript)编写自定义检查。
在本文中,你将学习到六个不同的工具:
Kubeval
Kube-score
Config-lint
Copper
Conftest
Polaris
Let's Go ~~~
基准服务
首先部署一个基准服务,以便后面测试对比
apiVersion: apps/v1
kind: Deployment
metadata:
name: http-echo
spec:
replicas: 2
selector:
matchLabels:
app: http-echo
template:
metadata:
labels:
app: http-echo
spec:
containers:
- name: http-echo
image: hashicorp/http-echo
args: ["-text", "hello-world"]
ports:
- containerPort: 5678
---
apiVersion: v1
kind: Service
metadata:
name: http-echo
spec:
ports:
- port: 5678
protocol: TCP
targetPort: 5678
selector:
app: http-echo
部署完成并验证如下:
[root@k8s-node001 Test]# kubectl get po
NAME READY STATUS RESTARTS AGE
http-echo-57dd74545-rtxzm 1/1 Running 0 65s
http-echo-57dd74545-trst7 1/1 Running 0 65s
[root@k8s-node001 Test]# kubectl get svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
http-echo ClusterIP 10.102.221.64 <none> 5678/TCP 70s
[root@k8s-node001 Test]# curl 10.102.221.64:5678
hello-world
以上YAML文件能部署成功,但是,它遵循最佳做法吗?
Let's start.
kubeval
kubeval的前提是与Kubernetes的任何交互都通过其REST API进行。
因此,可以使用API模式来验证给定的YAML输入是否符合该模式。
安装kubeval
wget https://github.com/instrumenta/kubeval/releases/latest/download/kubeval-linux-amd64.tar.gz
tar xf kubeval-linux-amd64.tar.gz
cp kubeval /usr/local/bin
现在我们来改下base.yaml,删除
selector:
matchLabels:
app: http-echo
然后使用kubeval对base.yaml检查
[root@k8s-node001 Test]# kubeval base.yaml
WARN - base.yaml contains an invalid Deployment (http-echo) - selector: selector is required
PASS - base.yaml contains a valid Service (http-echo)
输出看到一个WARN,提示selector是必须的字段
然后恢复selector,再次检查
[root@k8s-node001 Test]# kubeval base.yaml
PASS - base.yaml contains a valid Deployment (http-echo)
PASS - base.yaml contains a valid Service (http-echo)
检查PASS
kubeval之类的工具的优势在于,咱们可以在部署周期的早期发现此类错误。
另外,您不需要访问集群即可运行检查-它们可以脱机运行。
默认情况下,kubeval会根据最新的未发布的Kubernetes API模式验证资源。
更多用法详情请参见官网
kube-score
kube-score会对你提供的YAML清单进行分析,并针对集群的内置检查对其进行评分。
kube-score提供在线版和离线版
本文偷懒就用在线版了
首先打开https://