一、集群环境


底层系统为ubuntu18.04,然后在每个node上安装k8s,并构建集群。Master node的IP地址为192.168.26.71/24,两个Worker node的IP地址为192.168.26.72/24、192.168.26.73/24。部署Calico网络插件,保证Node之间能够正常通信。

二、准入控制器

1.什么是准入控制器

kube-apiserver是Kubernetes集群的中心,集群中所有资源的创建和更新都是通过APIServer的Restful API实现的。 因此Kubernetes通过一系列的机制来保证APIServer的安全,包括APIServer的认证、授权以及本文中我们会使用的准入控制Admission Control。上图是APIServer被访问控制的过程,在经过认证和授权之后就进入了准备控制Admission Control。

认证的操作请查看:https://blog.csdn.net/tushanpeipei/article/details/121877797?spm=1001.2014.3001.5501
授权的操作请查看:https://blog.csdn.net/tushanpeipei/article/details/121894874?spm=1001.2014.3001.5501

准入控制器可以理解为功能开关,可以启用或者关闭。其包含的类型有很多,包括了之前笔记中提到的:

  1. Pod 安全策略(Pod Security Policy)
  2. OPA (Open Policy Agent)规则
  3. NodeRestriction

在我们环境中kube-apiserver是通过容器执行的。所以我们可以使用如下的命令查看准入控制器的相关内容:

kubectl exec -it -n kube-system kube-apiserver-vms71.rhce.cc -- kube-apiserver -h | grep enable-admission-plugins

在其显示的信息中,我们可以看到在当前版本中默认开启的准入控制分别是:

CertificateApproval, CertificateSigning, CertificateSubjectRestriction, DefaultIngressClass, DefaultStorageClass, DefaultTolerationSeconds, LimitRanger, MutatingAdmissionWebhook, NamespaceLifecycle, PersistentVolumeClaimResize, Priority, ResourceQuota, RuntimeClass, ServiceAccount, StorageObjectInUseProtection, TaintNodesByCondition, ValidatingAdmissionWebhook

2.如何开启和关闭对应的准入控制器
kube-apiserver的 enable-admission-plugins 标志接受一个用于在集群修改对象之前 调用的(以逗号分隔的)准入控制插件顺序列表。

例如,下面的命令就启用了 NamespaceLifecycle 和 LimitRanger 准入控制插件。首先编辑kube-apiserver.yaml文件:

vim /etc/kubernetes/manifests/kube-apiserver.yaml

在command一栏下找到 --enable-admission-plugins=,添加自己想要开启的准入控制器。例如,下面的命令就启用了 NamespaceLifecycle 和 LimitRanger 准入控制插件:

--enable-admission-plugins=NamespaceLifecycle,LimitRanger

同样的,要想关闭默认启用的准入控制器插件,可以同样在command一栏下,找到–disable-admission-plugins,然后设置准备关闭的插件,例如,如下命令就跟关闭了PodNodeSelector和AlwaysDeny插件。

--disable-admission-plugins=PodNodeSelector,AlwaysDeny

3.每个准入控制器的作用是什么?

请查看官方文档:https://kubernetes.io/zh/docs/reference/access-authn-authz/admission-controllers/#每个准入控制器的作用是什么

4.整理创建pod调度的过程

  1. 用户通过可视化或者kubectl命令连接到kube-apiserver。kube-apiserver判断用户是否登录,是否有权限(认证和授权);
  2. 各种准入控制检测此创建pod请求的的合法性。如果请求符合各种准入控制器规则,则允许此请求,否则直接拒绝;
  3. 通过后准入控制器规则后,kubelet或者scheduler通过watch权限能够看到pod的状态为pending;
  4. schduler会通过主机排除、打分决定该pod运行在哪个worker node上;
  5. kubelet开始运行pause容器,创建相关的PID命名空间、网络命名空间等;
  6. pod被创建出来。

三、举例一:ResourceQuota准入控制器

ResourceQuota是默认开启的准入控制器插件,可以帮助我们限制K8s的资源配额。例如,我们使用如下yaml文件创建一个ResourceQuota准入控制器,限制只能创建2个pod:

apiVersion: v1
kind: ResourceQuota
metadata:name: myrq
spec:hard:pods: "2"

查看所部署的ResourceQuota:

root@vms71:~/admission-controllers# kubectl get resourcequotas
NAME   AGE   REQUEST     LIMIT
myrq   36s   pods: 0/2

然后我们使用deployment同时部署3个pod,deployment的yaml文件如下:

apiVersion: apps/v1
kind: Deployment
metadata:creationTimestamp: nulllabels:app: web1name: web1
spec:replicas: 3selector:matchLabels:app1: web1strategy: {}template:metadata:creationTimestamp: nulllabels:app1: web1app2: web1spec:containers:- image: nginxname: nginximagePullPolicy: IfNotPresentresources: {}

应用后可以看到如下的结果:3个pod仅能启用两个,说明我们ResourceQuota准入控制器部署成功。

