系列目录

动态准入控制器文档介绍了如何使用标准的,插件式的准入控制器.但是,但是由于以下原因,插件式的准入控制器在一些场景下并不灵活:

  • 它们需要编译到kube-apiserver里

  • 它们仅在apiserver启动的时候可以配置

准入钩子(Admission Webhooks 从1.9版本开始)解决了这些问题,它允许准入控制器独立于核心代码编译并且可以在运行时配置.

什么是准入钩子

准入钩子是一种http回调,它接收准入请求然后做一些处理.你可以定义两种类型的准入钩子:验证钩子变换钩子.对于验证钩子,你可以拒绝请求以使自定义准入策略生效.对于变换钩子,你可以改变请求来使自定义的默认配置生效.

体验准入钩子

准入控制钩子是集群管制面板不可缺少的一部分.你在编写部署它们时必须要警惕.如果你想要编写/布置生产级别的准入控制器,请阅读以下用户指南.下面我们将介绍如何快速体验准入钩子.

准备工作:

  • 确保你的kubernetes集群版本至少是1.9版本.

  • 确保变换钩子(MutatingAdmissionWebhook) 和验证钩子(ValidatingAdmissionWebhook)已经启用.这里是推荐开启的一组准入控制器.

编写一个准入钩子服务器(admission webhook server)

请参阅已经被kubernetes e2e测试验证通过的准入服务器钩子( admission webhook server)的实现.这个web钩子处理apiserver发出的admissionReview请求,然后把结果封装成一个admissionResponse返回给请求者.

admissionReview请求可能有多个版本( v1beta1 或者 未来的v1),web钩子可以通过admissionReviewVersions字段来定义它们接受的版本.apiserver会尝试使用列表中出现的,支持的第一个版本.如果列表中的版本没有一个是被支持的,验证将失败.如果webhook配置已经持久化,对web钩子的请求将会失败并被失败策略控制.

示例钩子服务器(admission webhook server)把ClientAuth字段留空,默认为NoClientCert.这意味着钩子服务器不验证客户端身份.如果你需要使用mutual TLS 或者其它方法来验证客户端请求,请参考如何认证apiserver

部署准入控制服务

