143 lines
5.2 KiB
TypeScript
143 lines
5.2 KiB
TypeScript
import { Construct } from 'constructs';
|
|
import { AlbScheme } from './alb-controller';
|
|
import type { ICluster } from './cluster';
|
|
import type { RemovalPolicy } from '../../core';
|
|
/**
|
|
* Options for `KubernetesManifest`.
|
|
*/
|
|
export interface KubernetesManifestOptions {
|
|
/**
|
|
* When a resource is removed from a Kubernetes manifest, it no longer appears
|
|
* in the manifest, and there is no way to know that this resource needs to be
|
|
* deleted. To address this, `kubectl apply` has a `--prune` option which will
|
|
* query the cluster for all resources with a specific label and will remove
|
|
* all the labeld resources that are not part of the applied manifest. If this
|
|
* option is disabled and a resource is removed, it will become "orphaned" and
|
|
* will not be deleted from the cluster.
|
|
*
|
|
* When this option is enabled (default), the construct will inject a label to
|
|
* all Kubernetes resources included in this manifest which will be used to
|
|
* prune resources when the manifest changes via `kubectl apply --prune`.
|
|
*
|
|
* The label name will be `aws.cdk.eks/prune-<ADDR>` where `<ADDR>` is the
|
|
* 42-char unique address of this construct in the construct tree. Value is
|
|
* empty.
|
|
*
|
|
* @see
|
|
* https://kubernetes.io/docs/tasks/manage-kubernetes-objects/declarative-config/#alternative-kubectl-apply-f-directory-prune-l-your-label
|
|
*
|
|
* @default - based on the prune option of the cluster, which is `true` unless
|
|
* otherwise specified.
|
|
*/
|
|
readonly prune?: boolean;
|
|
/**
|
|
* A flag to signify if the manifest validation should be skipped
|
|
*
|
|
* @default false
|
|
*/
|
|
readonly skipValidation?: boolean;
|
|
/**
|
|
* Automatically detect `Ingress` resources in the manifest and annotate them so they
|
|
* are picked up by an ALB Ingress Controller.
|
|
*
|
|
* @default false
|
|
*/
|
|
readonly ingressAlb?: boolean;
|
|
/**
|
|
* Specify the ALB scheme that should be applied to `Ingress` resources.
|
|
* Only applicable if `ingressAlb` is set to `true`.
|
|
*
|
|
* @default AlbScheme.INTERNAL
|
|
*/
|
|
readonly ingressAlbScheme?: AlbScheme;
|
|
/**
|
|
* The removal policy applied to the custom resource that manages the Kubernetes manifest.
|
|
*
|
|
* The removal policy controls what happens to the resource if it stops being managed by CloudFormation.
|
|
* This can happen in one of three situations:
|
|
*
|
|
* - The resource is removed from the template, so CloudFormation stops managing it
|
|
* - A change to the resource is made that requires it to be replaced, so CloudFormation stops managing it
|
|
* - The stack is deleted, so CloudFormation stops managing all resources in it
|
|
*
|
|
* @default RemovalPolicy.DESTROY
|
|
*/
|
|
readonly removalPolicy?: RemovalPolicy;
|
|
}
|
|
/**
|
|
* Properties for KubernetesManifest
|
|
*/
|
|
export interface KubernetesManifestProps extends KubernetesManifestOptions {
|
|
/**
|
|
* The EKS cluster to apply this manifest to.
|
|
*
|
|
* [disable-awslint:ref-via-interface]
|
|
*/
|
|
readonly cluster: ICluster;
|
|
/**
|
|
* The manifest to apply.
|
|
*
|
|
* Consists of any number of child resources.
|
|
*
|
|
* When the resources are created/updated, this manifest will be applied to the
|
|
* cluster through `kubectl apply` and when the resources or the stack is
|
|
* deleted, the resources in the manifest will be deleted through `kubectl delete`.
|
|
*
|
|
* @example
|
|
*
|
|
* [{
|
|
* apiVersion: 'v1',
|
|
* kind: 'Pod',
|
|
* metadata: { name: 'mypod' },
|
|
* spec: {
|
|
* containers: [ { name: 'hello', image: 'paulbouwer/hello-kubernetes:1.5', ports: [ { containerPort: 8080 } ] } ]
|
|
* }
|
|
* }]
|
|
*
|
|
*/
|
|
readonly manifest: Record<string, any>[];
|
|
/**
|
|
* Overwrite any existing resources.
|
|
*
|
|
* If this is set, we will use `kubectl apply` instead of `kubectl create`
|
|
* when the resource is created. Otherwise, if there is already a resource
|
|
* in the cluster with the same name, the operation will fail.
|
|
*
|
|
* @default false
|
|
*/
|
|
readonly overwrite?: boolean;
|
|
}
|
|
/**
|
|
* Represents a manifest within the Kubernetes system.
|
|
*
|
|
* Alternatively, you can use `cluster.addManifest(resource[, resource, ...])`
|
|
* to define resources on this cluster.
|
|
*
|
|
* Applies/deletes the manifest using `kubectl`.
|
|
*/
|
|
export declare class KubernetesManifest extends Construct {
|
|
/**
|
|
* Uniquely identifies this class.
|
|
*/
|
|
static readonly PROPERTY_INJECTION_ID: string;
|
|
/**
|
|
* The CloudFormation resource type.
|
|
*/
|
|
static readonly RESOURCE_TYPE = "Custom::AWSCDK-EKS-KubernetesResource";
|
|
constructor(scope: Construct, id: string, props: KubernetesManifestProps);
|
|
/**
|
|
* Injects a generated prune label to all resources in this manifest. The
|
|
* label name will be `awscdk.eks/manifest-ADDR` where `ADDR` is the address
|
|
* of the construct in the construct tree.
|
|
*
|
|
* @returns the label name
|
|
*/
|
|
private injectPruneLabel;
|
|
/**
|
|
* Inject the necessary ingress annotations if possible (and requested).
|
|
*
|
|
* @see https://kubernetes-sigs.github.io/aws-load-balancer-controller/v2.2/guide/ingress/annotations/
|
|
*/
|
|
private injectIngressAlbAnnotations;
|
|
}
|