Collaborate, Automate
Codify modern delivery across Kubernetes and Clouds
All about your modern app by Platform as Code
KusionStack codifies and unifies platform resources into stacked models and policies.
![[object Object]](/zh-CN/img/features/easy.jpeg)
Easy App Shipping
Fast development, easy delivery
- Codify and unify spec, resources and manifests around modern apps
- Orchestration and provision on Kubernetes and Clouds in a managed manner
- Easy-to-access, Kubernetes-first, lightweight and dev-friendly
![[object Object]](/zh-CN/img/features/teams.png)
Enterprise Declarative DevOps
From the first code to production
- Multi teams, projects go across multi phases to multi runtimes, clouds
- Production-ready with scalability, performance and left-shifted stability
- Various usages to meet the requirements of diverse enterprise scenarios
![[object Object]](/zh-CN/img/features/enable.jpeg)
Enable Platform Engineering
Build proper abstraction and golden path
- Schema-centric abstraction and constraints to build your models and validations
- Easy to integrate into CI pipeline, service and product to build your paved road
- Fast development on raw platform capabilities with consistency to cope with change
Codify Your Modern Delivery
With configs, models, functions and rules
import base.pkg.kusion_models.kube.frontendappConfiguration: frontend.Server {image = "howieyuen/gocity:latest"}
-- Configimport base.pkg.kusion_models.kube.frontendappConfiguration: frontend.Server {image = "howieyuen/gocity:latest"}
schema Server:"""Server is the abstraction of Deployment and StatefulSet.image: str, default is Undefined, required.Image name. More info: https://kubernetes.io/docs/concepts/containers/images.replicas: int, default is 1, required.Number of desired pods. This is a pointer to distinguish between explicit zero and not specified. Defaults to 1.labels: {str:str}, default is Undefined, optional.Labels is a map of string keys and values that can be used to organize and categorize (scope and select) objects."""image: strreplicas: int = option("replicas") or 1labels?: {str:str}
-- Schemaschema Server:"""Server is the abstraction of Deployment and StatefulSet.image: str, default is Undefined, required.Image name. More info: https://kubernetes.io/docs/concepts/containers/images.replicas: int, default is 1, required.Number of desired pods. This is a pointer to distinguish between explicit zero and not specified. Defaults to 1.labels: {str:str}, default is Undefined, optional.Labels is a map of string keys and values that can be used to organize and categorize (scope and select) objects."""image: strreplicas: int = option("replicas") or 1labels?: {str:str}
import base.pkg.kusion_models.kube.frontendgenLocalityLabels = lambda az: str, cell: str, cluster: str, app: str -> {str:str} {{"aws/az" = az"aws/cell" = cell"cluster.x-k8s.io/cluster-name" = cluster"app.kubernetes.io/name" = app}}appConfiguration: frontend.Server {labels: genLocalityLabels("us-west-1a", "us-west-2-lax-1a", "my-cluster", "gocity")}
-- Lambdaimport base.pkg.kusion_models.kube.frontendgenLocalityLabels = lambda az: str, cell: str, cluster: str, app: str -> {str:str} {{"aws/az" = az"aws/cell" = cell"cluster.x-k8s.io/cluster-name" = cluster"app.kubernetes.io/name" = app}}appConfiguration: frontend.Server {labels: genLocalityLabels("us-west-1a", "us-west-2-lax-1a", "my-cluster", "gocity")}
import regexrule ServerRule for Server:1 <= replicas < 20, "replica should be in range [1, 20)"regex.match(image, r"^([a-z0-9.:]+).([a-z]+):([a-z0-9]+)/([a-z0-9.]+)/([a-z0-9-_.:]+)$"), "image name should satisfy the `REPOSITORY:TAG` form"ServerRule()
-- Ruleimport regexrule ServerRule for Server:1 <= replicas < 20, "replica should be in range [1, 20)"regex.match(image, r"^([a-z0-9.:]+).([a-z]+):([a-z0-9]+)/([a-z0-9.]+)/([a-z0-9-_.:]+)$"), "image name should satisfy the `REPOSITORY:TAG` form"ServerRule()