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