All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.cdk8s.operator.package-info Maven / Gradle / Ivy

There is a newer version: 0.1.320
Show newest version
/**
 * 

cdk8s-operator

*

*

*

* Create Kubernetes CRD Operators using CDK8s Constructs *

*

*

* This is a multi-language (jsii) library and a command-line tool that allows you * to create Kubernetes operators for CRDs (Custom Resource Definitions) using * CDK8s. *

*

Getting Started

*

* Let's create our first CRD served by a CDK8s construct using TypeScript. *

*

Install CDK8s

*

* Make sure your system has the required CDK8s prerequisites. *

* Install the CDK8s CLI globally through npm: *

*

 * $ npm i -g cdk8s-cli
 * Installing...
 * 
 * # Verify installation
 * $ cdk8s --version
 * 1.0.0-beta.3
 * 
*

*

Create a new CDK8s app

*

* Now, let's create a new CDK8s typescript app: *

*

 * mkdir hello-operator && cd hello-operator
 * git init
 * cdk8s init typescript-app
 * 
*

*

Install cdk8s-operator

*

* Next, let's install this module as a dependency of our TypeScript project: *

*

 * npm install cdk8s-operator
 * 
*

*

Construct

*

* We will start by creating the construct that implements the abstraction. This is * is just a normal CDK8s custom construct: *

* Let's create a construct called PodCollection which represents a collection of * pods: *

* pod-collection.ts: *

*

 * import { Pod } from 'cdk8s-plus-17';
 * import { Construct } from 'constructs';
 * 
 * export interface PodCollectionProps {
 *   /** Number of pods */
 *   readonly count: number;
 *   /** The docker image to deploy */
 *   readonly image: string;
 * }
 * 
 * export class PodCollection extends Construct {
 *   constructor(scope: Construct, id: string, props: PodCollectionProps) {
 *     super(scope, id);
 * 
 *     for (let i = 0; i < props.count; ++i) {
 *       new Pod(this, `pod-${i}`, {
 *         containers: [ { image: props.image } ]
 *       });
 *     }
 *   }
 * }
 * 
*

*

Operator App

*

* Now, we will need to replace out main.ts file with an "operator app", which is * a special kind of CDK8s app designed to be executed by the cdk8s-server CLI * which is included in this module. *

* The Operator app construct can be used to create "CDK8s Operators" which are * CDK8s apps that accept input from a file (or STDIN) with a Kubernetes manifest, * instantiates a construct with the spec as its input and emits the resulting * manifest to STDOUT. *

* Replace the contents of main.ts with the following. We initialize an * Operator app and then register a provider which handles resources of API * version samples.cdk8s.org/v1alpha1 and kind PodCollection. *

* main.ts: *

*

 * import { Operator } from 'cdk8s-operator';
 * import { PodCollection } from './pod-collection';
 * 
 * const app = new Operator();
 * 
 * app.addProvider({
 *   apiVersion: 'samples.cdk8s.org/v1alpha1',
 *   kind: 'PodCollection',
 *   handler: {
 *     apply: (scope, id, props) => new PodCollection(scope, id, props)
 *   }
 * })
 * 
 * app.synth();
 * 
*

*

*

* A single operator can handle any number of resource kinds. Simply call * addProvider() for each apiVersion/kind. *

*

*

*

Using Operators

*

* To use this operator, create an input.json file, e.g: *

* input.json: *

*

 * {
 *   "apiVersion": "samples.cdk8s.org/v1alpha1",
 *   "kind": "PodCollection",
 *   "metadata": {
 *     "name": "my-collection"
 *   },
 *   "spec": {
 *     "image": "paulbouwer/hello-kubernetes",
 *     "count": 5
 *   }
 * }
 * 
*

* Compile your code: *

*

 * # delete `main.test.ts` since it has some code that won't compile
 * $ rm -f main.test.*
 * 
 * # compile
 * $ npm run compile
 * 
*

* And run: *

*

 * $ node main.js input.json
 * 
*

*

* STDOUT *

*

 * apiVersion: "v1"
 * kind: "Pod"
 * metadata:
 *   name: "my-collection-pod-0-c8735c52"
 * spec:
 *   containers:
 *     - env: []
 *       image: "paulbouwer/hello-kubernetes"
 *       imagePullPolicy: "Always"
 *       name: "main"
 *       ports: []
 *       volumeMounts: []
 *   volumes: []
 * ---
 * apiVersion: "v1"
 * kind: "Pod"
 * metadata:
 *   name: "my-collection-pod-1-c89f58d7"
 * spec:
 *   containers:
 *     - env: []
 *       image: "paulbouwer/hello-kubernetes"
 *       imagePullPolicy: "Always"
 *       name: "main"
 *       ports: []
 *       volumeMounts: []
 *   volumes: []
 * ---
 * apiVersion: "v1"
 * kind: "Pod"
 * metadata:
 *   name: "my-collection-pod-2-c88d4268"
 * spec:
 *   containers:
 *     - env: []
 *       image: "paulbouwer/hello-kubernetes"
 *       imagePullPolicy: "Always"
 *       name: "main"
 *       ports: []
 *       volumeMounts: []
 *   volumes: []
 * ---
 * apiVersion: "v1"
 * kind: "Pod"
 * metadata:
 *   name: "my-collection-pod-3-c86866b1"
 * spec:
 *   containers:
 *     - env: []
 *       image: "paulbouwer/hello-kubernetes"
 *       imagePullPolicy: "Always"
 *       name: "main"
 *       ports: []
 *       volumeMounts: []
 *   volumes: []
 * ---
 * apiVersion: "v1"
 * kind: "Pod"
 * metadata:
 *   name: "my-collection-pod-4-c8b74b1d"
 * spec:
 *   containers:
 *     - env: []
 *       image: "paulbouwer/hello-kubernetes"
 *       imagePullPolicy: "Always"
 *       name: "main"
 *       ports: []
 *       volumeMounts: []
 *   volumes: []
 * 
*

*

*

*

cdk8s-server

*

* This library is shipped with a program called cdk8s-server which can be used * to host your operator inside an HTTP server. This server can be used as a * sidecar container with a generic CRD operator (TBD). *

*

 * $ PORT=8080 npx cdk8s-server
 * Listening on 8080
 * - App command: node main.js
 * - Request body should include a single k8s resource in JSON format
 * - Request will be piped through STDIN to "node main.js"
 * - Response is the STDOUT and expected to be a multi-resource yaml manifest
 * 
*

* Now, you can send input.json over HTTP: *

*

 * $ curl -d @input.json http://localhost:8080
 * MANIFEST...
 * 
*

*

License

*

* Apache 2.0 */ @software.amazon.jsii.Stability(software.amazon.jsii.Stability.Level.Stable) package org.cdk8s.operator;





© 2015 - 2024 Weber Informatics LLC | Privacy Policy