e2e测试的钩子服务器通过部署api(https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.14/#deployment-v1beta1-apps)被部署到kubernetes集群中.测试项目也为钩子服务器创建了一个前端服务,代码

你也可以把你的钩子服务部署到集群外,你需要相应地更新web钩子客户端配置

运行时配置准入web钩子

你可以通过ValidatingWebhookConfigurationMutatingWebhookConfiguration动态地配置哪些资源被哪些web钩子控制.

以下是一个validatingWebhookConfiguration配置的示例,变换钩子的配置也类似

apiVersion: admissionregistration.k8s.io/v1beta1
kind: ValidatingWebhookConfiguration
metadata:
name: <name of this configuration object>
webhooks:
- name: <webhook name, e.g., pod-policy.example.io>
rules:
- apiGroups:
- ""
apiVersions:
- v1
operations:
- CREATE
resources:
- pods
scope: "Namespaced"
clientConfig:
service:
namespace: <namespace of the front-end service>
name: <name of the front-end service>
caBundle: <pem encoded ca cert that signs the server cert used by the webhook>
admissionReviewVersions:
- v1beta1
timeoutSeconds: 1

scope字段指定了集群级别的资源("Cluster")或者名称空间级别的资源("Namespaced")需要匹配这些规则."*"表示没有任何范围限制.

注意,如果使用clientConfig.service,服务端证书必须对<svc_name>.<svc_namespace>.svc有效.

web钩子请求默认超时时间为30秒,但是从1.14版本开始,你可以自由设置超时时间但是建议设置较小的时间.如果web钩子请求超时,请求将被web钩子的失败策略处理.

当apiserver接收到一个匹配规则的请求,apiserver将会发送一个admissionReview请求到clientConfig配置的web钩子里.

创建web钩子配置以后,系统将会经过一段时间使新配置生效.

认证apiserver

如果你的准入web钩子需要认证,你可以配置apiserver使用基本认证(basic auth), bearer token 或者证书认证.需要三个步骤来完成认证配置.

  • 当启动apiserver时,通过--admission-control-config-file选项来指定准入控制配置文件的位置.

  • 在准入控制配置文件里,指定变换控制器(MutatingAdmissionWebhook)和验证控制器(ValidatingAdmissionWebhook)从哪里读取证书.证书存储在kubeConfig文件里(和kubectl使用的相同),字段名为kubeConfigFile.下面是准入控制配置文件示例

apiVersion: apiserver.k8s.io/v1alpha1
kind: AdmissionConfiguration
plugins:
- name: ValidatingAdmissionWebhook
configuration:
apiVersion: apiserver.config.k8s.io/v1alpha1
kind: WebhookAdmission
kubeConfigFile: <path-to-kubeconfig-file>
- name: MutatingAdmissionWebhook
configuration:
apiVersion: apiserver.config.k8s.io/v1alpha1
kind: WebhookAdmission
kubeConfigFile: <path-to-kubeconfig-file>

这里是admissionConfigurationschema定义

  • 在kubeConfig文件里,提供证书
apiVersion: v1
kind: Config
users:
# DNS name of webhook service, i.e., <service name>.<namespace>.svc, or the URL
# of the webhook server.
- name: 'webhook1.ns1.svc'
user:
client-certificate-data: <pem encoded certificate>
client-key-data: <pem encoded key>
# The `name` supports using * to wildmatch prefixing segments.
- name: '*.webhook-company.org'
user:
password: <password>
username: <name>
# '*' is the default match.
- name: '*'
user:
token: <token>

当然,你需要设置web钩子服务器来处理这些认证.

kubernetes高级之动态准入控制的更多相关文章

  1. Kubernetes 两步验证 - 使用 Serverless 实现动态准入控制

    作者:CODING - 王炜 1. 背景 如果对 Kubernetes 集群安全特别关注,那么我们可能想要实现这些需求: 如何实现 Kubernetes 集群的两步验证,除了集群凭据,还需要提供一次性 ...

  2. 手把手教你在容器服务 TKE 中使用动态准入控制器

    在 TKE 中使用动态准入控制器 原理概述 动态准入控制器 Webhook 在访问鉴权过程中可以更改请求对象或完全拒绝该请求,其调用 Webhook 服务的方式使其独立于集群组件,具有非常大的灵活性, ...

  3. (十二)Kubernetes 认证、授权与准入控制

    访问控制概述 API Server作为Kubernetes集群系统的网关,是访问和管理资源对象的唯一入口:包括kube-controller-manager.kube-scheduler.kubele ...

  4. kubernetes集群的认证、授权、准入控制

    一.kubernetes集群安全架构 用户使用kubectl.客户机或通过REST请求访问API.可以授权用户和Kubernetes服务帐户进行API访问.当一个请求到达API时,它会经历几个阶段,如 ...

  5. 容器编排系统K8s之访问控制--准入控制

    前文我们聊到了k8s的访问控制第二关RBAC授权插件的相关话题,回顾请参考:https://www.cnblogs.com/qiuhom-1874/p/14216634.html:今天我们来聊一下k8 ...

  6. 第13 章 : Kubernetes 网络概念及策略控制

    Kubernetes 网络概念及策略控制 本文将主要分享以下 5 方面的内容: Kubernetes 基本网络模型: Netns 探秘: 主流网络方案简介: Network Policy 的用处: 思 ...

  7. c#, AOP动态代理实现动态权限控制(一)

    因最近工作需要一个动态的权限配置功能,具体实现逻辑是c#的动态代理功能,废话不多说,直接干货.需求: 用户分为管理员.普通用户 不同用户拥有不同功能权限 用户的权限可配置 新增功能时,不用修改权限配置 ...

  8. 技术的正宗与野路子 c#, AOP动态代理实现动态权限控制(一) 探索基于.NET下实现一句话木马之asmx篇 asp.net core 系列 9 环境(Development、Staging 、Production)

    黄衫女子的武功似乎与周芷若乃是一路,飘忽灵动,变幻无方,但举手抬足之间却是正而不邪,如说周芷若形似鬼魅,那黄衫女子便是态拟神仙. 这段描写出自<倚天屠龙记>第三十八回. “九阴神抓”本是& ...

  9. Kubernetes学习之路(十八)之认证、授权和准入控制

    API Server作为Kubernetes网关,是访问和管理资源对象的唯一入口,其各种集群组件访问资源都需要经过网关才能进行正常访问和管理.每一次的访问请求都需要进行合法性的检验,其中包括身份验证. ...

随机推荐

  1. LINUX学习资源

    鸟哥:http://vbird.dic.ksu.edu.tw/linux_basic/0430cron.php#cron 五分钟教程:http://roclinux.cn/?page_id=3759

  2. Educational Codeforces Round 31 B. Japanese Crosswords Strike Back【暴力】

    B. Japanese Crosswords Strike Back time limit per test 1 second memory limit per test 256 megabytes ...

  3. hdu3507(初识斜率优化DP)

    hdu3507 题意 给出 N 个数字,输出的时候可以选择连续的输出,每连续输出一串,它的费用是 这串数字和的平方加上一个常数 M. 分析 斜率优化dp,入门题. 参考 参考 得到 dp 方程后,发现 ...

  4. HDU 4251 The Famous ICPC Team Again(划分树)

    The Famous ICPC Team Again Time Limit: 30000/15000 MS (Java/Others)    Memory Limit: 32768/32768 K ( ...

  5. luogu P1347 排序

    题目描述 一个不同的值的升序排序数列指的是一个从左到右元素依次增大的序列,例如,一个有序的数列A,B,C,D 表示A<B,B<C,C<D.在这道题中,我们将给你一系列形如A<B ...

  6. [POI2014]Supercomputer

    题目大意: 给定一个$n(n\le10^6)$个结点的有根树,从根结点开始染色.每次可以染和已染色结点相邻的任意$k$个结点.$q(q\le10^6)$组询问,每次给定$k$,问至少需要染几次? 思路 ...

  7. oracle中执行execute的时候报异常ORA-01031的解决办法

    在做实验的时候,编写关于"在存储过程中使用动态sql,建立一个统计表,并把统计结果,插入这个表中"的PL/sql语句在执行时出现权限不足的问题. 上网查询很多,看到了下面这篇博文( ...

  8. 解决android客户端使用soap与服务器通讯错误415

    在编写一个android client与服务器使用soap通讯,虽然能连上但不是正常的200代码,而是415,经查询是"HTTP 415 错误 – 不 支持的媒体类型(Unsupported ...

  9. 【教训】null == '',改造ThinkSNS 系统里面的一个缓存管理函数S()后,留下一个大bug

    本来想简化 ThinkSNS 系统里面的一个缓存管理函数: <?php /** * 用来对应用缓存信息的读.写.删除 * $expire = null/0 表示永久缓存,否则为缓存有效期 */ ...

  10. Enum枚举类使用集合

    1.使用扩展方法使用枚举值对于的Description属性值 public static class EnumExtenstion { public static string GetDescript ...