亲眼看 API Server 真的拒绝掉什么
本实验运行在真实 API 服务器上
CRD 的作用是“把 API 服务器已有的能力借给自定义类型”。 这些能力包括模式验证、默认值、RBAC、审计与 watch。
但伪造的集群没有这些能力。无论放入什么内容都会接受,因此无法看到错误值被拒绝,也无法看到默认值得到填充。 只有真正被拒绝过,才能理解契约是什么。
首次启动大约需要两分钟。
目标
为开发者设计一个平台 API,并确认它能真正充当边界。
步骤
- 创建 CRD,并把 API 服务器接受它的证据保存到
/root/cnpa/crd.txt。 - 把模式拒绝错误值的证据保存到
/root/cnpa/validate.txt。 - 把默认值得到填充的证据保存到
/root/cnpa/defaults.txt。 - 添加输出列,让
kubectl get的结果真正实用,并保存到/root/cnpa/columns.txt。 - 使用 RBAC 规定开发者能够执行的操作,并把证据保存到
/root/cnpa/rbac.txt。 - 使用配额建立资源边界,并把证据保存到
/root/cnpa/quota.txt。 - 根据部署台账计算 DORA 指标,并保存到
/root/cnpa/dora.txt。 - 在
/root/cnpa/report.md中写入crd_kind=、rejected=yes、deploy_freq=三行及说明。
参考
kubectl explain会读取 CRD 模式,这正是无需另写文档的原因。- 请原样保留拒绝消息,它就是契约的证据。
- 常见错误:设置
x-kubernetes-preserve-unknown-fields: true,这会同时关闭字段裁剪和验证。 - 常见错误:使用
additionalProperties: false。它不能与properties同时使用,也没有必要使用。 - 常见错误:让控制器填充默认值。若由API 服务器填充,就能立即在
kubectl get -o yaml中看到。
把自定义类型注册到 API
创建 CRD,并把 API 服务器接受它的证据保存到 /root/cnpa/crd.txt。
需要 group、names、versions 三项,也请同时查看 served 与 storage。
只有被拒绝过,才能理解契约
把模式拒绝错误值的证据保存到 /root/cnpa/validate.txt。
尝试省略必填字段、使用错误类型,以及加入不存在的字段。
由 API 服务器填充遗漏值
把默认值得到填充的证据保存到 /root/cnpa/defaults.txt。
把 default: 放在模式中,保存时就会填充。请使用 kubectl get -o yaml 确认。
kubectl get 必须实用,用户才会采用
添加输出列,让 kubectl get 的结果真正实用,并保存到 /root/cnpa/columns.txt。
把 additionalPrinterColumns 放在 versions 下。
规定开发者能够执行的操作
使用 RBAC 规定开发者能够执行的操作,并把证据保存到 /root/cnpa/rbac.txt。
CRD 与其他资源一样受 RBAC 控制。请使用 kubectl auth can-i --as 确认。
资源边界
使用配额建立资源边界,并把证据保存到 /root/cnpa/quota.txt。
ResourceQuota 限制整个命名空间的资源总量,LimitRange 则规定单个 Pod 的默认值与上限。
指标取决于如何计算
根据部署台账计算 DORA 指标,并保存到 /root/cnpa/dora.txt。
请根据部署台账直接计算四项指标。改变答案的不是定义,而是实际统计了什么。
学到了什么
在 /root/cnpa/report.md 中写入 crd_kind=、rejected=yes、deploy_freq= 三行及说明。
请写入 crd_kind=、rejected=yes、deploy_freq= 三行及说明。