constructor()

in testbed/addons/karpenter/construct.ts [10:102]


    constructor(scope: cdk.Construct, id: string, props: KarpenterProps) {
        super(scope, id)
        const namespace = "karpenter"
        const ns = props.cluster.addManifest('namespace', {
            apiVersion: 'v1',
            kind: 'Namespace',
            metadata: {
                name: namespace
            }
        })

        // Controller Role
        const sa = props.cluster.addServiceAccount('karpenter-controller-sa', {
            name: "karpenter",
            namespace: namespace
        })
        sa.node.addDependency(ns)
        sa.role.attachInlinePolicy(new iam.Policy(this, 'karpenter-controller-policy', {
            statements: [
                new iam.PolicyStatement({
                    resources: ['*'],
                    actions: ["ec2:CreateLaunchTemplate", "ec2:CreateFleet", "ec2:RunInstances",
                        "ec2:CreateTags", "iam:PassRole", "ec2:TerminateInstances", "ec2:DescribeLaunchTemplates",
                        "ec2:DescribeInstances", "ec2:DescribeSecurityGroups", "ec2:DescribeSubnets",
                        "ec2:DescribeInstanceTypes", "ec2:DescribeInstanceTypeOfferings", "ec2:DescribeAvailabilityZones",
                        "ssm:GetParameter"],
                }),
            ],
        }))

        // Node Role
        const nodeRole = new iam.Role(this, 'karpenter-node-role', {
            assumedBy: new iam.ServicePrincipal('ec2.amazonaws.com'),
            managedPolicies: [
                iam.ManagedPolicy.fromAwsManagedPolicyName('AmazonEKSWorkerNodePolicy'),
                iam.ManagedPolicy.fromAwsManagedPolicyName('AmazonEC2ContainerRegistryReadOnly'),
                iam.ManagedPolicy.fromAwsManagedPolicyName('AmazonEKS_CNI_Policy'),
                iam.ManagedPolicy.fromAwsManagedPolicyName('AmazonSSMManagedInstanceCore')
            ]
        })

        props.cluster.awsAuth.addRoleMapping(nodeRole, {
            username: 'system:node:{{EC2PrivateDNSName}}',
            groups: ['system:bootstrappers', 'system:nodes']
        })

        new iam.CfnInstanceProfile(this, 'karpenter-instance-profile', {
            roles: [nodeRole.roleName],
            instanceProfileName: `KarpenterNodeInstanceProfile-${props.cluster.clusterName}`
        })

        // Install Karpenter
        const chart = props.cluster.addHelmChart('karpenter', {
            chart: 'karpenter',
            release: 'karpenter',
            version: 'v0.4.1',
            repository: 'https://charts.karpenter.sh',
            namespace: namespace,
            createNamespace: false,
            values: {
                'serviceAccount': {
                    'create': false,
                    'name': sa.serviceAccountName,
                    'annotations': {
                        'eks.amazonaws.com/role-arn': sa.role.roleArn
                    }
                }
            }
        })
        chart.node.addDependency(ns)

        //Karp Provisioner for kit
        props.cluster.addManifest("default-provisioner", {
            apiVersion: 'karpenter.sh/v1alpha5',
            kind: 'Provisioner',
            metadata: {
                name: 'default',
            },
            spec: {
                provider: {
                    instanceProfile: `KarpenterNodeInstanceProfile-${props.cluster.clusterName}`,
                    cluster: {
                        name: props.cluster.clusterName,
                        endpoint: props.cluster.clusterEndpoint,
                    },
                    subnetSelector: {
                        "kit/hostcluster": `${props.cluster.clusterName}-controlplane`
                    }
                },
                ttlSecondsAfterEmpty: 30,
            }
        }).node.addDependency(chart)
    }