使用gatekeeper限制kubernetes创建特定类型的资源
正常情况下用户要登录k8s创建某资源比如pod时,首先apiserver会检测
1.通过token或者证书认证此用户是否能够登录k8s
2.会检测此用户是否具备足够的权限
在k8s默认的情况下,如果用户能登录且具备权限的话,是可以正确的创建资源的。但是我们可以通过准入控制器(admission control)或者动态准入控制器(Dynamic Admission Control)定制一系列的规则,进一步限制所要创建的pod是否合规。
OPA(全称是Open Policy Agent )是CNCF孵化出来的一个项目,是一种开源的策略引擎,可以用于为docker、envoy、ssh、kubernetes等应用定制策略。
而gatekeeper是基于OPA为kubernetes定制的一个项目,可以实现各种策略。这些策略是通过准入控制器作用到kubernetes上的。
安装gatekeeper
先到下面的地址下载最新的manifest文件
https://github.com/open-policy-agent/gatekeeper/tree/master/deploy
然后在master上执行下面的命令安装gatekeeper。
root@vms61:~/demo4# kubectl apply -f gatekeeper.yaml
namespace/gatekeeper-system created
...输出...
poddisruptionbudget.policy/gatekeeper-controller-manager created
validatingwebhookconfiguration.admissionregistration.k8s.io/gatekeeper-validating-webhook-configuration created
root@vms61:~/demo4#
安装之后,会自动创建一个名字为gatekeeper-system的命名空间,在此命名空间里会创建一系列的pod,确认这些pod的状态都是运行的。
root@vms61:~/demo4# kubectl get pods -n gatekeeper-system
NAME READY STATUS RESTARTS AGE
gatekeeper-audit-7b67879df4-sm4fw 1/1 Running 0 30s
gatekeeper-controller-manager-6cb56f759f-96jmn 1/1 Running 0 30s
gatekeeper-controller-manager-6cb56f759f-hnxc4 1/1 Running 0 30s
gatekeeper-controller-manager-6cb56f759f-sv5zp 1/1 Running 0 30s
root@vms61:~/demo4#
gatekeeper会创建一系列的资源类型。
root@vms61:~/demo4# kubectl get crd | grep gatekeep
configs.config.gatekeeper.sh 2022-05-09T11:51:01Z
constraintpodstatuses.status.gatekeeper.sh 2022-05-09T11:51:01Z
constrainttemplatepodstatuses.status.gatekeeper.sh 2022-05-09T11:51:01Z
constrainttemplates.templates.gatekeeper.sh 2022-05-09T11:51:01Z
providers.externaldata.gatekeeper.sh 2022-05-09T11:51:01Z
root@vms61:~/demo4#
创建测试用的镜像
在所有节点把nginx镜像重新打标签为hub.c.163.com/library/nginx
root@vms6X:~# nerdctl tag nginx hub.c.163.com/library/nginx
root@vms6X:~#
现在对于使用哪个镜像是没有任何限制的,所以如果使用镜像nginx hub.c.163.com/library/nginx创建pod也是能创建出来的。
创建pod1.yaml内容如下。
root@vms61:~/demo4# cat pod1.yaml
apiVersion: v1
kind: Pod
metadata:creationTimestamp: nulllabels:run: pod1name: pod1
spec:terminationGracePeriodSeconds: 0containers:- image: hub.c.163.com/library/nginximagePullPolicy: IfNotPresentname: pod1resources: {}dnsPolicy: ClusterFirstrestartPolicy: Always
status: {}root@vms61:~/demo4#
开始创建pod。
root@vms61:~/demo4# kubectl apply -f pod1.yaml
pod/pod1 created
root@vms61:~/demo4# kubectl get pods
NAME READY STATUS RESTARTS AGE
pod1 1/1 Running 0 3s
root@vms61:~/demo4#
从这里可以看到pod能创建出来,也就是现在是可以正常使用hub.c.163.com/library/nginx这个镜像的。下面把这个pod删除。
root@vms61:~/demo4# kubectl delete pod pod1
pod "pod1" deleted
root@vms61:~/demo4#
禁止使用特定的镜像
我们先自定义一个类型为blacklistimages的CRD资源类型,用于禁止以hub.c.163.com开头的镜像。
注:如同有了pod这种资源类型,我们才能创建pod1、pod2、pod3等这些pod资源。我们要先创建一种资源类型才能创建具体的资源。
先查看是否存在blacklistimages类型的资源。
root@vms61:~/demo4# kubectl get blacklistimages
error: the server doesn't have a resource type "blacklistimages"
root@vms61:~/demo4#
这里提示不存在blacklistimages这种资源类型,所以先通过CRD创建出来这种类型。下面创建gatekeeper-blk-type.yaml内容如下。
root@vms61:~/demo4# cat gatekeeper-blk-type.yaml
apiVersion: templates.gatekeeper.sh/v1beta1
kind: ConstraintTemplate
metadata:name: blacklistimages
spec:crd:spec:names:kind: BlacklistImagestargets:- rego: |package k8strustedimagesimages {image := input.review.object.spec.containers[_].imagenot startswith(image, "hub.c.163.com/")}violation[{"msg": msg}] {not imagesmsg := "不可用的镜像!"}target: admission.k8s.gatekeeper.sh
root@vms61:~/demo4#
这里指定如果使用了hub.c.163.com开头的镜像的话,那么则提示“不可用的镜像!”。
创建此资源。
root@vms61:~/demo4# kubectl apply -f gatekeeper-blk-type.yaml
constrainttemplate.templates.gatekeeper.sh/blacklistimages created
root@vms61:~/demo4#
root@vms61:~/demo4# kubectl get blacklistimages
No resources found
root@vms61:~/demo4#
这里提示"No resources found",说明已经存在资源类型blacklistimages了,只是这个类型下面还没创建任何资源。
下面创建一个名字为pod-blk-img的BlacklistImages。
root@vms61:~/demo4# cat gatekeeper-blacklist.yaml
apiVersion: constraints.gatekeeper.sh/v1beta1
kind: BlacklistImages
metadata:generation: 1managedFields:name: pod-blk-imgresourceVersion: "14449"
spec:match:kinds:- apiGroups:- ""kinds:- Pod
root@vms61:~/demo4#
这里定义的pod-blk-img将用于pod的创建,先把名字叫做pod-blk-img 的blacklistimages创建出来。
root@vms61:~/demo4# kubectl apply -f gatekeeper-blacklist.yaml
blacklistimages.constraints.gatekeeper.sh/pod-blk-img created
root@vms61:~/demo4#root@vms61:~/demo4# kubectl get blacklistimages
NAME AGE
pod-blk-img 74s
root@vms61:~/demo4#
下面再次创建pod1。
root@vms61:~/demo4# kubectl apply -f pod1.yaml
Error from server ([pod-blk-img] 不可用的镜像!): error when creating "pod1.yaml": admission webhook "validation.gatekeeper.sh" denied the request: [pod-blk-img] 不可用的镜像!
root@vms61:~/demo4#
这里pod创建失败,说明现在已经不能使用hub.c.163.com的镜像了。
删除pod-blk-img。
root@vms61:~/demo4# kubectl delete -f gatekeeper-blacklist.yaml
blacklistimages.constraints.gatekeeper.sh "pod-blk-img" deleted
root@vms61:~/demo4#
删除blacklistimages这个资源类型。
root@vms61:~/demo4# kubectl delete -f gatekeeper-blk-type.yaml
constrainttemplate.templates.gatekeeper.sh "blacklistimages" deleted
root@vms61:~/demo4#
禁止创建LB类型的svc
下面再来一个练习,用于禁止创建LoadBalancer类型的service。
先把pod1创建出来。
root@vms61:~/demo4# kubectl apply -f pod1.yaml
pod/pod1 created
root@vms61:~/demo4# kubectl get pods
NAME READY STATUS RESTARTS AGE
pod1 1/1 Running 0 2s
root@vms61:~/demo4#
在没有任何限制的情况下,先创建一个LoadBalancer类型的service。
root@vms61:~/demo4# kubectl expose --name=svc1 pod pod1 --port=80 --type=LoadBalancer
service/svc1 exposed
root@vms61:~/demo4# kubectl get svc svc1
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
svc1 LoadBalancer 10.110.158.128 192.168.26.240 80:32109/TCP 5s
root@vms61:~/demo4#
可以此时是可以创建出来类型为LoadBalancer的service的,下面把此service删除。
root@vms61:~/demo4# kubectl delete svc svc1
service "svc1" deleted
root@vms61:~/demo4#
下面准备创建一个CRD的资源类型lbtypesvcnotallowed,先判断是否存在这种资源类型。
root@vms61:~/demo4# kubectl get lbtypesvcnotallowed
error: the server doesn't have a resource type "lbtypesvcnotallowed"
root@vms61:~/demo4#
报错,说明现在还不存在 lbtypesvcnotallowed这种资源类型。
首先创建资源类型lbtypesvcnotallowed,编写aa-tmp.yaml内容如下。
root@vms61:~/demo4# cat aa-tmp.yaml
apiVersion: templates.gatekeeper.sh/v1beta1
kind: ConstraintTemplate
metadata:name: lbtypesvcnotallowed
spec:crd:spec:names:kind: LBTypeSvcNotAllowedtargets:- target: admission.k8s.gatekeeper.shrego: |package kubernetes.admissionviolation[{"msg": msg}] {input.review.kind.kind = "Service"input.review.operation = "CREATE"input.review.object.spec.type = "LoadBalancer"msg := "不允许创建LB类型的service!"}
root@vms61:~/demo4#
这里创建了一个名字为lbtypesvcnotallowed的资源类型,禁止创建LB类型的service,如果创建的话,则会有"不允许创建LB类型的service!" 报错。
下面创建资源类型。
root@vms61:~/demo4# kubectl apply -f aa-tmp.yaml
constrainttemplate.templates.gatekeeper.sh/lbtypesvcnotallowed created
root@vms61:~/demo4#
root@vms61:~/demo4# kubectl get lbtypesvcnotallowed
No resources found
root@vms61:~/demo4#
现在已经存在 lbtypesvcnotallowed这种资源类型了,只是下面还没有任何的资源。
下面创建名字为deny-create-lb-type-svc的lbtypesvcnotallowed,编写bb-contraint.yaml内容如下。
root@vms61:~/demo4# cat bb-contraint.yaml
apiVersion: constraints.gatekeeper.sh/v1beta1
kind: LBTypeSvcNotAllowed
metadata:name: deny-create-lb-type-svc
spec:match:kinds:- apiGroups: [""]kinds: ["Service"]namespaces:- "default"
root@vms61:~/demo4#
创建此资源。
root@vms61:~/demo4# kubectl apply -f bb-contraint.yaml
lbtypesvcnotallowed.constraints.gatekeeper.sh/deny-create-lb-type-svc created
root@vms61:~/demo4#
root@vms61:~/demo4# kubectl get lbtypesvcnotallowed
NAME AGE
deny-create-lb-type-svc 4s
root@vms61:~/demo4#
再次创建LoadBalancer的service。
root@vms61:~/demo4# kubectl expose --name=svc1 pod pod1 --port=80 --type=LoadBalancer
Error from server ([deny-create-lb-type-svc] 不允许创建LB类型的service!): admission webhook "validation.gatekeeper.sh" denied the request: [deny-create-lb-type-svc] 不允许创建LB类型的service!
root@vms61:~/demo4#
这里可以看到已经不允许创建了。
删除lbtypesvcnotallowed,则下面的资源会一起删除掉。
root@vms61:~/demo4# kubectl delete -f aa-tmp.yaml
constrainttemplate.templates.gatekeeper.sh "lbtypesvcnotallowed" deleted
root@vms61:~/demo4#
使用gatekeeper限制kubernetes创建特定类型的资源相关推荐
- 万字长文:Kubernetes 创建 Pod 时,背后到底发生了什么?
关注「开源Linux」,选择"设为星标" 回复「学习」,有我为您特别筛选的学习资料~ 全文大纲: K8s 组件启动过程 kubectl(命令行客户端) kube-apiserver ...
- Kubernetes Volume及其类型(NFS、SAN) - PV - PVC - PV与PVC与Pod的关系
目录 volume 卷 官方文档:卷 | Kubernetes 一.emptyDir(临时卷) 二.hostPath卷 type字段参数 hostPath 实验: 三.第3方提供的存储卷(百度云.阿里 ...
- oracle对象类型_如何创建Oracle类型对象
oracle对象类型 Today we will learn how to create Oracle Type Object. If you are working on a large proje ...
- Windows批处理命令快速获取文件夹下特定类型的文件名(2022.5.15)
Windows批处理命令快速获取文件夹下特定类型的文件名 (2022.5.15) 1.需求分析 2.batch简介 3.代码实现 3.1 八种编程语言分别实现 3.1.1 C# 实现 3.1.2 C+ ...
- 创建自定义类型转换器
三种方法可以创建自定义类型转换器: 实现ognl.TypeConverter接口 继承DefaultTypeConverter类 继承StrutsTypeConverter类 一般使用继承Defaul ...
- 【Flutter】Dart 泛型 ( 泛型类 | 泛型方法 | 特定类型约束的泛型 )
文章目录 一.Dart 泛型类与泛型方法 二.Dart 泛型中的特定类型约束 三.Dart 自带泛型 四.完整代码示例 五. 相关资源 一.Dart 泛型类与泛型方法 泛型作用 : 为 类 , 接口 ...
- php如何捕捉异常并抛出去,php抛出异常及捕捉特定类型异常解决办法
php抛出异常及捕捉特定类型异常解决思路是什么?异常捕获在现在不少的ide工具中都能够用快捷键很方便的添加上,防止用户看到自己看不懂的报错甚至莫名其妙崩溃,导致用户体验不好.即使是显示一个友好一些的崩 ...
- 慢查询的重构和优化特定类型的查询
目录 为什么查询速度会慢 如何找到慢查询 慢查询原因 偶尔很慢的情况 访问数据过多 是否向数据库请求了不需要的数据 MySQL是否在扫描额外的记录 重构查询的方式 一个复杂查询还是多个简单查询 切分查 ...
- R语言sys方法:sys.getpid函数获取R会话的进程ID、sys.glob函数和file.path函数匹配文件夹下的所有特定类型文件、sys.info函数获取系统和用户信息
R语言sys方法:sys.getpid函数获取R会话的进程ID.sys.glob函数和file.path函数匹配文件夹下的所有特定类型文件.sys.info函数获取系统和用户信息 目录
最新文章
- c语言图论,图论问题------大家过来看看
- 一打在2019年亮相的迷人科技项目:飞行汽车、子弹头列车、登月、……
- PHP扩展开发入门3------带参数的函数
- C#中Split用法 转
- 机动车驾驶人科目三考试项目及合格标准
- CVE-2022-22965 漏洞分析,安全问题早发现
- DealComment (注释处理工具)
- Ubuntu 16 安装JDK1.8
- 如何在 Git 里撤销(几乎)任何操作
- Ubuntu各类版本下载地址(网易镜像)
- bugku CTF杂项wp(1)
- jq插件之bxSlider
- 绝了!超全面的Java调优方案,我司已用7年,并得到验证!(万能通用)
- 电力系统机组调度 考虑了源荷不确定性 考虑源荷两侧不确定性的含风电的低碳调度,引入模糊机会约束,程序包括储能、风光、火电机组及水电机组
- 基于树莓派的微型气象台
- CNCERT在FIRST会议关于国内PC被攻击的数据
- Chromedriver适用谷歌浏览器的各个版本
- linux终端基本操作命令
- MySql数据查重、去重的实现
- 天生棋局与棋局判断(C语言)
热门文章
- 三星oneui主屏幕费电_三星最新力作,第三方桌面无处遁形,OneUI越来越自由
- PLC按时间启停设备运转,设备到期停止设备运转
- 多彩的产品之年——产品经理一席谈
- Janky frames 是如何计算出来的
- 路由器R473g虚拟服务器设置,TL-R473G上网方式配置详解 路由器
- 郭天祥的10天学会51单片机_第十三节
- operands could not be broadcast together with remapped shapes
- SYN包TCP选项的设置
- GlobalSign 发布了即将要修改代码签名证书的重要通知
- 重磅!网页版 VSCode 来了!