Project: CDK for Kubernetes (CDK8s) (Provisioning / Automation & Configuration)
File: typescript.md

In this guide, we'll walk you through the most essential concepts you need to know in order to build a Kubernetes application using cdk8s for Typescript. To install the cdk8s CLI, you need the installed on your local machine. cdk8s for Typescript supports Node.js versions 16.20.0+. Check your Node.js version: ```bash node --version ``` To initialize a cdk8s project and auto-generate Kubernetes manifests based on our code, we need the cdk8s CLI: Run the following command to install the CLI using . For more installation methods, see . ```console npm install -g cdk8s-cli ``` Next, well initialize a project to create the directory structure and install the necessary dependencies using the command. In a terminal window, run the following command in an empty directory: ```console cdk8s init typescript-app ``` In your preferred code editor, open the `main.ts` file. ```typescript import { Construct } from 'constructs'; import { App, Chart, ChartProps } from 'cdk8s'; export class MyChart extends Chart { constructor(scope: Construct, id: string, props: ChartProps = { }) { super(scope, id, props); // define resources here } } const app = new App(); new MyChart(app, 'typescript'); app.synth(); ``` This sample shows the basic structure of a cdk8s application with the essential libraries: constructs and cdk8s. These libraries supply the foundational classes and methods required for working with cdk8s. It includes the following components: A custom `MyChart` class inherits from the base class provided by the cdk8s library, serving as a representation of the Kubernetes resources to be generated and managed. The `constructor` method within the MyChart class is responsible for initializing the base class () and specifying the Kubernetes resources. This method is invoked when creating an instance of the class. An instance of the class signifies the primary entry point of the cdk8s application and oversees the application's lifecycle and resources. An instance of the `MyChart` class is created by passing the app instance and a string identifier, "typescript", as arguments. This action generates and registers the Kubernetes resources defined in the `MyChart` class within the application. Note that in this example, the "typescript" string identifier is autogenerated based on the current directory name. The `synth` method is called on the `app` instance, which produces the required Kubernetes YAML manifest files based on the defined resources. Note that in this example, we haven't defined any resources within the `MyChart` constructor, so running the "cdk8s synth" command in the CLI would generate a blank Kubernetes

Now, let's delve into defining Kubernetes resources for our application. In this example, we'll outline a basic Kubernetes for a sample app. We'll start by importing the `imports` directory and the `k8s` sub-directory, which houses the `index.ts` file containing all cdk8s Kubernetes classes and functions. Copy and paste the following code sample into the existing `main.ts` file of your project. ```typescript import { Construct } from 'constructs'; import { App, Chart } from 'cdk8s'; import { KubeDeployment } from './imports/k8s'; class MyChart extends Chart { constructor(scope: Construct, ns: string, appLabel: string) { super(scope, ns); // Define a Kubernetes Deployment new KubeDeployment(this, 'my-deployment', { spec: { replicas: 3, selector: { matchLabels: { app: appLabel } }, template: { metadata: { labels: { app: appLabel } }, spec: { containers: [ { name: 'app-container', image: 'nginx:1.19.10', ports: [{ containerPort: 80 }] } ] } } } }); } } const app = new App(); new MyChart(app, 'getting-started', 'my-app'); app.synth(); ``` A few things worth noting about this sample: The `constructor` method in the custom `MyChart` class employs TypeScript's type system to construct a Kubernetes Deployment. This Deployment is configured with specific parameters, such as replica count, label selectors, and pod specifications. This approach leverages TypeScript's type system to dynamically assign the "app" key in label selectors and metadata labels, creating a clear and concise way to set key configuration details. After you have defined the Kubernetes resources for your application, you are ready to generate the Kubernetes manifest that will define your Deployment resource. Open a terminal and navigate to your project directory. Run the command. This command generates a Kubernetes manifest file in the `dist` folder of your project directory. The manifest file contains all the resources you defined inside the `MyChart` class. ```console cdk8s synth ``` Open the `dist/getting-started.k8s.yaml` file. You should see a Kubernetes manifest similar to the following: ```yaml apiVersion: apps/v1 kind: Deployment metadata: name: getting-started-my-deployment-c85252a6 spec: replicas: 3 selector: matchLabels: app: my-app template: metadata: labels: app: my-app spec: containers: image: nginx:1.19.10 name: app-container ports: containerPort: 80 ``` Throughout this guide, we introduced you to the cdk8s Typescript library and guided you through the process of creating a cdk8s Typescript application. We've initiated a simple project and crafted a Kubernetes Deployment using cdk8s code. This involved utilizing TypeScript's strong type system to dynamically set the "app" key in label selectors and metadata labels for Kubernetes resources. To run a complete code sample, we recommend diving into the Kubernetes and using the sample application.