乐趣区

关于云计算:为了-OpenPolicyAgent-学-Rego试试-Javascript

间隔上个版本 用 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 治理,能够轻松实现策略即代码。同时,资源耗费更少,性能更高(代理场景的特点)。

文章对立公布在公众号 云原生指北

退出移动版