public addNodegroupCapacity()

in core/src/emr-eks-platform/emr-eks-cluster.ts [572:651]


  public addNodegroupCapacity(nodegroupId: string, options: EmrEksNodegroupOptions): Nodegroup {

    const nodegroup = this.eksCluster.addNodegroupCapacity(nodegroupId, options);
    // Adding the Amazon SSM policy
    nodegroup.role.addManagedPolicy(ManagedPolicy.fromAwsManagedPolicyName('AmazonSSMManagedInstanceCore'));

    // Add tags for the Cluster Autoscaler management
    Tags.of(nodegroup).add(
      `k8s.io/cluster-autoscaler/${this.clusterName}`,
      'owned',
      { applyToLaunchedInstances: true },
    );
    Tags.of(nodegroup).add(
      'k8s.io/cluster-autoscaler/enabled',
      'true',
      {
        applyToLaunchedInstances: true,
      },
    );
    // Add tag for the AZ
    if (options.subnets && options.subnets.subnets) {
      Tags.of(nodegroup).add(
        'k8s.io/cluster-autoscaler/node-template/label/topology.kubernetes.io/zone',
        options.subnets.subnets[0].availabilityZone,
        {
          applyToLaunchedInstances: true,
        },
      );
    }
    // Add tag for the lifecycle type (spot or on-demand)
    Tags.of(nodegroup).add(
      'k8s.io/cluster-autoscaler/node-template/label/eks.amazonaws.com/capacityType',
      (options.capacityType == CapacityType.SPOT) ? 'SPOT' : 'ON_DEMAND',
      {
        applyToLaunchedInstances: true,
      },
    );
    // Iterate over labels and add appropriate tags
    if (options.labels) {
      for (const [key, value] of Object.entries(options.labels)) {
        Tags.of(nodegroup).add(
          `k8s.io/cluster-autoscaler/node-template/label/${key}`,
          value,
          {
            applyToLaunchedInstances: true,
          },
        );
        new CustomResource(this, `${nodegroupId}Label${key}`, {
          serviceToken: this.nodegroupAsgTagsProviderServiceToken,
          properties: {
            nodegroupName: options.nodegroupName,
            tagKey: `k8s.io/cluster-autoscaler/node-template/label/${key}`,
            tagValue: value,
          },
        }).node.addDependency(nodegroup);
      }
    }
    // Iterate over taints and add appropriate tags
    if (options.taints) {
      options.taints.forEach( (taint) => {
        Tags.of(nodegroup).add(
          `k8s.io/cluster-autoscaler/node-template/taint/${taint.key}`,
          `${taint.value}:${taint.effect}`,
          {
            applyToLaunchedInstances: true,
          },
        );
        new CustomResource(this, `${nodegroupId}Taint${taint.key}`, {
          serviceToken: this.nodegroupAsgTagsProviderServiceToken,
          properties: {
            nodegroupName: options.nodegroupName,
            tagKey: `k8s.io/cluster-autoscaler/node-template/taint/${taint.key}`,
            tagValue: `${taint.value}:${taint.effect}`,
          },
        }).node.addDependency(nodegroup);
      });
    }

    return nodegroup;
  }