间隔上个版本 用 Pipy 实现 OPA,曾经过来快半年了。当初应用 Pipy 实现了可信镜像仓库的查看,那时的版本实现起来会略微简单,从策略仓库到证书创立到 Admission Webhook 的创立都须要大量的人工操作,配置和逻辑也还是耦合在一起。
这个版本装置和应用起来会更加简略。
当初我用“不务正业”来形容 Pipy 实现准入管制,等看完这篇文章,欢送留言说说你的认识。
架构
还是持续上次的场景,在 Pod 创立时对 Pod 应用的镜像所在仓库进行查看,以及查看镜像的 tag 是否 非法。
这里借助 Pipy Repo 的能力,将 代表策略的脚本和配置 交由 Repo 进行治理;Pipy 实例实时从 Pipy Repo 同步 策略 ,并进行 动静加载。
同时 Pipy Repo 对外提供 REST API 来管理策略,对策略的批改更容易。也不便与企业现有治理后盾进行对接。
上面就开始部署验证,这里所应用的所有代码都已提交到 GitHub 仓库:https://github.com/flomesh-io…。
运行
git clone https://github.com/flomesh-io/demo-policy-as-code.git
cd demo-policy-as-code
筹备
环境
应用 Kubernetes 发行版 K3s 作为集群环境,集群的搭建不做过多阐明。我用 k3d:
k3d cluster create policy-as-code -p "6060:30060@server:0"
注:K3d 是在容器中运行 K3s,这里做了将容器的 30060
端口映射到本地的 6060
端口,前面会具体解释。
部署策略服务器
执行上面的命令部署策略服务器 Repo:
kubectl apply -f repo/pipy-repo.yaml
确保 Pod 失常运行:
kubectl get po -n pipy
NAME READY STATUS RESTARTS AGE
pipy-repo-697bbd9f4b-94pld 1/1 Running 0 10s
公布策略
要应用的策略(脚本和配置)位于 ./repo/scripts
目录中。后面提到 Repo 提供了 REST API 来治理 codebase(策略)。
这里提供了脚本 init-codebase.sh
,通过 curl
命令将策略公布到策略服务器。
./init-codebase.sh
部署策略引擎
这个版本中,应用 helm chart 实现证书的创立、服务的部署以及 Admission WebHook 的注册。
helm install policy-as-code ./policy-as-code -n default
确保 Pod 失常运行:
kubectl get po -n pipy
kubectl get po -n pipy
NAME READY STATUS RESTARTS AGE
pipy-repo-697bbd9f4b-94pld 1/1 Running 0 2m
policy-as-code-5867f9cdb9-9vwks 1/1 Running 0 8s
测试
在 ./test
目录中有三个 yaml 文件用于测试。
非法的镜像仓库:
kubectl apply -f test/bad.yaml
Error from server (192.168.64.1:5000/hello-world:linux repo not start with any repo [docker.io, k8s.gcr.io]): error when creating "test/bad.yaml": admission webhook "validating-webhook.pipy.flomesh-io.cn" denied the request: 192.168.64.1:5000/hello-world:linux repo not start with any repo [docker.io, k8s.gcr.io]
非法的镜像 tag:
kubectl apply -f test/bad2.yaml
Error from server (docker.io/library/hello-world:latest tag end with :latest): error when creating "test/bad2.yaml": admission webhook "validating-webhook.pipy.flomesh-io.cn" denied the request: docker.io/library/hello-world:latest tag end with :latest
非法的镜像
kubectl apply -f test/ok.yaml
pod/hello-world-success created
就这么完结了?当然没有,咱们还要对策略进行动静的调整。
持续上面的测试之前,执行 kubectl delete -f test/ok.yaml
清理方才创立的 Pod。
批改策略
批改 ./repo/scripts/config.json
文件,清空 invalidTagSuffixes
数组中的内容。
{
"validRepoPrefixes": [
"docker.io",
"k8s.gcr.io"
],
"invalidTagSuffixes": []}
留神:这里须要执行脚本 ./init-codebase.sh
更新策略。
此时,再次尝试 apply test/bad2.yaml
。你会发现,这次 Pod 创立胜利了。
kubectl apply -f test/bad2.yaml
pod/hello-world-bad-tag created
咱们没有批改任何逻辑代码,仅仅批改了配置就实现了对 Pod 镜像查看逻辑的调整。可能有人会问,命令行太麻烦调试不不便,有没有更直观的形式?
答案是:有!
图形用户界面
Pipy Repo 提供了图形用户界面,不便脚本的开发和调试。详细信息能够参考疾速入门 Pipy Repo,理解图形用户界面的应用。
还记得结尾的中央咱们为 K3d 容器做了端口映射:6060=>30060
,仔细的你也可能发现咱们为 Pipy Repo 创立了 NodePort Servce,node port 端口为 30060
。
此时,本地启动一个 Pipy:
#k3d
pipy http://localhost:6060 --admin-port=6061
#主机间接部署 k3s 请应用这条命令
pipy http://localhost:30060 --admin-port=6061
在浏览器中关上 http://localhost:6060
,你会看到:
点击上面咱们创立的 codebase /image-verify
,在左侧文件目录中能够找到咱们批改后的 config.json
:
在编辑器中编辑,改回原来的配置,而后点击 2 和 3 两个按钮
再次测试
# 清理
kubectl delete -f test/bad2.yaml
kubectl apply -f test/bad2.yaml
Error from server (docker.io/library/hello-world:latest tag end with :latest): error when creating "test/bad2.yaml": admission webhook "validating-webhook.pipy.flomesh-io.cn" denied the request: docker.io/library/hello-world:latest tag end with :latest
能够看到,批改的后果体现在错误信息里了。
总结
Open Policy Agent (OPA) 为策略引擎带来了新的天地,然而应用 Rego 语言编写策略为应用带来了门槛。Pipy 以其流量编程、易扩大的个性联合 Repo 的 codebase 治理,能够轻松实现策略即代码。同时,资源耗费更少,性能更高(代理场景的特点)。
文章对立公布在公众号
云原生指北