Skip to main content
Version: v0.13 🚧

Apply the Raw K8s Manifest YAML

The guides above provide examples on how to configure workloads and accessories with KCL, and generate the related Kubernetes resources with Kusion Module generators, which is the usage method we recommend, as it can achieve the separation of concerns between developers and platform engineers, reducing the cognitive burden on developers.

However, in some specific scenario, users may also have the need to directly use Kusion to apply and manage the raw Kubernetes manifest YAML files, such as taking over some existing resources and deploying CRD (CustomResourceDefinition), or other special resources.

To help users directly apply raw K8s manifests, the KusionStack community has provided the k8s_manifest Kusion Module.

info

The module definition and implementation, as well as the example can be found at here.

Prerequisites

Please refer to the prerequisites in the guide for deploying an application.

The example below also requires you to have initialized the project using the kusion workspace create, kusion project create, kusion stack create command, which will create a workspace and project, and also generate a kcl.mod file under the stack directory.

Managing Workspace Configuration

In the first guide in this series, we introduced a step to initialize a workspace with an empty configuration. The same empty configuration will still work in this guide, no changes are required there. Alternatively, if you have updated your workspace config in the previous guides, no changes need to be made either.

However, if you (or the platform team) would like to set some default paths for the raw K8s manifest YAML files to standardize the behavior of applications in the dev workspace, you can do so by updating the dev.yaml with the following config block:

modules: 
k8s_manifest:
path: oci://ghcr.io/kusionstack/k8s_manifest
version: 0.1.0
configs:
default:
# The default paths to apply for the raw K8s manifest YAML files.
paths:
- /path/to/k8s_manifest.yaml
- /dir/to/k8s_manifest/

Please note that the paths decalred by the platform engineers in the workspace configs will be merged with the ones declared by the developers in the AppConfiguration in main.k.

The workspace configuration needs to be updated with the command:

kusion workspace update dev -f dev.yaml

Example

To apply the specified raw K8s manifest YAML files with k8s_manifest module, please use the v0.2.1 version of kam, whose workload is no longer a required field in the AppConfiguration model. An example is shown below:

kcl.mod:

[dependencies]
kam = { git = "https://github.com/KusionStack/kam.git", tag = "v0.2.1" }
k8s_manifest = { oci = "oci://ghcr.io/kusionstack/k8s_manifest", tag = "0.1.0" }

stack.yaml:

# Generate a specified namespace 
name: dev
extensions:
- kind: kubernetesNamespace
kubernetesNamespace:
namespace: test

main.k:

import kam.v1.app_configuration as ac
import k8s_manifest

test: ac.AppConfiguration {
accessories: {
"k8s_manifests": k8s_manifest.K8sManifest {
paths: [
# The `test.yaml` should be placed under the stack directory,
# as it is declared using a relative path.
"./test.yaml"
]
}
}
}

test.yaml:

apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
namespace: test
labels:
app: nginx
spec:
replicas: 3
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:1.14.2
ports:
- containerPort: 80

Generate and Applying

Execute the kusion generate command, the Deployment in the test.yaml will be generated into a Kusion Resource with a Kusion ID in the Spec.

➜  dev git:(main) ✗ kusion generate
✔︎ Generating Spec in the Stack dev...
resources:
- id: v1:Namespace:test
type: Kubernetes
attributes:
apiVersion: v1
kind: Namespace
metadata:
creationTimestamp: null
name: test
spec: {}
status: {}
extensions:
GVK: /v1, Kind=Namespace
- id: apps/v1:Deployment:test:nginx-deployment
type: Kubernetes
attributes:
apiVersion: apps/v1
kind: Deployment
metadata:
labels:
app: nginx
name: nginx-deployment
namespace: test
spec:
replicas: 3
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- image: nginx:1.14.2
name: nginx
ports:
- containerPort: 80
dependsOn:
- v1:Namespace:test
secretStore: null
context: {}

Execute the kusion apply command, you may get the output like the following:

➜  dev git:(main) ✗ kusion apply
✔︎ Generating Spec in the Stack dev...
Stack: dev
ID Action
v1:Namespace:test Create
apps/v1:Deployment:test:nginx-deployment Create


Do you want to apply these diffs?:
> yes

Start applying diffs ...
✔︎ Succeeded v1:Namespace:test
✔︎ Succeeded apps/v1:Deployment:test:nginx-deployment
Apply complete! Resources: 2 created, 0 updated, 0 deleted.

[v1:Namespace:test]
Type Kind Name Detail
READY Namespace test Phase: Active
[apps/v1:Deployment:test:nginx-deployment]
Type Kind Name Detail
READY Deployment nginx-deployment Ready: 3/3, Up-to-date: 3, Available: 3
READY ReplicaSet nginx-deployment-7fb96c846b Desired: 3, Current: 3, Ready: 3
READY Pod nginx-deployment-7fb96c846b-d9pp4 Ready: 1/1, Status: Running, Restart: 0, Age: 2s

Validation

We can verify the Deployment and Pod we have just applied:

➜  dev git:(main) ✗ kubectl get deployment -n test
NAME READY UP-TO-DATE AVAILABLE AGE
nginx-deployment 3/3 3 3 70s
➜ dev git:(main) ✗ kubectl get pod -n test
NAME READY STATUS RESTARTS AGE
nginx-deployment-7fb96c846b-d9pp4 1/1 Running 0 87s
nginx-deployment-7fb96c846b-j45nt 1/1 Running 0 87s
nginx-deployment-7fb96c846b-tnz5f 1/1 Running 0 87s