ThirdPartyResources

ThirdPartyResources(TPR)是一种无需改变代码就可以扩展 Kubernetes API 的机制,可以用来管理自定义对象。每个 ThirdPartyResource 都包含以下属性

  • metadata:跟 kubernetes metadata 一样
  • kind:自定义的资源类型,采用 <kind mame>.<domain> 的格式
  • description:资源描述
  • versions:版本列表
  • 其他:还可以保护任何其他自定义的属性

API 版本对照表

Kubernetes 版本 Extension 版本
v1.5-v1.7 extensions/v1beta1
v1.8+ 不再支持

[warning] ThirdPartyResources 已在 v1.8 删除

ThirdPartyResources 已在 v1.8 版本中删除。建议从 v1.7 开始,迁移到 CustomResourceDefinition(CRD)

TPR 示例

下面的例子会创建一个 /apis/stable.example.com/v1/namespaces/<namespace>/crontabs/... 的 API

  1. $ cat resource.yaml
  2. apiVersion: extensions/v1beta1
  3. kind: ThirdPartyResource
  4. metadata:
  5. name: cron-tab.stable.example.com
  6. description: "A specification of a Pod to run on a cron style schedule"
  7. versions:
  8. - name: v1
  9. $ kubectl create -f resource.yaml
  10. thirdpartyresource "cron-tab.stable.example.com" created

API 创建好后,就可以创建具体的 CronTab 对象了

  1. $ cat my-cronjob.yaml
  2. apiVersion: "stable.example.com/v1"
  3. kind: CronTab
  4. metadata:
  5. name: my-new-cron-object
  6. cronSpec: "* * * * /5"
  7. image: my-awesome-cron-image
  8. $ kubectl create -f my-crontab.yaml
  9. crontab "my-new-cron-object" created
  10. $ kubectl get crontab
  11. NAME KIND
  12. my-new-cron-object CronTab.v1.stable.example.com

ThirdPartyResources 与 RBAC

注意 ThirdPartyResources 不是 namespace-scoped 的资源,在普通用户使用之前需要绑定 ClusterRole 权限。

  1. $ cat cron-rbac.yaml
  2. apiVersion: rbac.authorization.k8s.io/v1alpha1
  3. kind: ClusterRole
  4. metadata:
  5. name: cron-cluster-role
  6. rules:
  7. - apiGroups:
  8. - extensions
  9. resources:
  10. - thirdpartyresources
  11. verbs:
  12. - '*'
  13. - apiGroups:
  14. - stable.example.com
  15. resources:
  16. - crontabs
  17. verbs:
  18. - "*"
  19. $ kubectl create -f cron-rbac.yaml
  20. $ kubectl create clusterrolebinding user1 --clusterrole=cron-cluster-role --user=user1 --user=user2 --group=group1

迁移到 CustomResourceDefinition

  1. 首先将 TPR 资源重定义为 CRD 资源,比如下面这个 ThirdPartyResource 资源
  1. apiVersion: extensions/v1beta1
  2. kind: ThirdPartyResource
  3. metadata:
  4. name: cron-tab.stable.example.com
  5. description: "A specification of a Pod to run on a cron style schedule"
  6. versions:
  7. - name: v1

需要重新定义为

  1. apiVersion: apiextensions.k8s.io/v1beta1
  2. kind: CustomResourceDefinition
  3. metadata:
  4. name: crontabs.stable.example.com
  5. spec:
  6. scope: Namespaced
  7. group: stable.example.com
  8. version: v1
  9. names:
  10. kind: CronTab
  11. plural: crontabs
  12. singular: crontab
  1. 创建 CustomResourceDefinition 定义后,等待 CRD 的 Established 条件:
  1. $ kubectl get crd -o 'custom-columns=NAME:{.metadata.name},ESTABLISHED:{.status.conditions[?(@.type=="Established")].status}'
  2. NAME ESTABLISHED
  3. crontabs.stable.example.com True
  1. 然后,停止使用 TPR 的客户端和 TPR Controller,启动新的 CRD Controller。

  2. 备份数据

  1. $ kubectl get crontabs --all-namespaces -o yaml > crontabs.yaml
  2. $ kubectl get thirdpartyresource cron-tab.stable.example.com -o yaml --export > tpr.yaml
  1. 删除 TPR 定义,TPR 资源会自动复制为 CRD 资源
  1. $ kubectl delete thirdpartyresource cron-tab.stable.example.com
  1. 验证 CRD 数据是否迁移成功,如果有失败发生,可以从备份的 TPR 数据恢复
  1. $ kubectl create -f tpr.yaml
  1. 重启客户端和相关的控制器或监听程序,它们的数据源会自动切换到 CRD(即访问 TPR 的 API 会自动转换为对 CRD 的访问)