在本文中,我们将讨论如何使用 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。以下示例添加REPLICAS、VERSION和Age列。
将 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
请注意输出中的NAME、REPLICAS、VERSION和列:AGE
NAME REPLICAS VERSION AGE
test-app 3 release-1.0.0 4s
总结
在本文中,您了解了什么是自定义资源以及如何使用 CRD 扩展 Kubernetes API。您可以使用kubectl轻松创建和访问自定义资源对象,就像 Pod 等内置资源一样。
CRD 在与自定义控制器结合使用并用作声明性 API 时非常有用,可确保当前状态和所需状态始终保持同步。要了解有关 Kubernetes 控制器是什么的更多信息,请参阅下面的文章。