3 min read | by Jordi Prats
Openshift has some objects that doesn't exists on Kubernetes such as Project or Route. If we try to push one of these OpenShift objects into a vanilla Kubernetes we'll get an error:
$ kubectl apply -f route.yaml
error: resource mapping not found for name: "demo-route" namespace: "" from "route.yaml": no matches for kind "Route" in version "route.openshift.io/v1"
ensure CRDs are installed first
For CI/CD we might not need a fully features OpenShift cluster, just being able to push the objects might be enough, with the CRD generator we can create the needed CRDs to be able to create these OpenShift objects
We can take the object we need to create and paste it:
apiVersion: route.openshift.io/v1
kind: Route
metadata:
name: demo-route
spec:
host: demo.local
to:
kind: Service
name: not-important
weight: 100
wildcardPolicy: None
tls:
caCertificate: "-----BEGIN CERTIFICATE-----\r\nMIIAAA\r\n-----END CERTIFICATE-----\r\n"
certificate: "-----BEGIN CERTIFICATE-----\r\nMIIAAA\r\n-----END CERTIFICATE-----\r\n"
insecureEdgeTerminationPolicy: Redirect
key: "-----BEGIN RSA PRIVATE KEY-----\r\nMIIAAA\r\n-----END RSA PRIVATE KEY-----\r\n"
termination: edge
It is going to generate a CustomResourceDefinition as follows to match this object:
apiVersion: apiextensions.k8s.io/v1
kind: CustomResourceDefinition
metadata:
name: routes.route.openshift.io
spec:
group: route.openshift.io
names:
kind: Route
plural: routes
scope: Namespaced
versions:
- name: v1
served: true
storage: true
schema:
openAPIV3Schema:
type: object
properties:
spec:
type: object
properties:
host:
type: string
to:
type: object
properties:
kind:
type: string
name:
type: string
weight:
type: integer
wildcardPolicy:
type: string
tls:
type: object
properties:
caCertificate:
type: string
certificate:
type: string
insecureEdgeTerminationPolicy:
type: string
key:
type: string
termination:
type: string
We can apply it as usual:
$ kubectl apply -f crd_route.yaml
customresourcedefinition.apiextensions.k8s.io/routes.route.openshift.io created
Once the CRD available we'll be able to create Routes as if it was an OpenShift cluster:
$ kubectl apply -f demo.yaml
route.route.openshift.io/demo-route created
Although, of course, it won't be doing anything it all since there is no controller using the CRD: We are just going to be able to add the objects but for some contexts might be more than enough.
You can find the code that translates objects into CustomResourceDefinition in GitHub: pet2cattle/python-k8s2crd, the online tool CRD generator fetches the code from this repo, using pyodine (WebAssembly) to run python code from the browser
Posted on 17/10/2022