Create a Custom Resource¶
- Create a Custom Resource
- Operators
- Ready Made Operators
- Create a Custom Resource and Operator using the Operator SDK
- Install sdk-operator
- Create the Operator
- Cleanup
- Application CRD
Create a Custom Resource (CR)¶
https://kubernetes.io/docs/tasks/extend-kubernetes/custom-resources/custom-resource-definitions/
Custom Resource Definitions (CRD) were added in Kubernetes v1.7 in June 2017. A CRD defines Custom Resources (CR). A CR is an extension of the Kubernetes API that allows you to store your own API Objects and lets the API Server handle the lifecycle of a CR. On their own, CRs simply let you store and retrieve structured data.
For instance, our Guestbook application consists of an object Guestbook
with attributes GuestbookTitle
and GuestbookSubtitle
, and a Guestbook handles objectes of type GuestbookMessage
with attributes Message
, Sender
.
You have to ask yourself if it makes sense if your objects are added as a Custom Resource to Kubernetes or not. If your API is a Declarative API you can consider adding a CR.
- Your API has a small number of small objects (resources).
- The objects define configuration of applications or infrastructure.
- The objects are updated relatively infrequently.
- Users often need to read and write the objects.
- main operations on the objects are CRUD (create, read, update and delete).
- Transactions between objects are not required.
It doesn't immediately make sense to store messages by Guestbook users in Kubernetes, but it might make sense to store meta-data about a Guestbook deployment, for instance the title and subtitle of a Guestbook deployment, assigned resources or replicas.
Another benefit of adding a Custom Resource is to view your types in the Kubernetes Dashboard.
If you want to deploy a Guestbook instance as a Kubernetes API object and let the Kubernetes API Server handle the lifecycle events of the Guestbook deployment, you can create a Custom Resource Definition (CRD) for the Guestbook object as follows. That way you can deploy multiple Guestbooks with different titles and let each be managed by Kubernetes.
cat <<EOF >>guestbook-crd.yaml
apiVersion: apiextensions.k8s.io/v1
kind: CustomResourceDefinition
metadata:
name: guestbooks.apps.ibm.com
spec:
group: apps.ibm.com
versions:
- name: v1
served: true
storage: true
schema:
openAPIV3Schema:
type: object
properties:
spec:
type: object
properties:
guestbookTitle:
type: string
guestbookSubtitle:
type: string
scope: Namespaced
names:
plural: guestbooks
singular: guestbook
kind: Guestbook
shortNames:
- gb
EOF
- You can see that the
apiVersion
is part of theapiextensions.k8s.io/v1
API Group in Kubernetes, which is the API that enables extensions, and thekind
is set toCustomResourceDefinition
. - The
served
flag can disable and enable a version. - Only 1 version can be flagged as the storage version.
- The
spec.names.kind
is used by your resource manifests and should be CamelCased.
Create the Custom Resource for the Guestbook witht he command,
oc create -f guestbook-crd.yaml
When run in the terminal,
$ oc create -f guestbook-crd.yaml
customresourcedefinition.apiextensions.k8s.io/guestbooks.apps.ibm.com created
You have now added a CR to the Kubernetes API, but you have not yet created a deployment of type Guestbook yet.
Create a resource specification of type Guestbook named my-guestbook
,
cat <<EOF >>my-guestbook.yaml
apiVersion: "apps.ibm.com/v1"
kind: Guestbook
metadata:
name: my-guestbook
spec:
guestbookTitle: "The Chemical Wedding of Remko"
guestbookSubtitle: "First Day of Many"
EOF
And to create the my-guestbook
resource, run the command
oc create -f my-guestbook.yaml
When run in the terminal,
$ oc create -f my-guestbook.yaml
guestbook.apps.ibm.com/my-guestbook created
If you list all Kubernetes resources, only the default Kubernetes service is listed. To list your Custom Resources, add the extended type to your command.
$ oc get all
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
service/kubernetes ClusterIP 172.21.0.1 <none> 443/TCP 5d14h
service/openshift ExternalName <none> kubernetes.default.svc.cluster.local <none> 5d14h
service/openshift-apiserver ClusterIP 172.21.6.8 <none> =443/TCP 5d14h
$ oc get guestbook
NAME AGE
my-guestbook 8m32s
To read the details for the my-guestbook
of type Guestbook
, describe the instance,
$ oc describe guestbook my-guestbook
Name: my-guestbook
Namespace: default
Labels: <none>
Annotations: <none>
API Version: apps.ibm.com/v1
Kind: Guestbook
Metadata:
Creation Timestamp: 2020-06-30T20:31:36Z
Generation: 1
Resource Version: 1081471
Self Link: /apis/apps.ibm.com/v1/namespaces/default/guestbooks/my-guestbook
UID: dcbdcafc-999d-4051-9244-0315093357e7
Spec:
Guestbook Subtitle: First Day of Many
Guestbook Title: The Chemical Wedding of Remko
Events: <none>
Or retrieve the resource information by specifying the type,
$ oc get Guestbook -o yaml
apiVersion: v1
items:
- apiVersion: apps.ibm.com/v1
kind: Guestbook
metadata:
creationTimestamp: "2020-07-02T04:41:57Z"
generation: 1
name: my-guestbook
namespace: default
resourceVersion: "1903244"
selfLink: /apis/apps.ibm.com/v1/namespaces/default/guestbooks/my-guestbook
uid: 3f774899-3070-4e00-b74c-a6a14654faeb
spec:
guestbookSubtitle: First Day of Many
guestbookTitle: The Chemical Wedding of Remko
kind: List
metadata:
resourceVersion: ""
selfLink: ""
In the OpenShift web console, you can browse to Administration > Custom Resource Definitions and find the Guestbook CRD at /k8s/cluster/customresourcedefinitions/guestbooks.apps.ibm.com
.
You have now created a new type or Custom Resource (CR) and created an instance of your new type. But just having a new type and a new instance of the type, does not add as much control over the instances yet, we can basically only create and delete a static type with some descriptive meta-data. With a custom controller or Operator
you can over-write the methods that are triggered at certain lifecycle events.