详解如何使用 kubectl 创建简单的自定义资源

169 阅读4分钟

在本文中,我们将讨论如何使用 kubectl CRD来创建自定义资源

本博客涵盖以下主题。

  • 什么是 Kubernetes 资源
  • 什么是自定义资源(CR)
  • 什么是自定义资源定义 (CRD)
  • 创建自定义资源定义
  • 创建自定义对象
  • 添加更多信息

什么是 Kubernetes 资源

Kubernetes 资源是Kubernetes API中的端点,用于存储某种类型的API 对象的集合。例如,内置的 Pods 资源包含 Pod 对象的集合。

在 Kubernetes 中,有许多可用的内置资源。Kubernetes 资源的一些示例包括:

什么是自定义资源(CR)

自定义资源是扩展 Kubernetes API 或允许您将自己的 API 引入集群的对象。

自定义资源可以通过动态注册在正在运行的集群中出现和消失,并且集群管理员可以独立于集群本身更新自定义资源。

安装自定义资源后,用户可以使用kubectl创建和访问其对​​象,就像使用 Pod 等内置资源一样。

什么是自定义资源定义 (CRD)

CustomResourceDefinition (CRD) 定义要添加到集群的自定义资源的名称和结构。

CRD 允许用户创建新类型的自定义资源,而无需添加其他 API 服务器。定义 CRD 对象会创建一个具有您指定的名称和架构的新自定义资源。

当您创建新的 CRD 时,Kubernetes API Server 会创建一个新的 RESTful 资源路径来服务和处理自定义资源的存储。这使您无需编写自己的 API 服务器来处理自定义资源。

创建CRD

让我们创建一个简单的 CRD。这是我们将使用的YAML清单。您可以将以下 CRD 保存到crd.yaml

apiVersion: apiextensions.k8s.io/v1
kind: CustomResourceDefinition
metadata:
  # name must be in the form: <plural>.<group>
  name: myapps.example.com
spec:
  # group name to use for REST API: /apis/<group>/<version>
  group: example.com
  scope: Namespaced
  names:
    # kind is normally the CamelCased singular type. 
    kind: MyApp
    # singular name to be used as an alias on the CLI
    singular: myapp
    # plural name in the URL: /apis/<group>/<version>/<plural>
    plural: myapps
  versions:
  - name: v1
    served: true
    storage: true
    schema:
      openAPIV3Schema:
        type: object
        properties:
          spec:
            x-kubernetes-preserve-unknown-fields: true

下一步是使用以下命令创建 CRD :

➜   kubectl apply -f crd.yaml

您将收到以下回复:

customresourcedefinition.apiextensions.k8s.io/myapps.example.com created

现在您可以使用命令验证它kubectl api-resources | grep myapp。此命令打印服务器上支持的 API 资源。

使用它后,您应该看到以下输出:

NAME APIVERSION NAMESPACED KIND
myapps example.com/v1 true MyApp

创建自定义对象

创建 CRD 对象后,您可以创建自定义对象。自定义对象可以包含自定义字段。这些字段可以包含任意 JSON。

要创建自定义对象,您将使用以下 YAML 清单:

apiVersion: example.com/v1
kind: MyApp
metadata:
  name: test-app
spec:
  replicas: 3
  environment: dev
  version: release-1.0.0
  language: golang

您可以将上述 YAML 清单保存到test-app.yaml,并创建自定义对象:

kubectl apply -f test-app.yaml

然后,您可以使用 kubectl 管理您的 MyApp 对象。例如:

kubectl get myapp

应该打印这样的列表:

NAME AGE  
test-app 6s

使用 kubectl 时,资源名称不区分大小写,您可以使用 CRD 中定义的单数或复数形式,以及任何短名称。

您还可以查看自定义资源的原始 YAML 数据:

 kubectl get myapp test-app -o yaml

apiVersion: example.com/v1
kind: MyApp
metadata:
  creationTimestamp: "2022-06-04T09:06:33Z"
  generation: 1
  name: test-app
  namespace: test
  resourceVersion: "2191741"
spec:
  environment: dev
  language: golang
  replicas: 3
  version: release-1.0.0

删除自定义资源定义

当您删除 CustomResourceDefinition 时,服务器将卸载 RESTful API 端点并删除其中存储的所有自定义对象。

➜ kubectl delete -f crd.yaml
➜ kubectl get myapp
Error from server (NotFound): Unable to list "example.com/v1, Resource=myapps": the server could not find the requested resource (get myapps.example.com)

如果您稍后重新创建相同的 CustomResourceDefinition,它将开始为空。

添加附加打印机列

kubectl 工具依赖于服务器端输出格式。您的集群的 API 服务器决定命令显示哪些列kubectl get。您可以通过该字段为 CustomResourceDefinition 自定义这些列additionalPrinterColumns。以下示例添加REPLICASVERSIONAge列。

将 CustomResourceDefinition 保存到crd.yaml

apiVersion: apiextensions.k8s.io/v1
kind: CustomResourceDefinition
metadata:
  name: myapps.example.com
spec:
  group: example.com
  scope: Namespaced
  names:
    kind: MyApp
    singular: myapp
    plural: myapps
  versions:
  - name: v1
    served: true
    storage: true
    additionalPrinterColumns:
      - name: Replicas
        type: integer
        description: The number of pods launched by the MyApp
        jsonPath: .spec.replicas
      - name: Version
        type: string
        jsonPath: .spec.version
      - name: Age
        type: date
        jsonPath: .metadata.creationTimestamp
    schema:
      openAPIV3Schema:
        type: object
        properties:
          spec:
            x-kubernetes-preserve-unknown-fields: true

创建自定义资源定义:

kubectl apply -f crd.yaml

test-app.yaml使用上一节中的创建一个实例。调用服务器端打印:

kubectl get myapp test-app

请注意输出中的NAMEREPLICASVERSION和列:AGE

NAME       REPLICAS   VERSION         AGE
test-app   3          release-1.0.0   4s

总结

在本文中,您了解了什么是自定义资源以及如何使用 CRD 扩展 Kubernetes API。您可以使用kubectl轻松创建和访问自定义资源对象,就像 Pod 等内置资源一样。

CRD 在与自定义控制器结合使用并用作声明性 API 时非常有用,可确保当前状态和所需状态始终保持同步。要了解有关 Kubernetes 控制器是什么的更多信息,请参阅下面的文章。

点击“关注” 获得更多精彩文章