root@vms71:~/admission-controllers# kubectl get deployments.apps web1
NAME   READY   UP-TO-DATE   AVAILABLE   AGE
web1   2/3     2            2           10s
root@vms71:~/admission-controllers# kubectl get resourcequotas
NAME   AGE   REQUEST     LIMIT
myrq   12m   pods: 2/2

四、举例二:ImagePolicyWebhook准入控制器

ImagePolicyWebhook 准入控制器允许使用一个后端的 webhook 做出准入决策。

1.部署webhook服务器

使用集群外的另外一台Linux设备作为webhook服务,并在设备上安装好docker。下载一个已经内置规则的webhook服务器镜像:

docker pull flavio/kube-image-bouncer

这个webhook服务器所实现的规则是不允许我们我们使用最新的镜像来部署容器。然后通过此镜像生成webhook服务器容器(这里没有生成和使用对应的证书,测试环境中可能会报错,所以后续kube-apiserver直接通过http来访问webhook服务器):

docker run -dit --name=c1 --restart=always  -v `pwd`/webhook-key.pem:/certs/webhook-key.pem:ro -v `pwd`/webhook.pem:/certs/webhook.pem:ro -p 1323:1323 flavio/kube-image-bouncer

查看是否部署完成:

[root@localhost ~]# docker ps
CONTAINER ID   IMAGE                       COMMAND                  CREATED              STATUS              PORTS                    NAMES
b1b092ebd6b9   flavio/kube-image-bouncer   "./kube-image-bouncer"   About a minute ago   Up About a minute   0.0.0.0:1323->1323/tcp   c1

可以看到,已经部署成功。当我们访问这台设备(192.168.26.130)的1323端口时,也就访问到这个服务器了。

2.在K8s上启用ImagePolicyWebhook准入控制器

在master上修改/etc/kubernetes/manifests/kube-apiserver.yaml文件,启用ImagePolicyWebhook:

- --enable-admission-plugins=NodeRestriction,ImagePolicyWebhook

接下来,我们需要编辑ImagePolicyWebhook的配置文件中,ImagePolicyWebhook 使用配置文件来为后端服务器设置配置选项。该文件可以是 JSON 或 YAML,例如:

root@vms71:/etc/kubernetes/aa# cat admission_configuration.yaml
imagePolicy:# 指定kubeconfig的位置kubeConfigFile: /etc/kubernetes/aa/kubeconfig.yaml# 以秒计的时长,控制批准请求的缓存时间allowTTL: 50# 以毫秒计的时长,控制重试间隔denyTTL: 50# 确定 Webhook 后端失效时的行为retryBackoff: 500# 默认是允许的规则defaultAllow: true

ImagePolicyWebhook 的配置文件必须引用 kubeconfig 格式的文件;该文件设置了到后端的连接参数、证书等信息(本实验中没有),如:

apiVersion: v1
kind: Config
clusters:
- cluster:certificate-authority: /etc/kubernetes/aa/webhook.pemserver: http://192.168.26.130:1323/image_policyname: bouncer_webhook
contexts:
- context:cluster: bouncer_webhookuser: api-servername: bouncer_validator
current-context: bouncer_validator
preferences: {}
users:
- name: api-serveruser:client-certificate: /etc/kubernetes/aa/apiserver-client.pemclient-key:  /etc/kubernetes/aa/apiserver-client-key.pem

其中server: http://192.168.26.130:1323/image_policy指定了我们通过http连接到webhook服务器的1323端口。由于不是使用https的方式,其他的证书相关的内容,其实这里没有作用了。然后,我们还需要在kube-apiserver中指定ImagePolicyWebhook所使用的配置文件。同样在/etc/kubernetes/manifests/kube-apiserver.yaml文件中的command下,添加如下的信息即可:

- --admission-control-config-file=/etc/kubernetes/aa/admission_configuration.yaml

由于我们kube-apiserver以容器方式运行。而我们webhook相关的文件存放在宿主机上,所以要做一个挂载卷,将这些文件映射到容器中的相同目录下,同样编辑/etc/kubernetes/manifests/kube-apiserver.yaml文件,增加如下内容:

    volumeMounts:- mountPath: /etc/kubernetes/aaname: aareadOnly: truevolumes:- hostPath:path: /etc/kubernetes/aatype: DirectoryOrCreatename: aa

重启kubelet:

systemctl restart kubelet.service

3.测试能否使用latest的镜像部署pod

root@vms71:/etc/kubernetes/aa# kubectl run pod1 --image=nginx --image-pull-policy=IfNotPresent
Error from server (Forbidden): pods "pod1" is forbidden: image policy webhook backend denied one or more images: Images using latest tag are not allowed

可以看到,当我们尝试使用最新的nginx镜像创建pod时,会提示报错信息,告知我们不能够使用带有latest tag的镜像。说明webhook准入控制已经部署成功。

整理资料来源:
K8s admission-controllers: https://kubernetes.io/docs/reference/access-authn-authz/admission-controllers/
《老段CKS课程》

