Kubernetes YAML最佳实践和策略

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://kube-score.com/ ,然后在输入框贴入写好的YAML清单,这里以上文base.yaml来分析

Kubernetes YAML最佳实践和策略

解析结果如下

Kubernetes YAML最佳实践和策略

从如上可以看到针对这个文件给出的建议,比如资源限制、镜像TAG、Pod网络策略等。不错吧,非常好用的工具。。。

当然,kube-score并不可扩展,并且您不能添加或调整策略。
如果要编写自定义检查以符合组织策略,则可以使用以下四个工具之一:config-lint,copper,conftest或Polaris。

Config-lint

Config-lint是用于验证以YAML,JSON,Terraform,CSV和Kubernetes清单编写的配置文件的工具。

安装Config-lint

wget https://github.com/stelligent/config-lint/releases/download/v1.6.0/config-lint_Linux_x86_64.tar.gz tar -zxf config-lint_Linux_x86_64.tar.gz mv config-lint /usr/local/bin/

Config-lint并没有对Kubernetes清单进行内置检查。你必须编写自己的规则才能执行任何验证。
规则被写为YAML文件,称为规则集,并具有以下结构:

version: 1 description: Rules for Kubernetes spec files type: Kubernetes files: - "*.yaml" rules: # list of rules

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zwgfzf.html