Tasks

Step-by-step instructions for performing operations with Kubernetes.

Edit This Page

使用 ThirdPartyResources 扩展 Kubernetes API

DEPRECATION NOTICE: As of Kubernetes 1.7, this has been deprecated

This feature is deprecated. For more information on this state, see the Kubernetes Deprecation Policy.

什么是 ThirdPartyResource ?

**ThirdPartyResource 在 Kubernetes 1.7 中被弃用。它在 1.8 版本中已经依据 降级策略 移除。

为了避免丢失存放于 ThirdPartyResource 的数据,在升级到 Kubernetes 1.8 或更高版本之前,必须将数据 迁移至 CustomResourceDefinition

Kubernetes 有许多的内置 API 对象。然而,为实现自定义自动化,很多时候需要使用您自己的 API 对象扩展 Kubernetes。

ThirdPartyResource 对象是一种使用新 API 对象类型扩展 Kubernetes API 的方式。新 API 对象类型会被赋予一个 API 端点 URL、支持的 CRUD 操作和 watch API。您可以使用这个 API 端点创建自定义对象。您可以将 ThirdPartyResources 理解为数据库表的 schema。一旦您创建了表,就可以在表中存放一行行的数据。ThirdPartyResources 一旦被创建,就能够像数据模型一样,服务于自定义控制器或者自动化程序。

ThirdPartyResource 的结构

每个 ThirdPartyResource 都包含:

ThirdPartyResourcekind 取自于 <kind name>.<domain>。您必须提供一个唯一的 kind 和 domain 名来防止与其他 ThirdPartyResource 对象冲突。当创建 ThirdPartyResource 实例时,Kind 名称会按照驼峰命名法(CamelCase)进行转换。kind 内的连字符用于断词,比如, camel-case 会转换成 CamelCase,而 camelcase 会转换成 Camelcase

ThirdPartyResource 的其他字段会被视作自定义数据字段。这些字段可以是任意 JSON 数据或者其他任何结构类型。

你可以使用 kubctl 的 explain 参数查看 ThirdPartyResources 的完整文档。

$ kubectl explain thirdpartyresource

创建 ThirdPartyResource

当创建一个新的 ThirdPartyResource,Kubernetes API Server 会创建一个新的、按 namespace 存放的 RESTful 资源路径。目前不支持 non-namespaced 的对象。与现有的内置对象一样,删除一个 namespace 会删除那个 namespace 中所有的自定义对象。 ThirdPartyResources 本身是 non-namespaced,并对所有 namespace 可用。

例如,如果将如下的 ThirdPartyResource 存到 resource.yaml

apiVersion: extensions/v1beta1
kind: ThirdPartyResource
metadata:
  name: cron-tab.stable.example.com
description: "A specification of a Pod to run on a cron style schedule"
versions:
- name: v1

然后进行创建:

$ kubectl create -f resource.yaml
thirdpartyresource "cron-tab.stable.example.com" created

那么一个新的 RESTful API 端点就会创建在:

/apis/stable.example.com/v1/namespaces/<namespace>/crontabs/...

这个端点 URL 就能用于创建和管理自定义对象。依据驼峰命名规则(应用于 ThirdPartyResource(cron-tab.stable.example.com) 的 metadata.name 字段),这些对象的 kind 值为 CronTab。

创建自定义对象

在创建了 ThirdPartyResource 对象之后,就可以创建自定义对象。自定义对象包含自定义字段。这些字段可以包含任意 JSON。 在如下例子中,cronSpecimage 字段被设置到了名为 CronTab 的自定义对象中。CronTab 取自我们刚刚创建的 ThirdPartyResource 对象的 metadata.name

如果你将如下 YAML 保存到 my-crontab.yaml 中:

apiVersion: "stable.example.com/v1"
kind: CronTab
metadata:
  name: my-new-cron-object
cronSpec: "* * * * /5"
image: my-awesome-cron-image

然后创建:

$ kubectl create -f my-crontab.yaml
crontab "my-new-cron-object" created

你就能使用 kubectl 管理 CronTab 对象。注意,使用 kubectl 时资源名是大小写不敏感的。

$ kubectl get crontab
NAME                 KIND
my-new-cron-object   CronTab.v1.stable.example.com

你也可以查看 JSON raw 数据。此处你可以看到它包含用于创建它的 yaml 文件中的 cronSpecimage 字段:

$ kubectl get crontab -o json
{
    "apiVersion": "v1",
    "items": [
        {
            "apiVersion": "stable.example.com/v1",
            "cronSpec": "* * * * /5",
            "image": "my-awesome-cron-image",
            "kind": "CronTab",
            "metadata": {
                "creationTimestamp": "2016-09-29T04:59:00Z",
                "name": "my-new-cron-object",
                "namespace": "default",
                "resourceVersion": "12601503",
                "selfLink": "/apis/stable.example.com/v1/namespaces/default/crontabs/my-new-cron-object",
                "uid": "6f65e7a3-8601-11e6-a23e-42010af0000c"
            }
        }
    ],
    "kind": "List",
    "metadata": {},
    "resourceVersion": "",
    "selfLink": ""
}

接下来

Analytics

Create an Issue Edit this Page