三十、K8s供应链安全1-准入控制器相关推荐

  1. delete kubectl pod_使用kubectl管理k8s集群(三十)

    原标题:使用kubectl管理k8s集群(三十) 前言 Foreword 在搭建k8s集群之前,我们需要先了解下kubectl的使用,以便在集群部署出现问题时进行检查和处理.命令和语法记不住没有关系, ...

  2. 使用Kubeadm创建k8s集群之节点部署(三十二)

    前言 由于上次忘开申明原创,特再发一次. 本篇部署教程将讲述k8s集群的节点(master和工作节点)部署,请先按照上一篇教程完成节点的准备.本篇教程中的操作全部使用脚本完成,并且对于某些情况(比如镜 ...

  3. 【云原生 | Kubernetes 系列】K8s 实战 一文学会如何从 PodSecurityPolicy 迁移到内置的 PodSecurity 准入控制器

    PodSecurityPolicy 迁移到内置的 PodSecurity 准入控制器 前言 一.Pod 安全性 二.访问权限 三.标准化 PodSecurityPolicy 3.1.去掉纯粹变更性质的 ...

  4. 浅识k8s中的准入控制器

    背景 在 k8s中各组件和kube apiserver通信时的认证和鉴权 中提到"NodeRestriction准入插件",实际上它是一个"准入控制器". &q ...

  5. 智选假日酒店品牌创立三十周年;首家汉庭新品旗舰店落子天津;百胜中国西南供应链支持中心落户成都 | 美通企业周刊...

    一周企业资讯看点:智选假日酒店迎品牌三十周年.首家汉庭新品旗舰店落子天津.美的智能家电搭载华为鸿蒙系统产品将大批量上市.奥特斯投资约2亿欧元,进一步提升重庆工厂ABF载板产能.卡瓦集团上海总部创新卓越 ...

  6. webapi控制器怎么接收json_新手指南之 Kubernetes 准入控制器

    Kubernetes 准入控制器在安全性方面具有明显优势.为了增进各位读者对它的了解,今天 K8sMeetup 中国社区翻译了工程师 Malte Isberner 的技术博客,以两个生动的演示和相关代 ...

  7. 集群故障处理之处理思路以及健康状态检查(三十二)

    前言 按照笔者的教程,大家应该都能够比较顺畅的完成k8s集群的部署,不过由于环境.配置以及对Linux.k8s的不了解会导致很多问题.异常和故障,这里笔者分享一些处理技巧和思路,以及部分常见的问题,以 ...

  8. 【k8s权威指南】第三章 k8s核心原理

    k8s 核心原理分析 本文内容 API Server 原理分析 Controller Manager原理分析 Scheduler 调度器原理分析 kubelet 运行机制分析 一. k8s API S ...

  9. Kubernetes准入控制器指南

    Kubernetes准入控制器指南 作者:Malte Isberner(StackRox) Kubernetes极大地提高了当今生产中后端群集的速度和可管理性.由于其灵活性.可扩展性和易用性,Kube ...

  10. kubernetes安全:RBAC,Security Context,PSP,准入控制器

    文章目录 RBAC 权限控制前言 API 对象 RBAC 只能访问某个 namespace 的普通用户 创建用户凭证 创建角色 创建角色权限绑定 测试 只能访问某个 namespace 的 Servi ...

最新文章

  1. UVa11646 - Athletics Track(水题)
  2. Javag工程师成神之路(2019正式版)
  3. win 文字转化为语音
  4. AcWing算法基础课 Level-2 第二讲 数据结构
  5. HttpServletRequest常用获取URL的方法
  6. 华为性能服务器,服务器 性能
  7. ACM一类方程问题的求解[最短路建模] bzoj2118
  8. python自然语言分析 何翠仪_如何用 Python 中的 NLTK 对中文进行分析和处理?
  9. LeetCode C语言刷题——day1
  10. 为什么金融分析需要应用python语言_python入门第一篇:python语言简介
  11. 传智播客Java switch和循环
  12. DSDT/SSDT综合教程
  13. msfconsole php,msfconsole从入门到放弃
  14. 微信小程序开发(7)---协同工作篇
  15. 网站发布的文章如何快速被收录?
  16. w3c怎么检测html5,HTML5教程:html标签属性通过w3c验证
  17. Faulty Robot-(dfs或者dijkstra)
  18. 网络安全入门基础须知
  19. 大数据不是你想有就能有,如何才能“狂拽炫酷吊炸天”
  20. 单点登录cas-4.0.0 只是简单的同时登入,同时登出功能

热门文章

  1. 实例快速上手shell脚本
  2. 干货 | 一文掌握常用的机器学习模型
  3. Window10上使用Git与Github远程仓库互连
  4. torch.max;PyTorch中 tensor.detach() 和 tensor.data 的区别;
  5. 跟着AlphaGo 理解深度强化学习框架
  6. 《Java程序员职场全攻略:从小工到专家》连载十五:我们不是爱加班
  7. windows系统文件和dll文件
  8. Spatial-Channel Sequeeze Excitation (SCSE)-8-June-2018【论文理解】
  9. python很有用吗_Python之父:为什么操作符很有用?
  10. redirect_uri 域名与后配置不一致是什么意思_网站域名怎么购买?多少钱?