Copy disabled (too large)
Download .txt
Showing preview only (14,986K chars total). Download the full file to get everything.
Repository: aws/karpenter-provider-aws
Branch: main
Commit: dae2c1888f3a
Files: 982
Total size: 14.1 MB
Directory structure:
gitextract___izru8g/
├── .github/
│ ├── ISSUE_TEMPLATE/
│ │ ├── bug.yaml
│ │ ├── documentation.yaml
│ │ └── feature.yaml
│ ├── actionlint-matcher.json
│ ├── actions/
│ │ ├── commit-status/
│ │ │ ├── end/
│ │ │ │ └── action.yaml
│ │ │ └── start/
│ │ │ └── action.yaml
│ │ ├── deploy-website/
│ │ │ └── action.yml
│ │ ├── download-artifact/
│ │ │ └── action.yaml
│ │ ├── e2e/
│ │ │ ├── cleanup/
│ │ │ │ └── action.yaml
│ │ │ ├── dump-logs/
│ │ │ │ └── action.yaml
│ │ │ ├── install-eksctl/
│ │ │ │ └── action.yaml
│ │ │ ├── install-helm/
│ │ │ │ └── action.yaml
│ │ │ ├── install-karpenter/
│ │ │ │ └── action.yaml
│ │ │ ├── install-prometheus/
│ │ │ │ ├── action.yaml
│ │ │ │ └── values.yaml
│ │ │ ├── run-tests-private-cluster/
│ │ │ │ └── action.yaml
│ │ │ ├── setup-cluster/
│ │ │ │ └── action.yaml
│ │ │ ├── slack/
│ │ │ │ ├── notify/
│ │ │ │ │ └── action.yaml
│ │ │ │ └── send-message/
│ │ │ │ └── action.yaml
│ │ │ └── upgrade-crds/
│ │ │ └── action.yaml
│ │ └── install-deps/
│ │ └── action.yaml
│ ├── dependabot.yaml
│ ├── pull-request-template.md
│ ├── security-notice.md
│ └── workflows/
│ ├── approval-comment.yaml
│ ├── ci-test.yaml
│ ├── ci.yaml
│ ├── codegen.yaml
│ ├── codeql-analysis.yaml
│ ├── dryrun-gen-pr.yaml
│ ├── dryrun-gen.yaml
│ ├── e2e-cleanup.yaml
│ ├── e2e-matrix-trigger.yaml
│ ├── e2e-matrix.yaml
│ ├── e2e-private-cluster-trigger.yaml
│ ├── e2e-scale-trigger.yaml
│ ├── e2e-soak-trigger.yaml
│ ├── e2e-upgrade.yaml
│ ├── e2e-version-compatibility-trigger.yaml
│ ├── e2e.yaml
│ ├── image-canary.yaml
│ ├── postsubmit.yaml
│ ├── release.yaml
│ ├── resolve-args.yaml
│ ├── resource-count.yaml
│ ├── snapshot-pr.yaml
│ ├── snapshot.yaml
│ ├── stale.yaml
│ ├── sweeper.yaml
│ ├── website-cleanup-preview.yaml
│ ├── website-deploy.yaml
│ ├── website-preview-trigger.yaml
│ └── website-preview.yaml
├── .gitignore
├── .gitmodules
├── .golangci.yaml
├── .ko.yaml
├── ADOPTERS.md
├── CODEOWNERS
├── CODE_OF_CONDUCT.md
├── LICENSE
├── Makefile
├── NOTICE
├── README.md
├── THIRD_PARTY_LICENSES
├── charts/
│ ├── index.yaml
│ ├── karpenter/
│ │ ├── .helmignore
│ │ ├── Chart.yaml
│ │ ├── README.md
│ │ ├── README.md.gotmpl
│ │ ├── artifacthub-repo.yaml
│ │ ├── templates/
│ │ │ ├── _helpers.tpl
│ │ │ ├── aggregate-clusterrole.yaml
│ │ │ ├── clusterrole-core.yaml
│ │ │ ├── clusterrole.yaml
│ │ │ ├── deployment.yaml
│ │ │ ├── poddisruptionbudget.yaml
│ │ │ ├── role.yaml
│ │ │ ├── rolebinding.yaml
│ │ │ ├── service.yaml
│ │ │ ├── serviceaccount.yaml
│ │ │ └── servicemonitor.yaml
│ │ └── values.yaml
│ ├── karpenter-0.1.1.tgz
│ ├── karpenter-0.1.2.tgz
│ ├── karpenter-0.1.3.tgz
│ ├── karpenter-0.10.0.tgz
│ ├── karpenter-0.10.1.tgz
│ ├── karpenter-0.11.0.tgz
│ ├── karpenter-0.11.1.tgz
│ ├── karpenter-0.12.0.tgz
│ ├── karpenter-0.12.1.tgz
│ ├── karpenter-0.13.0.tgz
│ ├── karpenter-0.13.1.tgz
│ ├── karpenter-0.13.2.tgz
│ ├── karpenter-0.14.0-rc.0.tgz
│ ├── karpenter-0.14.0.tgz
│ ├── karpenter-0.15.0.tgz
│ ├── karpenter-0.16.0.tgz
│ ├── karpenter-0.16.1.tgz
│ ├── karpenter-0.16.2.tgz
│ ├── karpenter-0.16.3.tgz
│ ├── karpenter-0.2.0.tgz
│ ├── karpenter-0.2.1.tgz
│ ├── karpenter-0.2.2.tgz
│ ├── karpenter-0.2.3.tgz
│ ├── karpenter-0.2.4.tgz
│ ├── karpenter-0.2.5.tgz
│ ├── karpenter-0.2.6.tgz
│ ├── karpenter-0.2.7.tgz
│ ├── karpenter-0.2.8.tgz
│ ├── karpenter-0.2.9.tgz
│ ├── karpenter-0.3.0.tgz
│ ├── karpenter-0.3.1.tgz
│ ├── karpenter-0.3.2.tgz
│ ├── karpenter-0.3.3.tgz
│ ├── karpenter-0.3.4.tgz
│ ├── karpenter-0.4.0.tgz
│ ├── karpenter-0.4.1.tgz
│ ├── karpenter-0.4.2.tgz
│ ├── karpenter-0.4.3.tgz
│ ├── karpenter-0.5.0.tgz
│ ├── karpenter-0.5.1.tgz
│ ├── karpenter-0.5.2.tgz
│ ├── karpenter-0.5.3.tgz
│ ├── karpenter-0.5.4.tgz
│ ├── karpenter-0.5.5.tgz
│ ├── karpenter-0.5.6.tgz
│ ├── karpenter-0.6.0.tgz
│ ├── karpenter-0.6.1.tgz
│ ├── karpenter-0.6.2.tgz
│ ├── karpenter-0.6.3.tgz
│ ├── karpenter-0.6.4.tgz
│ ├── karpenter-0.6.5.tgz
│ ├── karpenter-0.7.0.tgz
│ ├── karpenter-0.7.1.tgz
│ ├── karpenter-0.7.2.tgz
│ ├── karpenter-0.7.3.tgz
│ ├── karpenter-0.8.0.tgz
│ ├── karpenter-0.8.1.tgz
│ ├── karpenter-0.8.2.tgz
│ ├── karpenter-0.9.0-rc.0.tgz
│ ├── karpenter-0.9.0-rc.1.tgz
│ ├── karpenter-0.9.0.tgz
│ ├── karpenter-0.9.1.tgz
│ ├── karpenter-crd/
│ │ ├── .helmignore
│ │ ├── Chart.yaml
│ │ ├── README.md
│ │ ├── README.md.gotmpl
│ │ ├── artifacthub-repo.yaml
│ │ ├── templates/
│ │ │ ├── karpenter.k8s.aws_ec2nodeclasses.yaml
│ │ │ ├── karpenter.sh_nodeclaims.yaml
│ │ │ ├── karpenter.sh_nodeoverlays.yaml
│ │ │ └── karpenter.sh_nodepools.yaml
│ │ └── values.yaml
│ └── karpenter-v0-66626bc5e21dc14b2cceaaeb3ad5933c0b4e2046.tgz
├── cmd/
│ └── controller/
│ └── main.go
├── designs/
│ ├── README.md
│ ├── ami-selector.md
│ ├── aws-launch-templates-options.md
│ ├── aws-launch-templates-v2.md
│ ├── bin-packing.md
│ ├── capacity-block-support.md
│ ├── consolidation.md
│ ├── custom-user-data-and-amis.md
│ ├── deprecated-ami-observability.md
│ ├── deprovisioning.md
│ ├── integration-testing.md
│ ├── interruption-handling.md
│ ├── limits.md
│ ├── metrics.md
│ ├── node-ownership.md
│ ├── node-upgrades.md
│ ├── odcr.md
│ ├── provisioner-priority.md
│ ├── runtime-defaulting.md
│ ├── termination.md
│ ├── unmanaged-launch-template-removal.md
│ ├── v1-api.md
│ ├── v1-roadmap.md
│ ├── v1alpha4-api.md
│ ├── v1beta1-api.md
│ └── v1beta1-full-changelist.md
├── examples/
│ ├── README.md
│ ├── v1/
│ │ ├── 100-cpu-limit.yaml
│ │ ├── al2-custom-ami.yaml
│ │ ├── al2-custom-userdata.yaml
│ │ ├── al2-kubelet-log-query.yaml
│ │ ├── al2023-custom-userdata.yaml
│ │ ├── bottlerocket.yaml
│ │ ├── br-custom-userdata.yaml
│ │ ├── custom-family-with-alias.yaml
│ │ ├── custom-family.yaml
│ │ ├── general-purpose.yaml
│ │ ├── instance-store-ephemeral-storage.yaml
│ │ ├── large-instances.yaml
│ │ ├── max-node-lifetime.yaml
│ │ ├── min-values-family.yaml
│ │ ├── min-values-multiple-keys.yaml
│ │ ├── multiple-arch.yaml
│ │ ├── multiple-ebs.yaml
│ │ ├── spot.yaml
│ │ ├── windows-2019.yaml
│ │ ├── windows-2022.yaml
│ │ ├── windows-2025.yaml
│ │ └── windows-custom-userdata.yaml
│ └── workloads/
│ ├── arm64.yaml
│ ├── disruption-budget.yaml
│ ├── gpu-amd.yaml
│ ├── gpu-nvidia.yaml
│ ├── inflate.yaml
│ ├── neuron.yaml
│ ├── prefer-arm.yaml
│ ├── spot.yaml
│ ├── spread-hostname-zone.yaml
│ ├── spread-hostname.yaml
│ └── spread-zone.yaml
├── go.mod
├── go.sum
├── hack/
│ ├── boilerplate.go.txt
│ ├── boilerplate.sh
│ ├── code/
│ │ ├── bandwidth_gen/
│ │ │ ├── example/
│ │ │ │ └── gp.html
│ │ │ └── main.go
│ │ ├── instancetype_testdata_gen/
│ │ │ └── main.go
│ │ ├── prices_gen/
│ │ │ └── main.go
│ │ └── vpc_limits_gen/
│ │ └── main.go
│ ├── codegen.sh
│ ├── docgen.sh
│ ├── docs/
│ │ ├── compatibilitymatrix_gen/
│ │ │ ├── compatibility.yaml
│ │ │ └── main.go
│ │ ├── configuration_gen/
│ │ │ └── main.go
│ │ ├── instancetypes_gen/
│ │ │ └── main.go
│ │ ├── metrics_gen/
│ │ │ └── main.go
│ │ ├── parse-redirects/
│ │ │ ├── go.mod
│ │ │ └── main.go
│ │ └── version_compatibility_gen/
│ │ └── main.go
│ ├── github/
│ │ ├── community-contributors.sh
│ │ ├── count-flakes.sh
│ │ ├── dependabot.sh
│ │ ├── feature_request_reactions.py
│ │ ├── label_issue_count.py
│ │ └── requirements.txt
│ ├── image_canary.sh
│ ├── mutation/
│ │ └── crd_annotations.sh
│ ├── release/
│ │ ├── common.sh
│ │ ├── prepare-website.sh
│ │ ├── release.sh
│ │ ├── snapshot.sh
│ │ └── stable-pr.sh
│ ├── toolchain.sh
│ ├── tools/
│ │ ├── allocatable_diff/
│ │ │ ├── README.md
│ │ │ └── main.go
│ │ └── launchtemplate_counter/
│ │ └── main.go
│ └── validation/
│ ├── kubelet.sh
│ ├── labels.sh
│ └── requirements.sh
├── kwok/
│ ├── Makefile
│ ├── README.md
│ ├── cloudprovider/
│ │ └── cloudprovider.go
│ ├── ec2/
│ │ ├── ec2.go
│ │ └── ratelimiting.go
│ ├── main.go
│ ├── manifests/
│ │ └── clusterrole.yaml
│ ├── operator/
│ │ └── operator.go
│ └── strategy/
│ └── strategy.go
├── pkg/
│ ├── apis/
│ │ ├── apis.go
│ │ ├── crds/
│ │ │ ├── karpenter.k8s.aws_ec2nodeclasses.yaml
│ │ │ ├── karpenter.sh_nodeclaims.yaml
│ │ │ ├── karpenter.sh_nodeoverlays.yaml
│ │ │ └── karpenter.sh_nodepools.yaml
│ │ └── v1/
│ │ ├── doc.go
│ │ ├── ec2nodeclass.go
│ │ ├── ec2nodeclass_defaults.go
│ │ ├── ec2nodeclass_hash_test.go
│ │ ├── ec2nodeclass_status.go
│ │ ├── ec2nodeclass_validation_cel_test.go
│ │ ├── labels.go
│ │ ├── nodepool_validation_cel_test.go
│ │ ├── suite_test.go
│ │ └── zz_generated.deepcopy.go
│ ├── aws/
│ │ └── sdk.go
│ ├── batcher/
│ │ ├── batcher.go
│ │ ├── createfleet.go
│ │ ├── createfleet_test.go
│ │ ├── describeinstances.go
│ │ ├── describeinstances_test.go
│ │ ├── ec2api.go
│ │ ├── metrics.go
│ │ ├── suite_test.go
│ │ ├── terminateinstances.go
│ │ └── terminateinstances_test.go
│ ├── cache/
│ │ ├── cache.go
│ │ ├── suite_test.go
│ │ └── unavailableofferings.go
│ ├── cloudprovider/
│ │ ├── cloudprovider.go
│ │ ├── drift.go
│ │ ├── events/
│ │ │ └── events.go
│ │ └── suite_test.go
│ ├── controllers/
│ │ ├── capacityreservation/
│ │ │ ├── capacitytype/
│ │ │ │ ├── controller.go
│ │ │ │ └── suite_test.go
│ │ │ └── expiration/
│ │ │ ├── controller.go
│ │ │ └── suite_test.go
│ │ ├── controllers.go
│ │ ├── interruption/
│ │ │ ├── controller.go
│ │ │ ├── events/
│ │ │ │ └── events.go
│ │ │ ├── interruption_benchmark_test.go
│ │ │ ├── messages/
│ │ │ │ ├── capacityreservationinterruption/
│ │ │ │ │ ├── model.go
│ │ │ │ │ └── parser.go
│ │ │ │ ├── noop/
│ │ │ │ │ └── model.go
│ │ │ │ ├── rebalancerecommendation/
│ │ │ │ │ ├── model.go
│ │ │ │ │ └── parser.go
│ │ │ │ ├── scheduledchange/
│ │ │ │ │ ├── model.go
│ │ │ │ │ └── parser.go
│ │ │ │ ├── spotinterruption/
│ │ │ │ │ ├── model.go
│ │ │ │ │ └── parser.go
│ │ │ │ ├── statechange/
│ │ │ │ │ ├── model.go
│ │ │ │ │ └── parser.go
│ │ │ │ └── types.go
│ │ │ ├── metrics.go
│ │ │ ├── parser.go
│ │ │ └── suite_test.go
│ │ ├── metrics/
│ │ │ ├── controller.go
│ │ │ ├── metrics.go
│ │ │ └── suite_test.go
│ │ ├── nodeclaim/
│ │ │ ├── garbagecollection/
│ │ │ │ ├── controller.go
│ │ │ │ └── suite_test.go
│ │ │ └── tagging/
│ │ │ ├── controller.go
│ │ │ └── suite_test.go
│ │ ├── nodeclass/
│ │ │ ├── ami.go
│ │ │ ├── ami_test.go
│ │ │ ├── capacityreservation.go
│ │ │ ├── capacityreservation_test.go
│ │ │ ├── controller.go
│ │ │ ├── events.go
│ │ │ ├── garbagecollection/
│ │ │ │ ├── controller.go
│ │ │ │ └── suite_test.go
│ │ │ ├── hash/
│ │ │ │ ├── controller.go
│ │ │ │ └── suite_test.go
│ │ │ ├── instanceprofile.go
│ │ │ ├── instanceprofile_test.go
│ │ │ ├── securitygroup.go
│ │ │ ├── securitygroup_test.go
│ │ │ ├── subnet.go
│ │ │ ├── subnet_test.go
│ │ │ ├── suite_test.go
│ │ │ ├── validation.go
│ │ │ └── validation_test.go
│ │ └── providers/
│ │ ├── instancetype/
│ │ │ ├── capacity/
│ │ │ │ ├── controller.go
│ │ │ │ └── suite_test.go
│ │ │ ├── controller.go
│ │ │ └── suite_test.go
│ │ ├── pricing/
│ │ │ ├── controller.go
│ │ │ └── suite_test.go
│ │ ├── ssm/
│ │ │ └── invalidation/
│ │ │ ├── controller.go
│ │ │ └── suite_test.go
│ │ └── version/
│ │ ├── controller.go
│ │ └── suite_test.go
│ ├── errors/
│ │ └── errors.go
│ ├── fake/
│ │ ├── atomic.go
│ │ ├── cloudprovider.go
│ │ ├── ec2api.go
│ │ ├── eksapi.go
│ │ ├── iamapi.go
│ │ ├── pricingapi.go
│ │ ├── sqsapi.go
│ │ ├── ssmapi.go
│ │ ├── types.go
│ │ ├── utils.go
│ │ └── zz_generated.describe_instance_types.go
│ ├── operator/
│ │ ├── operator.go
│ │ ├── options/
│ │ │ ├── options.go
│ │ │ ├── options_validation.go
│ │ │ └── suite_test.go
│ │ └── suite_test.go
│ ├── providers/
│ │ ├── amifamily/
│ │ │ ├── al2.go
│ │ │ ├── al2023.go
│ │ │ ├── ami.go
│ │ │ ├── bootstrap/
│ │ │ │ ├── bootstrap.go
│ │ │ │ ├── bottlerocket.go
│ │ │ │ ├── bottlerocket_test.go
│ │ │ │ ├── bottlerocketsettings.go
│ │ │ │ ├── custom.go
│ │ │ │ ├── eksbootstrap.go
│ │ │ │ ├── mime/
│ │ │ │ │ ├── mime.go
│ │ │ │ │ ├── suite_test.go
│ │ │ │ │ └── test_data/
│ │ │ │ │ ├── mime_bad_header.txt
│ │ │ │ │ ├── mime_valid.txt
│ │ │ │ │ ├── nodeconfig.txt
│ │ │ │ │ └── shell.txt
│ │ │ │ ├── nodeadm.go
│ │ │ │ └── windows.go
│ │ │ ├── bottlerocket.go
│ │ │ ├── bottlerocket_test.go
│ │ │ ├── custom.go
│ │ │ ├── resolver.go
│ │ │ ├── suite_test.go
│ │ │ ├── types.go
│ │ │ └── windows.go
│ │ ├── capacityreservation/
│ │ │ ├── provider.go
│ │ │ ├── suite_test.go
│ │ │ └── types.go
│ │ ├── instance/
│ │ │ ├── events.go
│ │ │ ├── filter/
│ │ │ │ ├── filter.go
│ │ │ │ └── filter_test.go
│ │ │ ├── instance.go
│ │ │ ├── suite_test.go
│ │ │ └── types.go
│ │ ├── instanceprofile/
│ │ │ ├── instanceprofile.go
│ │ │ └── suite_test.go
│ │ ├── instancetype/
│ │ │ ├── instancetype.go
│ │ │ ├── metrics.go
│ │ │ ├── offering/
│ │ │ │ └── offering.go
│ │ │ ├── suite_test.go
│ │ │ ├── types.go
│ │ │ ├── zz_generated.bandwidth.go
│ │ │ └── zz_generated.vpclimits.go
│ │ ├── launchtemplate/
│ │ │ ├── launchtemplate.go
│ │ │ ├── suite_test.go
│ │ │ ├── testdata/
│ │ │ │ ├── al2023_mime_userdata_input.golden
│ │ │ │ ├── al2023_mime_userdata_merged.golden
│ │ │ │ ├── al2023_shell_userdata_input.golden
│ │ │ │ ├── al2023_shell_userdata_merged.golden
│ │ │ │ ├── al2023_userdata_unmerged.golden
│ │ │ │ ├── al2023_yaml_userdata_input.golden
│ │ │ │ ├── al2023_yaml_userdata_merged.golden
│ │ │ │ ├── al2_no_mime_userdata_input.golden
│ │ │ │ ├── al2_userdata_content_type_first_input.golden
│ │ │ │ ├── al2_userdata_input.golden
│ │ │ │ ├── al2_userdata_merged.golden
│ │ │ │ ├── al2_userdata_unmerged.golden
│ │ │ │ ├── br_userdata_input.golden
│ │ │ │ ├── br_userdata_merged.golden
│ │ │ │ ├── br_userdata_unmerged.golden
│ │ │ │ ├── windows_userdata_input.golden
│ │ │ │ ├── windows_userdata_merged.golden
│ │ │ │ └── windows_userdata_unmerged.golden
│ │ │ └── types.go
│ │ ├── pricing/
│ │ │ ├── pricing.go
│ │ │ ├── zz_generated.pricing_aws.go
│ │ │ ├── zz_generated.pricing_aws_cn.go
│ │ │ └── zz_generated.pricing_aws_us_gov.go
│ │ ├── securitygroup/
│ │ │ ├── securitygroup.go
│ │ │ └── suite_test.go
│ │ ├── sqs/
│ │ │ └── sqs.go
│ │ ├── ssm/
│ │ │ ├── provider.go
│ │ │ └── types.go
│ │ ├── subnet/
│ │ │ ├── subnet.go
│ │ │ └── suite_test.go
│ │ └── version/
│ │ ├── suite_test.go
│ │ ├── version.go
│ │ └── version_test.go
│ ├── test/
│ │ ├── environment.go
│ │ ├── nodeclass.go
│ │ ├── options.go
│ │ └── utils.go
│ └── utils/
│ ├── suite_test.go
│ └── utils.go
├── test/
│ ├── README.md
│ ├── assets/
│ │ └── gha_architecture.excalidraw
│ ├── cloudformation/
│ │ ├── README.md
│ │ ├── grafana_cloudformation.yaml
│ │ ├── iam_cloudformation.yaml
│ │ ├── prometheus_cloudformation.yaml
│ │ └── timestream_cloudformation.yaml
│ ├── hack/
│ │ ├── e2e_scripts/
│ │ │ ├── clean_private_cluster.sh
│ │ │ ├── configure_private_cluster.sh
│ │ │ ├── diff_karpenter.sh
│ │ │ ├── install_helm.sh
│ │ │ ├── install_karpenter.sh
│ │ │ ├── install_prometheus.sh
│ │ │ └── noderole_bootstrap_permission.sh
│ │ ├── resource/
│ │ │ ├── clean/
│ │ │ │ └── main.go
│ │ │ ├── count/
│ │ │ │ └── main.go
│ │ │ ├── go.mod
│ │ │ ├── go.sum
│ │ │ └── pkg/
│ │ │ ├── metrics/
│ │ │ │ └── metrics.go
│ │ │ └── resourcetypes/
│ │ │ ├── eni.go
│ │ │ ├── instance.go
│ │ │ ├── instanceprofile.go
│ │ │ ├── launchtemplate.go
│ │ │ ├── oidc.go
│ │ │ ├── resourcetypes.go
│ │ │ ├── securitygroup.go
│ │ │ ├── stack.go
│ │ │ ├── vpc_endpoint.go
│ │ │ └── vpc_peering_connection.go
│ │ └── soak/
│ │ ├── get_clusters.go
│ │ ├── go.mod
│ │ └── go.sum
│ ├── pkg/
│ │ ├── debug/
│ │ │ ├── events.go
│ │ │ ├── monitor.go
│ │ │ ├── node.go
│ │ │ ├── nodeclaim.go
│ │ │ ├── pod.go
│ │ │ └── setup.go
│ │ └── environment/
│ │ ├── aws/
│ │ │ ├── default_ec2nodeclass.yaml
│ │ │ ├── default_nodepool.yaml
│ │ │ ├── environment.go
│ │ │ ├── expectations.go
│ │ │ ├── metrics.go
│ │ │ └── setup.go
│ │ └── common/
│ │ ├── environment.go
│ │ ├── expectations.go
│ │ ├── monitor.go
│ │ └── setup.go
│ └── suites/
│ ├── ami/
│ │ ├── suite_test.go
│ │ └── testdata/
│ │ ├── al2023_userdata_input.yaml
│ │ ├── al2_no_mime_userdata_input.sh
│ │ ├── al2_userdata_input.sh
│ │ ├── br_userdata_input.sh
│ │ └── windows_userdata_input.ps1
│ ├── consolidation/
│ │ ├── suite_test.go
│ │ └── testdata/
│ │ └── hugepage_userdata_input.sh
│ ├── drift/
│ │ └── suite_test.go
│ ├── integration/
│ │ ├── aws_metadata_test.go
│ │ ├── block_device_mappings_test.go
│ │ ├── cni_test.go
│ │ ├── extended_resources_test.go
│ │ ├── hash_test.go
│ │ ├── instance_profile_test.go
│ │ ├── kubelet_config_test.go
│ │ ├── launch_template_test.go
│ │ ├── metrics_test.go
│ │ ├── network_interface_test.go
│ │ ├── nodeclass_test.go
│ │ ├── repair_policy_test.go
│ │ ├── security_group_test.go
│ │ ├── subnet_test.go
│ │ ├── suite_test.go
│ │ ├── tags_test.go
│ │ ├── testdata/
│ │ │ └── amd_driver_input.sh
│ │ └── validation_test.go
│ ├── interruption/
│ │ └── suite_test.go
│ ├── ipv6/
│ │ └── suite_test.go
│ ├── localzone/
│ │ └── suite_test.go
│ ├── nodeclaim/
│ │ └── suite_test.go
│ ├── scale/
│ │ ├── deprovisioning_test.go
│ │ ├── provisioning_test.go
│ │ └── suite_test.go
│ ├── scheduling/
│ │ ├── suite_test.go
│ │ └── testdata/
│ │ └── hugepage_userdata_input.sh
│ └── storage/
│ └── suite_test.go
├── tools/
│ └── kompat/
│ ├── README.md
│ ├── cmd/
│ │ └── kompat/
│ │ └── main.go
│ ├── go.mod
│ ├── go.sum
│ └── pkg/
│ └── kompat/
│ └── kompat.go
└── website/
├── .gitignore
├── .node-version
├── README.md
├── archetypes/
│ └── default.md
├── assets/
│ ├── js/
│ │ └── search.js
│ ├── jsconfig.json
│ └── scss/
│ ├── _search.scss
│ └── _variables_project.scss
├── content/
│ └── en/
│ ├── _index.html
│ ├── docs/
│ │ ├── _index.md
│ │ ├── concepts/
│ │ │ ├── _index.md
│ │ │ ├── disruption.md
│ │ │ ├── nodeclaims.md
│ │ │ ├── nodeclasses.md
│ │ │ ├── nodeoverlays.md
│ │ │ ├── nodepools.md
│ │ │ └── scheduling.md
│ │ ├── contributing/
│ │ │ ├── _index.md
│ │ │ ├── community-meetings.md
│ │ │ ├── design-guide.md
│ │ │ ├── development-guide.md
│ │ │ └── documentation-updates.md
│ │ ├── faq.md
│ │ ├── getting-started/
│ │ │ ├── _index.md
│ │ │ ├── getting-started-with-karpenter/
│ │ │ │ ├── _index.md
│ │ │ │ ├── cloudformation.yaml
│ │ │ │ ├── grafana-values.yaml
│ │ │ │ ├── karpenter-capacity-dashboard.json
│ │ │ │ ├── karpenter-controllers-allocation.json
│ │ │ │ ├── karpenter-controllers.json
│ │ │ │ ├── karpenter-performance-dashboard.json
│ │ │ │ ├── prometheus-values.yaml
│ │ │ │ └── scripts/
│ │ │ │ ├── step01-config.sh
│ │ │ │ ├── step02-create-cluster-fargate.sh
│ │ │ │ ├── step02-create-cluster.sh
│ │ │ │ ├── step03-iam-cloud-formation.sh
│ │ │ │ ├── step04-grant-access.sh
│ │ │ │ ├── step05-controller-iam.sh
│ │ │ │ ├── step06-add-spot-role.sh
│ │ │ │ ├── step08-apply-helm-chart-fargate.sh
│ │ │ │ ├── step08-apply-helm-chart.sh
│ │ │ │ ├── step09-add-prometheus-grafana.sh
│ │ │ │ ├── step10-add-grafana-port-forward.sh
│ │ │ │ ├── step11-grafana-get-password.sh
│ │ │ │ ├── step12-add-nodepool.sh
│ │ │ │ ├── step13-automatic-node-provisioning.sh
│ │ │ │ ├── step14-deprovisioning.sh
│ │ │ │ ├── step15-apply-flowschemas.sh
│ │ │ │ ├── step16-delete-node.sh
│ │ │ │ └── step17-cleanup.sh
│ │ │ └── migrating-from-cas/
│ │ │ ├── _index.md
│ │ │ └── scripts/
│ │ │ ├── step01-env.sh
│ │ │ ├── step02-node-iam.sh
│ │ │ ├── step03-node-policies.sh
│ │ │ ├── step04-controller-iam.sh
│ │ │ ├── step05-tag-subnets.sh
│ │ │ ├── step06-tag-security-groups.sh
│ │ │ ├── step07-edit-aws-auth.sh
│ │ │ ├── step08-generate-chart.sh
│ │ │ ├── step09-deploy.sh
│ │ │ ├── step10-create-nodepool.sh
│ │ │ ├── step11-scale-cas.sh
│ │ │ ├── step12-scale-multiple-ng.sh
│ │ │ └── step12-scale-single-ng.sh
│ │ ├── reference/
│ │ │ ├── _index.md
│ │ │ ├── cloudformation.md
│ │ │ ├── instance-types.md
│ │ │ ├── metrics.md
│ │ │ ├── settings.md
│ │ │ └── threat-model.md
│ │ ├── tasks/
│ │ │ ├── _index.md
│ │ │ ├── managing-amis.md
│ │ │ └── odcrs.md
│ │ ├── troubleshooting.md
│ │ └── upgrading/
│ │ ├── _index.md
│ │ ├── compatibility.md
│ │ └── upgrade-guide.md
│ ├── preview/
│ │ ├── _index.md
│ │ ├── concepts/
│ │ │ ├── _index.md
│ │ │ ├── disruption.md
│ │ │ ├── nodeclaims.md
│ │ │ ├── nodeclasses.md
│ │ │ ├── nodeoverlays.md
│ │ │ ├── nodepools.md
│ │ │ └── scheduling.md
│ │ ├── contributing/
│ │ │ ├── _index.md
│ │ │ ├── community-meetings.md
│ │ │ ├── design-guide.md
│ │ │ ├── development-guide.md
│ │ │ └── documentation-updates.md
│ │ ├── faq.md
│ │ ├── getting-started/
│ │ │ ├── _index.md
│ │ │ ├── getting-started-with-karpenter/
│ │ │ │ ├── _index.md
│ │ │ │ ├── cloudformation.yaml
│ │ │ │ ├── grafana-values.yaml
│ │ │ │ ├── karpenter-capacity-dashboard.json
│ │ │ │ ├── karpenter-controllers-allocation.json
│ │ │ │ ├── karpenter-controllers.json
│ │ │ │ ├── karpenter-performance-dashboard.json
│ │ │ │ ├── prometheus-values.yaml
│ │ │ │ └── scripts/
│ │ │ │ ├── step01-config.sh
│ │ │ │ ├── step02-create-cluster-fargate.sh
│ │ │ │ ├── step02-create-cluster.sh
│ │ │ │ ├── step03-iam-cloud-formation.sh
│ │ │ │ ├── step04-grant-access.sh
│ │ │ │ ├── step05-controller-iam.sh
│ │ │ │ ├── step06-add-spot-role.sh
│ │ │ │ ├── step08-apply-helm-chart-fargate.sh
│ │ │ │ ├── step08-apply-helm-chart.sh
│ │ │ │ ├── step09-add-prometheus-grafana.sh
│ │ │ │ ├── step10-add-grafana-port-forward.sh
│ │ │ │ ├── step11-grafana-get-password.sh
│ │ │ │ ├── step12-add-nodepool.sh
│ │ │ │ ├── step13-automatic-node-provisioning.sh
│ │ │ │ ├── step14-deprovisioning.sh
│ │ │ │ ├── step15-apply-flowschemas.sh
│ │ │ │ ├── step16-delete-node.sh
│ │ │ │ └── step17-cleanup.sh
│ │ │ └── migrating-from-cas/
│ │ │ ├── _index.md
│ │ │ └── scripts/
│ │ │ ├── step01-env.sh
│ │ │ ├── step02-node-iam.sh
│ │ │ ├── step03-node-policies.sh
│ │ │ ├── step04-controller-iam.sh
│ │ │ ├── step05-tag-subnets.sh
│ │ │ ├── step06-tag-security-groups.sh
│ │ │ ├── step07-edit-aws-auth.sh
│ │ │ ├── step08-generate-chart.sh
│ │ │ ├── step09-deploy.sh
│ │ │ ├── step10-create-nodepool.sh
│ │ │ ├── step11-scale-cas.sh
│ │ │ ├── step12-scale-multiple-ng.sh
│ │ │ └── step12-scale-single-ng.sh
│ │ ├── reference/
│ │ │ ├── _index.md
│ │ │ ├── cloudformation.md
│ │ │ ├── instance-types.md
│ │ │ ├── metrics.md
│ │ │ ├── settings.md
│ │ │ └── threat-model.md
│ │ ├── tasks/
│ │ │ ├── _index.md
│ │ │ ├── managing-amis.md
│ │ │ └── odcrs.md
│ │ ├── troubleshooting.md
│ │ └── upgrading/
│ │ ├── _index.md
│ │ ├── compatibility.md
│ │ └── upgrade-guide.md
│ ├── v1.0/
│ │ ├── _index.md
│ │ ├── concepts/
│ │ │ ├── _index.md
│ │ │ ├── disruption.md
│ │ │ ├── nodeclaims.md
│ │ │ ├── nodeclasses.md
│ │ │ ├── nodepools.md
│ │ │ └── scheduling.md
│ │ ├── contributing/
│ │ │ ├── _index.md
│ │ │ ├── community-meetings.md
│ │ │ ├── design-guide.md
│ │ │ ├── development-guide.md
│ │ │ └── documentation-updates.md
│ │ ├── faq.md
│ │ ├── getting-started/
│ │ │ ├── _index.md
│ │ │ ├── getting-started-with-karpenter/
│ │ │ │ ├── _index.md
│ │ │ │ ├── cloudformation.yaml
│ │ │ │ ├── grafana-values.yaml
│ │ │ │ ├── karpenter-capacity-dashboard.json
│ │ │ │ ├── karpenter-controllers-allocation.json
│ │ │ │ ├── karpenter-controllers.json
│ │ │ │ ├── karpenter-performance-dashboard.json
│ │ │ │ ├── prometheus-values.yaml
│ │ │ │ └── scripts/
│ │ │ │ ├── step01-config.sh
│ │ │ │ ├── step02-create-cluster-fargate.sh
│ │ │ │ ├── step02-create-cluster.sh
│ │ │ │ ├── step03-iam-cloud-formation.sh
│ │ │ │ ├── step04-grant-access.sh
│ │ │ │ ├── step05-controller-iam.sh
│ │ │ │ ├── step06-add-spot-role.sh
│ │ │ │ ├── step08-apply-helm-chart-fargate.sh
│ │ │ │ ├── step08-apply-helm-chart.sh
│ │ │ │ ├── step09-add-prometheus-grafana.sh
│ │ │ │ ├── step10-add-grafana-port-forward.sh
│ │ │ │ ├── step11-grafana-get-password.sh
│ │ │ │ ├── step12-add-nodepool.sh
│ │ │ │ ├── step13-automatic-node-provisioning.sh
│ │ │ │ ├── step14-deprovisioning.sh
│ │ │ │ ├── step15-apply-flowschemas.sh
│ │ │ │ ├── step16-delete-node.sh
│ │ │ │ └── step17-cleanup.sh
│ │ │ └── migrating-from-cas/
│ │ │ ├── _index.md
│ │ │ └── scripts/
│ │ │ ├── step01-env.sh
│ │ │ ├── step02-node-iam.sh
│ │ │ ├── step03-node-policies.sh
│ │ │ ├── step04-controller-iam.sh
│ │ │ ├── step05-tag-subnets.sh
│ │ │ ├── step06-tag-security-groups.sh
│ │ │ ├── step07-edit-aws-auth.sh
│ │ │ ├── step08-generate-chart.sh
│ │ │ ├── step09-deploy.sh
│ │ │ ├── step10-create-nodepool.sh
│ │ │ ├── step11-scale-cas.sh
│ │ │ ├── step12-scale-multiple-ng.sh
│ │ │ └── step12-scale-single-ng.sh
│ │ ├── reference/
│ │ │ ├── _index.md
│ │ │ ├── cloudformation.md
│ │ │ ├── instance-types.md
│ │ │ ├── metrics.md
│ │ │ ├── settings.md
│ │ │ └── threat-model.md
│ │ ├── tasks/
│ │ │ ├── _index.md
│ │ │ └── managing-amis.md
│ │ ├── troubleshooting.md
│ │ └── upgrading/
│ │ ├── _index.md
│ │ ├── compatibility.md
│ │ ├── get-controller-policy.sh
│ │ ├── upgrade-guide.md
│ │ ├── v1-migration.md
│ │ ├── v1beta1-controller-policy.json
│ │ └── v1beta1-migration.md
│ ├── v1.7/
│ │ ├── _index.md
│ │ ├── concepts/
│ │ │ ├── _index.md
│ │ │ ├── disruption.md
│ │ │ ├── nodeclaims.md
│ │ │ ├── nodeclasses.md
│ │ │ ├── nodeoverlays.md
│ │ │ ├── nodepools.md
│ │ │ └── scheduling.md
│ │ ├── contributing/
│ │ │ ├── _index.md
│ │ │ ├── community-meetings.md
│ │ │ ├── design-guide.md
│ │ │ ├── development-guide.md
│ │ │ └── documentation-updates.md
│ │ ├── faq.md
│ │ ├── getting-started/
│ │ │ ├── _index.md
│ │ │ ├── getting-started-with-karpenter/
│ │ │ │ ├── _index.md
│ │ │ │ ├── cloudformation.yaml
│ │ │ │ ├── grafana-values.yaml
│ │ │ │ ├── karpenter-capacity-dashboard.json
│ │ │ │ ├── karpenter-controllers-allocation.json
│ │ │ │ ├── karpenter-controllers.json
│ │ │ │ ├── karpenter-performance-dashboard.json
│ │ │ │ ├── prometheus-values.yaml
│ │ │ │ └── scripts/
│ │ │ │ ├── step01-config.sh
│ │ │ │ ├── step02-create-cluster-fargate.sh
│ │ │ │ ├── step02-create-cluster.sh
│ │ │ │ ├── step03-iam-cloud-formation.sh
│ │ │ │ ├── step04-grant-access.sh
│ │ │ │ ├── step05-controller-iam.sh
│ │ │ │ ├── step06-add-spot-role.sh
│ │ │ │ ├── step08-apply-helm-chart-fargate.sh
│ │ │ │ ├── step08-apply-helm-chart.sh
│ │ │ │ ├── step09-add-prometheus-grafana.sh
│ │ │ │ ├── step10-add-grafana-port-forward.sh
│ │ │ │ ├── step11-grafana-get-password.sh
│ │ │ │ ├── step12-add-nodepool.sh
│ │ │ │ ├── step13-automatic-node-provisioning.sh
│ │ │ │ ├── step14-deprovisioning.sh
│ │ │ │ ├── step15-apply-flowschemas.sh
│ │ │ │ ├── step16-delete-node.sh
│ │ │ │ └── step17-cleanup.sh
│ │ │ └── migrating-from-cas/
│ │ │ ├── _index.md
│ │ │ └── scripts/
│ │ │ ├── step01-env.sh
│ │ │ ├── step02-node-iam.sh
│ │ │ ├── step03-node-policies.sh
│ │ │ ├── step04-controller-iam.sh
│ │ │ ├── step05-tag-subnets.sh
│ │ │ ├── step06-tag-security-groups.sh
│ │ │ ├── step07-edit-aws-auth.sh
│ │ │ ├── step08-generate-chart.sh
│ │ │ ├── step09-deploy.sh
│ │ │ ├── step10-create-nodepool.sh
│ │ │ ├── step11-scale-cas.sh
│ │ │ ├── step12-scale-multiple-ng.sh
│ │ │ └── step12-scale-single-ng.sh
│ │ ├── reference/
│ │ │ ├── _index.md
│ │ │ ├── cloudformation.md
│ │ │ ├── instance-types.md
│ │ │ ├── metrics.md
│ │ │ ├── settings.md
│ │ │ └── threat-model.md
│ │ ├── tasks/
│ │ │ ├── _index.md
│ │ │ ├── managing-amis.md
│ │ │ └── odcrs.md
│ │ ├── troubleshooting.md
│ │ └── upgrading/
│ │ ├── _index.md
│ │ ├── compatibility.md
│ │ └── upgrade-guide.md
│ ├── v1.8/
│ │ ├── _index.md
│ │ ├── concepts/
│ │ │ ├── _index.md
│ │ │ ├── disruption.md
│ │ │ ├── nodeclaims.md
│ │ │ ├── nodeclasses.md
│ │ │ ├── nodeoverlays.md
│ │ │ ├── nodepools.md
│ │ │ └── scheduling.md
│ │ ├── contributing/
│ │ │ ├── _index.md
│ │ │ ├── community-meetings.md
│ │ │ ├── design-guide.md
│ │ │ ├── development-guide.md
│ │ │ └── documentation-updates.md
│ │ ├── faq.md
│ │ ├── getting-started/
│ │ │ ├── _index.md
│ │ │ ├── getting-started-with-karpenter/
│ │ │ │ ├── _index.md
│ │ │ │ ├── cloudformation.yaml
│ │ │ │ ├── grafana-values.yaml
│ │ │ │ ├── karpenter-capacity-dashboard.json
│ │ │ │ ├── karpenter-controllers-allocation.json
│ │ │ │ ├── karpenter-controllers.json
│ │ │ │ ├── karpenter-performance-dashboard.json
│ │ │ │ ├── prometheus-values.yaml
│ │ │ │ └── scripts/
│ │ │ │ ├── step01-config.sh
│ │ │ │ ├── step02-create-cluster-fargate.sh
│ │ │ │ ├── step02-create-cluster.sh
│ │ │ │ ├── step03-iam-cloud-formation.sh
│ │ │ │ ├── step04-grant-access.sh
│ │ │ │ ├── step05-controller-iam.sh
│ │ │ │ ├── step06-add-spot-role.sh
│ │ │ │ ├── step08-apply-helm-chart-fargate.sh
│ │ │ │ ├── step08-apply-helm-chart.sh
│ │ │ │ ├── step09-add-prometheus-grafana.sh
│ │ │ │ ├── step10-add-grafana-port-forward.sh
│ │ │ │ ├── step11-grafana-get-password.sh
│ │ │ │ ├── step12-add-nodepool.sh
│ │ │ │ ├── step13-automatic-node-provisioning.sh
│ │ │ │ ├── step14-deprovisioning.sh
│ │ │ │ ├── step15-apply-flowschemas.sh
│ │ │ │ ├── step16-delete-node.sh
│ │ │ │ └── step17-cleanup.sh
│ │ │ └── migrating-from-cas/
│ │ │ ├── _index.md
│ │ │ └── scripts/
│ │ │ ├── step01-env.sh
│ │ │ ├── step02-node-iam.sh
│ │ │ ├── step03-node-policies.sh
│ │ │ ├── step04-controller-iam.sh
│ │ │ ├── step05-tag-subnets.sh
│ │ │ ├── step06-tag-security-groups.sh
│ │ │ ├── step07-edit-aws-auth.sh
│ │ │ ├── step08-generate-chart.sh
│ │ │ ├── step09-deploy.sh
│ │ │ ├── step10-create-nodepool.sh
│ │ │ ├── step11-scale-cas.sh
│ │ │ ├── step12-scale-multiple-ng.sh
│ │ │ └── step12-scale-single-ng.sh
│ │ ├── reference/
│ │ │ ├── _index.md
│ │ │ ├── cloudformation.md
│ │ │ ├── instance-types.md
│ │ │ ├── metrics.md
│ │ │ ├── settings.md
│ │ │ └── threat-model.md
│ │ ├── tasks/
│ │ │ ├── _index.md
│ │ │ ├── managing-amis.md
│ │ │ └── odcrs.md
│ │ ├── troubleshooting.md
│ │ └── upgrading/
│ │ ├── _index.md
│ │ ├── compatibility.md
│ │ └── upgrade-guide.md
│ └── v1.9/
│ ├── _index.md
│ ├── concepts/
│ │ ├── _index.md
│ │ ├── disruption.md
│ │ ├── nodeclaims.md
│ │ ├── nodeclasses.md
│ │ ├── nodeoverlays.md
│ │ ├── nodepools.md
│ │ └── scheduling.md
│ ├── contributing/
│ │ ├── _index.md
│ │ ├── community-meetings.md
│ │ ├── design-guide.md
│ │ ├── development-guide.md
│ │ └── documentation-updates.md
│ ├── faq.md
│ ├── getting-started/
│ │ ├── _index.md
│ │ ├── getting-started-with-karpenter/
│ │ │ ├── _index.md
│ │ │ ├── cloudformation.yaml
│ │ │ ├── grafana-values.yaml
│ │ │ ├── karpenter-capacity-dashboard.json
│ │ │ ├── karpenter-controllers-allocation.json
│ │ │ ├── karpenter-controllers.json
│ │ │ ├── karpenter-performance-dashboard.json
│ │ │ ├── prometheus-values.yaml
│ │ │ └── scripts/
│ │ │ ├── step01-config.sh
│ │ │ ├── step02-create-cluster-fargate.sh
│ │ │ ├── step02-create-cluster.sh
│ │ │ ├── step03-iam-cloud-formation.sh
│ │ │ ├── step04-grant-access.sh
│ │ │ ├── step05-controller-iam.sh
│ │ │ ├── step06-add-spot-role.sh
│ │ │ ├── step08-apply-helm-chart-fargate.sh
│ │ │ ├── step08-apply-helm-chart.sh
│ │ │ ├── step09-add-prometheus-grafana.sh
│ │ │ ├── step10-add-grafana-port-forward.sh
│ │ │ ├── step11-grafana-get-password.sh
│ │ │ ├── step12-add-nodepool.sh
│ │ │ ├── step13-automatic-node-provisioning.sh
│ │ │ ├── step14-deprovisioning.sh
│ │ │ ├── step15-apply-flowschemas.sh
│ │ │ ├── step16-delete-node.sh
│ │ │ └── step17-cleanup.sh
│ │ └── migrating-from-cas/
│ │ ├── _index.md
│ │ └── scripts/
│ │ ├── step01-env.sh
│ │ ├── step02-node-iam.sh
│ │ ├── step03-node-policies.sh
│ │ ├── step04-controller-iam.sh
│ │ ├── step05-tag-subnets.sh
│ │ ├── step06-tag-security-groups.sh
│ │ ├── step07-edit-aws-auth.sh
│ │ ├── step08-generate-chart.sh
│ │ ├── step09-deploy.sh
│ │ ├── step10-create-nodepool.sh
│ │ ├── step11-scale-cas.sh
│ │ ├── step12-scale-multiple-ng.sh
│ │ └── step12-scale-single-ng.sh
│ ├── reference/
│ │ ├── _index.md
│ │ ├── cloudformation.md
│ │ ├── instance-types.md
│ │ ├── metrics.md
│ │ ├── settings.md
│ │ └── threat-model.md
│ ├── tasks/
│ │ ├── _index.md
│ │ ├── managing-amis.md
│ │ └── odcrs.md
│ ├── troubleshooting.md
│ └── upgrading/
│ ├── _index.md
│ ├── compatibility.md
│ └── upgrade-guide.md
├── go.mod
├── go.sum
├── hugo.yaml
├── layouts/
│ ├── 404.html
│ ├── partials/
│ │ ├── favicons.html
│ │ ├── footer.html
│ │ └── navbar-version-selector.html
│ ├── robots.txt
│ └── shortcodes/
│ ├── blocks/
│ │ └── feature.html
│ ├── github.html
│ ├── githubRelRef.html
│ └── script.html
├── netlify.toml
├── package.json
└── static/
├── _redirects
└── favicons/
└── browserconfig.xml
================================================
FILE CONTENTS
================================================
================================================
FILE: .github/ISSUE_TEMPLATE/bug.yaml
================================================
name: Bug
description: Report a bug
labels:
- bug
- needs-triage
body:
- type: markdown
attributes:
value: |
> [!IMPORTANT]
> If your issue is not specific to AWS, please cut a ticket in [kubernetes-sigs/karpenter](https://github.com/kubernetes-sigs/karpenter/issues/new/choose).
- type: textarea
attributes:
label: Description
value: |
**Observed Behavior**:
**Expected Behavior**:
**Reproduction Steps** (Please include YAML):
**Versions**:
- Chart Version:
- Kubernetes Version (`kubectl version`):
* Please vote on this issue by adding a 👍 [reaction](https://blog.github.com/2016-03-10-add-reactions-to-pull-requests-issues-and-comments/) to the original issue to help the community and maintainers prioritize this request
* Please do not leave "+1" or "me too" comments, they generate extra noise for issue followers and do not help prioritize the request
* If you are interested in working on this issue or have submitted a pull request, please leave a comment
================================================
FILE: .github/ISSUE_TEMPLATE/documentation.yaml
================================================
name: Documentation
description: How the docs be improved?
labels:
- documentation
- needs-triage
body:
- type: textarea
attributes:
label: Description
value: |
**How can the docs be improved?**
* Please vote on this issue by adding a 👍 [reaction](https://blog.github.com/2016-03-10-add-reactions-to-pull-requests-issues-and-comments/) to the original issue to help the community and maintainers prioritize this request
* Please do not leave "+1" or "me too" comments, they generate extra noise for issue followers and do not help prioritize the request
* If you are interested in working on this issue or have submitted a pull request, please leave a comment
================================================
FILE: .github/ISSUE_TEMPLATE/feature.yaml
================================================
name: Feature
description: Suggest an idea for a new feature
labels:
- feature
- needs-triage
body:
- type: markdown
attributes:
value: |
> [!IMPORTANT]
> If your issue is not specific to AWS, please cut a ticket in [kubernetes-sigs/karpenter](https://github.com/kubernetes-sigs/karpenter/issues/new/choose).
- type: textarea
attributes:
label: Description
value: |
**What problem are you trying to solve?**
**How important is this feature to you?**
* Please vote on this issue by adding a 👍 [reaction](https://blog.github.com/2016-03-10-add-reactions-to-pull-requests-issues-and-comments/) to the original issue to help the community and maintainers prioritize this request
* Please do not leave "+1" or "me too" comments, they generate extra noise for issue followers and do not help prioritize the request
* If you are interested in working on this issue or have submitted a pull request, please leave a comment
================================================
FILE: .github/actionlint-matcher.json
================================================
{
"problemMatcher": [
{
"owner": "actionlint",
"pattern": [
{
"regexp": "^(?:\\x1b\\[\\d+m)?(.+?)(?:\\x1b\\[\\d+m)*:(?:\\x1b\\[\\d+m)*(\\d+)(?:\\x1b\\[\\d+m)*:(?:\\x1b\\[\\d+m)*(\\d+)(?:\\x1b\\[\\d+m)*: (?:\\x1b\\[\\d+m)*(.+?)(?:\\x1b\\[\\d+m)* \\[(.+?)\\]$",
"file": 1,
"line": 2,
"column": 3,
"message": 4,
"code": 5
}
]
}
]
}
================================================
FILE: .github/actions/commit-status/end/action.yaml
================================================
name: CommitStatusEnd
description: 'Adds a commit status at the end of the test run based on success, failure, or cancelled'
inputs:
name:
description: "Name of the check"
required: true
git_ref:
description: "The git commit, tag, or branch to check out. Requires a corresponding Karpenter snapshot release"
required: true
runs:
using: "composite"
steps:
- uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8.0.0
if: job.status == 'success'
env:
NAME: ${{ inputs.name }}
SHA: ${{ inputs.git_ref }}
REPO: ${{ github.repository }}
RUN_ID: ${{ github.run_id }}
with:
script: |
github.rest.repos.createCommitStatus({
owner: context.repo.owner,
repo: context.repo.repo,
context: process.env.NAME,
sha: process.env.SHA,
state: "success",
target_url: `https://github.com/${process.env.REPO}/actions/runs/${process.env.RUN_ID}`,
});
- uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8.0.0
if: job.status == 'failure' || job.status == 'cancelled'
env:
NAME: ${{ inputs.name }}
SHA: ${{ inputs.git_ref }}
REPO: ${{ github.repository }}
RUN_ID: ${{ github.run_id }}
with:
script: |
github.rest.repos.createCommitStatus({
owner: context.repo.owner,
repo: context.repo.repo,
context: process.env.NAME,
sha: process.env.SHA,
state: "failure",
target_url: `https://github.com/${process.env.REPO}/actions/runs/${process.env.RUN_ID}`,
});
================================================
FILE: .github/actions/commit-status/start/action.yaml
================================================
name: CommitStatusStart
description: 'Adds a commit status at the start of the test run to set the status to pending'
inputs:
name:
description: "Name of the check"
required: true
git_ref:
description: "The git commit, tag, or branch to check out. Requires a corresponding Karpenter snapshot release"
required: true
runs:
using: "composite"
steps:
- uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8.0.0
if: always()
env:
NAME: ${{ inputs.name }}
SHA: ${{ inputs.git_ref }}
REPO: ${{ github.repository }}
RUN_ID: ${{ github.run_id }}
with:
script: |
github.rest.repos.createCommitStatus({
owner: context.repo.owner,
repo: context.repo.repo,
context: process.env.NAME,
sha: process.env.SHA,
state: "pending",
target_url: `https://github.com/${process.env.REPO}/actions/runs/${process.env.RUN_ID}`,
});
================================================
FILE: .github/actions/deploy-website/action.yml
================================================
name: 'Deploy Website to Amplify'
description: 'Build Hugo site and deploy to AWS Amplify'
inputs:
role:
description: 'AWS IAM role ARN to assume'
required: true
region:
description: 'AWS region for Amplify'
required: true
amplify-app-id:
description: 'AWS Amplify App ID'
required: true
amplify-branch-name:
description: 'AWS Amplify branch name'
required: true
s3-bucket:
description: 'S3 bucket for website files'
required: true
s3-prefix:
description: 'S3 prefix/path for website files'
required: false
default: ''
hugo-base-url:
description: 'Base URL for Hugo build'
required: false
default: ''
runs:
using: 'composite'
steps:
- name: Install Go
uses: actions/setup-go@d35c59abb061a4a6fb18e82ac0862c26744d6ab5 # v5.5.0
with:
go-version-file: hack/docs/parse-redirects/go.mod
check-latest: true
- name: Install Hugo
uses: peaceiris/actions-hugo@16361eb4acea8698b220b76c0d4e84e1fd22c61d # v2.6.0
with:
hugo-version: '0.120.3'
extended: true
- name: Build Hugo site (preview)
working-directory: website
shell: bash
env:
HUGO_ENV: production
HUGO_ENABLEGITINFO: true
TZ: America/Los_Angeles
HUGO_CACHEDIR: ${{ github.workspace }}/.hugo
NPM_CONFIG_CACHE: ${{ github.workspace }}/.npm
if: github.event_name == 'workflow_run'
run: |
npm ci --prefer-offline
hugo --gc --minify --buildFuture -b "${{ inputs.hugo-base-url }}"
- name: Build Hugo site (production)
working-directory: website
shell: bash
env:
HUGO_ENV: production
HUGO_ENABLEGITINFO: true
TZ: America/Los_Angeles
HUGO_CACHEDIR: ${{ github.workspace }}/.hugo
NPM_CONFIG_CACHE: ${{ github.workspace }}/.npm
if: github.event_name == 'push'
run: |
npm ci --prefer-offline
hugo --gc --minify
- name: Configure AWS credentials
uses: aws-actions/configure-aws-credentials@b47578312673ae6fa5b5096b330d9fbac3d116df # v4.2.1
with:
role-to-assume: ${{ inputs.role }}
aws-region: ${{ inputs.region }}
- name: Upload to S3
shell: bash
run: |
S3_PATH="s3://${{ inputs.s3-bucket }}/${{ inputs.s3-prefix }}"
aws s3 sync website/public/ "$S3_PATH" --delete
- name: Create Amplify branch (if preview and doesn't exist)
shell: bash
if: github.event_name == 'workflow_run'
run: |
if ! aws amplify get-branch --app-id ${{ inputs.amplify-app-id }} --branch-name "${{ inputs.amplify-branch-name }}" 2>/dev/null; then
aws amplify create-branch \
--app-id ${{ inputs.amplify-app-id }} \
--branch-name "${{ inputs.amplify-branch-name }}"
fi
- name: Configure redirects
shell: bash
run: |
REDIRECT_RULES=$(go run hack/docs/parse-redirects/main.go)
aws amplify update-app \
--app-id ${{ inputs.amplify-app-id }} \
--custom-rules "$REDIRECT_RULES"
- name: Deploy to Amplify
shell: bash
run: |
SOURCE_URL="s3://${{ inputs.s3-bucket }}/${{ inputs.s3-prefix }}"
aws amplify start-deployment \
--app-id ${{ inputs.amplify-app-id }} \
--branch-name "${{ inputs.amplify-branch-name }}" \
--source-url "$SOURCE_URL" \
--source-url-type BUCKET_PREFIX
================================================
FILE: .github/actions/download-artifact/action.yaml
================================================
name: DownloadArtifacts
description: 'Downloads and unarchives artifacts for a workflow that runs on workflow_run so that it can use its data'
runs:
using: "composite"
steps:
- uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8.0.0
with:
script: |
let allArtifacts = await github.rest.actions.listWorkflowRunArtifacts({
owner: context.repo.owner,
repo: context.repo.repo,
run_id: context.payload.workflow_run.id,
});
let matchArtifact = allArtifacts.data.artifacts.filter((artifact) => {
return artifact.name == "artifacts"
})[0];
let download = await github.rest.actions.downloadArtifact({
owner: context.repo.owner,
repo: context.repo.repo,
artifact_id: matchArtifact.id,
archive_format: 'zip',
});
let fs = require('fs');
fs.writeFileSync(`/tmp/artifacts.zip`, Buffer.from(download.data));
- run: |
mkdir -p /tmp/artifacts
unzip /tmp/artifacts.zip -d /tmp/artifacts
shell: bash
- run: |
echo "Downloaded artifacts:"
ls -ablh /tmp/artifacts
shell: bash
================================================
FILE: .github/actions/e2e/cleanup/action.yaml
================================================
name: Cleanup
description: 'Runs all the cleanup tasks to cleanup resources deployed during E2E'
inputs:
account_id:
description: "Account ID to access AWS"
required: true
role:
description: "Role to access AWS"
required: true
region:
description: "Region to access AWS"
required: true
cluster_name:
description: 'Name of the cluster to be launched by eksctl'
required: true
git_ref:
description: "The git commit, tag, or branch to check out. Requires a corresponding Karpenter snapshot release"
eksctl_version:
description: "Version of eksctl to install"
default: v0.202.0
private_cluster:
description: "Whether the cluster that has to be deleted is private or not. Valid values are 'true' or 'false'"
default: 'false'
runs:
using: "composite"
steps:
- uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1
with:
ref: ${{ inputs.git_ref }}
- uses: ./.github/actions/e2e/install-eksctl
with:
version: ${{ inputs.eksctl_version }}
- name: delete-cluster
if: ${{ inputs.private_cluster == 'false' }}
shell: bash
env:
CLUSTER_NAME: ${{ inputs.cluster_name }}
run: |
eksctl delete cluster --name "$CLUSTER_NAME" --timeout 60m --wait || true
- uses: actions/setup-go@7a3fe6cf4cb3a834922a1244abfce67bcef6a0c5 # v6.2.0
with:
go-version-file: test/hack/resource/go.mod
cache-dependency-path: test/hack/resource/go.sum
check-latest: true
cache: false
- name: "Run cleanup script"
shell: bash
env:
CLUSTER_NAME: ${{ inputs.cluster_name }}
run: |
go run main.go --cluster-name "$CLUSTER_NAME"
working-directory: ./test/hack/resource/clean
================================================
FILE: .github/actions/e2e/dump-logs/action.yaml
================================================
name: DumpLogs
description: 'Dump logs and debug information from the cluster after a test run'
inputs:
account_id:
description: "Account ID to access AWS"
required: true
role:
description: "Role to access AWS"
required: true
region:
description: "Region to access AWS"
required: true
cluster_name:
description: 'Name of the cluster to be launched by eksctl'
required: true
runs:
using: "composite"
steps:
- name: configure aws credentials
uses: aws-actions/configure-aws-credentials@61815dcd50bd041e203e49132bacad1fd04d2708 # v5.1.1
with:
role-to-assume: arn:aws:iam::${{ inputs.account_id }}:role/${{ inputs.role }}
aws-region: ${{ inputs.region }}
role-duration-seconds: 21600
- name: update cluster context
shell: bash
env:
CLUSTER_NAME: ${{ inputs.cluster_name }}
run: |
aws eks update-kubeconfig --name "$CLUSTER_NAME"
- name: controller-logs
shell: bash
run: |
kubectl logs -n kube-system -l app.kubernetes.io/name=karpenter --all-containers --ignore-errors
- name: describe karpenter pods
shell: bash
run: |
kubectl describe pods -n kube-system -l app.kubernetes.io/name=karpenter
- name: describe nodes
shell: bash
run: |
kubectl describe nodes
================================================
FILE: .github/actions/e2e/install-eksctl/action.yaml
================================================
name: InstallEKSCTL
description: 'Installs eksctl'
inputs:
version:
description: "Version of EKSCTL to use for the launched cluster"
required: true
runs:
using: "composite"
steps:
- shell: bash
env:
VERSION: ${{ inputs.version }}
run: |
# for ARM systems, set ARCH to: `arm64`, `armv6` or `armv7`
ARCH=amd64
PLATFORM=$(uname -s)_$ARCH
curl -sLO "https://github.com/weaveworks/eksctl/releases/download/$VERSION/eksctl_$PLATFORM.tar.gz"
# (Optional) Verify checksum
curl -sL "https://github.com/weaveworks/eksctl/releases/download/$VERSION/eksctl_checksums.txt" | grep $PLATFORM | sha256sum --check
tar -xzf eksctl_$PLATFORM.tar.gz -C /tmp && rm eksctl_$PLATFORM.tar.gz
sudo mv /tmp/eksctl /usr/local/bin
================================================
FILE: .github/actions/e2e/install-helm/action.yaml
================================================
name: InstallHelm
description: 'Installs helm'
inputs:
version:
description: "Version of Helm to install"
required: true
runs:
using: "composite"
steps:
- name: install helm
shell: bash
env:
HELM_VERSION: ${{ inputs.version }}
run: |
./test/hack/e2e_scripts/install_helm.sh
- name: install helm-diff
shell: bash
run: |
helm plugin install https://github.com/databus23/helm-diff || true
================================================
FILE: .github/actions/e2e/install-karpenter/action.yaml
================================================
name: InstallKarpenter
description: 'Installs Go Downloads and installs Karpenter Dependencies'
inputs:
account_id:
description: "Account ID to access AWS"
required: true
role:
description: "Role to access AWS"
required: true
region:
description: "Region to access AWS"
required: true
ecr_account_id:
description: "Account ID for the ECR repo"
required: true
ecr_region:
description: "Region for the ECR repo"
required: true
cluster_name:
description: 'Name of the cluster to be launched by eksctl'
required: true
k8s_version:
description: 'Version of Kubernetes to use for the launched cluster'
default: "1.35"
git_ref:
description: "The git commit, tag, or branch to check out. Requires a corresponding Karpenter snapshot release"
private_cluster:
description: "Whether the cluster is private or not. Valid values are 'true' or 'false'"
default: 'false'
runs:
using: "composite"
steps:
- uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1
with:
ref: ${{ inputs.git_ref }}
- uses: ./.github/actions/e2e/install-helm
with:
version: v3.18.6
# Label namespace to enforce security stranded and scrape prometheus metrics
# https://kubernetes.io/docs/concepts/security/pod-security-standards/
- name: add labels to kube-system namespace
shell: bash
run: |
kubectl label ns kube-system scrape=enabled --overwrite=true
kubectl label ns kube-system pod-security.kubernetes.io/warn=restricted --overwrite=true
- name: login to ecr via docker
uses: docker/login-action@5e57cd118135c172c3672efd75eb46360885c0ef # v3.6.0
with:
registry: ${{ inputs.ecr_account_id }}.dkr.ecr.${{ inputs.ecr_region }}.amazonaws.com
logout: true
- name: install-karpenter
shell: bash
env:
ECR_ACCOUNT_ID: ${{ inputs.ecr_account_id }}
ECR_REGION: ${{ inputs.ecr_region }}
ACCOUNT_ID: ${{ inputs.account_id }}
CLUSTER_NAME: ${{ inputs.cluster_name }}
PRIVATE_CLUSTER: ${{ inputs.private_cluster }}
run: |
output=$(./test/hack/e2e_scripts/install_karpenter.sh 2>&1)
if echo "$output" | grep -i "warning.*violate.*podsecurity"; then
echo "ERROR: Karpenter does not respect restricted Pod Security Standard"
exit 1
fi
- name: diff-karpenter
shell: bash
env:
ECR_ACCOUNT_ID: ${{ inputs.ecr_account_id }}
ECR_REGION: ${{ inputs.ecr_region }}
run: |
./test/hack/e2e_scripts/diff_karpenter.sh
================================================
FILE: .github/actions/e2e/install-prometheus/action.yaml
================================================
name: InstallPrometheus
description: 'Installs prometheus'
inputs:
account_id:
description: "Account ID to access AWS"
required: true
role:
description: "Role to access AWS"
required: true
region:
description: "Region to access AWS"
required: true
prometheus_region:
description: "Prometheus region"
required: true
cluster_name:
description: 'Name of the cluster to be launched by eksctl'
required: true
workspace_id:
description: "Id of the prometheus remote_write workspace"
required: true
git_ref:
description: "The git commit, tag, or branch to check out. Requires a corresponding Karpenter snapshot release"
private_cluster:
description: "Whether the cluster is private or not. Valid values are 'true' or 'false'"
default: 'false'
runs:
using: "composite"
steps:
- uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1
with:
ref: ${{ inputs.git_ref }}
- uses: ./.github/actions/e2e/install-helm
with:
version: v3.18.6
- name: add prometheus repo
shell: bash
run: |
helm repo add prometheus-community https://prometheus-community.github.io/helm-charts
- name: create prometheus namespace
shell: bash
run: |
kubectl create ns prometheus || true
kubectl label ns prometheus scrape=enabled --overwrite=true
- name: install prometheus
shell: bash
env:
PROMETHEUS_REGION: ${{ inputs.prometheus_region }}
REGION: ${{ inputs.region }}
WORKSPACE_ID: ${{ inputs.workspace_id }}
ACCOUNT_ID: ${{ inputs.account_id }}
CLUSTER_NAME: ${{ inputs.cluster_name }}
PRIVATE_CLUSTER: ${{ inputs.private_cluster }}
run: |
./test/hack/e2e_scripts/install_prometheus.sh
================================================
FILE: .github/actions/e2e/install-prometheus/values.yaml
================================================
prometheusOperator:
tolerations:
- key: CriticalAddonsOnly
operator: Exists
admissionWebhooks:
patch:
tolerations:
- key: CriticalAddonsOnly
operator: Exists
prometheus-node-exporter:
tolerations:
- key: CriticalAddonsOnly
operator: Exists
nodeExporter:
enabled: false
kube-state-metrics:
tolerations:
- key: CriticalAddonsOnly
operator: Exists
grafana:
tolerations:
- key: CriticalAddonsOnly
operator: Exists
alertmanager:
alertmanagerSpec:
tolerations:
- key: CriticalAddonsOnly
operator: Exists
kubelet:
serviceMonitor:
# Enable CAdvisor metrics (this is enabled by default but explicitly specified for clarity)
# https://github.com/prometheus-community/helm-charts/blob/main/charts/kube-prometheus-stack/templates/exporters/kubelet/servicemonitor.yaml#L41
cAdvisor: true
# Disable probes scrape endpoint
# https://github.com/prometheus-community/helm-charts/blob/main/charts/kube-prometheus-stack/templates/exporters/kubelet/servicemonitor.yaml#L68
probes: false
# Disable resource scrape endpoint
# https://github.com/prometheus-community/helm-charts/blob/main/charts/kube-prometheus-stack/templates/exporters/kubelet/servicemonitor.yaml#L95
resource: false
additionalLabels:
scrape: enabled
prometheus:
prometheusSpec:
tolerations:
- key: CriticalAddonsOnly
operator: Exists
resources:
requests:
cpu: 1
memory: 15Gi
limits:
cpu: 1
memory: 15Gi
serviceMonitorSelector:
matchLabels:
scrape: enabled
serviceMonitorNamespaceSelector:
matchLabels:
scrape: enabled
remoteWrite:
- queueConfig:
maxSamplesPerSend: 1000
maxShards: 200
capacity: 2500
================================================
FILE: .github/actions/e2e/run-tests-private-cluster/action.yaml
================================================
name: RunTestsPrivateCluster
description: 'Installs Karpenter, Prometheus, runs tests on private cluster and performs clean up'
inputs:
account_id:
description: "Account ID to access AWS"
required: true
suite:
description: "Test suite to run"
required: true
ecr_account_id:
description: "Account ID to access ECR Repository"
required: true
prometheus_workspace_id:
description: "Workspace ID for the Prometheus workspace"
required: true
metrics_region:
description: "Metrics region"
required: true
node_role:
description: "Private cluster node role"
required: true
region:
description: "Region to access AWS"
required: true
ecr_region:
description: "Region to access ECR Repository"
required: true
prometheus_region:
description: Region to access Prometheus
required: true
cluster_name:
description: 'Name of the cluster to be launched by eksctl'
required: true
k8s_version:
description: 'Version of Kubernetes to use for the launched cluster'
default: "1.35"
private_cluster:
description: "Whether to create a private cluster which does not add access to the public internet. Valid values are 'true' or 'false'"
default: 'false'
enable_metrics:
description: "Whether to enable metrics for the cluster"
default: 'false'
codebuild_sg:
description: "Codebuild security group to run private cluster tests"
required: true
codebuild_vpc:
description: "Codebuild VPC to run private cluster tests"
required: true
cleanup:
description: "Whether to cleanup resources on failure"
default: 'false'
runs:
using: "composite"
steps:
- name: login to ecr via docker
uses: docker/login-action@5e57cd118135c172c3672efd75eb46360885c0ef # v3.6.0
with:
registry: ${{ inputs.account_id }}.dkr.ecr.${{ inputs.region }}.amazonaws.com
logout: true
- name: configure private cluster
if: ${{ inputs.private_cluster }}
shell: bash
env:
REGION: ${{ inputs.region }}
CLUSTER_NAME: ${{ inputs.cluster_name }}
ACCOUNT_ID: ${{ inputs.account_id }}
REPOSITORY: ${{ github.repository }}
RUN_ID: ${{ github.run_id }}
CODEBUILD_SG: ${{ inputs.codebuild_sg }}
CODEBUILD_VPC: ${{ inputs.codebuild_vpc }}
run: |
./test/hack/e2e_scripts/configure_private_cluster.sh
- name: run private cluster tests on codebuild
env:
SUITE: ${{ inputs.suite }}
CLUSTER_NAME: ${{ inputs.cluster_name }}
INTERRUPTION_QUEUE: ${{ inputs.cluster_name }}
REGION: ${{ inputs.region }}
HELM_VERSION: v3.12.3 # Pinned to this version since v3.13.0 has issues with anonymous pulls: https://github.com/helm/helm/issues/12423
PROMETHEUS_REGION: ${{ inputs.prometheus_region }}
WORKSPACE_ID: ${{ inputs.prometheus_workspace_id }}
ACCOUNT_ID: ${{ inputs.account_id }}
K8S_VERSION: ${{ inputs.k8s_version }}
ECR_ACCOUNT_ID: ${{ inputs.ecr_account_id }}
ECR_REGION: ${{ inputs.ecr_region }}
PRIVATE_CLUSTER: ${{ inputs.private_cluster }}
ENABLE_METRICS: ${{ inputs.enable_metrics }}
METRICS_REGION: ${{ inputs.metrics_region }}
VPC_PEERING_CONNECTION_ID: ${{ env.VPC_PEERING_CONNECTION_ID }}
NODE_ROLE: ${{ env.NODE_ROLE }}
SG_CB: ${{ inputs.codebuild_sg }}
VPC_CB: ${{ inputs.codebuild_vpc }}
CLUSTER_VPC_ID: ${{ env.CLUSTER_VPC_ID }}
EKS_CLUSTER_SG: ${{ env.EKS_CLUSTER_SG }}
CLEANUP: ${{ inputs.cleanup }}
uses: aws-actions/aws-codebuild-run-build@4d15a47425739ac2296ba5e7eee3bdd4bfbdd767 # v1.0.18
with:
project-name: E2EPrivateClusterCodeBuildProject-us-east-1
buildspec-override: |
version: 0.2
phases:
install:
commands:
# Make sure goenv is up to date
- cd $HOME/.goenv && git pull --ff-only && cd -
# Install Go 1.22
- goenv install 1.22 && goenv global 1.22
build:
commands:
- aws eks update-kubeconfig --name $CLUSTER_NAME
- ./test/hack/e2e_scripts/noderole_bootstrap_permission.sh
- ./test/hack/e2e_scripts/install_helm.sh
- helm plugin install https://github.com/databus23/helm-diff || true
- aws ecr get-login-password --region $REGION | docker login --username AWS --password-stdin $ACCOUNT_ID.dkr.ecr.$REGION.amazonaws.com
- helm repo add prometheus-community https://prometheus-community.github.io/helm-charts
- helm pull prometheus-community/kube-prometheus-stack
- kubectl create ns prometheus || true
- kubectl label ns prometheus scrape=enabled --overwrite=true
- ./test/hack/e2e_scripts/install_prometheus.sh
- kubectl label ns kube-system scrape=enabled --overwrite=true
- kubectl label ns kube-system pod-security.kubernetes.io/warn=restricted --overwrite=true
- ./test/hack/e2e_scripts/install_karpenter.sh
- ./test/hack/e2e_scripts/diff_karpenter.sh
- kubectl delete nodepool --all
- kubectl delete ec2nodeclass --all
- kubectl delete deployment --all
- PRIVATE_CLUSTER=$CLUSTER_NAME TEST_SUITE=$SUITE ENABLE_METRICS=$ENABLE_METRICS METRICS_REGION=$METRICS_REGION GIT_REF="$(git rev-parse HEAD)" CLUSTER_NAME=$CLUSTER_NAME CLUSTER_ENDPOINT="$(aws eks describe-cluster --name $CLUSTER_NAME --query "cluster.endpoint" --output text)" INTERRUPTION_QUEUE=$CLUSTER_NAME make e2etests
post_build:
commands:
# Describe karpenter pods
- kubectl describe pods -n kube-system -l app.kubernetes.io/name=karpenter
# Describe nodes
- kubectl describe nodes
- |
if [ "${CLEANUP}" = true ]; then
./test/hack/e2e_scripts/clean_private_cluster.sh
fi
env-vars-for-codebuild: |
SUITE,
CLUSTER_NAME,
INTERRUPTION_QUEUE,
REGION,
HELM_VERSION,
PROMETHEUS_REGION,
WORKSPACE_ID,
ACCOUNT_ID,
K8S_VERSION,
ECR_ACCOUNT_ID,
ECR_REGION,
PRIVATE_CLUSTER,
ENABLE_METRICS,
METRICS_REGION,
VPC_PEERING_CONNECTION_ID,
NODE_ROLE,
SG_CB,
VPC_CB,
CLUSTER_VPC_ID,
EKS_CLUSTER_SG,
CLEANUP
================================================
FILE: .github/actions/e2e/setup-cluster/action.yaml
================================================
name: SetupCluster
description: 'Installs Go Downloads and installs Karpenter Dependencies'
inputs:
account_id:
description: "Account ID to access AWS"
required: true
ecr_account_id:
description: "Account ID to access ECR Repository"
required: true
prometheus_workspace_id:
description: Workspace ID for the Prometheus workspace
required: true
role:
description: "Role to access AWS"
required: true
region:
description: "Region to access AWS"
required: true
ecr_region:
description: "Region to access ECR Repository"
required: true
prometheus_region:
description: Region to access Prometheus
required: true
cluster_name:
description: 'Name of the cluster to be launched by eksctl'
required: true
k8s_version:
description: 'Version of Kubernetes to use for the launched cluster'
default: "1.35"
eksctl_version:
description: "Version of eksctl to install"
default: v0.202.0
ip_family:
description: "IP Family of the cluster. Valid values are IPv4 or IPv6"
default: "IPv4"
private_cluster:
description: "Whether to create a private cluster which does not add access to the public internet. Valid values are 'true' or 'false'"
default: 'false'
git_ref:
description: "The git commit, tag, or branch to check out. Requires a corresponding Karpenter snapshot release"
enable_local_zones:
description: "Whether to include local zones in the VPC created for the cluster."
default: 'false'
cleanup:
description: "Whether to cleanup resources on failure"
default: 'false'
codebuild_role:
description: "Codebuild Role that must be given an access entry in case of private cluster"
runs:
using: "composite"
steps:
- uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1
with:
ref: ${{ inputs.git_ref }}
- uses: ./.github/actions/e2e/install-eksctl
with:
version: ${{ inputs.eksctl_version }}
- name: create iam policies
shell: bash
env:
ACCOUNT_ID: ${{ inputs.account_id }}
CLUSTER_NAME: ${{ inputs.cluster_name }}
run: |
# Resolve the cloudformation path with fallback
CLOUDFORMATION_PATH=website/content/en/preview/getting-started/getting-started-with-karpenter/cloudformation.yaml
# Update the Cloudformation policy to add the permissionBoundary to the NodeRole
yq -i ".Resources.KarpenterNodeRole.Properties.PermissionsBoundary = \"arn:aws:iam::$ACCOUNT_ID:policy/GithubActionsPermissionsBoundary\"" $CLOUDFORMATION_PATH
# Update the PassRole resource to use wildcard
awk '{gsub(/"Resource": "\${KarpenterNodeRole.Arn}"/, "\"Resource\": \"arn:${AWS::Partition}:iam::${AWS::AccountId}:role/KarpenterNodeRole-*\"")}1' $CLOUDFORMATION_PATH > $CLOUDFORMATION_PATH.tmp && mv $CLOUDFORMATION_PATH.tmp $CLOUDFORMATION_PATH
aws iam create-service-linked-role --aws-service-name spot.amazonaws.com || true
aws cloudformation deploy \
--stack-name "iam-$CLUSTER_NAME" \
--template-file $CLOUDFORMATION_PATH \
--capabilities CAPABILITY_NAMED_IAM \
--parameter-overrides "ClusterName=$CLUSTER_NAME" \
--tags "testing/type=e2e" "testing/cluster=$CLUSTER_NAME" "github.com/run-url=https://github.com/${{ github.repository }}/actions/runs/${{ github.run_id }}" "karpenter.sh/discovery=$CLUSTER_NAME"
- name: create or upgrade cluster
shell: bash
env:
ACCOUNT_ID: ${{ inputs.account_id }}
CLUSTER_NAME: ${{ inputs.cluster_name }}
REGION: ${{ inputs.region }}
K8S_VERSION: ${{ inputs.k8s_version }}
IP_FAMILY: ${{ inputs.ip_family }}
PRIVATE_CLUSTER: ${{ inputs.private_cluster }}
GIT_REF: ${{ inputs.git_ref }}
ENABLE_LOCAL_ZONES: ${{ inputs.enable_local_zones }}
CLEANUP: ${{ inputs.cleanup }}
CODEBUILD_ROLE: ${{ inputs.codebuild_role }}
run: |
if [[ "$GIT_REF" == '' ]]; then
GIT_REF=$(git rev-parse HEAD)
fi
# Disable Pod Identity for Private Clusters
# https://docs.aws.amazon.com/eks/latest/userguide/pod-identities.html#pod-id-considerations
if [[ "$PRIVATE_CLUSTER" == 'true' ]]; then
KARPENTER_IAM="""
- metadata:
name: karpenter
namespace: kube-system
attachPolicyARNs:
- "arn:aws:iam::${{ inputs.account_id }}:policy/KarpenterControllerNodeLifecyclePolicy-${{ inputs.cluster_name }}"
- "arn:aws:iam::${{ inputs.account_id }}:policy/KarpenterControllerIAMIntegrationPolicy-${{ inputs.cluster_name }}"
- "arn:aws:iam::${{ inputs.account_id }}:policy/KarpenterControllerEKSIntegrationPolicy-${{ inputs.cluster_name }}"
- "arn:aws:iam::${{ inputs.account_id }}:policy/KarpenterControllerInterruptionPolicy-${{ inputs.cluster_name }}"
- "arn:aws:iam::${{ inputs.account_id }}:policy/KarpenterControllerResourceDiscoveryPolicy-${{ inputs.cluster_name }}"
permissionsBoundary: "arn:aws:iam::${{ inputs.account_id }}:policy/GithubActionsPermissionsBoundary"
roleName: karpenter-irsa-${{ inputs.cluster_name }}
roleOnly: true"""
else
KARPENTER_IAM="""podIdentityAssociations:
- namespace: kube-system
serviceAccountName: karpenter
roleName: karpenter-irsa-${{ inputs.cluster_name }}
permissionsBoundaryARN: "arn:aws:iam::${{ inputs.account_id }}:policy/GithubActionsPermissionsBoundary"
permissionPolicyARNs:
- "arn:aws:iam::${{ inputs.account_id }}:policy/KarpenterControllerNodeLifecyclePolicy-${{ inputs.cluster_name }}"
- "arn:aws:iam::${{ inputs.account_id }}:policy/KarpenterControllerIAMIntegrationPolicy-${{ inputs.cluster_name }}"
- "arn:aws:iam::${{ inputs.account_id }}:policy/KarpenterControllerEKSIntegrationPolicy-${{ inputs.cluster_name }}"
- "arn:aws:iam::${{ inputs.account_id }}:policy/KarpenterControllerInterruptionPolicy-${{ inputs.cluster_name }}"
- "arn:aws:iam::${{ inputs.account_id }}:policy/KarpenterControllerResourceDiscoveryPolicy-${{ inputs.cluster_name }}""""
POD_IDENTITY="""- name: eks-pod-identity-agent
permissionsBoundary: "arn:aws:iam::$ACCOUNT_ID:policy/GithubActionsPermissionsBoundary"
configurationValues: |
tolerations:
- operator: Exists"""
fi
# Create or Upgrade the cluster based on whether the cluster already exists
cmd="create"
eksctl get cluster --name "$CLUSTER_NAME" && cmd="upgrade"
cat << EOF >> clusterconfig.yaml
---
apiVersion: eksctl.io/v1alpha5
kind: ClusterConfig
metadata:
name: "$CLUSTER_NAME"
region: "$REGION"
version: "$K8S_VERSION"
tags:
karpenter.sh/discovery: "$CLUSTER_NAME"
github.com/run-url: "https://github.com/${{ github.repository }}/actions/runs/${{ github.run_id }}"
testing/type: "e2e"
testing/cluster: "$CLUSTER_NAME"
test/git_ref: "$GIT_REF"
kubernetesNetworkConfig:
ipFamily: "$IP_FAMILY"
managedNodeGroups:
- instanceType: c5.4xlarge
amiFamily: AmazonLinux2023
name: "$CLUSTER_NAME-system-pool"
desiredCapacity: 2
disableIMDSv1: true
minSize: 2
maxSize: 2
iam:
instanceRolePermissionsBoundary: "arn:aws:iam::$ACCOUNT_ID:policy/GithubActionsPermissionsBoundary"
taints:
- key: CriticalAddonsOnly
value: "true"
effect: NoSchedule
cloudWatch:
clusterLogging:
enableTypes: ["*"]
logRetentionInDays: 30
iam:
serviceRolePermissionsBoundary: "arn:aws:iam::$ACCOUNT_ID:policy/GithubActionsPermissionsBoundary"
serviceAccounts:
- metadata:
name: prometheus-kube-prometheus-prometheus
namespace: prometheus
attachPolicyARNs:
- "arn:aws:iam::$ACCOUNT_ID:policy/PrometheusWorkspaceIngestionPolicy"
permissionsBoundary: "arn:aws:iam::$ACCOUNT_ID:policy/GithubActionsPermissionsBoundary"
roleName: "prometheus-irsa-$CLUSTER_NAME"
roleOnly: true
$KARPENTER_IAM
withOIDC: true
addons:
- name: vpc-cni
permissionsBoundary: "arn:aws:iam::$ACCOUNT_ID:policy/GithubActionsPermissionsBoundary"
- name: coredns
permissionsBoundary: "arn:aws:iam::$ACCOUNT_ID:policy/GithubActionsPermissionsBoundary"
- name: kube-proxy
permissionsBoundary: "arn:aws:iam::$ACCOUNT_ID:policy/GithubActionsPermissionsBoundary"
- name: aws-ebs-csi-driver
permissionsBoundary: "arn:aws:iam::$ACCOUNT_ID:policy/GithubActionsPermissionsBoundary"
wellKnownPolicies:
ebsCSIController: true
$POD_IDENTITY
EOF
if [[ $ENABLE_LOCAL_ZONES == "true" ]]; then
local_zones=$(AWS_REGION=$REGION aws ec2 describe-availability-zones | yq '.AvailabilityZones | filter(.ZoneType == "local-zone") | [.[].ZoneName] | join(" ")')
for zone in $local_zones; do
yq -i ".localZones += [\"$zone\"]" clusterconfig.yaml
done
fi
if [[ $PRIVATE_CLUSTER == 'true' ]]; then
yq -i '.privateCluster.enabled=true' clusterconfig.yaml
yq -i '.managedNodeGroups[0].privateNetworking=true' clusterconfig.yaml
yq -i '.accessConfig.authenticationMode="API_AND_CONFIG_MAP"' clusterconfig.yaml
CODEBUILD_ROLE_ARN="arn:aws:iam::$ACCOUNT_ID:role/$CODEBUILD_ROLE"
yq -i ".accessConfig.accessEntries[0].principalARN=\"$CODEBUILD_ROLE_ARN\"" clusterconfig.yaml
yq -i '.accessConfig.accessEntries[0].accessPolicies[0].policyARN="arn:aws:eks::aws:cluster-access-policy/AmazonEKSClusterAdminPolicy"' clusterconfig.yaml
yq -i '.accessConfig.accessEntries[0].accessPolicies[0].accessScope.type="cluster"' clusterconfig.yaml
fi
# Disable rollback of the CloudFormation on Create if we aren't cleaning up the run
if [[ $CLEANUP == 'false' ]] && [[ $cmd == 'create' ]]; then
eksctl ${cmd} cluster -f clusterconfig.yaml --cfn-disable-rollback
else
eksctl ${cmd} cluster -f clusterconfig.yaml
fi
- name: tag oidc provider of the cluster
if: always()
shell: bash
env:
ACCOUNT_ID: ${{ inputs.account_id }}
CLUSTER_NAME: ${{ inputs.cluster_name }}
GIT_REF: ${{ inputs.git_ref }}
run: |
if [[ "$GIT_REF" == '' ]]; then
GIT_REF=$(git rev-parse HEAD)
fi
oidc_id=$(aws eks describe-cluster --name "$CLUSTER_NAME" --query "cluster.identity.oidc.issuer" --output text | cut -d '/' -f 3,4,5)
arn="arn:aws:iam::$ACCOUNT_ID:oidc-provider/${oidc_id}"
aws iam tag-open-id-connect-provider --open-id-connect-provider-arn $arn \
--tags Key=test/git_ref,Value=$GIT_REF Key=testing/type,Value=e2e Key=testing/cluster,Value=$CLUSTER_NAME Key=github.com/run-url,Value=https://github.com/${{ github.repository }}/actions/runs/${{ github.run_id }}
- name: give KarpenterNodeRole permission to bootstrap
if: ${{ inputs.private_cluster == 'false' }}
shell: bash
env:
ACCOUNT_ID: ${{ inputs.account_id }}
CLUSTER_NAME: ${{ inputs.cluster_name }}
run: |
./test/hack/e2e_scripts/noderole_bootstrap_permission.sh
- name: cloudformation describe stack events
shell: bash
if: failure()
env:
CLUSTER_NAME: ${{ inputs.cluster_name }}
run: |
stack_names=$(aws cloudformation describe-stacks --query "Stacks[?Tags[?Key == 'karpenter.sh/discovery' && Value == '$CLUSTER_NAME']].{StackName: StackName}" --output text)
for stack_name in $stack_names; do
echo "Stack Events for $stack_name:"
aws cloudformation describe-stack-events --stack-name $stack_name
done
- name: install prometheus
if: ${{ inputs.private_cluster == 'false' }}
uses: ./.github/actions/e2e/install-prometheus
with:
account_id: ${{ inputs.account_id }}
role: ${{ inputs.role }}
prometheus_region: ${{ inputs.prometheus_region }}
region: ${{ inputs.region }}
cluster_name: ${{ inputs.cluster_name }}
workspace_id: ${{ inputs.prometheus_workspace_id }}
git_ref: ${{ inputs.git_ref }}
- name: install karpenter
if: ${{ inputs.private_cluster == 'false' }}
uses: ./.github/actions/e2e/install-karpenter
with:
account_id: ${{ inputs.account_id }}
role: ${{ inputs.role }}
region: ${{ inputs.region }}
ecr_account_id: ${{ inputs.ecr_account_id }}
ecr_region: ${{ inputs.ecr_region }}
cluster_name: ${{ inputs.cluster_name }}
k8s_version: ${{ inputs.k8s_version }}
git_ref: ${{ inputs.git_ref }}
private_cluster: ${{ inputs.private_cluster }}
================================================
FILE: .github/actions/e2e/slack/notify/action.yaml
================================================
name: SlackNotify
description: 'Notifies slack of the success or failure of the suite'
inputs:
cluster_name:
description: "Name of the cluster"
required: false
suite:
description: "Suite that's running"
required: true
url:
description: "Webhook URL to send the Slack notification to"
required: true
git_ref:
description: "The git commit, tag, or branch to check out. Requires a corresponding Karpenter snapshot release"
workflow_trigger:
description: "Workflow trigger for this run"
runs:
using: "composite"
steps:
- uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1
with:
ref: ${{ inputs.git_ref }}
- id: get-run-name
shell: bash
env:
SUITE: ${{ inputs.suite }}
WORKFLOW: ${{ inputs.workflow_trigger }}
run: |
if [[ ${{ github.event_name }} == "schedule" && "$WORKFLOW" == 'private_cluster' ]]; then
RUN_NAME="privateCluster-periodic"
elif [[ ${{ github.event_name }} == "schedule" && "$WORKFLOW" == 'soak' ]]; then
RUN_NAME="soak-periodic"
elif [[ ${{ github.event_name }} == "schedule" ]]; then
RUN_NAME="$SUITE-periodic"
else
RUN_NAME="$SUITE-${GITHUB_SHA::7}"
fi
# Convert the RUN_NAME to all lowercase
echo RUN_NAME=${RUN_NAME,,} >> $GITHUB_OUTPUT
- uses: ./.github/actions/e2e/slack/send-message
if: ${{ job.status == 'success' }}
with:
url: ${{ inputs.url }}
message: ":white_check_mark: ${{ steps.get-run-name.outputs.RUN_NAME }} (https://github.com/${{ github.repository }}/actions/runs/${{ github.run_id }})"
- uses: ./.github/actions/e2e/slack/send-message
if: ${{ job.status == 'failure' }}
with:
url: ${{ inputs.url }}
message: ":x: ${{ steps.get-run-name.outputs.RUN_NAME }} (https://github.com/${{ github.repository }}/actions/runs/${{ github.run_id }})"
================================================
FILE: .github/actions/e2e/slack/send-message/action.yaml
================================================
name: SlackSendMessage
description: 'Notifies slack of the success or failure of the suite'
inputs:
message:
description: "Message to send to the Slack webhook notification channel"
required: true
url:
description: "Webhook URL to send the Slack notification to"
required: true
runs:
using: "composite"
steps:
- shell: bash
env:
URL: ${{ inputs.url }}
MESSAGE: ${{ inputs.message }}
run: |
JSON="{'message': '$MESSAGE'}"
curl -X POST -H 'Content-Type: application/json' --data "${JSON}" "$(printf "$URL" | tr -d "\n")"
================================================
FILE: .github/actions/e2e/upgrade-crds/action.yaml
================================================
name: UpgradeCRDs
description: 'Installs Go Downloads and installs Karpenter Dependencies'
inputs:
account_id:
description: "Account ID to access AWS"
required: true
role:
description: "Role to access AWS"
required: true
region:
description: "Region to access AWS"
required: true
cluster_name:
description: 'Name of the cluster to be launched by eksctl'
required: true
git_ref:
description: "The git commit, tag, or branch to check out. Requires a corresponding Karpenter snapshot release"
runs:
using: "composite"
steps:
- name: configure aws credentials
uses: aws-actions/configure-aws-credentials@61815dcd50bd041e203e49132bacad1fd04d2708 # v5.1.1
with:
role-to-assume: arn:aws:iam::${{ inputs.account_id }}:role/${{ inputs.role }}
aws-region: ${{ inputs.region }}
role-duration-seconds: 21600
- uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1
with:
ref: ${{ inputs.git_ref }}
- name: install-karpenter
shell: bash
env:
CLUSTER_NAME: ${{ inputs.cluster_name }}
run: |
aws eks update-kubeconfig --name "$CLUSTER_NAME"
kubectl apply -f pkg/apis/crds/
================================================
FILE: .github/actions/install-deps/action.yaml
================================================
name: InstallDependencies
description: 'Installs Go Downloads and installs Karpenter Dependencies'
inputs:
k8sVersion:
description: Kubernetes version to use when installing the toolchain
default: "1.35.x"
use-cache:
description: 'Whether to cache dependencies'
default: true
runs:
using: "composite"
steps:
- uses: actions/setup-go@7a3fe6cf4cb3a834922a1244abfce67bcef6a0c5 # v6.2.0
id: setup-go
with:
cache: ${{ inputs.use-cache == 'true' }}
go-version-file: go.mod
check-latest: true
cache-dependency-path: "**/go.sum"
# Root path permission workaround for caching https://github.com/actions/cache/issues/845#issuecomment-1252594999
- run: sudo chown "$USER" /usr/local
shell: bash
- uses: actions/cache@8b402f58fbc84540c8b491a91e594a4576fec3d7 # v5.0.2
id: cache-toolchain
if: ${{ inputs.use-cache == 'true' }}
with:
path: |
/usr/local/kubebuilder/bin
~/go/bin
# Added go version to compensate for this issue with govulncheck: https://github.com/golang/go/issues/65590. Could re-evaluate if this is necessary once the
# upstream go issue is corrected and if this is causing too many cache misses.
key: ${{ runner.os }}-${{ inputs.k8sVersion }}-${{ steps.setup-go.outputs.go-version }}-toolchain-cache-${{ hashFiles('hack/toolchain.sh') }}
- if: ${{ steps.cache-toolchain.outputs.cache-hit != 'true' }}
shell: bash
env:
K8S_VERSION: ${{ inputs.k8sVersion }}
run: make toolchain
================================================
FILE: .github/dependabot.yaml
================================================
# See https://docs.github.com/en/github/administering-a-repository/configuration-options-for-dependency-updates#package-ecosystem
version: 2
updates:
- package-ecosystem: "gomod"
directory: "/"
schedule:
interval: "weekly"
ignore:
# We are currently pinning to pseudo-version for sigs.k8s.io/karpenter package, so that we can take later changes into the AWS provider.
# This may change later, but this is how we have it configured right now.
# https://github.com/aws/karpenter-provider-aws/issues/7826
- dependency-name: sigs.k8s.io/karpenter
groups:
# Group updates together, so that they are all applied in a single PR.
# Grouped updates are currently in beta and is subject to change.
# xref: https://docs.github.com/en/code-security/dependabot/dependabot-version-updates/configuration-options-for-the-dependabot.yml-file#groups
k8s-go-deps:
patterns:
- "k8s.io/*"
- "sigs.k8s.io/*"
- "knative.dev/*"
exclude-patterns:
- "sigs.k8s.io/karpenter"
go-deps:
patterns:
- "*"
exclude-patterns:
- "k8s.io/*"
- "sigs.k8s.io/*"
- "knative.dev/*"
- package-ecosystem: "github-actions"
directory: "/"
schedule:
interval: "weekly"
groups:
# Group updates together, so that they are all applied in a single PR.
# Grouped updates are currently in beta and is subject to change.
# xref: https://docs.github.com/en/code-security/dependabot/dependabot-version-updates/configuration-options-for-the-dependabot.yml-file#groups
actions-deps:
patterns:
- "*"
- package-ecosystem: "npm"
directory: "/website"
schedule:
interval: "weekly"
groups:
# Group updates together, so that they are all applied in a single PR.
# Grouped updates are currently in beta and is subject to change.
# xref: https://docs.github.com/en/code-security/dependabot/dependabot-version-updates/configuration-options-for-the-dependabot.yml-file#groups
website-deps:
patterns:
- "*"
# Everything under this line is currently auto-generated by hack/github/dependabot.sh
# This needs to be generated since composite actions are currently not supported for auto-updates
# through dependabot without explicitly setting their directory: https://github.com/dependabot/dependabot-core/issues/6704
# If you need to make a change to this file, ensure that you make a change to hack/github/dependabot.sh first
# That script assumes that the number of elements above this line is static and bases the append operation on it
- package-ecosystem: github-actions
directory: .github/actions/commit-status/end
schedule:
interval: weekly
groups:
action-deps:
patterns:
- '*'
- package-ecosystem: github-actions
directory: .github/actions/commit-status/start
schedule:
interval: weekly
groups:
action-deps:
patterns:
- '*'
- package-ecosystem: github-actions
directory: .github/actions/download-artifact
schedule:
interval: weekly
groups:
action-deps:
patterns:
- '*'
- package-ecosystem: github-actions
directory: .github/actions/e2e/cleanup
schedule:
interval: weekly
groups:
action-deps:
patterns:
- '*'
- package-ecosystem: github-actions
directory: .github/actions/e2e/dump-logs
schedule:
interval: weekly
groups:
action-deps:
patterns:
- '*'
- package-ecosystem: github-actions
directory: .github/actions/e2e/install-eksctl
schedule:
interval: weekly
groups:
action-deps:
patterns:
- '*'
- package-ecosystem: github-actions
directory: .github/actions/e2e/install-helm
schedule:
interval: weekly
groups:
action-deps:
patterns:
- '*'
- package-ecosystem: github-actions
directory: .github/actions/e2e/install-karpenter
schedule:
interval: weekly
groups:
action-deps:
patterns:
- '*'
- package-ecosystem: github-actions
directory: .github/actions/e2e/install-prometheus
schedule:
interval: weekly
groups:
action-deps:
patterns:
- '*'
- package-ecosystem: github-actions
directory: .github/actions/e2e/run-tests-private-cluster
schedule:
interval: weekly
groups:
action-deps:
patterns:
- '*'
- package-ecosystem: github-actions
directory: .github/actions/e2e/setup-cluster
schedule:
interval: weekly
groups:
action-deps:
patterns:
- '*'
- package-ecosystem: github-actions
directory: .github/actions/e2e/slack/notify
schedule:
interval: weekly
groups:
action-deps:
patterns:
- '*'
- package-ecosystem: github-actions
directory: .github/actions/e2e/slack/send-message
schedule:
interval: weekly
groups:
action-deps:
patterns:
- '*'
- package-ecosystem: github-actions
directory: .github/actions/e2e/upgrade-crds
schedule:
interval: weekly
groups:
action-deps:
patterns:
- '*'
- package-ecosystem: github-actions
directory: .github/actions/install-deps
schedule:
interval: weekly
groups:
action-deps:
patterns:
- '*'
================================================
FILE: .github/pull-request-template.md
================================================
<!-- Please follow the guidelines at https://www.conventionalcommits.org/en/v1.0.0/ and use one of the following in your title:
feat: <-- New features that require a MINOR version update
fix: <-- Bug fixes that require at PATCH version update
chore: <-- Smaller changes that impact behavior but aren't large enough to be features
perf: <-- Code changes that improve performance but do not impact behavior
docs: <-- Documentation changes that do not impact code
test: <-- Test changes that do not impact behavior
ci: <-- Changes that affect test or rollout automation
!${type}: <-- Include ! if your change includes a backwards incompatible change.
Please review the Karpenter contribution docs at https://karpenter.sh/docs/contributing/ before submitting your pull request.
-->
Fixes #N/A <!-- issue number -->
**Description**
**How was this change tested?**
**Does this change impact docs?**
- [ ] Yes, PR includes docs updates <!-- docs must be added to /preview to be included in future version releases -->
- [ ] Yes, issue opened: # <!-- issue number -->
- [x] No
By submitting this pull request, I confirm that my contribution is made under the terms of the Apache 2.0 license.
================================================
FILE: .github/security-notice.md
================================================
# Github Workflows Security Notice
Writing security workflows that can be accessed by third parties outside of your repository is inherently dangerous. There is a full list of vulnerabilities that you can subject yourself to when you enable external users to interact with your workflows. These vulnerabilities are well-described here: https://docs.github.com/en/actions/security-guides/security-hardening-for-github-actions as well as detail on how to mitigate these risks.
As a rule-of-thumb within the Karpenter workflows, we have chosen to always assign any input that _might_ come from a user in either a Github workflow or a composite action into environment variables any we are using a bash or javascript script as a step in the workflow or action. An example of this can be seen below:
```yaml
- name: Save info about the review comment as an artifact for other workflows that run on workflow_run to download them
env:
# We store these values in environment variables to avoid bash script injection
# Specifically, it's important that we do this for github.event.review.body since this is user-controlled input
# https://docs.github.com/en/actions/security-guides/security-hardening-for-github-actions
REVIEW_BODY: ${{ github.event.review.body }}
PULL_REQUEST_NUMBER: ${{ github.event.pull_request.number }}
COMMIT_ID: ${{ github.event.review.commit_id }}
run: |
mkdir -p /tmp/artifacts
{ echo "$REVIEW_BODY"; echo "$PULL_REQUEST_NUMBER"; echo "$COMMIT_ID"; } >> /tmp/artifacts/metadata.txt
cat /tmp/artifacts/metadata.txt
```
Note that, when you are writing Github workflows or composite actions to ensure to follow this code-style to reduce the attack surface could result from attempted script injection to the workflows.
================================================
FILE: .github/workflows/approval-comment.yaml
================================================
name: ApprovalComment
on:
pull_request_review:
types: [submitted]
jobs:
approval-comment:
if: startsWith(github.event.review.body, '/karpenter snapshot') || startsWith(github.event.review.body, '/karpenter scale') || startsWith(github.event.review.body, '/karpenter versionCompatibility')
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1
with:
fetch-depth: 0
- name: Save info about the review comment as an artifact for other workflows that run on workflow_run to download them
env:
REVIEW_BODY: ${{ github.event.review.body }}
PULL_REQUEST_NUMBER: ${{ github.event.pull_request.number }}
COMMIT_ID: ${{ github.event.review.commit_id }}
run: |
mkdir -p /tmp/artifacts
{ echo "$REVIEW_BODY"; echo "$PULL_REQUEST_NUMBER"; echo "$COMMIT_ID"; } >> /tmp/artifacts/metadata.txt
cat /tmp/artifacts/metadata.txt
- uses: actions/upload-artifact@b7c566a772e6b6bfb58ed0dc250532a479d7789f # v6.0.0
with:
name: artifacts
path: /tmp/artifacts
================================================
FILE: .github/workflows/ci-test.yaml
================================================
name: CI-TEST
on:
push:
branches:
- 'main'
- 'release-v*'
- 'staging/*'
pull_request:
workflow_dispatch:
jobs:
ci-test:
runs-on: ubuntu-latest
if: github.repository == 'aws/karpenter-provider-aws'
strategy:
fail-fast: false
matrix:
k8sVersion: ["1.29.x", "1.30.x", "1.31.x", "1.32.x", "1.33.x", "1.34.x", "1.35.x"]
steps:
- uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1
- uses: ./.github/actions/install-deps
with:
k8sVersion: ${{ matrix.k8sVersion }}
- run: K8S_VERSION=${{ matrix.k8sVersion }} make ci-test
- name: Send coverage
# should only send converage once https://docs.coveralls.io/parallel-builds
if: matrix.k8sVersion == '1.35.x'
env:
COVERALLS_TOKEN: ${{ secrets.GITHUB_TOKEN }}
run: goveralls -coverprofile=coverage.out -service=github
================================================
FILE: .github/workflows/ci.yaml
================================================
name: CI
on:
push:
branches:
- 'main'
- 'release-v*'
- 'staging/*'
pull_request:
workflow_dispatch:
jobs:
ci:
runs-on: ubuntu-latest
if: github.repository == 'aws/karpenter-provider-aws'
steps:
- uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1
- uses: ./.github/actions/install-deps
- name: Enable the actionlint matcher
run: echo "::add-matcher::.github/actionlint-matcher.json"
- run: make ci-non-test
shell: bash
================================================
FILE: .github/workflows/codegen.yaml
================================================
name: "CodeGenCI"
on:
workflow_dispatch:
schedule:
- cron: '0 13 * * MON'
jobs:
codegen:
permissions:
id-token: write # aws-actions/configure-aws-credentials@v4.0.1
pull-requests: write # name: Create Pull Request
contents: write # name: Create Pull Request
if: github.repository == 'aws/karpenter-provider-aws'
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1
- uses: ./.github/actions/install-deps
with:
use-cache: false
- run: |
git config user.name "APICodeGen"
git config user.email "APICodeGen@users.noreply.github.com"
git remote set-url origin https://x-access-token:${{ secrets.GITHUB_TOKEN }}@github.com/${{ github.repository }}
git config pull.rebase false
- uses: aws-actions/configure-aws-credentials@61815dcd50bd041e203e49132bacad1fd04d2708 # v5.1.1
with:
role-to-assume: 'arn:aws:iam::${{ vars.READONLY_ACCOUNT_ID }}:role/${{ vars.READONLY_ROLE_NAME }}'
aws-region: ${{ vars.READONLY_REGION }}
- run: make codegen
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
ENABLE_GIT_PUSH: true
- id: detect-changes
run: |
# If we have a committed change, mark that we committed with a variable
if [[ $(git rev-list --count main..codegen) != "0" ]]; then
echo APICodeGenUpdate=true >> "$GITHUB_OUTPUT"
fi
- name: Create Pull Request
if: steps.detect-changes.outputs.APICodeGenUpdate == 'true'
uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8.0.0
with:
script: |
const { repo, owner } = context.repo;
const result = await github.rest.pulls.create({
title: 'chore: Update data from AWS APIs',
owner,
repo,
head: 'codegen',
base: 'main',
body: [
'Updates auto generated files with data from the AWS APIs for pricing and VPC limits. Please remove the branch after merging.',
'This PR is generated by [APICodeGen](https://github.com/aws/karpenter/actions/workflows/codegen.yml).'
].join('\n')
});
github.rest.issues.addLabels({
owner,
repo,
issue_number: result.data.number,
labels: ['aws', 'dependencies']
});
- name: notify slack of success or failure
uses: ./.github/actions/e2e/slack/notify
if: (success() || failure())
with:
url: ${{ secrets.SLACK_WEBHOOK_URL }}
suite: codegen
================================================
FILE: .github/workflows/codeql-analysis.yaml
================================================
name: "CodeQL"
on:
push:
branches:
- 'main'
- 'release-v*'
- 'staging/*'
pull_request:
schedule:
- cron: '0 12 * * *'
jobs:
analyze-go:
name: Analyze Go
if: github.repository == 'aws/karpenter-provider-aws'
runs-on: ubuntu-latest
permissions:
actions: read # github/codeql-action/init@v2
security-events: write # github/codeql-action/init@v2
steps:
- uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1
- uses: ./.github/actions/install-deps
- run: make vulncheck
- uses: github/codeql-action/init@cdefb33c0f6224e58673d9004f47f7cb3e328b89 # v4.31.10
with:
languages: go
- uses: github/codeql-action/autobuild@cdefb33c0f6224e58673d9004f47f7cb3e328b89 # v4.31.10
- uses: github/codeql-action/analyze@cdefb33c0f6224e58673d9004f47f7cb3e328b89 # v4.31.10
# Javascript is added here for evaluating Github Action vulnerabilities
# https://github.blog/2023-08-09-four-tips-to-keep-your-github-actions-workflows-secure/#2-enable-code-scanning-for-workflows
analyze-github-actions:
name: Analyze Github Actions
if: github.repository == 'aws/karpenter-provider-aws'
runs-on: ubuntu-latest
permissions:
actions: read # github/codeql-action/init@v3
security-events: write # github/codeql-action/init@v3
steps:
- uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1
- uses: github/codeql-action/init@cdefb33c0f6224e58673d9004f47f7cb3e328b89 # v4.31.10
with:
languages: actions
- uses: github/codeql-action/analyze@cdefb33c0f6224e58673d9004f47f7cb3e328b89 # v4.31.10
================================================
FILE: .github/workflows/dryrun-gen-pr.yaml
================================================
name: DryRunGenPR
on:
pull_request:
workflow_dispatch:
jobs:
dryrun-gen:
if: github.repository == 'aws/karpenter-provider-aws'
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1
- run: make prepare-website
env:
GIT_TAG: v0.10000.0 # Mock version for testing website generation
================================================
FILE: .github/workflows/dryrun-gen.yaml
================================================
name: DryRunGen
on:
push:
branches:
- 'main'
- 'release-v*'
- 'staging/*'
jobs:
dryrun-gen:
permissions:
id-token: write # aws-actions/configure-aws-credentials@v4.0.1
if: github.repository == 'aws/karpenter-provider-aws'
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1
- uses: ./.github/actions/install-deps
with:
use-cache: false
- uses: aws-actions/configure-aws-credentials@61815dcd50bd041e203e49132bacad1fd04d2708 # v5.1.1
with:
role-to-assume: 'arn:aws:iam::${{ vars.READONLY_ACCOUNT_ID }}:role/${{ vars.READONLY_ROLE_NAME }}'
aws-region: ${{ vars.READONLY_REGION }}
- run: make docgen
- run: make codegen
env:
ENABLE_GIT_PUSH: false
- run: make prepare-website
env:
GIT_TAG: v0.10000.0 # Mock version for testing website generation
================================================
FILE: .github/workflows/e2e-cleanup.yaml
================================================
name: E2ECleanup
on:
workflow_dispatch:
inputs:
cluster_name:
type: string
required: true
git_ref:
type: string
region:
type: choice
options:
- "us-east-1"
- "us-east-2"
- "us-west-2"
- "eu-west-1"
jobs:
cleanup:
permissions:
id-token: write # aws-actions/configure-aws-credentials@v4.0.1
name: cleanup-${{ inputs.cluster_name }}
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1
with:
ref: ${{ inputs.git_ref }}
- name: configure aws credentials
uses: aws-actions/configure-aws-credentials@61815dcd50bd041e203e49132bacad1fd04d2708 # v5.1.1
with:
role-to-assume: arn:aws:iam::${{ vars.CI_ACCOUNT_ID }}:role/${{ vars.CI_ROLE_NAME }}
aws-region: ${{ inputs.region }}
role-duration-seconds: 21600
- name: cleanup karpenter and cluster '${{ inputs.cluster_name }}' resources
uses: ./.github/actions/e2e/cleanup
with:
account_id: ${{ vars.CI_ACCOUNT_ID }}
role: ${{ vars.CI_ROLE_NAME }}
region: ${{ inputs.region }}
cluster_name: ${{ inputs.cluster_name }}
git_ref: ${{ inputs.git_ref }}
eksctl_version: v0.202.0
================================================
FILE: .github/workflows/e2e-matrix-trigger.yaml
================================================
name: E2EMatrixTrigger
on:
schedule:
- cron: '7 */8 * * *'
push:
branches:
- 'main'
- 'release-v*'
- 'staging/*'
workflow_run:
workflows:
- ApprovalComment
types:
- completed
workflow_dispatch:
inputs:
region:
required: true
default: 'us-east-2'
type: choice
options:
- "us-east-1"
- "us-east-2"
cleanup:
required: true
default: true
type: boolean
jobs:
resolve:
if: (github.repository == 'aws/karpenter-provider-aws' && (github.event_name != 'workflow_run' || github.event.workflow_run.conclusion == 'success')) || github.event_name == 'workflow_dispatch'
uses: ./.github/workflows/resolve-args.yaml
with:
allowed_comment: "snapshot"
e2e-matrix:
permissions:
id-token: write # aws-actions/configure-aws-credentials@v4.0.1
statuses: write # ./.github/actions/commit-status/start
needs: [resolve]
if: needs.resolve.outputs.SHOULD_RUN == 'true'
uses: ./.github/workflows/e2e-matrix.yaml
with:
git_ref: ${{ needs.resolve.outputs.GIT_REF }}
region: ${{ inputs.region || 'us-east-2' }}
workflow_trigger: "matrix"
# Default to true unless using a workflow_dispatch
cleanup: ${{ github.event_name != 'workflow_dispatch' && true || inputs.cleanup }}
secrets:
SLACK_WEBHOOK_URL: ${{ secrets.SLACK_WEBHOOK_URL }}
================================================
FILE: .github/workflows/e2e-matrix.yaml
================================================
name: E2EMatrix
on:
workflow_call:
inputs:
region:
type: string
default: "us-east-2"
k8s_version:
type: string
default: "1.35"
cleanup:
type: boolean
required: true
git_ref:
type: string
workflow_trigger:
type: string
required: true
parallelism:
type: number
secrets:
SLACK_WEBHOOK_URL:
required: true
workflow_dispatch:
inputs:
region:
type: choice
options:
- "us-east-1"
- "us-east-2"
- "us-west-2"
- "eu-west-1"
default: "us-east-2"
k8s_version:
type: choice
options:
- "1.29"
- "1.30"
- "1.31"
- "1.32"
- "1.33"
- "1.34"
- "1.35"
default: "1.35"
cleanup:
type: boolean
required: true
default: true
# All jobs will run under the following conditions:
# 1. Upstream Karpenter repo triggered the job by schedule, push, or dispatch
# 2. Upstream Karpenter repo triggered the job by workflow_run, which requires maintainer check to succeed
# 3. Downstream fork triggered the job through dispatch and has set 'ENABLE_E2E' in repo environment variables
jobs:
e2e:
permissions:
id-token: write # aws-actions/configure-aws-credentials@v4.0.1
statuses: write # ./.github/actions/commit-status/start
strategy:
fail-fast: false
max-parallel: ${{ inputs.parallelism || 100 }}
matrix:
suite:
- name: IPv6
region: ${{ inputs.region }}
source: aws
- name: AMI
region: ${{ inputs.region }}
source: aws
- name: Scheduling
region: ${{ inputs.region }}
source: aws
- name: Storage
region: ${{ inputs.region }}
source: aws
- name: Integration
region: ${{ inputs.region }}
source: all
- name: NodeClaim
region: ${{ inputs.region }}
source: all
- name: Consolidation
region: ${{ inputs.region }}
source: aws
- name: Interruption
region: ${{ inputs.region }}
source: aws
- name: Drift
region: ${{ inputs.region }}
source: all
- name: Expiration
region: ${{ inputs.region }}
source: upstream
- name: Chaos
region: ${{ inputs.region }}
source: upstream
- name: Termination
region: ${{ inputs.region }}
source: upstream
- name: LocalZone
# LAX is the only local zone available in the CI account, therefore only use us-west-2
region: us-west-2
source: aws
uses: ./.github/workflows/e2e.yaml
with:
suite: ${{ matrix.suite.name }}
git_ref: ${{ inputs.git_ref }}
region: ${{ matrix.suite.region }}
k8s_version: ${{ inputs.k8s_version }}
cleanup: ${{ inputs.cleanup }}
workflow_trigger: ${{ inputs.workflow_trigger }}
source: ${{ matrix.suite.source }}
secrets:
SLACK_WEBHOOK_URL: ${{ secrets.SLACK_WEBHOOK_URL }}
e2e-upgrade:
permissions:
id-token: write # aws-actions/configure-aws-credentials@v4.0.1
statuses: write # ./.github/actions/commit-status/start
uses: ./.github/workflows/e2e-upgrade.yaml
with:
from_git_ref: e169c8f9b56a7ce0b0c4b7f4ae233d5740365590
to_git_ref: ${{ inputs.git_ref }}
region: ${{ inputs.region }}
k8s_version: ${{ inputs.k8s_version }}
cleanup: ${{ inputs.cleanup }}
workflow_trigger: ${{ inputs.workflow_trigger }}
source: all
secrets:
SLACK_WEBHOOK_URL: ${{ secrets.SLACK_WEBHOOK_URL }}
================================================
FILE: .github/workflows/e2e-private-cluster-trigger.yaml
================================================
name: E2EPrivateClusterTrigger
on:
schedule:
- cron: '7 0 * * 4'
jobs:
private-cluster-trigger:
if: github.repository == 'aws/karpenter-provider-aws'
permissions:
id-token: write # aws-actions/configure-aws-credentials@v4.0.1
statuses: write # ./.github/actions/commit-status/start
uses: ./.github/workflows/e2e.yaml
with:
suite: Integration
region: us-east-1
workflow_trigger: "private_cluster"
cleanup: true
codebuild_region: US_EAST_1
source: aws
secrets:
SLACK_WEBHOOK_URL: ${{ secrets.SLACK_WEBHOOK_URL }}
================================================
FILE: .github/workflows/e2e-scale-trigger.yaml
================================================
name: E2EScaleTrigger
on:
schedule:
- cron: '7 18 * * *'
workflow_run:
workflows: [ApprovalComment]
types: [completed]
workflow_dispatch:
inputs:
region:
required: true
default: 'us-west-2'
type: choice
options:
- "us-east-1"
- "us-west-2"
cleanup:
required: true
default: true
type: boolean
enable_metrics:
required: true
default: false
type: boolean
jobs:
resolve:
if: (github.repository == 'aws/karpenter-provider-aws' && (github.event_name != 'workflow_run' || github.event.workflow_run.conclusion == 'success')) || github.event_name == 'workflow_dispatch'
uses: ./.github/workflows/resolve-args.yaml
with:
allowed_comment: "scale"
scale:
permissions:
id-token: write # aws-actions/configure-aws-credentials@v4.0.1
statuses: write # ./.github/actions/commit-status/start
needs: [resolve]
if: needs.resolve.outputs.SHOULD_RUN == 'true'
uses: ./.github/workflows/e2e.yaml
with:
suite: Scale
git_ref: ${{ needs.resolve.outputs.GIT_REF }}
region: ${{ inputs.region || 'us-west-2' }}
enable_metrics: ${{ inputs.enable_metrics || true }}
workflow_trigger: "scale"
source: aws
# Default to true unless using a workflow_dispatch
cleanup: ${{ github.event_name != 'workflow_dispatch' && true || inputs.cleanup }}
secrets:
SLACK_WEBHOOK_URL: ${{ secrets.SLACK_WEBHOOK_URL }}
================================================
FILE: .github/workflows/e2e-soak-trigger.yaml
================================================
name: E2ESoakTrigger
on:
schedule:
- cron: '0 */3 * * *'
jobs:
resolve_cluster:
permissions:
id-token: write # aws-actions/configure-aws-credentials@v4.0.1
if: github.repository == 'aws/karpenter-provider-aws'
runs-on: ubuntu-latest
outputs:
PREEXISTING_CLUSTERS: ${{ steps.list_clusters.outputs.PREEXISTING_CLUSTERS }}
steps:
- uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1
- name: configure aws credentials
uses: aws-actions/configure-aws-credentials@61815dcd50bd041e203e49132bacad1fd04d2708
with:
role-to-assume: arn:aws:iam::${{ vars.CI_ACCOUNT_ID }}:role/${{ vars.CI_ROLE_NAME }}
aws-region: eu-north-1
- uses: actions/setup-go@7a3fe6cf4cb3a834922a1244abfce67bcef6a0c5 # v6.2.0
with:
go-version-file: test/hack/soak/go.mod
cache-dependency-path: test/hack/soak/go.sum
check-latest: true
cache: false
# Grab all the names of the soak testing clusters, and identify clusters that will need to be deleted
# Empty cluster_name will indicate that a new cluster will be created
- id: list_clusters
name: "Run list clusters script"
run: |
PREEXISTING_CLUSTERS="$(go run get_clusters.go)"
echo PREEXISTING_CLUSTERS="$PREEXISTING_CLUSTERS" >> "$GITHUB_OUTPUT"
working-directory: ./test/hack/soak
shell: bash
soak:
permissions:
id-token: write # aws-actions/configure-aws-credentials@v4.0.1
statuses: write # required by e2e.yaml
needs: [resolve_cluster]
strategy:
fail-fast: false
matrix: ${{ fromJson(needs.resolve_cluster.outputs.PREEXISTING_CLUSTERS) }}
uses: ./.github/workflows/e2e.yaml
with:
suite: Integration
region: eu-north-1
workflow_trigger: "soak"
cluster_name: ${{ matrix.cluster_name }}
cleanup: ${{ matrix.cluster_cleanup }}
git_ref: ${{ matrix.git_ref }}
source: aws
secrets:
SLACK_WEBHOOK_SOAK_URL: ${{ secrets.SLACK_WEBHOOK_SOAK_URL }}
================================================
FILE: .github/workflows/e2e-upgrade.yaml
================================================
name: E2EUpgrade
on:
workflow_dispatch:
inputs:
from_git_ref:
type: string
required: true
region:
type: choice
options:
- "us-east-2"
- "us-west-2"
default: "us-east-2"
to_git_ref:
type: string
k8s_version:
type: choice
options:
- "1.29"
- "1.30"
- "1.31"
- "1.32"
- "1.33"
- "1.34"
- "1.35"
default: "1.35"
cleanup:
required: true
default: true
type: boolean
source:
type: string
default: "aws"
workflow_call:
inputs:
from_git_ref:
type: string
required: true
to_git_ref:
type: string
region:
type: string
default: "us-east-2"
k8s_version:
type: string
default: "1.35"
cleanup:
required: true
type: boolean
workflow_trigger:
type: string
source:
type: string
default: "aws"
secrets:
SLACK_WEBHOOK_URL:
required: true
jobs:
run-suite:
permissions:
id-token: write # aws-actions/configure-aws-credentials@v4.0.1
statuses: write # ./.github/actions/commit-status/start
name: suite-upgrade
runs-on: ubuntu-latest
steps:
# This additional checkout can be removed when the commit status action is added to the from_git_ref version of Karpenter
- uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1
with:
ref: ${{ inputs.to_git_ref }}
- if: always() && github.event_name == 'workflow_run'
uses: ./.github/actions/commit-status/start
with:
name: ${{ github.workflow }} (${{ inputs.k8s_version }}) / e2e (Upgrade)
git_ref: ${{ inputs.to_git_ref }}
- uses: ./.github/actions/install-deps
- uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1
with:
ref: ${{ inputs.from_git_ref }}
- name: configure aws credentials
uses: aws-actions/configure-aws-credentials@61815dcd50bd041e203e49132bacad1fd04d2708 # v5.1.1
with:
role-to-assume: arn:aws:iam::${{ vars.CI_ACCOUNT_ID }}:role/${{ vars.CI_ROLE_NAME }}
aws-region: ${{ inputs.region }}
role-duration-seconds: 21600
- id: generate-cluster-name
name: generate cluster name
run: |
CLUSTER_NAME="upgrade-$RANDOM$RANDOM"
echo "Using cluster name \"$CLUSTER_NAME\""
echo CLUSTER_NAME="$CLUSTER_NAME" >> "$GITHUB_OUTPUT"
- name: setup eks cluster '${{ steps.generate-cluster-name.outputs.CLUSTER_NAME }}'
uses: ./.github/actions/e2e/setup-cluster
with:
account_id: ${{ vars.CI_ACCOUNT_ID }}
role: ${{ vars.CI_ROLE_NAME }}
region: ${{ inputs.region }}
cluster_name: ${{ steps.generate-cluster-name.outputs.CLUSTER_NAME }}
k8s_version: ${{ inputs.k8s_version }}
eksctl_version: v0.202.0
ip_family: IPv4 # Set the value to IPv6 if IPv6 suite, else IPv4
git_ref: ${{ inputs.from_git_ref }}
ecr_account_id: ${{ vars.SNAPSHOT_ACCOUNT_ID }}
ecr_region: ${{ vars.SNAPSHOT_REGION }}
prometheus_workspace_id: ${{ vars.WORKSPACE_ID }}
prometheus_region: ${{ vars.PROMETHEUS_REGION }}
- uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1
with:
ref: ${{ inputs.to_git_ref }}
- name: upgrade crds
uses: ./.github/actions/e2e/upgrade-crds
with:
account_id: ${{ vars.CI_ACCOUNT_ID }}
role: ${{ vars.CI_ROLE_NAME }}
region: ${{ inputs.region }}
cluster_name: ${{ steps.generate-cluster-name.outputs.CLUSTER_NAME }}
git_ref: ${{ inputs.to_git_ref }}
- name: upgrade eks cluster '${{ steps.generate-cluster-name.outputs.CLUSTER_NAME }}'
uses: ./.github/actions/e2e/setup-cluster
with:
account_id: ${{ vars.CI_ACCOUNT_ID }}
role: ${{ vars.CI_ROLE_NAME }}
region: ${{ inputs.region }}
cluster_name: ${{ steps.generate-cluster-name.outputs.CLUSTER_NAME }}
k8s_version: ${{ inputs.k8s_version }}
eksctl_version: v0.202.0
ip_family: IPv4 # Set the value to IPv6 if IPv6 suite, else IPv4
git_ref: ${{ inputs.to_git_ref }}
ecr_account_id: ${{ vars.SNAPSHOT_ACCOUNT_ID }}
ecr_region: ${{ vars.SNAPSHOT_REGION }}
prometheus_workspace_id: ${{ vars.WORKSPACE_ID }}
prometheus_region: ${{ vars.PROMETHEUS_REGION }}
- name: run the Upgrade test suite
env:
SOURCE: ${{ inputs.source }}
run: |
aws eks update-kubeconfig --name ${{ steps.generate-cluster-name.outputs.CLUSTER_NAME }}
if [[ "$SOURCE" == 'aws' ]]; then
CLUSTER_NAME=${{ steps.generate-cluster-name.outputs.CLUSTER_NAME }} INTERRUPTION_QUEUE=${{ steps.generate-cluster-name.outputs.CLUSTER_NAME }} CLUSTER_ENDPOINT="$(aws eks describe-cluster --name ${{ steps.generate-cluster-name.outputs.CLUSTER_NAME }} --query "cluster.endpoint" --output text)" TEST_SUITE="Integration" make e2etests
elif [[ "$SOURCE" == 'upstream' ]]; then
FOCUS="Integration" CLUSTER_NAME="${{ steps.generate-cluster-name.outputs.CLUSTER_NAME }}" make upstream-e2etests
elif [[ "$SOURCE" == 'all' ]]; then
CLUSTER_NAME=${{ steps.generate-cluster-name.outputs.CLUSTER_NAME }} INTERRUPTION_QUEUE=${{ steps.generate-cluster-name.outputs.CLUSTER_NAME }} CLUSTER_ENDPOINT="$(aws eks describe-cluster --name ${{ steps.generate-cluster-name.outputs.CLUSTER_NAME }} --query "cluster.endpoint" --output text)" TEST_SUITE="Integration" make e2etests
FOCUS="Integration" CLUSTER_NAME="${{ steps.generate-cluster-name.outputs.CLUSTER_NAME }}" make upstream-e2etests
fi
- name: notify slack of success or failure
uses: ./.github/actions/e2e/slack/notify
if: (success() || failure()) && github.event_name != 'workflow_run' && inputs.workflow_trigger != 'versionCompatibility'
with:
cluster_name: ${{ steps.generate-cluster-name.outputs.CLUSTER_NAME }}
url: ${{ secrets.SLACK_WEBHOOK_URL }}
suite: Upgrade
git_ref: ${{ inputs.to_git_ref }}
- name: dump logs on failure
uses: ./.github/actions/e2e/dump-logs
if: failure() || cancelled()
with:
account_id: ${{ vars.CI_ACCOUNT_ID }}
role: ${{ vars.CI_ROLE_NAME }}
region: ${{ inputs.region }}
cluster_name: ${{ steps.generate-cluster-name.outputs.CLUSTER_NAME }}
- name: cleanup karpenter and cluster '${{ steps.generate-cluster-name.outputs.CLUSTER_NAME }}' resources
uses: ./.github/actions/e2e/cleanup
if: always() && inputs.cleanup
with:
account_id: ${{ vars.CI_ACCOUNT_ID }}
role: ${{ vars.CI_ROLE_NAME }}
region: ${{ inputs.region }}
cluster_name: ${{ steps.generate-cluster-name.outputs.CLUSTER_NAME }}
git_ref: ${{ inputs.to_git_ref }}
eksctl_version: v0.202.0
- if: always() && github.event_name == 'workflow_run'
uses: ./.github/actions/commit-status/end
with:
name: ${{ github.workflow }} (${{ inputs.k8s_version }}) / e2e (Upgrade)
git_ref: ${{ inputs.to_git_ref }}
================================================
FILE: .github/workflows/e2e-version-compatibility-trigger.yaml
================================================
name: E2EVersionCompatibilityTrigger
on:
schedule:
# The test will run every Monday, Thursday at 12:07 AM UTC
- cron: '7 0 * * 1,4'
workflow_run:
workflows: [ApprovalComment]
types: [completed]
workflow_dispatch:
inputs:
region:
required: true
default: 'eu-west-1'
type: choice
options:
- "us-east-1"
- "eu-west-1"
cleanup:
required: true
default: true
type: boolean
jobs:
resolve:
if: (github.repository == 'aws/karpenter-provider-aws' && (github.event_name != 'workflow_run' || github.event.workflow_run.conclusion == 'success')) || github.event_name == 'workflow_dispatch'
uses: ./.github/workflows/resolve-args.yaml
with:
allowed_comment: "versionCompatibility"
versionCompatibility:
permissions:
id-token: write # aws-actions/configure-aws-credentials@v4.0.1
statuses: write # ./.github/actions/commit-status/start
needs: [resolve]
if: needs.resolve.outputs.SHOULD_RUN == 'true'
strategy:
fail-fast: false
matrix:
k8s_version: ["1.29", "1.30", "1.31", "1.32", "1.33", "1.34", "1.35"]
uses: ./.github/workflows/e2e-matrix.yaml
with:
region: ${{ inputs.region || 'eu-west-1' }}
git_ref: ${{ needs.resolve.outputs.GIT_REF }}
k8s_version: ${{ matrix.k8s_version }}
workflow_trigger: "versionCompatibility"
# Default to true unless using a workflow_dispatch
cleanup: ${{ github.event_name != 'workflow_dispatch' && true || inputs.cleanup }}
parallelism: 1
secrets:
SLACK_WEBHOOK_URL: ${{ secrets.SLACK_WEBHOOK_URL }}
================================================
FILE: .github/workflows/e2e.yaml
================================================
name: E2E
on:
workflow_dispatch:
inputs:
git_ref:
type: string
region:
type: choice
options:
- "us-east-1"
- "us-east-2"
- "us-west-2"
- "eu-west-1"
default: "us-east-2"
suite:
type: choice
required: true
options:
- Integration
- NodeClaim
- Consolidation
- Interruption
- Drift
- Expiration
- Chaos
- IPv6
- Scale
- PrivateCluster
- LocalZone
k8s_version:
type: choice
options:
- "1.29"
- "1.30"
- "1.31"
- "1.32"
- "1.33"
- "1.34"
- "1.35"
default: "1.35"
cluster_name:
type: string
cleanup:
type: boolean
required: true
default: true
enable_metrics:
type: boolean
default: false
codebuild_region:
type: string
source:
type: string
default: "aws"
workflow_call:
inputs:
git_ref:
type: string
source:
type: string
default: "aws"
region:
type: string
default: "us-east-2"
suite:
type: string
required: true
k8s_version:
type: string
default: "1.35"
enable_metrics:
type: boolean
default: false
cleanup:
type: boolean
required: true
workflow_trigger:
type: string
codebuild_region:
type: string
cluster_name:
type: string
description: If cluster_name is empty, a new cluster will be created. Otherwise, tests will run on an existing cluster
secrets:
SLACK_WEBHOOK_URL:
required: false
SLACK_WEBHOOK_SOAK_URL:
required: false
jobs:
run-suite:
permissions:
id-token: write # aws-actions/configure-aws-credentials@v4.0.1
statuses: write # ./.github/actions/commit-status/start
name: suite-${{ inputs.suite }}
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1
with:
ref: ${{ inputs.git_ref }}
- if: always() && github.event_name == 'workflow_run'
uses: ./.github/actions/commit-status/start
with:
name: ${{ github.workflow }} (${{ inputs.k8s_version }}) / e2e (${{ inputs.suite }})
git_ref: ${{ inputs.git_ref }}
- uses: ./.github/actions/install-deps
- name: configure aws credentials
uses: aws-actions/configure-aws-credentials@61815dcd50bd041e203e49132bacad1fd04d2708 # v5.1.1
with:
role-to-assume: arn:aws:iam::${{ vars.CI_ACCOUNT_ID }}:role/${{ vars.CI_ROLE_NAME }}
aws-region: ${{ inputs.region }}
role-duration-seconds: 21600
- name: add jitter on cluster setup
if: github.repository == 'aws/karpenter-provider-aws'
run: |
# Creating jitter so that we can stagger cluster creation to avoid throttling
sleep $(( RANDOM % 300 + 1 ))
- id: generate-cluster-name
name: generate cluster name
env:
SUITE: ${{ inputs.suite }}
CLUSTER_NAME: ${{ inputs.cluster_name }}
WORKFLOW_TRIGGER: ${{ inputs.workflow_trigger }}
run: |
if [[ "$CLUSTER_NAME" == '' ]]; then
if [[ "$WORKFLOW_TRIGGER" == 'soak' ]]; then
CLUSTER_NAME=$(echo "soak-periodic-$RANDOM$RANDOM" | awk '{print tolower($0)}' | tr / -)
else
CLUSTER_NAME=$(echo "$SUITE-$RANDOM$RANDOM" | awk '{print tolower($0)}' | tr / -)
fi
fi
echo "Using cluster name \"$CLUSTER_NAME\""
echo CLUSTER_NAME="$CLUSTER_NAME" >> "$GITHUB_OUTPUT"
- name: setup eks cluster '${{ steps.generate-cluster-name.outputs.CLUSTER_NAME }}'
if: inputs.cluster_name == ''
uses: ./.github/actions/e2e/setup-cluster
with:
account_id: ${{ vars.CI_ACCOUNT_ID }}
role: ${{ vars.CI_ROLE_NAME }}
region: ${{ inputs.region }}
cluster_name: ${{ steps.generate-cluster-name.outputs.CLUSTER_NAME }}
k8s_version: ${{ inputs.k8s_version }}
eksctl_version: v0.202.0
ip_family: ${{ contains(inputs.suite, 'IPv6') && 'IPv6' || 'IPv4' }} # Set the value to IPv6 if IPv6 suite, else IPv4
private_cluster: ${{ inputs.workflow_trigger == 'private_cluster' }}
git_ref: ${{ inputs.git_ref }}
ecr_account_id: ${{ vars.SNAPSHOT_ACCOUNT_ID }}
ecr_region: ${{ vars.SNAPSHOT_REGION }}
prometheus_workspace_id: ${{ vars.WORKSPACE_ID }}
prometheus_region: ${{ vars.PROMETHEUS_REGION }}
enable_local_zones: ${{ inputs.suite == 'LocalZone' }}
cleanup: ${{ inputs.cleanup }}
codebuild_role: ${{ vars[format('{0}_CODEBUILD_ROLE', inputs.codebuild_region)] }}
- name: run tests for private cluster
if: ${{ inputs.workflow_trigger == 'private_cluster' }}
uses: ./.github/actions/e2e/run-tests-private-cluster
with:
cluster_name: ${{ steps.generate-cluster-name.outputs.CLUSTER_NAME }}
suite: ${{ inputs.suite }}
prometheus_region: ${{ vars.PROMETHEUS_REGION }}
prometheus_workspace_id: ${{ vars.WORKSPACE_ID }}
region: ${{ inputs.region }}
account_id: ${{ vars.CI_ACCOUNT_ID }}
k8s_version: ${{ inputs.k8s_version }}
ecr_account_id: ${{ vars.SNAPSHOT_ACCOUNT_ID }}
ecr_region: ${{ vars.SNAPSHOT_REGION }}
private_cluster: ${{ inputs.workflow_trigger == 'private_cluster' }}
enable_metrics: ${{ inputs.enable_metrics }}
metrics_region: ${{ vars.TIMESTREAM_REGION }}
node_role: ${{ env.NODE_ROLE }}
cleanup: ${{ inputs.cleanup }}
codebuild_sg: ${{ vars[format('{0}_CODEBUILD_SG', inputs.codebuild_region)] }}
codebuild_vpc: ${{ vars[format('{0}_CODEBUILD_VPC', inputs.codebuild_region)] }}
- name: run the ${{ inputs.suite }} test suite
if: ${{ inputs.workflow_trigger != 'private_cluster' }}
env:
SUITE: ${{ inputs.suite }}
ENABLE_METRICS: ${{ inputs.enable_metrics }}
SOURCE: ${{ inputs.source }}
run: |
aws eks update-kubeconfig --name ${{ steps.generate-cluster-name.outputs.CLUSTER_NAME }}
# Clean up the cluster before running all tests
kubectl delete nodepool --all
kubectl delete ec2nodeclass --all
kubectl delete deployment --all
if [[ "$SOURCE" == 'aws' ]]; then
TEST_SUITE="$SUITE" ENABLE_METRICS=$ENABLE_METRICS METRICS_REGION=${{ vars.TIMESTREAM_REGION }} GIT_REF="$(git rev-parse HEAD)" \
CLUSTER_NAME="${{ steps.generate-cluster-name.outputs.CLUSTER_NAME }}" CLUSTER_ENDPOINT="$(aws eks describe-cluster --name ${{ steps.generate-cluster-name.outputs.CLUSTER_NAME }} --query "cluster.endpoint" --output text)" \
INTERRUPTION_QUEUE="${{ steps.generate-cluster-name.outputs.CLUSTER_NAME }}" make e2etests
elif [[ "$SOURCE" == 'upstream' ]]; then
FOCUS="$SUITE" GIT_REF="$(git rev-parse HEAD)" \
CLUSTER_NAME="${{ steps.generate-cluster-name.outputs.CLUSTER_NAME }}" make upstream-e2etests
elif [[ "$SOURCE" == 'all' ]]; then
TEST_SUITE="$SUITE" ENABLE_METRICS=$ENABLE_METRICS METRICS_REGION=${{ vars.TIMESTREAM_REGION }} GIT_REF="$(git rev-parse HEAD)" \
CLUSTER_NAME="${{ steps.generate-cluster-name.outputs.CLUSTER_NAME }}" CLUSTER_ENDPOINT="$(aws eks describe-cluster --name ${{ steps.generate-cluster-name.outputs.CLUSTER_NAME }} --query "cluster.endpoint" --output text)" \
INTERRUPTION_QUEUE="${{ steps.generate-cluster-name.outputs.CLUSTER_NAME }}" make e2etests
FOCUS="$SUITE" GIT_REF="$(git rev-parse HEAD)" \
CLUSTER_NAME="${{ steps.generate-cluster-name.outputs.CLUSTER_NAME }}" make upstream-e2etests
fi
- name: notify slack of success or failure
uses: ./.github/actions/e2e/slack/notify
if: (success() || failure()) && github.event_name != 'workflow_run' && inputs.workflow_trigger != 'versionCompatibility'
with:
cluster_name: ${{ steps.generate-cluster-name.outputs.CLUSTER_NAME }}
url: ${{ inputs.workflow_trigger == 'soak' && secrets.SLACK_WEBHOOK_SOAK_URL || secrets.SLACK_WEBHOOK_URL }}
suite: ${{ inputs.suite }}
git_ref: ${{ inputs.git_ref }}
workflow_trigger: ${{ inputs.workflow_trigger }}
- name: dump logs on failure
uses: ./.github/actions/e2e/dump-logs
if: (failure() || cancelled()) && inputs.workflow_trigger != 'private_cluster'
with:
account_id: ${{ vars.CI_ACCOUNT_ID }}
role: ${{ vars.CI_ROLE_NAME }}
region: ${{ inputs.region }}
cluster_name: ${{ steps.generate-cluster-name.outputs.CLUSTER_NAME }}
- name: cleanup karpenter and cluster '${{ steps.generate-cluster-name.outputs.CLUSTER_NAME }}' resources
uses: ./.github/actions/e2e/cleanup
if: always() && inputs.cleanup
with:
account_id: ${{ vars.CI_ACCOUNT_ID }}
role: ${{ vars.CI_ROLE_NAME }}
region: ${{ inputs.region }}
cluster_name: ${{ steps.generate-cluster-name.outputs.CLUSTER_NAME }}
git_ref: ${{ inputs.git_ref }}
eksctl_version: v0.202.0
private_cluster: ${{ inputs.workflow_trigger == 'private_cluster' }}
- if: always() && github.event_name == 'workflow_run'
uses: ./.github/actions/commit-status/end
with:
name: ${{ github.workflow }} (${{ inputs.k8s_version }}) / e2e (${{ inputs.suite }})
git_ref: ${{ inputs.git_ref }}
================================================
FILE: .github/workflows/image-canary.yaml
================================================
name: ImageCanary
on:
workflow_dispatch:
schedule:
- cron: '0 */1 * * *'
jobs:
image-canary:
runs-on: ubuntu-latest
permissions:
id-token: write # aws-actions/configure-aws-credentials@v4.0.1
if: github.repository == 'aws/karpenter-provider-aws'
steps:
- uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1
- name: Configure AWS credentials
uses: aws-actions/configure-aws-credentials@61815dcd50bd041e203e49132bacad1fd04d2708 # v5.1.1
with:
role-to-assume: arn:aws:iam::${{ vars.READONLY_ACCOUNT_ID }}:role/${{ vars.READONLY_ROLE_NAME }}
aws-region: ${{ vars.READONLY_REGION }}
role-duration-seconds: 900
# Authenticate to public ECR to prevent rate limiting
- uses: docker/login-action@5e57cd118135c172c3672efd75eb46360885c0ef # v3.6.0
with:
registry: public.ecr.aws
logout: true
env:
AWS_REGION: us-east-1
- name: Run image canary
env:
GH_TOKEN: ${{ github.token }}
run: ./hack/image_canary.sh
- name: Notify slack of failure
if: failure() && github.event_name != 'workflow_run'
uses: ./.github/actions/e2e/slack/send-message
with:
message: ":alert: image canary failure (https://github.com/${{ github.repository }}/actions/runs/${{ github.run_id }}) @channel"
url: ${{ secrets.SLACK_WEBHOOK_URL }}
================================================
FILE: .github/workflows/postsubmit.yaml
================================================
name: PostSubmit
on:
push:
branches:
- main
workflow_dispatch:
jobs:
postsubmit:
if: github.repository == 'aws/karpenter-provider-aws'
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1
- uses: ./.github/actions/install-deps
- name: hydrate-goproxy
run: |
mkdir -p hydrate-goproxy
cd hydrate-goproxy
go mod init hydrate-goproxy
go get "github.com/${GITHUB_REPOSITORY}@${GITHUB_SHA}"
================================================
FILE: .github/workflows/release.yaml
================================================
name: Release
on:
push:
# Only release on supported semantic version tagging e.g. v0.0.1-rc.0
tags:
- 'v[0-9]+.[0-9]+.[0-9]+'
- 'v[0-9]+.[0-9]+.[0-9]+-rc.[0-9]+'
- 'v[0-9]+.[0-9]+.[0-9]+-alpha.[0-9]+'
- 'v[0-9]+.[0-9]+.[0-9]+-beta.[0-9]+'
jobs:
release:
permissions:
id-token: write # aws-actions/configure-aws-credentials@v4.0.1
contents: write # marvinpinto/action-automatic-releases@v1.2.1
pull-requests: write # name: Create PR
if: github.repository == 'aws/karpenter-provider-aws'
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1
with:
fetch-depth: 0
- name: Create GitHub Release
uses: marvinpinto/action-automatic-releases@919008cf3f741b179569b7a6fb4d8860689ab7f0 # v1.2.1
with:
repo_token: '${{ secrets.GITHUB_TOKEN }}'
prerelease: false
- uses: ./.github/actions/install-deps
with:
use-cache: false
- uses: ./.github/actions/e2e/install-helm
with:
version: v3.18.6
- uses: aws-actions/configure-aws-credentials@61815dcd50bd041e203e49132bacad1fd04d2708 # v5.1.1
with:
role-to-assume: 'arn:aws:iam::${{ vars.RELEASE_ACCOUNT_ID }}:role/${{ vars.RELEASE_ROLE_NAME }}'
aws-region: ${{ vars.RELEASE_REGION }}
- run: make release
env:
RELEASE_ACCOUNT_ID: ${{ vars.RELEASE_ACCOUNT_ID }}
CACHED_ECR_NAME: ${{ vars.CACHED_ECR_NAME }}
- uses: aws-actions/configure-aws-credentials@61815dcd50bd041e203e49132bacad1fd04d2708 # v5.1.1
with:
role-to-assume: 'arn:aws:iam::${{ vars.READONLY_ACCOUNT_ID }}:role/${{ vars.READONLY_ROLE_NAME }}'
aws-region: ${{ vars.READONLY_REGION }}
- run: make docgen
- run: make prepare-website
- run: make stable-release-pr
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
GITHUB_REPO: ${{ github.repository }}
- name: Create PR
uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8.0.0
with:
script: |
const { repo, owner } = context.repo;
const tag = context.ref.replace("refs/tags/", '');
const result = await github.rest.pulls.create({
title: `chore: Release ${tag}`,
owner,
repo,
head: `release-${tag}`,
base: 'main',
body: [
`Stable Release Changes for ${tag}.`,
'Please disregard this PR if it is for a patch release.',
'Please remove the branch after merging.',
'This PR is generated by [StableRelease](https://github.com/aws/karpenter-provider-aws/actions/workflows/stable-release.yml).'
].join('\n')
});
github.rest.issues.addLabels({
owner,
repo,
issue_number: result.data.number,
labels: ['stable-release','website','helm-charts']
});
================================================
FILE: .github/workflows/resolve-args.yaml
================================================
name: ResolveArgs
on:
workflow_call:
inputs:
allowed_comment:
type: string
required: true
outputs:
SHOULD_RUN:
value: ${{ jobs.resolve.outputs.SHOULD_RUN }}
GIT_REF:
value: ${{ jobs.resolve.outputs.GIT_REF }}
jobs:
resolve:
runs-on: ubuntu-latest
outputs:
SHOULD_RUN: ${{ steps.resolve-step.outputs.SHOULD_RUN }}
GIT_REF: ${{ steps.resolve-step.outputs.GIT_REF }}
steps:
# Download the artifact and resolve the commit if initiated by PR snapshot
# Otherwise, use the currently checked-out branch to run the E2E tests against
- uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1
- if: github.event_name == 'workflow_run'
uses: ./.github/actions/download-artifact
- id: resolve-step
env:
ALLOWED_COMMENT: ${{ inputs.allowed_comment }}
run: |
if [[ "${{ github.event_name }}" == "workflow_run" ]]; then
if [[ "$(head -n 1 /tmp/artifacts/metadata.txt)" == *"$ALLOWED_COMMENT"* ]]; then
echo SHOULD_RUN=true >> "$GITHUB_OUTPUT"
else
echo SHOULD_RUN=false >> "$GITHUB_OUTPUT"
fi
echo GIT_REF="$(tail -n 1 /tmp/artifacts/metadata.txt)" >> "$GITHUB_OUTPUT"
else
echo SHOULD_RUN=true >> "$GITHUB_OUTPUT"
echo GIT_REF="" >> "$GITHUB_OUTPUT"
fi
================================================
FILE: .github/workflows/resource-count.yaml
================================================
name: ResourceCount
on:
schedule:
- cron: '3 */1 * * *' # every hour
workflow_dispatch:
permissions:
id-token: write # aws-actions/configure-aws-credentials@v4.0.1
jobs:
counter:
if: vars.CI_ACCOUNT_ID != '' || github.event_name == 'workflow_dispatch'
strategy:
fail-fast: false
matrix:
region: [us-east-2, us-west-2, eu-west-1, eu-north-1, us-east-1]
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1
- name: configure aws credentials
uses: aws-actions/configure-aws-credentials@61815dcd50bd041e203e49132bacad1fd04d2708 # v5.1.1
with:
role-to-assume: arn:aws:iam::${{ vars.CI_ACCOUNT_ID }}:role/${{ vars.CI_ROLE_NAME }}
aws-region: ${{ matrix.region }}
- uses: actions/setup-go@7a3fe6cf4cb3a834922a1244abfce67bcef6a0c5 # v6.2.0
with:
go-version-file: test/hack/resource/go.mod
check-latest: true
cache-dependency-path: "test/hack/resource/go.sum"
- run: go run main.go
working-directory: ./test/hack/resource/count
name: "Run resource count script"
================================================
FILE: .github/workflows/snapshot-pr.yaml
================================================
name: SnapshotPR
on:
workflow_run:
workflows:
- ApprovalComment
types:
- completed
jobs:
snapshot:
permissions:
id-token: write
pull-requests: write
statuses: write
if: github.event.workflow_run.conclusion == 'success'
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1
- uses: ./.github/actions/download-artifact
- id: metadata
run: |
pr_number="$(head -n 2 /tmp/artifacts/metadata.txt | tail -n 1)"
pr_commit="$(tail -n 1 /tmp/artifacts/metadata.txt)"
echo PR_COMMIT="$pr_commit" >> "$GITHUB_ENV"
echo PR_NUMBER="$pr_number" >> "$GITHUB_ENV"
- uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1
with:
ref: ${{ env.PR_COMMIT }}
- uses: ./.github/actions/commit-status/start
with:
name: "${{ github.workflow }} / ${{ github.job }} (pull_request_review)"
git_ref: ${{ env.PR_COMMIT }}
- uses: ./.github/actions/install-deps
- uses: aws-actions/configure-aws-credentials@61815dcd50bd041e203e49132bacad1fd04d2708 # v5.1.1
with:
role-to-assume: 'arn:aws:iam::${{ vars.SNAPSHOT_ACCOUNT_ID }}:role/${{ vars.SNAPSHOT_ROLE_NAME }}'
aws-region: ${{ vars.SNAPSHOT_REGION }}
- run: make snapshot
- uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8.0.0
env:
SNAPSHOT_ACCOUNT_ID: ${{ vars.SNAPSHOT_ACCOUNT_ID }}
SNAPSHOT_REGION: ${{ vars.SNAPSHOT_REGION }}
with:
script: |
github.rest.issues.createComment({
issue_number: process.env.PR_NUMBER,
owner: context.repo.owner,
repo: context.repo.repo,
body: `Snapshot successfully published to \`oci://${process.env.SNAPSHOT_ACCOUNT_ID}.dkr.ecr.${process.env.SNAPSHOT_REGION}.amazonaws.com/karpenter/snapshot/karpenter:0-${process.env.PR_COMMIT}\`.
To install you must login to the ECR repo with an AWS account:
~~~
aws ecr get-login-password --region ${process.env.SNAPSHOT_REGION} | docker login --username AWS --password-stdin ${process.env.SNAPSHOT_ACCOUNT_ID}.dkr.ecr.${process.env.SNAPSHOT_REGION}.amazonaws.com
helm upgrade --install karpenter oci://${process.env.SNAPSHOT_ACCOUNT_ID}.dkr.ecr.${process.env.SNAPSHOT_REGION}.amazonaws.com/karpenter/snapshot/karpenter --version "0-${process.env.PR_COMMIT}" --namespace "kube-system" --create-namespace \\
--set "settings.clusterName=\${CLUSTER_NAME}" \\
--set "settings.interruptionQueue=\${CLUSTER_NAME}" \\
--set controller.resources.requests.cpu=1 \\
--set controller.resources.requests.memory=1Gi \\
--set controller.resources.limits.cpu=1 \\
--set controller.resources.limits.memory=1Gi \\
--wait
~~~
`
})
- if: always()
uses: ./.github/actions/commit-status/end
with:
name: "${{ github.workflow }} / ${{ github.job }} (pull_request_review)"
git_ref: ${{ env.PR_COMMIT }}
================================================
FILE: .github/workflows/snapshot.yaml
================================================
name: Snapshot
on:
push:
branches:
- 'main'
- 'release-v*'
- 'staging/*'
jobs:
snapshot:
permissions:
id-token: write # aws-actions/configure-aws-credentials@v4.0.1
if: github.repository == 'aws/karpenter-provider-aws'
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1
with:
fetch-depth: 0
- uses: ./.github/actions/install-deps
with:
use-cache: false
- uses: aws-actions/configure-aws-credentials@61815dcd50bd041e203e49132bacad1fd04d2708 # v5.1.1
with:
role-to-assume: 'arn:aws:iam::${{ vars.SNAPSHOT_ACCOUNT_ID }}:role/${{ vars.SNAPSHOT_ROLE_NAME }}'
aws-region: ${{ vars.SNAPSHOT_REGION }}
- run: make snapshot
================================================
FILE: .github/workflows/stale.yaml
================================================
name: StaleBot
on:
workflow_dispatch:
schedule:
- cron: '0 12 * * *'
jobs:
StaleBot:
runs-on: ubuntu-latest
permissions:
issues: write # actions/stale@v8.0.0
pull-requests: write # actions/stale@v8.0.0
if: github.repository == 'aws/karpenter-provider-aws'
name: Stale issue bot
steps:
# Issue stale-out for "triage/needs-information"
- uses: actions/stale@997185467fa4f803885201cee163a9f38240193d # v10.1.1
with:
repo-token: ${{ secrets.GITHUB_TOKEN }}
stale-issue-message: 'This issue has been inactive for 14 days. StaleBot will close this stale issue after 14 more days of inactivity.'
only-issue-labels: 'triage/needs-information'
stale-issue-label: 'lifecycle/stale'
close-issue-label: 'lifecycle/closed'
only-pr-labels: 'ignore' # Ignore this step for PRs
days-before-stale: 14
days-before-close: 14
operations-per-run: 300
# Issue stale-out for "triage/solved"
- uses: actions/stale@997185467fa4f803885201cee163a9f38240193d # v10.1.1
with:
repo-token: ${{ secrets.GITHUB_TOKEN }}
stale-issue-message: 'This issue has been inactive for 7 days and is marked as "triage/solved". StaleBot will close this stale issue after 7 more days of inactivity.'
only-issue-labels: 'triage/solved'
stale-issue-label: 'lifecycle/stale'
close-issue-label: 'lifecycle/closed'
only-pr-labels: 'ignore' # Ignore this step for PRs
days-before-stale: 7
days-before-close: 7
operations-per-run: 300
================================================
FILE: .github/workflows/sweeper.yaml
================================================
name: Sweeper
on:
schedule:
- cron: '0 */12 * * *'
workflow_dispatch:
jobs:
sweeper:
permissions:
id-token: write # aws-actions/configure-aws-credentials@v4.0.1
if: vars.CI_ACCOUNT_ID != '' || github.event_name == 'workflow_dispatch'
strategy:
fail-fast: false
max-parallel: 1
matrix:
region: [us-east-2, us-west-2, eu-west-1, eu-north-1, us-east-1]
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1
- name: configure aws credentials
uses: aws-actions/configure-aws-credentials@61815dcd50bd041e203e49132bacad1fd04d2708 # v5.1.1
with:
role-to-assume: arn:aws:iam::${{ vars.CI_ACCOUNT_ID }}:role/${{ vars.CI_ROLE_NAME }}
aws-region: ${{ matrix.region }}
- uses: actions/setup-go@7a3fe6cf4cb3a834922a1244abfce67bcef6a0c5 # v6.2.0
with:
go-version-file: test/hack/resource/go.mod
check-latest: true
cache-dependency-path: "test/hack/resource/go.sum"
# eu-north-1 contains the soak tests and resources should be swept if they are older than 8 days
- run: |
if [[ "${{ matrix.region }}" == "eu-north-1" ]]; then
go run main.go --expiration 192h
else
go run main.go --expiration 12h
fi
working-directory: ./test/hack/resource/clean
name: "Run cleanup script"
================================================
FILE: .github/workflows/website-cleanup-preview.yaml
================================================
name: Cleanup Website PR Preview
on:
pull_request_target:
types: [ closed ]
jobs:
cleanup:
runs-on: ubuntu-latest
if: github.repository == 'aws/karpenter-provider-aws'
permissions:
id-token: write
contents: read
steps:
- id: metadata
run: |
pr_number="${{ github.event.number }}"
echo PR_NUMBER="$pr_number" >> "$GITHUB_ENV"
echo BRANCH_NAME="pr-$pr_number" >> "$GITHUB_ENV"
- uses: aws-actions/configure-aws-credentials@61815dcd50bd041e203e49132bacad1fd04d2708 # v5.1.1
with:
role-to-assume: arn:aws:iam::${{ vars.RELEASE_PREVIEW_ACCOUNT_ID }}:role/${{ vars.WEBSITE_ROLE_NAME }}
aws-region: ${{ vars.AMPLIFY_REGION }}
- run: |
if aws amplify get-branch --app-id ${{ vars.AMPLIFY_APP_ID_PREVIEW }} --branch-name "${{ env.BRANCH_NAME }}" 2>/dev/null; then
aws amplify delete-branch --app-id ${{ vars.AMPLIFY_APP_ID_PREVIEW }} --branch-name "${{ env.BRANCH_NAME }}"
fi
- run: aws s3 rm s3://${{ vars.AMPLIFY_S3_BUCKET_BETA }}/pr-${{ env.PR_NUMBER }}/ --recursive
================================================
FILE: .github/workflows/website-deploy.yaml
================================================
name: Deploy Website to Amplify
on:
push:
branches: [ main ]
paths: [ website/** ]
jobs:
deploy:
runs-on: ubuntu-latest
if: github.repository == 'aws/karpenter-provider-aws'
permissions:
id-token: write
contents: read
steps:
- uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1
- name: Deploy website
uses: ./.github/actions/deploy-website
with:
role: arn:aws:iam::${{ vars.RELEASE_ACCOUNT_ID }}:role/${{ vars.WEBSITE_ROLE_NAME }}
region: ${{ vars.AMPLIFY_REGION }}
amplify-app-id: ${{ vars.AMPLIFY_APP_ID }}
amplify-branch-name: ${{ vars.BRANCH_NAME }}
s3-bucket: ${{ vars.AMPLIFY_S3_BUCKET }}
================================================
FILE: .github/workflows/website-preview-trigger.yaml
================================================
name: WebsitePreviewTrigger
on:
pull_request:
types: [ opened, synchronize, reopened ]
jobs:
preview-trigger:
runs-on: ubuntu-latest
if: github.repository == 'aws/karpenter-provider-aws'
steps:
- uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1
with:
fetch-depth: 0
- name: Save info about the PR as an artifact for other workflows that run on workflow_run to download them
env:
PULL_REQUEST_NUMBER: ${{ github.event.pull_request.number }}
COMMIT_ID: ${{ github.event.pull_request.head.sha }}
run: |
mkdir -p /tmp/artifacts
{ echo "$PULL_REQUEST_NUMBER"; echo "$COMMIT_ID"; } >> /tmp/artifacts/website-metadata.txt
cat /tmp/artifacts/website-metadata.txt
- uses: actions/upload-artifact@b7c566a772e6b6bfb58ed0dc250532a479d7789f # v6.0.0
with:
name: artifacts
path: /tmp/artifacts
================================================
FILE: .github/workflows/website-preview.yaml
================================================
name: Deploy Website Preview to Amplify
on:
workflow_run:
workflows: [ WebsitePreviewTrigger ]
types: [ completed ]
jobs:
preview:
permissions:
id-token: write
contents: read
pull-requests: write
statuses: write
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1
- uses: ./.github/actions/download-artifact
- id: website-metadata
run: |
pr_number="$(head -n 1 /tmp/artifacts/website-metadata.txt)"
pr_commit="$(tail -n 1 /tmp/artifacts/website-metadata.txt)"
{
echo PR_COMMIT="$pr_commit"
echo PR_NUMBER="$pr_number"
echo BRANCH_NAME="pr-$pr_number"
} >> "$GITHUB_ENV"
- uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1
with:
ref: ${{ env.PR_COMMIT }}
- uses: ./.github/actions/commit-status/start
with:
name: "${{ github.workflow }} / ${{ github.job }} (pull_request_review)"
git_ref: ${{ env.PR_COMMIT }}
- name: Configure AWS credentials
uses: aws-actions/configure-aws-credentials@61815dcd50bd041e203e49132bacad1fd04d2708 # v5.1.1
with:
role-to-assume: arn:aws:iam::${{ vars.RELEASE_PREVIEW_ACCOUNT_ID }}:role/${{ vars.WEBSITE_ROLE_NAME }}
aws-region: ${{ vars.AMPLIFY_REGION }}
- name: Get preview URL
run: |
APP_DOMAIN=$(aws amplify get-app --app-id ${{ vars.AMPLIFY_APP_ID_PREVIEW }} --query 'app.defaultDomain' --output text)
PREVIEW_URL="https://${{ env.BRANCH_NAME }}.$APP_DOMAIN"
echo PREVIEW_URL="$PREVIEW_URL" >> "$GITHUB_ENV"
- name: Deploy website
uses: ./.github/actions/deploy-website
with:
role: arn:aws:iam::${{ vars.RELEASE_PREVIEW_ACCOUNT_ID }}:role/${{ vars.WEBSITE_ROLE_NAME }}
region: ${{ vars.AMPLIFY_REGION }}
amplify-app-id: ${{ vars.AMPLIFY_APP_ID_PREVIEW }}
amplify-branch-name: ${{ env.BRANCH_NAME }}
s3-bucket: ${{ vars.AMPLIFY_S3_BUCKET_BETA }}
s3-prefix: pr-${{ env.PR_NUMBER }}/
hugo-base-url: ${{ env.PREVIEW_URL }}
- uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8.0.0
env:
PREVIEW_URL: ${{ env.PREVIEW_URL }}
PR_COMMIT: ${{ env.PR_COMMIT }}
with:
script: |
const commentBody = `**Preview deployment ready!**
**Preview URL:** ${process.env.PREVIEW_URL}
Built from commit \`${process.env.PR_COMMIT}\``;
const existingComment = (await github.rest.issues.listComments({
issue_number: process.env.PR_NUMBER,
owner: context.repo.owner,
repo: context.repo.repo,
})).data.find(comment =>
comment.user.login === 'github-actions[bot]' &&
comment.body.includes('**Preview deployment ready!**')
);
if (existingComment) {
await github.rest.issues.updateComment({
comment_id: existingComment.id,
owner: context.repo.owner,
repo: context.repo.repo,
body: commentBody
});
} else {
await github.rest.issues.createComment({
issue_number: process.env.PR_NUMBER,
owner: context.repo.owner,
repo: context.repo.repo,
body: commentBody
});
}
- if: always()
uses: ./.github/actions/commit-status/end
with:
name: "${{ github.workflow }} / ${{ github.job }} (pull_request_review)"
git_ref: ${{ env.PR_COMMIT }}
================================================
FILE: .gitignore
================================================
# Go toolchain
coverage.out
coverage.html
*.test
*.cpuprofile
*.heapprofile
go.work
go.work.sum
# Environment
.idea
.vscode
.DS_Store
# Project Specific
*.csv
# Binary output
karpenter-provider-aws-*
================================================
FILE: .gitmodules
================================================
================================================
FILE: .golangci.yaml
================================================
version: "2"
run:
tests: true
timeout: 5m
linters:
enable:
- asciicheck
- bidichk
- copyloopvar
- errorlint
- gocyclo
- goheader
- gosec
- misspell
- nilerr
- revive
- staticcheck
- tparallel
- unconvert
- unparam
disable:
- prealloc
settings:
gocyclo:
min-complexity: 11
goheader:
template: |-
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
govet:
disable:
- fieldalignment
enable-all: true
misspell:
locale: US
revive:
rules:
- name: dot-imports
disabled: true
staticcheck:
dot-import-whitelist:
- github.com/onsi/ginkgo/v2
- github.com/onsi/gomega
exclusions:
generated: lax
presets:
- comments
- common-false-positives
- legacy
- std-error-handling
rules:
- linters:
- goheader
path: zz_(.+)\.go
- path: (.+)\.go$
text: declaration of "(err|ctx)" shadows declaration at
paths:
- tools
- website
- hack
- charts
- designs
- third_party$
- builtin$
- examples$
issues:
fix: true
formatters:
enable:
- goimports
settings:
goimports:
local-prefixes:
- github.com/aws/karpenter-provider-aws
exclusions:
generated: lax
paths:
- tools
- website
- hack
- charts
- designs
- third_party$
- builtin$
- examples$
================================================
FILE: .ko.yaml
================================================
defaultBaseImage: public.ecr.aws/eks-distro-build-tooling/eks-distro-minimal-base
defaultPlatforms:
- linux/arm64
- linux/amd64
================================================
FILE: ADOPTERS.md
================================================
# Who is using Karpenter?
Karpenter has a variety of users and use cases for scaling Kubernetes.
Many customers want to learn from others who have already implemented Karpenter in their environments.
The following is a self-reported list of users to help identify adoption and points of contact.
## Community
If you would like to ask question from the community please join the [Karpenter slack channel in the Kubernetes Slack](https://kubernetes.slack.com/archives/C02SFFZSA2K) or join the [Karpenter working group](https://karpenter.sh/docs/contributing/working-group/) bi-weekly calls.
## Add yourself
If you are using Karpenter please consider adding yourself as a user by opening a pull request to this file.
If you are open to others contacting you about your use of Karpenter on Slack, add your Slack name as well.
## Adopters (Alphabetical)
| Organization | Description | Contacts | Link |
| --- | --- | --- | --- |
| Amazon, Inc. | Scaling production workloads and batch jobs in all AWS regions | `@Alex Kestner`, `@Ellis Tarn` | [Introducing Karpenter](https://aws.amazon.com/blogs/aws/introducing-karpenter-an-open-source-high-performance-kubernetes-cluster-autoscaler/) |
| Airtel Digital Ltd. | Karpenter for all kind of spiky and base workload and to increase spot coverage. | `@Sagar Arora` | [Homepage](https://www.wynk.in)
| Anthropic | Better utilizing mixes of instance types for more reliable capacity | N/A | [Homepage](https://anthropic.com) |
| AppsFlyer | Managing statefull workloads like Kafka and more | `@alicvsroxas` `@danielvrog`| [Homepage](https://www.appsflyer.com/)|
| Astradot | Using Karpenter on all K8s clusters in production and staging | N/A | [Homepage](https://astradot.com) |
| Beeswax | Using Karpenter to scale our high load AdTech platform efficiently | `@James Wojewoda` | [Homepage](https://www.beeswax.com) |
| Cabify | Replace cluster-autoscaler in our EKS clusters | N/A | [Homepage](https://tech.cabify.com) |
| Canva | Using Karpetner to scale CPU and GPU workloads on EKS | `@groodt` | [Canva](https://www.canva.com/) |
| Cloud Posse, LLC | Karpenter ships out-of-the-box in our Terraform Blueprint for EKS and is offered as part of our comprehensive multi-account [AWS reference architecture](https://cloudposse.com/reference-architecture/). Everything is Open Source (APACHE2). | `@osterman` | [Karpenter : The Cloud Posse Developer Hub](https://docs.cloudposse.com/components/catalog/aws/eks/karpenter/) |
| Codefresh | Juggling workloads for the SAAS CD/GitOps offering | `@Yonatan Koren`, `@Ilia Medvedev` | [Codefresh](https://codefresh.io/) |
| Conveyor | Using karpenter to scale our customers data pipelines on EKS | `@stijndehaes` | [Conveyor](https://conveyordata.com/) |
| Coralogix | Using Karpenter on all of our EKS K8S Clusters in multi-tenant high scale production environments | `@doryer` | [Coralogix](https://coralogix.com/) |
| Cordial | Using Karpenter to scale multiple EKS clusters quickly | `@dschaaff` | [Cordial](https://cordial.com) |
| Dig Security | Protecting our customers data - Using Karpenter to manage production and development workloads on EKS, We are using only Spot Instances in production. | `@Shahar Danus` | [Dig Security](https://dig.security/) |
| Docker | Using Karpenter to scale Docker Hub on our EKS clusters | N/A | [Docker](https://www.docker.com) |
| GlobalDots | Using Karpenter to scale Kubernetes clusters for a lot of our clients & for internal needs | `@vainkop` | [GlobalDots](https://globaldots.com) |
| Grafana Labs | Using Karpenter as our Autoscaling tool on EKS | `@paulajulve`, `@logyball` | [Homepage](https://grafana.com/) & [Blog](https://grafana.com/blog/2023/11/09/how-grafana-labs-switched-to-karpenter-to-reduce-costs-and-complexities-in-amazon-eks/) |
| Hazelcast | Running Hazelcast Cloud workloads on EKS with Karpenter—fast provisioning, intelligent consolidation, and resilience under spiky traffic. | `@atilsensalduz`, `@taylanerden` | [Hazelcast](https://hazelcast.com/) |
| H2O.ai | Dynamically scaling CPU and GPU nodes for AI workloads | `@Ophir Zahavi`, `@Asaf Oren` | [H2O.ai](https://h2o.ai/) |
| HENNGE K.K. | Dynamically scaling production workloads in Tokyo region | `@furqan.habibi`, `@Hans Gunawan` | [HENNGE](https://hennge.com/global/) |
| Homa | Using Karpenter to manage dynamically big instances and save cost effectively with disruptions | `@afreyermuth98`, `@alexbescond` | [Homa](https://www.homagames.com/) |
| idealo | Scaling multi-arch IPv6 clusters hosting web and event-driven applications | `@Heiko Rothe` | [Homepage](https://www.idealo.de) |
| Kaltura | Using karpenter to deliver video to millions of end users | `@Ido Ziv` | [Homepage](https://corp.kaltura.com/) |
| Livspace | Replacement for cluster autoscaler on production and staging EKS clusters | `@praveen-livspace` | [Homepage](https://www.livspace.com) |
| Nexxiot | Easier, Safer, Cleaner Global Transportation - Using Karpenter to manage EKS nodes | `@Alex Berger` | [Homepage](https://nexxiot.com/) |
| OccMundial | Using karpenter to manage our production workloads, using the dynamic scaling according to workload that needs to scale. | `@parraletz` | [Homepage](https://www.occ.com.mx) |
| Omaze | Intelligently using Karpenter's autoscaling to power our platforms | `@devopsidiot` | [Homepage](https://www.omaze.com/) |
| PITS Global Data Recovery Services | Used to manage continuous integration and continuous delivery/deployment workflows. | N/A | [PITS Global Data Recovery Services](https://www.pitsdatarecovery.net/) |
| PlanetScale | Leveraging Karpenter to dynamically deploy serverless MySQL workloads. | `@jtcunning` | [Homepage](https://www.planetscale.com/) |
| Postnord | Using Karpenter for Node Lifecycle Management & Autoscaling. | `@dhaval-vithalani`, `@christianOps`, `@sjam11` | [Postnord](https://www.postnord.com/) |
| QuestDB | Using Karpenter for the service nodes of the QuestBD Cloud (time-series database). | [questdb slack group](https://slack.questdb.io/) | [QuestDB](https://questdb.io/) |
| Rapid7 | Using Karpenter across all of our Kubernetes infrastructure for efficient autoscaling, both in terms of speed and cost | `@arobinson`, `@Ross Kirk`, `@Ryan Williams` | [Homepage](https://www.rapid7.com/) |
| Sendcloud | Using Karpenter to scale our k8s clusters for Europe’s #1 shipping automation platform | N/A | [Homepage](https://www.sendcloud.com/) |
| Sentra | Using Karpenter to scale our EKS clusters, running our platform and workflows while maximizing cost-efficiency with minimal operational overhead | `@Roei Jacobovich` | [Homepage](https://sentra.io/) |
| Sophotech | We rely on Karpenter to keep our clients' Kubernetes clusters fast, efficient, and cost-optimized. It is an irreplaceable part of our infrastructure toolkit, instantly scaling nodes to match demand. Once you use Karpenter, there is no going back. | `@archy-rock3t-cloud` | [Homepage](https://sopho.tech) |
| SternumIOT | Using Karpenter to efficiently autoscale & manage our EKS clusters with GitOps, optimizing node lifecycle management for both performance and cost-effectiveness across our Kubernetes workloads | `@itayvolo` `@amitde69` | [SternumIOT](https://sternumiot.com/) |
| Stone Pagamentos | Using Karpenter to do smart sizing of our clusters | `@fabiano-amaral` | [Stone Pagamentos](https://www.stone.com.br/) |
| Stytch | Powering the scaling needs of Stytch's authentication and user-management APIs | `@Elijah Chanakira`, `@Ovadia Harary` | [Homepage](https://www.stytch.com/) |
| Superbexperience | Using Karpenter to scale the k8s clusters running our Guest Experience Management platform | `@Wernich Bekker` | [Homepage](https://www.superbexperience.com/) |
| Target Australia | Using Karpenter to manage (scale, auto update etc) the containerised (EKS) compute that powers much of the Target Online platform | `@gazal-k` | [Target Australia Online Shopping](https://www.target.com.au) |
| The Scale Factory | Using Karpenter (controllers on EC2/Fargate) to efficiently scale K8s workloads and empowering our customer teams to do the same | `@marko` | [Homepage](https://www.scalefactory.com) |
| Tyk Cloud | Scaling workloads for the Cloud Free plan | `@Artem Hluvchynskyi`, `@gowtham` | [Tyk Cloud](https://tyk.io/cloud/) |
| VictoriaMetrics Cloud | Managed Time Series Database Services from VictoriaMetrics | `@Max G` | [VictoriaMetrics Cloud](https://victoriametrics.com/products/managed/) |
| Wehkamp | Using Karpenter to scale the EKS clusters for our e-commerce platforms | `@ChrisV` | [Wehkamp](https://www.wehkamp.nl) & [Wehkamp Techblog](https://medium.com/wehkamp-techblog)|
| Whoosh | Using Karpenter to scale the EKS clusters for many purposes | `@vainkop` | [Whoosh](https://whoosh.bike) |
| Next Insurance | Using Karpenter to manage the nodes in all our EKS clusters, including dev and prod, on demand and spots | `@moshebs` | [Homepage](https://www.nextinsurance.com)|
| Grover Group GmbH | We use Karpenter for efficient and cost effective scaling of our nodes in all of our EKS clusters | `@suraj2410` | [Homepage](https://www.grover.com/de-en) & [Engineering Techblog](https://engineering.grover.com)|
| Legit Security | We run Karpenter across all our EKS clusters to ensure efficient and cost-effective scaling across our infrastructure | `@Tal Balash`, `@Matan Ryngler` | [Homepage](https://www.legitsecurity.com)|
| Logz.io | Using Karpenter in all of our EKS clusters for efficient and cost effective scaling of all our K8s workloads | `@pincher95`, `@Samplify` | [Homepage](https://logz.io/)|
| X3M ads | We have been using Karpenter for (almost) all our workloads since 2023 | `@mreparaz`, `@fmansilla`, `@mrmartinez95` | [Homepage](https://x3mads.com) |
================================================
FILE: CODEOWNERS
================================================
# Require approvals from someone in the owner team before merging
# More information here: https://docs.github.com/en/repositories/managing-your-repositorys-settings-and-features/customizing-your-repository/about-code-owners
* @aws/karpenter
================================================
FILE: CODE_OF_CONDUCT.md
================================================
# Code of Conduct
The Karpenter project follows the [CNCF Community Code of Conduct](https://github.com/cncf/foundation/blob/master/code-of-conduct.md).
================================================
FILE: LICENSE
================================================
Apache License
Version 2.0, January 2004
http://www.apache.org/licenses/
TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
1. Definitions.
"License" shall mean the terms and conditions for use, reproduction,
and distribution as defined by Sections 1 through 9 of this document.
"Licensor" shall mean the copyright owner or entity authorized by
the copyright owner that is granting the License.
"Legal Entity" shall mean the union of the acting entity and all
other entities that control, are controlled by, or are under common
control with that entity. For the purposes of this definition,
"control" means (i) the power, direct or indirect, to cause the
direction or management of such entity, whether by contract or
otherwise, or (ii) ownership of fifty percent (50%) or more of the
outstanding shares, or (iii) beneficial ownership of such entity.
"You" (or "Your") shall mean an individual or Legal Entity
exercising permissions granted by this License.
"Source" form shall mean the preferred form for making modifications,
including but not limited to software source code, documentation
source, and configuration files.
"Object" form shall mean any form resulting from mechanical
transformation or translation of a Source form, including but
not limited to compiled object code, generated documentation,
and conversions to other media types.
"Work" shall mean the work of authorship, whether in Source or
Object form, made available under the License, as indicated by a
copyright notice that is included in or attached to the work
(an example is provided in the Appendix below).
"Derivative Works" shall mean any work, whether in Source or Object
form, that is based on (or derived from) the Work and for which the
editorial revisions, annotations, elaborations, or other modifications
represent, as a whole, an original work of authorship. For the purposes
of this License, Derivative Works shall not include works that remain
separable from, or merely link (or bind by name) to the interfaces of,
the Work and Derivative Works thereof.
"Contribution" shall mean any work of authorship, including
the original version of the Work and any modifications or additions
to that Work or Derivative Works thereof, that is intentionally
submitted to Licensor for inclusion in the Work by the copyright owner
or by an individual or Legal Entity authorized to submit on behalf of
the copyright owner. For the purposes of this definition, "submitted"
means any form of electronic, verbal, or written communication sent
to the Licensor or its representatives, including but not limited to
communication on electronic mailing lists, source code control systems,
and issue tracking systems that are managed by, or on behalf of, the
Licensor for the purpose of discussing and improving the Work, but
excluding communication that is conspicuously marked or otherwise
designated in writing by the copyright owner as "Not a Contribution."
"Contributor" shall mean Licensor and any individual or Legal Entity
on behalf of whom a Contribution has been received by Licensor and
subsequently incorporated within the Work.
2. Grant of Copyright License. Subject to the terms and conditions of
this License, each Contributor hereby grants to You a perpetual,
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
copyright license to reproduce, prepare Derivative Works of,
publicly display, publicly perform, sublicense, and distribute the
Work and such Derivative Works in Source or Object form.
3. Grant of Patent License. Subject to the terms and conditions of
this License, each Contributor hereby grants to You a perpetual,
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
(except as stated in this section) patent license to make, have made,
use, offer to sell, sell, import, and otherwise transfer the Work,
where such license applies only to those patent claims licensable
by such Contributor that are necessarily infringed by their
Contribution(s) alone or by combination of their Contribution(s)
with the Work to which such Contribution(s) was submitted. If You
institute patent litigation against any entity (including a
cross-claim or counterclaim in a lawsuit) alleging that the Work
or a Contribution incorporated within the Work constitutes direct
or contributory patent infringement, then any patent licenses
granted to You under this License for that Work shall terminate
as of the date such litigation is filed.
4. Redistribution. You may reproduce and distribute copies of the
Work or Derivative Works thereof in any medium, with or without
modifications, and in Source or Object form, provided that You
meet the following conditions:
(a) You must give any other recipients of the Work or
Derivative Works a copy of this License; and
(b) You must cause any modified files to carry prominent notices
stating that You changed the files; and
(c) You must retain, in the Source form of any Derivative Works
that You distribute, all copyright, patent, trademark, and
attribution notices from the Source form of the Work,
excluding those notices that do not pertain to any part of
the Derivative Works; and
(d) If the Work includes a "NOTICE" text file as part of its
distribution, then any Derivative Works that You distribute must
include a readable copy of the attribution notices contained
within such NOTICE file, excluding those notices that do not
pertain to any part of the Derivative Works, in at least one
of the following places: within a NOTICE text file distributed
as part of the Derivative Works; within the Source form or
documentation, if provided along with the Derivative Works; or,
within a display generated by the Derivative Works, if and
wherever such third-party notices normally appear. The contents
of the NOTICE file are for informational purposes only and
do not modify the License. You may add Your own attribution
notices within Derivative Works that You distribute, alongside
or as an addendum to the NOTICE text from the Work, provided
that such additional attribution notices cannot be construed
as modifying the License.
You may add Your own copyright statement to Your modifications and
may provide additional or different license terms and conditions
for use, reproduction, or distribution of Your modifications, or
for any such Derivative Works as a whole, provided Your use,
reproduction, and distribution of the Work otherwise complies with
the conditions stated in this License.
5. Submission of Contributions. Unless You explicitly state otherwise,
any Contribution intentionally submitted for inclusion in the Work
by You to the Licensor shall be under the terms and conditions of
this License, without any additional terms or conditions.
Notwithstanding the above, nothing herein shall supersede or modify
the terms of any separate license agreement you may have executed
with Licensor regarding such Contributions.
6. Trademarks. This License does not grant permission to use the trade
names, trademarks, service marks, or product names of the Licensor,
except as required for reasonable and customary use in describing the
origin of the Work and reproducing the content of the NOTICE file.
7. Disclaimer of Warranty. Unless required by applicable law or
agreed to in writing, Licensor provides the Work (and each
Contributor provides its Contributions) on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
implied, including, without limitation, any warranties or conditions
of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
PARTICULAR PURPOSE. You are solely responsible for determining the
appropriateness of using or redistributing the Work and assume any
risks associated with Your exercise of permissions under this License.
8. Limitation of Liability. In no event and under no legal theory,
whether in tort (including negligence), contract, or otherwise,
unless required by applicable law (such as deliberate and grossly
negligent acts) or agreed to in writing, shall any Contributor be
liable to You for damages, including any direct, indirect, special,
incidental, or consequential damages of any character arising as a
result of this License or out of the use or inability to use the
Work (including but not limited to damages for loss of goodwill,
work stoppage, computer failure or malfunction, or any and all
other commercial damages or losses), even if such Contributor
has been advised of the possibility of such damages.
9. Accepting Warranty or Additional Liability. While redistributing
the Work or Derivative Works thereof, You may choose to offer,
and charge a fee for, acceptance of support, warranty, indemnity,
or other liability obligations and/or rights consistent with this
License. However, in accepting such obligations, You may act only
on Your own behalf and on Your sole responsibility, not on behalf
of any other Contributor, and only if You agree to indemnify,
defend, and hold each Contributor harmless for any liability
incurred by, or claims asserted against, such Contributor by reason
of your accepting any such warranty or additional liability.
END OF TERMS AND CONDITIONS
APPENDIX: How to apply the Apache License to your work.
To apply the Apache License to your work, attach the following
boilerplate notice, with the fields enclosed by brackets "[]"
replaced with your own identifying information. (Don't include
the brackets!) The text should be enclosed in the appropriate
comment syntax for the file format. We also recommend that a
file or class name and description of purpose be included on the
same "printed page" as the copyright notice for easier
identification within third-party archives.
Copyright [yyyy] [name of copyright owner]
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
================================================
FILE: Makefile
================================================
CLUSTER_NAME ?= $(shell kubectl config view --minify -o jsonpath='{.clusters[].name}' | rev | cut -d"/" -f1 | rev | cut -d"." -f1)
## Inject the app version into operator.Version
LDFLAGS ?= -ldflags=-X=sigs.k8s.io/karpenter/pkg/operator.Version=$(shell git describe --tags --always | cut -d"v" -f2)
GOFLAGS += $(LDFLAGS)
WITH_GOFLAGS = GOFLAGS="$(GOFLAGS)"
## Extra helm options
CLUSTER_ENDPOINT ?= $(shell kubectl config view --minify -o jsonpath='{.clusters[].cluster.server}')
AWS_ACCOUNT_ID ?= $(shell aws sts get-caller-identity --query Account --output text)
KARPENTER_IAM_ROLE_ARN ?= arn:aws:iam::${AWS_ACCOUNT_ID}:role/${CLUSTER_NAME}-karpenter
HELM_OPTS ?= --set serviceAccount.annotations.eks\\.amazonaws\\.com/role-arn=${KARPENTER_IAM_ROLE_ARN} \
--set settings.clusterName=${CLUSTER_NAME} \
--set settings.interruptionQueue=${CLUSTER_NAME} \
--set controller.resources.requests.cpu=1 \
--set controller.resources.requests.memory=1Gi \
--set controller.resources.limits.cpu=1 \
--set controller.resources.limits.memory=1Gi \
--set settings.featureGates.nodeRepair=true \
--set settings.featureGates.reservedCapacity=true \
--set settings.featureGates.spotToSpotConsolidation=true \
--set settings.featureGates.nodeOverlay=true \
--set settings.featureGates.staticCapacity=true \
--set settings.preferencePolicy=Ignore \
--set logLevel=debug \
--create-namespace
# CR for local builds of Karpenter
KARPENTER_NAMESPACE ?= kube-system
KARPENTER_VERSION ?= $(shell git tag --sort=committerdate | tail -1 | cut -d"v" -f2)
KO_DOCKER_REPO ?= ${AWS_ACCOUNT_ID}.dkr.ecr.${AWS_DEFAULT_REGION}.amazonaws.com/dev
KOCACHE ?= ~/.ko
# Common Directories
MOD_DIRS = $(shell find . -path "./website" -prune -o -name go.mod -type f -print | xargs dirname)
KARPENTER_CORE_DIR = $(shell go list -m -f '{{ .Dir }}' sigs.k8s.io/karpenter)
# TEST_SUITE enables you to select a specific test suite directory to run "make e2etests" against
TEST_SUITE ?= "..."
TMPFILE := $(shell mktemp)
# Filename when building the binary controller only
GOARCH ?= $(shell go env GOARCH)
BINARY_FILENAME = karpenter-provider-aws-$(GOARCH)
help: ## Display help
@awk 'BEGIN {FS = ":.*##"; printf "Usage:\n make \033[36m<target>\033[0m\n"} /^[a-zA-Z_0-9-]+:.*?##/ { printf " \033[36m%-15s\033[0m %s\n", $$1, $$2 } /^##@/ { printf "\n\033[1m%s\033[0m\n", substr($$0, 5) } ' $(MAKEFILE_LIST)
presubmit: verify test ## Run all steps in the developer loop
ci-test: test coverage ## Runs tests and submits coverage
ci-non-test: verify licenses vulncheck ## Runs checks other than tests
run: ## Run Karpenter controller binary against your local cluster with latest CRD's
kubectl apply -f ./pkg/apis/crds/
SYSTEM_NAMESPACE=${KARPENTER_NAMESPACE} \
KUBERNETES_MIN_VERSION="1.19.0-0" \
DISABLE_LEADER_ELECTION=true \
CLUSTER_NAME=${CLUSTER_NAME} \
INTERRUPTION_QUEUE=${CLUSTER_NAME} \
FEATURE_GATES="SpotToSpotConsolidation=true,NodeOverlay=true,StaticCapacity=true" \
LOG_LEVEL="debug" \
go run ./cmd/controller/main.go
test: ## Run tests
go test ./pkg/... \
-cover -coverprofile=coverage.out -outputdir=. -coverpkg=./... \
--ginkgo.focus="${FOCUS}" \
--ginkgo.randomize-all \
--ginkgo.vv
deflake: ## Run randomized, racing tests until the test fails to catch flakes
ginkgo \
--race \
--focus="${FOCUS}" \
--randomize-all \
--until-it-fails \
-v \
./pkg/...
e2etests: ## Run the e2e suite against your local cluster
cd test && CLUSTER_ENDPOINT=${CLUSTER_ENDPOINT} \
CLUSTER_NAME=${CLUSTER_NAME} \
INTERRUPTION_QUEUE=${CLUSTER_NAME} \
go test \
-p 1 \
-count 1 \
-timeout 3.25h \
-v \
./suites/$(shell echo $(TEST_SUITE) | tr A-Z a-z)/... \
--ginkgo.focus="${FOCUS}" \
--ginkgo.timeout=3h \
--ginkgo.grace-period=3m \
--ginkgo.vv
upstream-e2etests: tidy download
CLUSTER_NAME=${CLUSTER_NAME} envsubst < $(shell pwd)/test/pkg/environment/aws/default_ec2nodeclass.yaml > ${TMPFILE}
cd $(KARPENTER_CORE_DIR) && go test \
-count 1 \
-timeout 3.25h \
-v \
./test/suites/regression/... \
--ginkgo.focus="${FOCUS}" \
--ginkgo.timeout=3h \
--ginkgo.grace-period=5m \
--ginkgo.vv \
--default-nodeclass="$(TMPFILE)"\
--default-nodepool="$(shell pwd)/test/pkg/environment/aws/default_nodepool.yaml"
e2etests-deflake: ## Run the e2e suite against your local cluster
cd test && CLUSTER_NAME=${CLUSTER_NAME} ginkgo \
--focus="${FOCUS}" \
--timeout=3h \
--grace-period=3m \
--until-it-fails \
--vv \
./suites/$(shell echo $(TEST_SUITE) | tr A-Z a-z) \
benchmark:
go test -tags=test_performance -run=NoTests -bench=. ./...
coverage:
go tool cover -html coverage.out -o coverage.html
verify: tidy download ## Verify code. Includes dependencies, linting, formatting, etc
go generate ./...
hack/boilerplate.sh
cp $(KARPENTER_CORE_DIR)/pkg/apis/crds/* pkg/apis/crds
hack/validation/kubelet.sh
bash -c 'source ./hack/validation/requirements.sh && injectDomainRequirementRestrictions "karpenter.k8s.aws"'
bash -c 'source ./hack/validation/labels.sh && injectDomainLabelRestrictions "karpenter.k8s.aws"'
cp pkg/apis/crds/* charts/karpenter-crd/templates
hack/mutation/crd_annotations.sh
hack/github/dependabot.sh
$(foreach dir,$(MOD_DIRS),cd $(dir) && golangci-lint run $(newline))
@git diff --quiet ||\
{ echo "New file modification detected in the Git working tree. Please check in before commit."; git --no-pager diff --name-only | uniq | awk '{print " - " $$0}'; \
if [ "${CI}" = true ]; then\
exit 1;\
fi;}
@echo "Validating codegen/docgen build scripts..."
@find hack/code hack/docs -name "*.go" -type f -print0 | xargs -0 -I {} go build -o /dev/null {}
actionlint -oneline
vulncheck: ## Verify code vulnerabilities
@govulncheck ./pkg/...
licenses: download ## Verifies dependency licenses
# TODO: remove nodeadm check once license is updated
! go-licenses csv ./... | grep -v -e 'MIT' -e 'Apache-2.0' -e 'BSD-3-Clause' -e 'BSD-2-Clause' -e 'ISC' -e 'MPL-2.0' -e 'github.com/awslabs/amazon-eks-ami/nodeadm'
image: ## Build the Karpenter controller images using ko build
$(eval CONTROLLER_IMG=$(shell $(WITH_GOFLAGS) KOCACHE=$(KOCACHE) KO_DOCKER_REPO="$(KO_DOCKER_REPO)" ko build --bare github.com/aws/karpenter-provider-aws/cmd/controller))
$(eval IMG_REPOSITORY=$(shell echo $(CONTROLLER_IMG) | cut -d "@" -f 1 | cut -d ":" -f 1))
$(eval IMG_TAG=$(shell echo $(CONTROLLER_IMG) | cut -d "@" -f 1 | cut -d ":" -f 2 -s))
$(eval IMG_DIGEST=$(shell echo $(CONTROLLER_IMG) | cut -d "@" -f 2))
binary: ## Build the Karpenter controller binary using go build
go build $(GOFLAGS) -o $(BINARY_FILENAME) ./cmd/controller/...
apply: verify image ## Deploy the controller from the current state of your git repository into your ~/.kube/config cluster
kubectl apply -f ./pkg/apis/crds/
helm upgrade --install karpenter charts/karpenter --namespace ${KARPENTER_NAMESPACE} \
$(HELM_OPTS) \
--set controller.image.repository=$(IMG_REPOSITORY) \
--set controller.image.tag=$(IMG_TAG) \
--set controller.image.digest=$(IMG_DIGEST)
install: ## Deploy the latest released version into your ~/.kube/config cluster
@echo Upgrading to ${KARPENTER_VERSION}
helm upgrade --install karpenter oci://public.ecr.aws/karpenter/karpenter --version ${KARPENTER_VERSION} --namespace ${KARPENTER_NAMESPACE} \
$(HELM_OPTS)
delete: ## Delete the controller from your ~/.kube/config cluster
helm uninstall karpenter --namespace ${KARPENTER_NAMESPACE}
docgen: ## Generate docs
KARPENTER_CORE_DIR=$(KARPENTER_CORE_DIR) $(WITH_GOFLAGS) ./hack/docgen.sh
codegen: ## Auto generate files based on AWS APIs response
$(WITH_GOFLAGS) ./hack/codegen.sh
stable-release-pr: ## Generate PR for stable release
$(WITH_GOFLAGS) ./hack/release/stable-pr.sh
snapshot: ## Builds and publishes snapshot release
$(WITH_GOFLAGS) ./hack/release/snapshot.sh
release: ## Builds and publishes stable release
$(WITH_GOFLAGS) ./hack/release/release.sh
prepare-website: ## prepare the website for release
./hack/release/prepare-website.sh
toolchain: ## Install developer toolchain
./hack/toolchain.sh
issues: ## Run GitHub issue analysis scripts
pip install -r ./hack/github/requirements.txt
@echo "Set GH_TOKEN env variable to avoid being rate limited by Github"
./hack/github/feature_request_reactions.py > "karpenter-feature-requests-$(shell date +"%Y-%m-%d").csv"
./hack/github/label_issue_count.py > "karpenter-labels-$(shell date +"%Y-%m-%d").csv"
website: ## Serve the docs website locally
cd website && npm install && hugo mod tidy && hugo server
tidy: ## Recursively "go mod tidy" on all directories where go.mod exists
$(foreach dir,$(MOD_DIRS),cd $(dir) && go mod tidy $(newline))
download: ## Recursively "go mod download" on all directories where go.mod exists
$(foreach dir,$(MOD_DIRS),cd $(dir) && go mod download $(newline))
update-karpenter: ## Update kubernetes-sigs/karpenter to latest
go get -u sigs.k8s.io/karpenter@HEAD
go mod tidy
.PHONY: deploy-cfn
deploy-cfn: ## Deploys the cloudformation stack defined in the docs preview directory
aws cloudformation deploy \
--stack-name "Karpenter-${CLUSTER_NAME}" \
--template-file "./website/content/en/preview/getting-started/getting-started-with-karpenter/cloudformation.yaml" \
--capabilities CAPABILITY_NAMED_IAM \
--parameter-overrides "ClusterName=${CLUSTER_NAME}"
.PHONY: help presubmit ci-test ci-non-test run test deflake e2etests e2etests-deflake benchmark coverage verify vulncheck licenses image apply install delete docgen codegen stable-release-pr snapshot release prepare-website toolchain issues website tidy download update-karpenter
define newline
endef
================================================
FILE: NOTICE
================================================
Karpenter
Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
================================================
FILE: README.md
================================================
[](https://github.com/aws/karpenter/actions/workflows/ci.yaml)


[](https://github.com/aws/karpenter-provider-aws/blob/main/LICENSE)
[](https://goreportcard.com/report/github.com/aws/karpenter)
[](https://coveralls.io/github/aws/karpenter?branch=main)
[](https://github.com/aws/karpenter-provider-aws/issues)

Karpenter is an open-source node provisioning project built for Kubernetes.
Karpenter improves the efficiency and cost of running workloads on Kubernetes clusters by:
* **Watching** for pods that the Kubernetes scheduler has marked as unschedulable
* **Evaluating** scheduling constraints (resource requests, nodeselectors, affinities, tolerations, and topology spread constraints) requested by the pods
* **Provisioning** nodes that meet the requirements of the pods
* **Removing** the nodes when the nodes are no longer needed
Come discuss Karpenter in the [#karpenter](https://kubernetes.slack.com/archives/C02SFFZSA2K) channel, in the [Kubernetes slack](https://slack.k8s.io/) or join the [Karpenter working group](https://karpenter.sh/docs/contributing/community-meetings/#working-group-meetings) bi-weekly calls. If you want to contribute to the Karpenter project, please refer to the Karpenter docs.
Check out the [Docs](https://karpenter.sh/docs/) to learn more.
## Talks
- 03/19/2024 [Harnessing Karpenter: Transforming Kubernetes Clusters with Argo Workflows](https://www.youtube.com/watch?v=rq57liGu0H4)
- 12/04/2023 [AWS re:Invent 2023 - Harness the power of Karpenter to scale, optimize & upgrade Kubernetes](https://www.youtube.com/watch?v=lkg_9ETHeks)
- 09/08/2022 [Workload Consolidation with Karpenter](https://youtu.be/BnksdJ3oOEs)
- 05/19/2022 [Scaling K8s Nodes Without Breaking the Bank or Your Sanity](https://www.youtube.com/watch?v=UBb8wbfSc34)
- 03/25/2022 [Karpenter @ AWS Community Day 2022](https://youtu.be/sxDtmzbNHwE?t=3931)
- 12/20/2021 [How To Auto-Scale Kubernetes Clusters With Karpenter](https://youtu.be/C-2v7HT-uSA)
- 11/30/2021 [Karpenter vs Kubernetes Cluster Autoscaler](https://youtu.be/3QsVRHVdOnM)
- 11/19/2021 [Karpenter @ Container Day](https://youtu.be/qxWJRUF6JJc)
- 05/14/2021 [Groupless Autoscaling with Karpenter @ Kubecon](https://www.youtube.com/watch?v=43g8uPohTgc)
- 05/04/2021 [Karpenter @ Container Day](https://youtu.be/MZ-4HzOC_ac?t=7137)
================================================
FILE: THIRD_PARTY_LICENSES
================================================
** go.uber.org/zap; v1.24.0 ---
Copyright (c) 2016-2017 Uber Technologies, Inc.
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.
------
** sigs.k8s.io/json; v0.0.0-20220713155537-f223a00ba0e2 ---
Files other than internal/golang/* licensed under:
Apache License
Version 2.0, January 2004
http://www.apache.org/licenses/
TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
1. Definitions.
"License" shall mean the terms and conditions for use, reproduction,
and distribution as defined by Sections 1 through 9 of this document.
"Licensor" shall mean the copyright owner or entity authorized by
the copyright owner that is granting the License.
"Legal Entity" shall mean the union of the acting entity and all
other entities that control, are controlled by, or are under common
control with that entity. For the purposes of this definition,
"control" means (i) the power, direct or indirect, to cause the
direction or management of such entity, whether by contract or
otherwise, or (ii) ownership of fifty percent (50%) or more of the
outstanding shares, or (iii) beneficial ownership of such entity.
"You" (or "Your") shall mean an individual or Legal Entity
exercising permissions granted by this License.
"Source" form shall mean the preferred form for making modifications,
including but not limited to software source code, documentation
source, and configuration files.
"Object" form shall mean any form resulting from mechanical
transformation or translation of a Source form, including but
not limited to compiled object code, generated documentation,
and conversions to other media types.
"Work" shall mean the work of authorship, whether in Source or
Object form, made available under the License, as indicated by a
copyright notice that is included in or attached to the work
(an example is provided in the Appendix below).
"Derivative Works" shall mean any work, whether in Source or Object
form, that is based on (or derived from) the Work and for which the
editorial revisions, annotations, elaborations, or other modifications
represent, as a whole, an original work of authorship. For the purposes
of this License, Derivative Works shall not include works that remain
separable from, or merely link (or bind by name) to the interfaces of,
the Work and Derivative Works thereof.
"Contribution" shall mean any work of authorship, including
the original version of the Work and any modifications or additions
to that Work or Derivative Works thereof, that is intentionally
submitted to Licensor for inclusion in the Work by the copyright owner
or by an individual or Legal Entity authorized to submit on behalf of
the copyright owner. For the purposes of this definition, "submitted"
means any form of electronic, verbal, or written communication sent
to the Licensor or its representatives, including but not limited to
communication on electronic mailing lists, source code control systems,
and issue tracking systems that are managed by, or on behalf of, the
Licensor for the purpose of discussing and improving the Work, but
excluding communication that is conspicuously marked or otherwise
designated in writing by the copyright owner as "Not a Contribution."
"Contributor" shall mean Licensor and any individual or Legal Entity
on behalf of whom a Contribution has been received by Licensor and
subsequently incorporated within the Work.
2. Grant of Copyright License. Subject to the terms and conditions of
this License, each Contributor hereby grants to You a perpetual,
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
copyright license to reproduce, prepare Derivative Works of,
publicly display, publicly perform, sublicense, and distribute the
Work and such Derivative Works in Source or Object form.
3. Grant of Patent License. Subject to the terms and conditions of
this License, each Contributor hereby grants to You a perpetual,
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
(except as stated in this section) patent license to make, have made,
use, offer to sell, sell, import, and otherwise transfer the Work,
where such license applies only to those patent claims licensable
by such Contributor that are necessarily infringed by their
Contribution(s) alone or by combination of their Contribution(s)
with the Work to which such Contribution(s) was submitted. If You
institute patent litigation against any entity (including a
cross-claim or counterclaim in a lawsuit) alleging that the Work
or a Contribution incorporated within the Work constitutes direct
or contributory patent infringement, then any patent licenses
granted to You under this License for that Work shall terminate
as of the date such litigation is filed.
4. Redistribution. You may reproduce and distribute copies of the
Work or Derivative Works thereof in any medium, with or without
modifications, and in Source or Object form, provided that You
meet the following conditions:
(a) You must give any other recipients of the Work or
Derivative Works a copy of this License; and
(b) You must cause any modified files to carry prominent notices
stating that You changed the files; and
(c) You must retain, in the Source form of any Derivative Works
that You distribute, all copyright, patent, trademark, and
attribution notices from the Source form of the Work,
excluding those notices that do not pertain to any part of
the Derivative Works; and
(d) If the Work includes a "NOTICE" text file as part of its
distribution, then any Derivative Works that You distribute must
include a readable copy of the attribution notices contained
within such NOTICE file, excluding those notices that do not
pertain to any part of the Derivative Works, in at least one
of the following places: within a NOTICE text file distributed
as part of the Derivative Works; within the Source form or
documentation, if provided along with the Derivative Works; or,
within a display generated by the Derivative Works, if and
wherever such third-party notices normally appear. The contents
of the NOTICE file are for informational purposes only and
do not modify the License. You may add Your own attribution
notices within Derivative Works that You distribute, alongside
or as an addendum to the NOTICE text from the Work, provided
that such additional attribution notices cannot be construed
as modifying the License.
You may add Your own copyright statement to Your modifications and
may provide additional or different license terms and conditions
for use, reproduction, or distribution of Your modifications, or
for any such Derivative Works as a whole, provided Your use,
reproduction, and distribution of the Work otherwise complies with
the conditions stated in this License.
5. Submission of Contributions. Unless You explicitly state otherwise,
any Contribution intentionally submitted for inclusion in the Work
by You to the Licensor shall be under the terms and conditions of
this License, without any additional terms or conditions.
Notwithstanding the above, nothing herein shall supersede or modify
the terms of any separate license agreement you may have executed
with Licensor regarding such Contributions.
6. Trademarks. This License does not grant permission to use the trade
names, trademarks, service marks, or product names of the Licensor,
except as required for reasonable and customary use in describing the
origin of the Work and reproducing the content of the NOTICE file.
7. Disclaimer of Warranty. Unless required by applicable law or
agreed to in writing, Licensor provides the Work (and each
Contributor provides its Contributions) on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
implied, including, without limitation, any warranties or conditions
of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
PARTICULAR PURPOSE. You are solely responsible for determining the
appropriateness of using or redistributing the Work and assume any
risks associated with Your exercise of permissions under this License.
8. Limitation of Liability. In no event and under no legal theory,
whether in tort (including negligence), contract, or otherwise,
unless required by applicable law (such as deliberate and grossly
negligent acts) or agreed to in writing, shall any Contributor be
liable to You for damages, including any direct, indirect, special,
incidental, or consequential damages of any character arising as a
result of this License or out of the use or inability to use the
Work (including but not limited to damages for loss of goodwill,
work stoppage, computer failure or malfunction, or any and all
other commercial damages or losses), even if such Contributor
has been advised of the possibility of such damages.
9. Accepting Warranty or Additional Liability. While redistributing
the Work or Derivative Works thereof, You may choose to offer,
and charge a fee for, acceptance of support, warranty, indemnity,
or other liability obligations and/or rights consistent with this
License. However, in accepting such obligations, You may act only
on Your own behalf and on Your sole responsibility, not on behalf
of any other Contributor, and only if You agree to indemnify,
defend, and hold each Contributor harmless for any liability
incurred by, or claims asserted against, such Contributor by reason
of your accepting any such warranty or additional liability.
END OF TERMS AND CONDITIONS
APPENDIX: How to apply the Apache License to your work.
To apply the Apache License to your work, attach the following
boilerplate notice, with the fields enclosed by brackets "{}"
replaced with your own identifying information. (Don't include
the brackets!) The text should be enclosed in the appropriate
comment syntax for the file format. We also recommend that a
file or class name and description of purpose be included on the
same "printed page" as the copyright notice for easier
identification within third-party archives.
Copyright {yyyy} {name of copyright owner}
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
------------------
internal/golang/* files licensed under:
Copyright (c) 2009 The Go Authors. All rights reserved.
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are
met:
* Redistributions of source code must retain the above copyright
notice, this list of conditions and the following disclaimer.
* Redistributions in binary form must reproduce the above
copyright notice, this list of conditions and the following disclaimer
in the documentation and/or other materials provided with the
distribution.
* Neither the name of Google Inc. nor the names of its
contributors may be used to endorse or promote products derived from
this software without specific prior written permission.
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
------
** github.com/aws/aws-sdk-go; v1.44.154 ---
AWS SDK for Go
Copyright 2015 Amazon.com, Inc. or its affiliates. All Rights Reserved.
Copyright 2014-2015 Stripe, Inc.
Apache License
Version 2.0, January 2004
http://www.apache.org/licenses/
TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
1. Definitions.
"License" shall mean the terms and conditions for use, reproduction,
and distribution as defined by Sections 1 through 9 of this document.
"Licensor" shall mean the copyright owner or entity authorized by
the copyright owner that is granting the License.
"Legal Entity" shall mean the union of the acting entity and all
other entities that control, are controlled by, or are under common
control with that entity. For the purposes of this definition,
"control" means (i) the power, direct or indirect, to cause the
direction or management of such entity, whether by contract or
otherwise, or (ii) ownership of fifty percent (50%) or more of the
outstanding shares, or (iii) beneficial ownership of such entity.
"You" (or "Your") shall mean an individual or Legal Entity
exercising permissions granted by this License.
"Source" form shall mean the preferred form for making modifications,
including but not limited to software source code, documentation
source, and configuration files.
"Object" form shall mean any form resulting from mechanical
transformation or translation of a Source form, including but
not limited to compiled object code, generated documentation,
and conversions to other media types.
"Work" shall mean the work of authorship, whether in Source or
Object form, made available under the License, as indicated by a
copyright notice that is included in or attached to the work
(an example is provided in the Appendix below).
"Derivative Works" shall mean any work, whether in Source or Object
form, that is based on (or derived from) the Work and for which the
editorial revisions, annotations, elaborations, or other modifications
represent, as a whole, an original work of authorship. For the purposes
of this License, Derivative Works shall not include works that remain
separable from, or merely link (or bind by name) to the interfaces of,
the Work and Derivative Works thereof.
"Contribution" shall mean any work of authorship, including
the original version of the Work and any modifications or additions
to that Work or Derivative Works thereof, that is intentionally
submitted to Licensor for inclusion in the Work by the copyright owner
or by an individual or Legal Entity authorized to submit on behalf of
the copyright owner. For the purposes of this definition, "submitted"
means any form of electronic, verbal, or written communication sent
to the Licensor or its representatives, including but not limited to
communication on electronic mailing lists, source code control systems,
and issue tracking systems that are managed by, or on behalf of, the
Licensor for the purpose of discussing and improving the Work, but
excluding communication that is conspicuously marked or otherwise
designated in writing by the copyright owner as "Not a Contribution."
"Contributor" shall mean Licensor and any individual or Legal Entity
on behalf of whom a Contribution has been received by Licensor and
subsequently incorporated within the Work.
2. Grant of Copyright License. Subject to the terms and conditions of
this License, each Contributor hereby grants to You a perpetual,
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
copyright license to reproduce, prepare Derivative Works of,
publicly display, publicly perform, sublicense, and distribute the
Work and such Derivative Works in Source or Object form.
3. Grant of Patent License. Subject to the terms and conditions of
this License, each Contributor hereby grants to You a perpetual,
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
(except as stated in this section) patent license to make, have made,
use, offer to sell, sell, import, and otherwise transfer the Work,
where such license applies only to those patent claims licensable
by such Contributor that are necessarily infringed by their
Contribution(s) alone or by combination of their Contribution(s)
with the Work to which such Contribution(s) was submitted. If You
institute patent litigation against any entity (including a
cross-claim or counterclaim in a lawsuit) alleging that the Work
or a Contribution incorporated within the Work constitutes direct
or contributory patent infringement, then any patent licenses
granted to You under this License for that Work shall terminate
as of the date such litigation is filed.
4. Redistribution. You may reproduce and distribute copies of the
Work or Derivative Works thereof in any medium, with or without
modifications, and in Source or Object form, provided that You
meet the following conditions:
(a) You must give any other recipients of the Work or
Derivative Works a copy of this License; and
(b) You must cause any modified files to carry prominent notices
stating that You changed the files; and
(c) You must retain, in the Source form of any Derivative Works
that You distribute, all copyright, patent, trademark, and
attribution notices from the Source form of the Work,
excluding those notices that do not pertain to any part of
the Derivative Works; and
(d) If the Work includes a "NOTICE" text file as part of its
distribution, then any Derivative Works that You distribute must
include a readable copy of the attribution notices contained
within such NOTICE file, excluding those notices that do not
pertain to any part of the Derivative Works, in at least one
of the following places: within a NOTICE text file distributed
as part of the Derivative Works; within the Source form or
documentation, if provided along with the Derivative Works; or,
within a display generated by the Derivative Works, if and
wherever such third-party notices normally appear. The contents
of the NOTICE file are for informational purposes only and
do not modify the License. You may add Your own attribution
notices within Derivative Works that You distribute, alongside
or as an addendum to the NOTICE text from the Work, provided
that such additional attribution notices cannot be construed
as modifying the License.
You may add Your own copyright statement to Your modifications and
may provide additional or different license terms and conditions
for use, reproduction, or distribution of Your modifications, or
for any such Derivative Works as a whole, provided Your use,
reproduction, and distribution of the Work otherwise complies with
the conditions stated in this License.
5. Submission of Contributions. Unless You explicitly state otherwise,
any Contribution intentionally submitted for inclusion in the Work
by You to the Licensor shall be under the terms and conditions of
this License, without any additional terms or conditions.
Notwithstanding the above, nothing herein shall supersede or modify
the terms of any separate license agreement you may have executed
with Licensor regarding such Contributions.
6. Trademarks. This License does not grant permission to use the trade
names, trademarks, service marks, or product names of the Licensor,
except as required for reasonable and customary use in describing the
origin of the Work and reproducing the content of the NOTICE file.
7. Disclaimer of Warranty. Unless required by applicable law or
agreed to in writing, Licensor provides the Work (and each
Contributor provides its Contributions) on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
implied, including, without limitation, any warranties or conditions
of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
PARTICULAR PURPOSE. You are solely responsible for determining the
appropriateness of using or redistributing the Work and assume any
risks associated with Your exercise of permissions under this License.
8. Limitation of Liability. In no event and under no legal theory,
whether in tort (including negligence), contract, or otherwise,
unless required by applicable law (such as deliberate and grossly
negligent acts) or agreed to in writing, shall any Contributor be
liable to You for damages, including any direct, indirect, special,
incidental, or consequential damages of any character arising as a
result of this License or out of the use or inability to use the
Work (including but not limited to damages for loss of goodwill,
work stoppage, computer failure or malfunction, or any and all
other commercial damages or losses), even if such Contributor
has been advised of the possibility of such damages.
9. Accepting Warranty or Additional Liability. While redistributing
the Work or Derivative Works thereof, You may choose to offer,
and charge a fee for, acceptance of support, warranty, indemnity,
or other liability obligations and/or rights consistent with this
License. However, in accepting such obligations, You may act only
on Your own behalf and on Your sole responsibility, not on behalf
of any other Contributor, and only if You agree to indemnify,
defend, and hold each Contributor harmless for any liability
incurred by, or claims asserted against, such Contributor by reason
of your accepting any such warranty or additional liability.
END OF TERMS AND CONDITIONS
APPENDIX: How to apply the Apache License to your work.
To apply the Apache License to your work, attach the following
boilerplate notice, with the fields enclosed by brackets "[]"
replaced with your own identifying information. (Don't include
the brackets!) The text should be enclosed in the appropriate
comment syntax for the file format. We also recommend that a
file or class name and description of purpose be included on the
same "printed page" as the copyright notice for easier
identification within third-party archives.
Copyright [yyyy] [name of copyright owner]
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
------
** github.com/aws/karpenter-core; v0.22.2-0.20230124174026-a2d4c9b50fdb ---
Karpenter
Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
Apache License
Version 2.0, January 2004
http://www.apache.org/licenses/
TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
1. Definitions.
"License" shall mean the terms and conditions for use, reproduction,
and distribution as defined by Sections 1 through 9 of this document.
"Licensor" shall mean the copyright owner or entity authorized by
the copyright owner that is granting the License.
"Legal Entity" shall mean the union of the acting entity and all
other entities that control, are controlled by, or are under common
control with that entity. For the purposes of this definition,
"control" means (i) the power, direct or indirect, to cause the
direction or management of such entity, whether by contract or
otherwise, or (ii) ownership of fifty percent (50%) or more of the
outstanding shares, or (iii) beneficial ownership of such entity.
"You" (or "Your") shall mean an individual or Legal Entity
exercising permissions granted by this License.
"Source" form shall mean the preferred form for making modifications,
including but not limited to software source code, documentation
source, and configuration files.
"Object" form shall mean any form resulting from mechanical
transformation or translation of a Source form, including but
not limited to compiled object code, generated documentation,
and conversions to other media types.
"Work" shall mean the work of authorship, whether in Source or
Object form, made available under the License, as indicated by a
copyright notice that is included in or attached to the work
(an example is provided in the Appendix below).
"Derivative Works" shall mean any work, whether in Source or Object
form, that is based on (or derived from) the Work and for which the
editorial revisions, annotations, elaborations, or other modifications
represent, as a whole, an original work of authorship. For the purposes
of this License, Derivative Works shall not include works that remain
separable from, or merely link (or bind by name) to the interfaces of,
the Work and Derivative Works thereof.
"Contribution" shall mean any work of authorship, including
the original version of the Work and any modifications or additions
to that Work or Derivative Works thereof, that is intentionally
submitted to Licensor for inclusion in the Work by the copyright owner
or by an individual or Legal Entity authorized to submit on behalf of
the copyright owner. For the purposes of this definition, "submitted"
means any form of electronic, verbal, or written communication sent
to the Licensor or its representatives, including but not limited to
communication on electronic mailing lists, source code control systems,
and issue tracking systems that are managed by, or on behalf of, the
Licensor for the purpose of discussing and improving the Work, but
excluding communication that is conspicuously marked or otherwise
designated in writing by the copyright owner as "Not a Contribution."
"Contributor" shall mean Licensor and any individual or Legal Entity
on behalf of whom a Contribution has been received by Licensor and
subsequently incorporated within the Work.
2. Grant of Copyright License. Subject to the terms and conditions of
this License, each Contributor hereby grants to You a perpetual,
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
copyright license to reproduce, prepare Derivative Works of,
publicly display, publicly perform, sublicense, and distribute the
Work and such Derivative Works in Source or Object form.
3. Grant of Patent License. Subject to the terms and conditions of
this License, each Contributor hereby grants to You a perpetual,
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
(except as stated in this section) patent license to make, have made,
use, offer to sell, sell, import, and otherwise transfer the Work,
where such license applies only to those patent claims licensable
by such Contributor that are necessarily infringed by their
Contribution(s) alone or by combination of their Contribution(s)
with the Work to which such Contribution(s) was submitted. If You
institute patent litigation against any entity (including a
cross-claim or counterclaim in a lawsuit) alleging that the Work
or a Contribution incorporated within the Work constitutes direct
or contributory patent infringement, then any patent licenses
granted to You under this License for that Work shall terminate
as of the date such litigation is filed.
4. Redistribution. You may reproduce and distribute copies of the
Work or Derivative Works thereof in any medium, with or without
modifications, and in Source or Object form, provided that You
meet the following conditions:
(a) You must give any other recipients of the Work or
Derivative Works a copy of this License; and
(b) You must cause any modified files to carry prominent notices
stating that You changed the files; and
(c) You must retain, in the Source form of any Derivative Works
that You distribute, all copyright, patent, trademark, and
attribution notices from the Source form of the Work,
excluding those notices that do not pertain to any part of
the Derivative Works; and
(d) If the Work includes a "NOTICE" text file as part of its
distribution, then any Derivative Works that You distribute must
include a readable copy of the attribution notices contained
within such NOTICE file, excluding those notices that do not
pertain to any part of the Derivative Works, in at least one
of the following places: within a NOTICE text file distributed
as part of the Derivative Works; within the Source form or
documentation, if provided along with the Derivative Works; or,
within a display generated by the Derivative Works, if and
wherever such third-party notices normally appear. The contents
of the NOTICE file are for informational purposes only and
do not modify the License. You may add Your own attribution
notices within Derivative Works that You distribute, alongside
or as an addendum to the NOTICE text from the Work, provided
that such additional attribution notices cannot be construed
as modifying the License.
You may add Your own copyright statement to Your modifications and
may provide additional or different license terms and conditions
for use, reproduction, or distribution of Your modifications, or
for any such Derivative Works as a whole, provided Your use,
reproduction, and distribution of the Work otherwise complies with
the conditions stated in this License.
5. Submission of Contributions. Unless You explicitly state otherwise,
any Contribution intentionally submitted for inclusion in the Work
by You to the Licensor shall be under the terms and conditions of
this License, without any additional terms or conditions.
Notwithstanding the above, nothing herein shall supersede or modify
the terms of any separate license agreement you may have executed
with Licensor regarding such Contributions.
6. Trademarks. This License does not grant permission to use the trade
names, trademarks, service marks, or product names of the Licensor,
except as required for reasonable and customary use in describing the
origin of the Work and reproducing the content of the NOTICE file.
7. Disclaimer of Warranty. Unless required by applicable law or
agreed to in writing, Licensor provides the Work (and each
Contributor provides its Contributions) on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
implied, including, without limitation, any warranties or conditions
of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
PARTICULAR PURPOSE. You are solely responsible for determining the
appropriateness of using or redistributing the Work and assume any
risks associated with Your exercise of permissions under this License.
8. Limitation of Liability. In no event and under no legal theory,
whether in tort (including negligence), contract, or otherwise,
unless required by applicable law (such as deliberate and grossly
negligent acts) or agreed to in writing, shall any Contributor be
liable to You for damages, including any direct, indirect, special,
incidental, or consequential damages of any character arising as a
result of this License or out of the use or inability to use the
Work (including but not limited to damages for loss of goodwill,
work stoppage, computer failure or malfunction, or any and all
other commercial damages or losses), even if such Contributor
has been advised of the possibility of such damages.
9. Accepting Warranty or Additional Liability. While redistributing
the Work or Derivative Works thereof, You may choose to offer,
and charge a fee for, acceptance of support, warranty, indemnity,
or other liability obligations and/or rights consistent with this
License. However, in accepting such obligations, You may act only
on Your own behalf and on Your sole responsibility, not on behalf
of any other Contributor, and only if You agree to indemnify,
defend, and hold each Contributor harmless for any liability
incurred by, or claims asserted against, such Contributor by reason
of your accepting any such warranty or additional liability.
END OF TERMS AND CONDITIONS
APPENDIX: How to apply the Apache License to your work.
To apply the Apache License to your work, attach the following
boilerplate notice, with the fields enclosed by brackets "[]"
replaced with your own identifying information. (Don't include
the brackets!) The text should be enclosed in the appropriate
comment syntax for the file format. We also recommend that a
file or class name and description of purpose be included on the
same "printed page" as the copyright notice for easier
identification within third-party archives.
Copyright [yyyy] [name of copyright owner]
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
------
** github.com/grpc-ecosystem/grpc-gateway; v1.16.0 ---
Copyright (c) 2015, Gengo, Inc.
All rights reserved.
Redistribution and use in source and binary forms, with or without modification,
are permitted provided that the following conditions are met:
* Redistributions of source code must retain the above copyright notice,
this list of conditions and the following disclaimer.
* Redistributions in binary form must reproduce the above copyright notice,
this list of conditions and the following disclaimer in the documentation
and/or other materials provided with the distribution.
* Neither the name of Gengo, Inc. nor the names of its
contributors may be used to endorse or promote products derived from this
software without specific prior written permission.
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
------
** github.com/kelseyhightower/envconfig; v1.4.0 ---
Copyright (c) 2013 Kelsey Hightower
Permission is hereby granted, free of charge, to any person obtaining a copy of
this software and associated documentation files (the "Software"), to deal in
the Software without restriction, including without limitation the rights to
use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
of the Software, and to permit persons to whom the Software is furnished to do
so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
------
** github.com/matttproud/golang_protobuf_extensions; v1.0.2-0.20181231171920-c182affec369 ---
Copyright 2012 Matt T. Proud (matt.proud@gmail.com)
Apache Licens
gitextract___izru8g/
├── .github/
│ ├── ISSUE_TEMPLATE/
│ │ ├── bug.yaml
│ │ ├── documentation.yaml
│ │ └── feature.yaml
│ ├── actionlint-matcher.json
│ ├── actions/
│ │ ├── commit-status/
│ │ │ ├── end/
│ │ │ │ └── action.yaml
│ │ │ └── start/
│ │ │ └── action.yaml
│ │ ├── deploy-website/
│ │ │ └── action.yml
│ │ ├── download-artifact/
│ │ │ └── action.yaml
│ │ ├── e2e/
│ │ │ ├── cleanup/
│ │ │ │ └── action.yaml
│ │ │ ├── dump-logs/
│ │ │ │ └── action.yaml
│ │ │ ├── install-eksctl/
│ │ │ │ └── action.yaml
│ │ │ ├── install-helm/
│ │ │ │ └── action.yaml
│ │ │ ├── install-karpenter/
│ │ │ │ └── action.yaml
│ │ │ ├── install-prometheus/
│ │ │ │ ├── action.yaml
│ │ │ │ └── values.yaml
│ │ │ ├── run-tests-private-cluster/
│ │ │ │ └── action.yaml
│ │ │ ├── setup-cluster/
│ │ │ │ └── action.yaml
│ │ │ ├── slack/
│ │ │ │ ├── notify/
│ │ │ │ │ └── action.yaml
│ │ │ │ └── send-message/
│ │ │ │ └── action.yaml
│ │ │ └── upgrade-crds/
│ │ │ └── action.yaml
│ │ └── install-deps/
│ │ └── action.yaml
│ ├── dependabot.yaml
│ ├── pull-request-template.md
│ ├── security-notice.md
│ └── workflows/
│ ├── approval-comment.yaml
│ ├── ci-test.yaml
│ ├── ci.yaml
│ ├── codegen.yaml
│ ├── codeql-analysis.yaml
│ ├── dryrun-gen-pr.yaml
│ ├── dryrun-gen.yaml
│ ├── e2e-cleanup.yaml
│ ├── e2e-matrix-trigger.yaml
│ ├── e2e-matrix.yaml
│ ├── e2e-private-cluster-trigger.yaml
│ ├── e2e-scale-trigger.yaml
│ ├── e2e-soak-trigger.yaml
│ ├── e2e-upgrade.yaml
│ ├── e2e-version-compatibility-trigger.yaml
│ ├── e2e.yaml
│ ├── image-canary.yaml
│ ├── postsubmit.yaml
│ ├── release.yaml
│ ├── resolve-args.yaml
│ ├── resource-count.yaml
│ ├── snapshot-pr.yaml
│ ├── snapshot.yaml
│ ├── stale.yaml
│ ├── sweeper.yaml
│ ├── website-cleanup-preview.yaml
│ ├── website-deploy.yaml
│ ├── website-preview-trigger.yaml
│ └── website-preview.yaml
├── .gitignore
├── .gitmodules
├── .golangci.yaml
├── .ko.yaml
├── ADOPTERS.md
├── CODEOWNERS
├── CODE_OF_CONDUCT.md
├── LICENSE
├── Makefile
├── NOTICE
├── README.md
├── THIRD_PARTY_LICENSES
├── charts/
│ ├── index.yaml
│ ├── karpenter/
│ │ ├── .helmignore
│ │ ├── Chart.yaml
│ │ ├── README.md
│ │ ├── README.md.gotmpl
│ │ ├── artifacthub-repo.yaml
│ │ ├── templates/
│ │ │ ├── _helpers.tpl
│ │ │ ├── aggregate-clusterrole.yaml
│ │ │ ├── clusterrole-core.yaml
│ │ │ ├── clusterrole.yaml
│ │ │ ├── deployment.yaml
│ │ │ ├── poddisruptionbudget.yaml
│ │ │ ├── role.yaml
│ │ │ ├── rolebinding.yaml
│ │ │ ├── service.yaml
│ │ │ ├── serviceaccount.yaml
│ │ │ └── servicemonitor.yaml
│ │ └── values.yaml
│ ├── karpenter-0.1.1.tgz
│ ├── karpenter-0.1.2.tgz
│ ├── karpenter-0.1.3.tgz
│ ├── karpenter-0.10.0.tgz
│ ├── karpenter-0.10.1.tgz
│ ├── karpenter-0.11.0.tgz
│ ├── karpenter-0.11.1.tgz
│ ├── karpenter-0.12.0.tgz
│ ├── karpenter-0.12.1.tgz
│ ├── karpenter-0.13.0.tgz
│ ├── karpenter-0.13.1.tgz
│ ├── karpenter-0.13.2.tgz
│ ├── karpenter-0.14.0-rc.0.tgz
│ ├── karpenter-0.14.0.tgz
│ ├── karpenter-0.15.0.tgz
│ ├── karpenter-0.16.0.tgz
│ ├── karpenter-0.16.1.tgz
│ ├── karpenter-0.16.2.tgz
│ ├── karpenter-0.16.3.tgz
│ ├── karpenter-0.2.0.tgz
│ ├── karpenter-0.2.1.tgz
│ ├── karpenter-0.2.2.tgz
│ ├── karpenter-0.2.3.tgz
│ ├── karpenter-0.2.4.tgz
│ ├── karpenter-0.2.5.tgz
│ ├── karpenter-0.2.6.tgz
│ ├── karpenter-0.2.7.tgz
│ ├── karpenter-0.2.8.tgz
│ ├── karpenter-0.2.9.tgz
│ ├── karpenter-0.3.0.tgz
│ ├── karpenter-0.3.1.tgz
│ ├── karpenter-0.3.2.tgz
│ ├── karpenter-0.3.3.tgz
│ ├── karpenter-0.3.4.tgz
│ ├── karpenter-0.4.0.tgz
│ ├── karpenter-0.4.1.tgz
│ ├── karpenter-0.4.2.tgz
│ ├── karpenter-0.4.3.tgz
│ ├── karpenter-0.5.0.tgz
│ ├── karpenter-0.5.1.tgz
│ ├── karpenter-0.5.2.tgz
│ ├── karpenter-0.5.3.tgz
│ ├── karpenter-0.5.4.tgz
│ ├── karpenter-0.5.5.tgz
│ ├── karpenter-0.5.6.tgz
│ ├── karpenter-0.6.0.tgz
│ ├── karpenter-0.6.1.tgz
│ ├── karpenter-0.6.2.tgz
│ ├── karpenter-0.6.3.tgz
│ ├── karpenter-0.6.4.tgz
│ ├── karpenter-0.6.5.tgz
│ ├── karpenter-0.7.0.tgz
│ ├── karpenter-0.7.1.tgz
│ ├── karpenter-0.7.2.tgz
│ ├── karpenter-0.7.3.tgz
│ ├── karpenter-0.8.0.tgz
│ ├── karpenter-0.8.1.tgz
│ ├── karpenter-0.8.2.tgz
│ ├── karpenter-0.9.0-rc.0.tgz
│ ├── karpenter-0.9.0-rc.1.tgz
│ ├── karpenter-0.9.0.tgz
│ ├── karpenter-0.9.1.tgz
│ ├── karpenter-crd/
│ │ ├── .helmignore
│ │ ├── Chart.yaml
│ │ ├── README.md
│ │ ├── README.md.gotmpl
│ │ ├── artifacthub-repo.yaml
│ │ ├── templates/
│ │ │ ├── karpenter.k8s.aws_ec2nodeclasses.yaml
│ │ │ ├── karpenter.sh_nodeclaims.yaml
│ │ │ ├── karpenter.sh_nodeoverlays.yaml
│ │ │ └── karpenter.sh_nodepools.yaml
│ │ └── values.yaml
│ └── karpenter-v0-66626bc5e21dc14b2cceaaeb3ad5933c0b4e2046.tgz
├── cmd/
│ └── controller/
│ └── main.go
├── designs/
│ ├── README.md
│ ├── ami-selector.md
│ ├── aws-launch-templates-options.md
│ ├── aws-launch-templates-v2.md
│ ├── bin-packing.md
│ ├── capacity-block-support.md
│ ├── consolidation.md
│ ├── custom-user-data-and-amis.md
│ ├── deprecated-ami-observability.md
│ ├── deprovisioning.md
│ ├── integration-testing.md
│ ├── interruption-handling.md
│ ├── limits.md
│ ├── metrics.md
│ ├── node-ownership.md
│ ├── node-upgrades.md
│ ├── odcr.md
│ ├── provisioner-priority.md
│ ├── runtime-defaulting.md
│ ├── termination.md
│ ├── unmanaged-launch-template-removal.md
│ ├── v1-api.md
│ ├── v1-roadmap.md
│ ├── v1alpha4-api.md
│ ├── v1beta1-api.md
│ └── v1beta1-full-changelist.md
├── examples/
│ ├── README.md
│ ├── v1/
│ │ ├── 100-cpu-limit.yaml
│ │ ├── al2-custom-ami.yaml
│ │ ├── al2-custom-userdata.yaml
│ │ ├── al2-kubelet-log-query.yaml
│ │ ├── al2023-custom-userdata.yaml
│ │ ├── bottlerocket.yaml
│ │ ├── br-custom-userdata.yaml
│ │ ├── custom-family-with-alias.yaml
│ │ ├── custom-family.yaml
│ │ ├── general-purpose.yaml
│ │ ├── instance-store-ephemeral-storage.yaml
│ │ ├── large-instances.yaml
│ │ ├── max-node-lifetime.yaml
│ │ ├── min-values-family.yaml
│ │ ├── min-values-multiple-keys.yaml
│ │ ├── multiple-arch.yaml
│ │ ├── multiple-ebs.yaml
│ │ ├── spot.yaml
│ │ ├── windows-2019.yaml
│ │ ├── windows-2022.yaml
│ │ ├── windows-2025.yaml
│ │ └── windows-custom-userdata.yaml
│ └── workloads/
│ ├── arm64.yaml
│ ├── disruption-budget.yaml
│ ├── gpu-amd.yaml
│ ├── gpu-nvidia.yaml
│ ├── inflate.yaml
│ ├── neuron.yaml
│ ├── prefer-arm.yaml
│ ├── spot.yaml
│ ├── spread-hostname-zone.yaml
│ ├── spread-hostname.yaml
│ └── spread-zone.yaml
├── go.mod
├── go.sum
├── hack/
│ ├── boilerplate.go.txt
│ ├── boilerplate.sh
│ ├── code/
│ │ ├── bandwidth_gen/
│ │ │ ├── example/
│ │ │ │ └── gp.html
│ │ │ └── main.go
│ │ ├── instancetype_testdata_gen/
│ │ │ └── main.go
│ │ ├── prices_gen/
│ │ │ └── main.go
│ │ └── vpc_limits_gen/
│ │ └── main.go
│ ├── codegen.sh
│ ├── docgen.sh
│ ├── docs/
│ │ ├── compatibilitymatrix_gen/
│ │ │ ├── compatibility.yaml
│ │ │ └── main.go
│ │ ├── configuration_gen/
│ │ │ └── main.go
│ │ ├── instancetypes_gen/
│ │ │ └── main.go
│ │ ├── metrics_gen/
│ │ │ └── main.go
│ │ ├── parse-redirects/
│ │ │ ├── go.mod
│ │ │ └── main.go
│ │ └── version_compatibility_gen/
│ │ └── main.go
│ ├── github/
│ │ ├── community-contributors.sh
│ │ ├── count-flakes.sh
│ │ ├── dependabot.sh
│ │ ├── feature_request_reactions.py
│ │ ├── label_issue_count.py
│ │ └── requirements.txt
│ ├── image_canary.sh
│ ├── mutation/
│ │ └── crd_annotations.sh
│ ├── release/
│ │ ├── common.sh
│ │ ├── prepare-website.sh
│ │ ├── release.sh
│ │ ├── snapshot.sh
│ │ └── stable-pr.sh
│ ├── toolchain.sh
│ ├── tools/
│ │ ├── allocatable_diff/
│ │ │ ├── README.md
│ │ │ └── main.go
│ │ └── launchtemplate_counter/
│ │ └── main.go
│ └── validation/
│ ├── kubelet.sh
│ ├── labels.sh
│ └── requirements.sh
├── kwok/
│ ├── Makefile
│ ├── README.md
│ ├── cloudprovider/
│ │ └── cloudprovider.go
│ ├── ec2/
│ │ ├── ec2.go
│ │ └── ratelimiting.go
│ ├── main.go
│ ├── manifests/
│ │ └── clusterrole.yaml
│ ├── operator/
│ │ └── operator.go
│ └── strategy/
│ └── strategy.go
├── pkg/
│ ├── apis/
│ │ ├── apis.go
│ │ ├── crds/
│ │ │ ├── karpenter.k8s.aws_ec2nodeclasses.yaml
│ │ │ ├── karpenter.sh_nodeclaims.yaml
│ │ │ ├── karpenter.sh_nodeoverlays.yaml
│ │ │ └── karpenter.sh_nodepools.yaml
│ │ └── v1/
│ │ ├── doc.go
│ │ ├── ec2nodeclass.go
│ │ ├── ec2nodeclass_defaults.go
│ │ ├── ec2nodeclass_hash_test.go
│ │ ├── ec2nodeclass_status.go
│ │ ├── ec2nodeclass_validation_cel_test.go
│ │ ├── labels.go
│ │ ├── nodepool_validation_cel_test.go
│ │ ├── suite_test.go
│ │ └── zz_generated.deepcopy.go
│ ├── aws/
│ │ └── sdk.go
│ ├── batcher/
│ │ ├── batcher.go
│ │ ├── createfleet.go
│ │ ├── createfleet_test.go
│ │ ├── describeinstances.go
│ │ ├── describeinstances_test.go
│ │ ├── ec2api.go
│ │ ├── metrics.go
│ │ ├── suite_test.go
│ │ ├── terminateinstances.go
│ │ └── terminateinstances_test.go
│ ├── cache/
│ │ ├── cache.go
│ │ ├── suite_test.go
│ │ └── unavailableofferings.go
│ ├── cloudprovider/
│ │ ├── cloudprovider.go
│ │ ├── drift.go
│ │ ├── events/
│ │ │ └── events.go
│ │ └── suite_test.go
│ ├── controllers/
│ │ ├── capacityreservation/
│ │ │ ├── capacitytype/
│ │ │ │ ├── controller.go
│ │ │ │ └── suite_test.go
│ │ │ └── expiration/
│ │ │ ├── controller.go
│ │ │ └── suite_test.go
│ │ ├── controllers.go
│ │ ├── interruption/
│ │ │ ├── controller.go
│ │ │ ├── events/
│ │ │ │ └── events.go
│ │ │ ├── interruption_benchmark_test.go
│ │ │ ├── messages/
│ │ │ │ ├── capacityreservationinterruption/
│ │ │ │ │ ├── model.go
│ │ │ │ │ └── parser.go
│ │ │ │ ├── noop/
│ │ │ │ │ └── model.go
│ │ │ │ ├── rebalancerecommendation/
│ │ │ │ │ ├── model.go
│ │ │ │ │ └── parser.go
│ │ │ │ ├── scheduledchange/
│ │ │ │ │ ├── model.go
│ │ │ │ │ └── parser.go
│ │ │ │ ├── spotinterruption/
│ │ │ │ │ ├── model.go
│ │ │ │ │ └── parser.go
│ │ │ │ ├── statechange/
│ │ │ │ │ ├── model.go
│ │ │ │ │ └── parser.go
│ │ │ │ └── types.go
│ │ │ ├── metrics.go
│ │ │ ├── parser.go
│ │ │ └── suite_test.go
│ │ ├── metrics/
│ │ │ ├── controller.go
│ │ │ ├── metrics.go
│ │ │ └── suite_test.go
│ │ ├── nodeclaim/
│ │ │ ├── garbagecollection/
│ │ │ │ ├── controller.go
│ │ │ │ └── suite_test.go
│ │ │ └── tagging/
│ │ │ ├── controller.go
│ │ │ └── suite_test.go
│ │ ├── nodeclass/
│ │ │ ├── ami.go
│ │ │ ├── ami_test.go
│ │ │ ├── capacityreservation.go
│ │ │ ├── capacityreservation_test.go
│ │ │ ├── controller.go
│ │ │ ├── events.go
│ │ │ ├── garbagecollection/
│ │ │ │ ├── controller.go
│ │ │ │ └── suite_test.go
│ │ │ ├── hash/
│ │ │ │ ├── controller.go
│ │ │ │ └── suite_test.go
│ │ │ ├── instanceprofile.go
│ │ │ ├── instanceprofile_test.go
│ │ │ ├── securitygroup.go
│ │ │ ├── securitygroup_test.go
│ │ │ ├── subnet.go
│ │ │ ├── subnet_test.go
│ │ │ ├── suite_test.go
│ │ │ ├── validation.go
│ │ │ └── validation_test.go
│ │ └── providers/
│ │ ├── instancetype/
│ │ │ ├── capacity/
│ │ │ │ ├── controller.go
│ │ │ │ └── suite_test.go
│ │ │ ├── controller.go
│ │ │ └── suite_test.go
│ │ ├── pricing/
│ │ │ ├── controller.go
│ │ │ └── suite_test.go
│ │ ├── ssm/
│ │ │ └── invalidation/
│ │ │ ├── controller.go
│ │ │ └── suite_test.go
│ │ └── version/
│ │ ├── controller.go
│ │ └── suite_test.go
│ ├── errors/
│ │ └── errors.go
│ ├── fake/
│ │ ├── atomic.go
│ │ ├── cloudprovider.go
│ │ ├── ec2api.go
│ │ ├── eksapi.go
│ │ ├── iamapi.go
│ │ ├── pricingapi.go
│ │ ├── sqsapi.go
│ │ ├── ssmapi.go
│ │ ├── types.go
│ │ ├── utils.go
│ │ └── zz_generated.describe_instance_types.go
│ ├── operator/
│ │ ├── operator.go
│ │ ├── options/
│ │ │ ├── options.go
│ │ │ ├── options_validation.go
│ │ │ └── suite_test.go
│ │ └── suite_test.go
│ ├── providers/
│ │ ├── amifamily/
│ │ │ ├── al2.go
│ │ │ ├── al2023.go
│ │ │ ├── ami.go
│ │ │ ├── bootstrap/
│ │ │ │ ├── bootstrap.go
│ │ │ │ ├── bottlerocket.go
│ │ │ │ ├── bottlerocket_test.go
│ │ │ │ ├── bottlerocketsettings.go
│ │ │ │ ├── custom.go
│ │ │ │ ├── eksbootstrap.go
│ │ │ │ ├── mime/
│ │ │ │ │ ├── mime.go
│ │ │ │ │ ├── suite_test.go
│ │ │ │ │ └── test_data/
│ │ │ │ │ ├── mime_bad_header.txt
│ │ │ │ │ ├── mime_valid.txt
│ │ │ │ │ ├── nodeconfig.txt
│ │ │ │ │ └── shell.txt
│ │ │ │ ├── nodeadm.go
│ │ │ │ └── windows.go
│ │ │ ├── bottlerocket.go
│ │ │ ├── bottlerocket_test.go
│ │ │ ├── custom.go
│ │ │ ├── resolver.go
│ │ │ ├── suite_test.go
│ │ │ ├── types.go
│ │ │ └── windows.go
│ │ ├── capacityreservation/
│ │ │ ├── provider.go
│ │ │ ├── suite_test.go
│ │ │ └── types.go
│ │ ├── instance/
│ │ │ ├── events.go
│ │ │ ├── filter/
│ │ │ │ ├── filter.go
│ │ │ │ └── filter_test.go
│ │ │ ├── instance.go
│ │ │ ├── suite_test.go
│ │ │ └── types.go
│ │ ├── instanceprofile/
│ │ │ ├── instanceprofile.go
│ │ │ └── suite_test.go
│ │ ├── instancetype/
│ │ │ ├── instancetype.go
│ │ │ ├── metrics.go
│ │ │ ├── offering/
│ │ │ │ └── offering.go
│ │ │ ├── suite_test.go
│ │ │ ├── types.go
│ │ │ ├── zz_generated.bandwidth.go
│ │ │ └── zz_generated.vpclimits.go
│ │ ├── launchtemplate/
│ │ │ ├── launchtemplate.go
│ │ │ ├── suite_test.go
│ │ │ ├── testdata/
│ │ │ │ ├── al2023_mime_userdata_input.golden
│ │ │ │ ├── al2023_mime_userdata_merged.golden
│ │ │ │ ├── al2023_shell_userdata_input.golden
│ │ │ │ ├── al2023_shell_userdata_merged.golden
│ │ │ │ ├── al2023_userdata_unmerged.golden
│ │ │ │ ├── al2023_yaml_userdata_input.golden
│ │ │ │ ├── al2023_yaml_userdata_merged.golden
│ │ │ │ ├── al2_no_mime_userdata_input.golden
│ │ │ │ ├── al2_userdata_content_type_first_input.golden
│ │ │ │ ├── al2_userdata_input.golden
│ │ │ │ ├── al2_userdata_merged.golden
│ │ │ │ ├── al2_userdata_unmerged.golden
│ │ │ │ ├── br_userdata_input.golden
│ │ │ │ ├── br_userdata_merged.golden
│ │ │ │ ├── br_userdata_unmerged.golden
│ │ │ │ ├── windows_userdata_input.golden
│ │ │ │ ├── windows_userdata_merged.golden
│ │ │ │ └── windows_userdata_unmerged.golden
│ │ │ └── types.go
│ │ ├── pricing/
│ │ │ ├── pricing.go
│ │ │ ├── zz_generated.pricing_aws.go
│ │ │ ├── zz_generated.pricing_aws_cn.go
│ │ │ └── zz_generated.pricing_aws_us_gov.go
│ │ ├── securitygroup/
│ │ │ ├── securitygroup.go
│ │ │ └── suite_test.go
│ │ ├── sqs/
│ │ │ └── sqs.go
│ │ ├── ssm/
│ │ │ ├── provider.go
│ │ │ └── types.go
│ │ ├── subnet/
│ │ │ ├── subnet.go
│ │ │ └── suite_test.go
│ │ └── version/
│ │ ├── suite_test.go
│ │ ├── version.go
│ │ └── version_test.go
│ ├── test/
│ │ ├── environment.go
│ │ ├── nodeclass.go
│ │ ├── options.go
│ │ └── utils.go
│ └── utils/
│ ├── suite_test.go
│ └── utils.go
├── test/
│ ├── README.md
│ ├── assets/
│ │ └── gha_architecture.excalidraw
│ ├── cloudformation/
│ │ ├── README.md
│ │ ├── grafana_cloudformation.yaml
│ │ ├── iam_cloudformation.yaml
│ │ ├── prometheus_cloudformation.yaml
│ │ └── timestream_cloudformation.yaml
│ ├── hack/
│ │ ├── e2e_scripts/
│ │ │ ├── clean_private_cluster.sh
│ │ │ ├── configure_private_cluster.sh
│ │ │ ├── diff_karpenter.sh
│ │ │ ├── install_helm.sh
│ │ │ ├── install_karpenter.sh
│ │ │ ├── install_prometheus.sh
│ │ │ └── noderole_bootstrap_permission.sh
│ │ ├── resource/
│ │ │ ├── clean/
│ │ │ │ └── main.go
│ │ │ ├── count/
│ │ │ │ └── main.go
│ │ │ ├── go.mod
│ │ │ ├── go.sum
│ │ │ └── pkg/
│ │ │ ├── metrics/
│ │ │ │ └── metrics.go
│ │ │ └── resourcetypes/
│ │ │ ├── eni.go
│ │ │ ├── instance.go
│ │ │ ├── instanceprofile.go
│ │ │ ├── launchtemplate.go
│ │ │ ├── oidc.go
│ │ │ ├── resourcetypes.go
│ │ │ ├── securitygroup.go
│ │ │ ├── stack.go
│ │ │ ├── vpc_endpoint.go
│ │ │ └── vpc_peering_connection.go
│ │ └── soak/
│ │ ├── get_clusters.go
│ │ ├── go.mod
│ │ └── go.sum
│ ├── pkg/
│ │ ├── debug/
│ │ │ ├── events.go
│ │ │ ├── monitor.go
│ │ │ ├── node.go
│ │ │ ├── nodeclaim.go
│ │ │ ├── pod.go
│ │ │ └── setup.go
│ │ └── environment/
│ │ ├── aws/
│ │ │ ├── default_ec2nodeclass.yaml
│ │ │ ├── default_nodepool.yaml
│ │ │ ├── environment.go
│ │ │ ├── expectations.go
│ │ │ ├── metrics.go
│ │ │ └── setup.go
│ │ └── common/
│ │ ├── environment.go
│ │ ├── expectations.go
│ │ ├── monitor.go
│ │ └── setup.go
│ └── suites/
│ ├── ami/
│ │ ├── suite_test.go
│ │ └── testdata/
│ │ ├── al2023_userdata_input.yaml
│ │ ├── al2_no_mime_userdata_input.sh
│ │ ├── al2_userdata_input.sh
│ │ ├── br_userdata_input.sh
│ │ └── windows_userdata_input.ps1
│ ├── consolidation/
│ │ ├── suite_test.go
│ │ └── testdata/
│ │ └── hugepage_userdata_input.sh
│ ├── drift/
│ │ └── suite_test.go
│ ├── integration/
│ │ ├── aws_metadata_test.go
│ │ ├── block_device_mappings_test.go
│ │ ├── cni_test.go
│ │ ├── extended_resources_test.go
│ │ ├── hash_test.go
│ │ ├── instance_profile_test.go
│ │ ├── kubelet_config_test.go
│ │ ├── launch_template_test.go
│ │ ├── metrics_test.go
│ │ ├── network_interface_test.go
│ │ ├── nodeclass_test.go
│ │ ├── repair_policy_test.go
│ │ ├── security_group_test.go
│ │ ├── subnet_test.go
│ │ ├── suite_test.go
│ │ ├── tags_test.go
│ │ ├── testdata/
│ │ │ └── amd_driver_input.sh
│ │ └── validation_test.go
│ ├── interruption/
│ │ └── suite_test.go
│ ├── ipv6/
│ │ └── suite_test.go
│ ├── localzone/
│ │ └── suite_test.go
│ ├── nodeclaim/
│ │ └── suite_test.go
│ ├── scale/
│ │ ├── deprovisioning_test.go
│ │ ├── provisioning_test.go
│ │ └── suite_test.go
│ ├── scheduling/
│ │ ├── suite_test.go
│ │ └── testdata/
│ │ └── hugepage_userdata_input.sh
│ └── storage/
│ └── suite_test.go
├── tools/
│ └── kompat/
│ ├── README.md
│ ├── cmd/
│ │ └── kompat/
│ │ └── main.go
│ ├── go.mod
│ ├── go.sum
│ └── pkg/
│ └── kompat/
│ └── kompat.go
└── website/
├── .gitignore
├── .node-version
├── README.md
├── archetypes/
│ └── default.md
├── assets/
│ ├── js/
│ │ └── search.js
│ ├── jsconfig.json
│ └── scss/
│ ├── _search.scss
│ └── _variables_project.scss
├── content/
│ └── en/
│ ├── _index.html
│ ├── docs/
│ │ ├── _index.md
│ │ ├── concepts/
│ │ │ ├── _index.md
│ │ │ ├── disruption.md
│ │ │ ├── nodeclaims.md
│ │ │ ├── nodeclasses.md
│ │ │ ├── nodeoverlays.md
│ │ │ ├── nodepools.md
│ │ │ └── scheduling.md
│ │ ├── contributing/
│ │ │ ├── _index.md
│ │ │ ├── community-meetings.md
│ │ │ ├── design-guide.md
│ │ │ ├── development-guide.md
│ │ │ └── documentation-updates.md
│ │ ├── faq.md
│ │ ├── getting-started/
│ │ │ ├── _index.md
│ │ │ ├── getting-started-with-karpenter/
│ │ │ │ ├── _index.md
│ │ │ │ ├── cloudformation.yaml
│ │ │ │ ├── grafana-values.yaml
│ │ │ │ ├── karpenter-capacity-dashboard.json
│ │ │ │ ├── karpenter-controllers-allocation.json
│ │ │ │ ├── karpenter-controllers.json
│ │ │ │ ├── karpenter-performance-dashboard.json
│ │ │ │ ├── prometheus-values.yaml
│ │ │ │ └── scripts/
│ │ │ │ ├── step01-config.sh
│ │ │ │ ├── step02-create-cluster-fargate.sh
│ │ │ │ ├── step02-create-cluster.sh
│ │ │ │ ├── step03-iam-cloud-formation.sh
│ │ │ │ ├── step04-grant-access.sh
│ │ │ │ ├── step05-controller-iam.sh
│ │ │ │ ├── step06-add-spot-role.sh
│ │ │ │ ├── step08-apply-helm-chart-fargate.sh
│ │ │ │ ├── step08-apply-helm-chart.sh
│ │ │ │ ├── step09-add-prometheus-grafana.sh
│ │ │ │ ├── step10-add-grafana-port-forward.sh
│ │ │ │ ├── step11-grafana-get-password.sh
│ │ │ │ ├── step12-add-nodepool.sh
│ │ │ │ ├── step13-automatic-node-provisioning.sh
│ │ │ │ ├── step14-deprovisioning.sh
│ │ │ │ ├── step15-apply-flowschemas.sh
│ │ │ │ ├── step16-delete-node.sh
│ │ │ │ └── step17-cleanup.sh
│ │ │ └── migrating-from-cas/
│ │ │ ├── _index.md
│ │ │ └── scripts/
│ │ │ ├── step01-env.sh
│ │ │ ├── step02-node-iam.sh
│ │ │ ├── step03-node-policies.sh
│ │ │ ├── step04-controller-iam.sh
│ │ │ ├── step05-tag-subnets.sh
│ │ │ ├── step06-tag-security-groups.sh
│ │ │ ├── step07-edit-aws-auth.sh
│ │ │ ├── step08-generate-chart.sh
│ │ │ ├── step09-deploy.sh
│ │ │ ├── step10-create-nodepool.sh
│ │ │ ├── step11-scale-cas.sh
│ │ │ ├── step12-scale-multiple-ng.sh
│ │ │ └── step12-scale-single-ng.sh
│ │ ├── reference/
│ │ │ ├── _index.md
│ │ │ ├── cloudformation.md
│ │ │ ├── instance-types.md
│ │ │ ├── metrics.md
│ │ │ ├── settings.md
│ │ │ └── threat-model.md
│ │ ├── tasks/
│ │ │ ├── _index.md
│ │ │ ├── managing-amis.md
│ │ │ └── odcrs.md
│ │ ├── troubleshooting.md
│ │ └── upgrading/
│ │ ├── _index.md
│ │ ├── compatibility.md
│ │ └── upgrade-guide.md
│ ├── preview/
│ │ ├── _index.md
│ │ ├── concepts/
│ │ │ ├── _index.md
│ │ │ ├── disruption.md
│ │ │ ├── nodeclaims.md
│ │ │ ├── nodeclasses.md
│ │ │ ├── nodeoverlays.md
│ │ │ ├── nodepools.md
│ │ │ └── scheduling.md
│ │ ├── contributing/
│ │ │ ├── _index.md
│ │ │ ├── community-meetings.md
│ │ │ ├── design-guide.md
│ │ │ ├── development-guide.md
│ │ │ └── documentation-updates.md
│ │ ├── faq.md
│ │ ├── getting-started/
│ │ │ ├── _index.md
│ │ │ ├── getting-started-with-karpenter/
│ │ │ │ ├── _index.md
│ │ │ │ ├── cloudformation.yaml
│ │ │ │ ├── grafana-values.yaml
│ │ │ │ ├── karpenter-capacity-dashboard.json
│ │ │ │ ├── karpenter-controllers-allocation.json
│ │ │ │ ├── karpenter-controllers.json
│ │ │ │ ├── karpenter-performance-dashboard.json
│ │ │ │ ├── prometheus-values.yaml
│ │ │ │ └── scripts/
│ │ │ │ ├── step01-config.sh
│ │ │ │ ├── step02-create-cluster-fargate.sh
│ │ │ │ ├── step02-create-cluster.sh
│ │ │ │ ├── step03-iam-cloud-formation.sh
│ │ │ │ ├── step04-grant-access.sh
│ │ │ │ ├── step05-controller-iam.sh
│ │ │ │ ├── step06-add-spot-role.sh
│ │ │ │ ├── step08-apply-helm-chart-fargate.sh
│ │ │ │ ├── step08-apply-helm-chart.sh
│ │ │ │ ├── step09-add-prometheus-grafana.sh
│ │ │ │ ├── step10-add-grafana-port-forward.sh
│ │ │ │ ├── step11-grafana-get-password.sh
│ │ │ │ ├── step12-add-nodepool.sh
│ │ │ │ ├── step13-automatic-node-provisioning.sh
│ │ │ │ ├── step14-deprovisioning.sh
│ │ │ │ ├── step15-apply-flowschemas.sh
│ │ │ │ ├── step16-delete-node.sh
│ │ │ │ └── step17-cleanup.sh
│ │ │ └── migrating-from-cas/
│ │ │ ├── _index.md
│ │ │ └── scripts/
│ │ │ ├── step01-env.sh
│ │ │ ├── step02-node-iam.sh
│ │ │ ├── step03-node-policies.sh
│ │ │ ├── step04-controller-iam.sh
│ │ │ ├── step05-tag-subnets.sh
│ │ │ ├── step06-tag-security-groups.sh
│ │ │ ├── step07-edit-aws-auth.sh
│ │ │ ├── step08-generate-chart.sh
│ │ │ ├── step09-deploy.sh
│ │ │ ├── step10-create-nodepool.sh
│ │ │ ├── step11-scale-cas.sh
│ │ │ ├── step12-scale-multiple-ng.sh
│ │ │ └── step12-scale-single-ng.sh
│ │ ├── reference/
│ │ │ ├── _index.md
│ │ │ ├── cloudformation.md
│ │ │ ├── instance-types.md
│ │ │ ├── metrics.md
│ │ │ ├── settings.md
│ │ │ └── threat-model.md
│ │ ├── tasks/
│ │ │ ├── _index.md
│ │ │ ├── managing-amis.md
│ │ │ └── odcrs.md
│ │ ├── troubleshooting.md
│ │ └── upgrading/
│ │ ├── _index.md
│ │ ├── compatibility.md
│ │ └── upgrade-guide.md
│ ├── v1.0/
│ │ ├── _index.md
│ │ ├── concepts/
│ │ │ ├── _index.md
│ │ │ ├── disruption.md
│ │ │ ├── nodeclaims.md
│ │ │ ├── nodeclasses.md
│ │ │ ├── nodepools.md
│ │ │ └── scheduling.md
│ │ ├── contributing/
│ │ │ ├── _index.md
│ │ │ ├── community-meetings.md
│ │ │ ├── design-guide.md
│ │ │ ├── development-guide.md
│ │ │ └── documentation-updates.md
│ │ ├── faq.md
│ │ ├── getting-started/
│ │ │ ├── _index.md
│ │ │ ├── getting-started-with-karpenter/
│ │ │ │ ├── _index.md
│ │ │ │ ├── cloudformation.yaml
│ │ │ │ ├── grafana-values.yaml
│ │ │ │ ├── karpenter-capacity-dashboard.json
│ │ │ │ ├── karpenter-controllers-allocation.json
│ │ │ │ ├── karpenter-controllers.json
│ │ │ │ ├── karpenter-performance-dashboard.json
│ │ │ │ ├── prometheus-values.yaml
│ │ │ │ └── scripts/
│ │ │ │ ├── step01-config.sh
│ │ │ │ ├── step02-create-cluster-fargate.sh
│ │ │ │ ├── step02-create-cluster.sh
│ │ │ │ ├── step03-iam-cloud-formation.sh
│ │ │ │ ├── step04-grant-access.sh
│ │ │ │ ├── step05-controller-iam.sh
│ │ │ │ ├── step06-add-spot-role.sh
│ │ │ │ ├── step08-apply-helm-chart-fargate.sh
│ │ │ │ ├── step08-apply-helm-chart.sh
│ │ │ │ ├── step09-add-prometheus-grafana.sh
│ │ │ │ ├── step10-add-grafana-port-forward.sh
│ │ │ │ ├── step11-grafana-get-password.sh
│ │ │ │ ├── step12-add-nodepool.sh
│ │ │ │ ├── step13-automatic-node-provisioning.sh
│ │ │ │ ├── step14-deprovisioning.sh
│ │ │ │ ├── step15-apply-flowschemas.sh
│ │ │ │ ├── step16-delete-node.sh
│ │ │ │ └── step17-cleanup.sh
│ │ │ └── migrating-from-cas/
│ │ │ ├── _index.md
│ │ │ └── scripts/
│ │ │ ├── step01-env.sh
│ │ │ ├── step02-node-iam.sh
│ │ │ ├── step03-node-policies.sh
│ │ │ ├── step04-controller-iam.sh
│ │ │ ├── step05-tag-subnets.sh
│ │ │ ├── step06-tag-security-groups.sh
│ │ │ ├── step07-edit-aws-auth.sh
│ │ │ ├── step08-generate-chart.sh
│ │ │ ├── step09-deploy.sh
│ │ │ ├── step10-create-nodepool.sh
│ │ │ ├── step11-scale-cas.sh
│ │ │ ├── step12-scale-multiple-ng.sh
│ │ │ └── step12-scale-single-ng.sh
│ │ ├── reference/
│ │ │ ├── _index.md
│ │ │ ├── cloudformation.md
│ │ │ ├── instance-types.md
│ │ │ ├── metrics.md
│ │ │ ├── settings.md
│ │ │ └── threat-model.md
│ │ ├── tasks/
│ │ │ ├── _index.md
│ │ │ └── managing-amis.md
│ │ ├── troubleshooting.md
│ │ └── upgrading/
│ │ ├── _index.md
│ │ ├── compatibility.md
│ │ ├── get-controller-policy.sh
│ │ ├── upgrade-guide.md
│ │ ├── v1-migration.md
│ │ ├── v1beta1-controller-policy.json
│ │ └── v1beta1-migration.md
│ ├── v1.7/
│ │ ├── _index.md
│ │ ├── concepts/
│ │ │ ├── _index.md
│ │ │ ├── disruption.md
│ │ │ ├── nodeclaims.md
│ │ │ ├── nodeclasses.md
│ │ │ ├── nodeoverlays.md
│ │ │ ├── nodepools.md
│ │ │ └── scheduling.md
│ │ ├── contributing/
│ │ │ ├── _index.md
│ │ │ ├── community-meetings.md
│ │ │ ├── design-guide.md
│ │ │ ├── development-guide.md
│ │ │ └── documentation-updates.md
│ │ ├── faq.md
│ │ ├── getting-started/
│ │ │ ├── _index.md
│ │ │ ├── getting-started-with-karpenter/
│ │ │ │ ├── _index.md
│ │ │ │ ├── cloudformation.yaml
│ │ │ │ ├── grafana-values.yaml
│ │ │ │ ├── karpenter-capacity-dashboard.json
│ │ │ │ ├── karpenter-controllers-allocation.json
│ │ │ │ ├── karpenter-controllers.json
│ │ │ │ ├── karpenter-performance-dashboard.json
│ │ │ │ ├── prometheus-values.yaml
│ │ │ │ └── scripts/
│ │ │ │ ├── step01-config.sh
│ │ │ │ ├── step02-create-cluster-fargate.sh
│ │ │ │ ├── step02-create-cluster.sh
│ │ │ │ ├── step03-iam-cloud-formation.sh
│ │ │ │ ├── step04-grant-access.sh
│ │ │ │ ├── step05-controller-iam.sh
│ │ │ │ ├── step06-add-spot-role.sh
│ │ │ │ ├── step08-apply-helm-chart-fargate.sh
│ │ │ │ ├── step08-apply-helm-chart.sh
│ │ │ │ ├── step09-add-prometheus-grafana.sh
│ │ │ │ ├── step10-add-grafana-port-forward.sh
│ │ │ │ ├── step11-grafana-get-password.sh
│ │ │ │ ├── step12-add-nodepool.sh
│ │ │ │ ├── step13-automatic-node-provisioning.sh
│ │ │ │ ├── step14-deprovisioning.sh
│ │ │ │ ├── step15-apply-flowschemas.sh
│ │ │ │ ├── step16-delete-node.sh
│ │ │ │ └── step17-cleanup.sh
│ │ │ └── migrating-from-cas/
│ │ │ ├── _index.md
│ │ │ └── scripts/
│ │ │ ├── step01-env.sh
│ │ │ ├── step02-node-iam.sh
│ │ │ ├── step03-node-policies.sh
│ │ │ ├── step04-controller-iam.sh
│ │ │ ├── step05-tag-subnets.sh
│ │ │ ├── step06-tag-security-groups.sh
│ │ │ ├── step07-edit-aws-auth.sh
│ │ │ ├── step08-generate-chart.sh
│ │ │ ├── step09-deploy.sh
│ │ │ ├── step10-create-nodepool.sh
│ │ │ ├── step11-scale-cas.sh
│ │ │ ├── step12-scale-multiple-ng.sh
│ │ │ └── step12-scale-single-ng.sh
│ │ ├── reference/
│ │ │ ├── _index.md
│ │ │ ├── cloudformation.md
│ │ │ ├── instance-types.md
│ │ │ ├── metrics.md
│ │ │ ├── settings.md
│ │ │ └── threat-model.md
│ │ ├── tasks/
│ │ │ ├── _index.md
│ │ │ ├── managing-amis.md
│ │ │ └── odcrs.md
│ │ ├── troubleshooting.md
│ │ └── upgrading/
│ │ ├── _index.md
│ │ ├── compatibility.md
│ │ └── upgrade-guide.md
│ ├── v1.8/
│ │ ├── _index.md
│ │ ├── concepts/
│ │ │ ├── _index.md
│ │ │ ├── disruption.md
│ │ │ ├── nodeclaims.md
│ │ │ ├── nodeclasses.md
│ │ │ ├── nodeoverlays.md
│ │ │ ├── nodepools.md
│ │ │ └── scheduling.md
│ │ ├── contributing/
│ │ │ ├── _index.md
│ │ │ ├── community-meetings.md
│ │ │ ├── design-guide.md
│ │ │ ├── development-guide.md
│ │ │ └── documentation-updates.md
│ │ ├── faq.md
│ │ ├── getting-started/
│ │ │ ├── _index.md
│ │ │ ├── getting-started-with-karpenter/
│ │ │ │ ├── _index.md
│ │ │ │ ├── cloudformation.yaml
│ │ │ │ ├── grafana-values.yaml
│ │ │ │ ├── karpenter-capacity-dashboard.json
│ │ │ │ ├── karpenter-controllers-allocation.json
│ │ │ │ ├── karpenter-controllers.json
│ │ │ │ ├── karpenter-performance-dashboard.json
│ │ │ │ ├── prometheus-values.yaml
│ │ │ │ └── scripts/
│ │ │ │ ├── step01-config.sh
│ │ │ │ ├── step02-create-cluster-fargate.sh
│ │ │ │ ├── step02-create-cluster.sh
│ │ │ │ ├── step03-iam-cloud-formation.sh
│ │ │ │ ├── step04-grant-access.sh
│ │ │ │ ├── step05-controller-iam.sh
│ │ │ │ ├── step06-add-spot-role.sh
│ │ │ │ ├── step08-apply-helm-chart-fargate.sh
│ │ │ │ ├── step08-apply-helm-chart.sh
│ │ │ │ ├── step09-add-prometheus-grafana.sh
│ │ │ │ ├── step10-add-grafana-port-forward.sh
│ │ │ │ ├── step11-grafana-get-password.sh
│ │ │ │ ├── step12-add-nodepool.sh
│ │ │ │ ├── step13-automatic-node-provisioning.sh
│ │ │ │ ├── step14-deprovisioning.sh
│ │ │ │ ├── step15-apply-flowschemas.sh
│ │ │ │ ├── step16-delete-node.sh
│ │ │ │ └── step17-cleanup.sh
│ │ │ └── migrating-from-cas/
│ │ │ ├── _index.md
│ │ │ └── scripts/
│ │ │ ├── step01-env.sh
│ │ │ ├── step02-node-iam.sh
│ │ │ ├── step03-node-policies.sh
│ │ │ ├── step04-controller-iam.sh
│ │ │ ├── step05-tag-subnets.sh
│ │ │ ├── step06-tag-security-groups.sh
│ │ │ ├── step07-edit-aws-auth.sh
│ │ │ ├── step08-generate-chart.sh
│ │ │ ├── step09-deploy.sh
│ │ │ ├── step10-create-nodepool.sh
│ │ │ ├── step11-scale-cas.sh
│ │ │ ├── step12-scale-multiple-ng.sh
│ │ │ └── step12-scale-single-ng.sh
│ │ ├── reference/
│ │ │ ├── _index.md
│ │ │ ├── cloudformation.md
│ │ │ ├── instance-types.md
│ │ │ ├── metrics.md
│ │ │ ├── settings.md
│ │ │ └── threat-model.md
│ │ ├── tasks/
│ │ │ ├── _index.md
│ │ │ ├── managing-amis.md
│ │ │ └── odcrs.md
│ │ ├── troubleshooting.md
│ │ └── upgrading/
│ │ ├── _index.md
│ │ ├── compatibility.md
│ │ └── upgrade-guide.md
│ └── v1.9/
│ ├── _index.md
│ ├── concepts/
│ │ ├── _index.md
│ │ ├── disruption.md
│ │ ├── nodeclaims.md
│ │ ├── nodeclasses.md
│ │ ├── nodeoverlays.md
│ │ ├── nodepools.md
│ │ └── scheduling.md
│ ├── contributing/
│ │ ├── _index.md
│ │ ├── community-meetings.md
│ │ ├── design-guide.md
│ │ ├── development-guide.md
│ │ └── documentation-updates.md
│ ├── faq.md
│ ├── getting-started/
│ │ ├── _index.md
│ │ ├── getting-started-with-karpenter/
│ │ │ ├── _index.md
│ │ │ ├── cloudformation.yaml
│ │ │ ├── grafana-values.yaml
│ │ │ ├── karpenter-capacity-dashboard.json
│ │ │ ├── karpenter-controllers-allocation.json
│ │ │ ├── karpenter-controllers.json
│ │ │ ├── karpenter-performance-dashboard.json
│ │ │ ├── prometheus-values.yaml
│ │ │ └── scripts/
│ │ │ ├── step01-config.sh
│ │ │ ├── step02-create-cluster-fargate.sh
│ │ │ ├── step02-create-cluster.sh
│ │ │ ├── step03-iam-cloud-formation.sh
│ │ │ ├── step04-grant-access.sh
│ │ │ ├── step05-controller-iam.sh
│ │ │ ├── step06-add-spot-role.sh
│ │ │ ├── step08-apply-helm-chart-fargate.sh
│ │ │ ├── step08-apply-helm-chart.sh
│ │ │ ├── step09-add-prometheus-grafana.sh
│ │ │ ├── step10-add-grafana-port-forward.sh
│ │ │ ├── step11-grafana-get-password.sh
│ │ │ ├── step12-add-nodepool.sh
│ │ │ ├── step13-automatic-node-provisioning.sh
│ │ │ ├── step14-deprovisioning.sh
│ │ │ ├── step15-apply-flowschemas.sh
│ │ │ ├── step16-delete-node.sh
│ │ │ └── step17-cleanup.sh
│ │ └── migrating-from-cas/
│ │ ├── _index.md
│ │ └── scripts/
│ │ ├── step01-env.sh
│ │ ├── step02-node-iam.sh
│ │ ├── step03-node-policies.sh
│ │ ├── step04-controller-iam.sh
│ │ ├── step05-tag-subnets.sh
│ │ ├── step06-tag-security-groups.sh
│ │ ├── step07-edit-aws-auth.sh
│ │ ├── step08-generate-chart.sh
│ │ ├── step09-deploy.sh
│ │ ├── step10-create-nodepool.sh
│ │ ├── step11-scale-cas.sh
│ │ ├── step12-scale-multiple-ng.sh
│ │ └── step12-scale-single-ng.sh
│ ├── reference/
│ │ ├── _index.md
│ │ ├── cloudformation.md
│ │ ├── instance-types.md
│ │ ├── metrics.md
│ │ ├── settings.md
│ │ └── threat-model.md
│ ├── tasks/
│ │ ├── _index.md
│ │ ├── managing-amis.md
│ │ └── odcrs.md
│ ├── troubleshooting.md
│ └── upgrading/
│ ├── _index.md
│ ├── compatibility.md
│ └── upgrade-guide.md
├── go.mod
├── go.sum
├── hugo.yaml
├── layouts/
│ ├── 404.html
│ ├── partials/
│ │ ├── favicons.html
│ │ ├── footer.html
│ │ └── navbar-version-selector.html
│ ├── robots.txt
│ └── shortcodes/
│ ├── blocks/
│ │ └── feature.html
│ ├── github.html
│ ├── githubRelRef.html
│ └── script.html
├── netlify.toml
├── package.json
└── static/
├── _redirects
└── favicons/
└── browserconfig.xml
SYMBOL INDEX (1596 symbols across 215 files)
FILE: cmd/controller/main.go
function main (line 31) | func main() {
FILE: hack/code/bandwidth_gen/main.go
constant fileFormat (line 46) | fileFormat = `
function main (line 61) | func main() {
function containsAny (line 138) | func containsAny(value string, excludedSubstrings ...string) bool {
function getAllInstanceTypes (line 147) | func getAllInstanceTypes() []ec2types.InstanceType {
FILE: hack/code/instancetype_testdata_gen/main.go
constant packageHeader (line 36) | packageHeader = `
function init (line 55) | func init() {
function main (line 61) | func main() {
function getDescribeInstanceTypesOutput (line 91) | func getDescribeInstanceTypesOutput(ctx context.Context, ec2api sdk.EC2A...
function getDescribeInstanceTypeOfferingsOutput (line 122) | func getDescribeInstanceTypeOfferingsOutput() string {
function getInstanceTypeInfo (line 161) | func getInstanceTypeInfo(info ec2types.InstanceTypeInfo) string {
function getNetworkCardInfo (line 243) | func getNetworkCardInfo(info ec2types.NetworkCardInfo) string {
function getNeuronDeviceInfo (line 252) | func getNeuronDeviceInfo(info ec2types.NeuronDeviceInfo) string {
function getGPUDeviceInfo (line 269) | func getGPUDeviceInfo(info ec2types.GpuDeviceInfo) string {
function getStringSliceData (line 282) | func getStringSliceData[T ec2types.UsageClassType | ec2types.Virtualizat...
FILE: hack/code/prices_gen/main.go
function getAWSRegions (line 43) | func getAWSRegions(partition string) []string {
function getPartitionSuffix (line 56) | func getPartitionSuffix(partition string) string {
type Options (line 69) | type Options struct
function NewOptions (line 74) | func NewOptions() *Options {
function main (line 85) | func main() {
function writePricing (line 143) | func writePricing(src *bytes.Buffer, instanceNames []ec2types.InstanceTy...
function newline (line 185) | func newline(src *bytes.Buffer) {
FILE: hack/code/vpc_limits_gen/main.go
type Options (line 29) | type Options struct
function main (line 34) | func main() {
FILE: hack/docs/compatibilitymatrix_gen/main.go
function main (line 27) | func main() {
FILE: hack/docs/configuration_gen/main.go
function main (line 29) | func main() {
FILE: hack/docs/instancetypes_gen/main.go
type FakeManager (line 57) | type FakeManager struct
method GetClient (line 61) | func (m *FakeManager) GetClient() client.Client {
method GetConfig (line 65) | func (m *FakeManager) GetConfig() *rest.Config {
method GetFieldIndexer (line 69) | func (m *FakeManager) GetFieldIndexer() client.FieldIndexer {
method Elected (line 73) | func (m *FakeManager) Elected() <-chan struct{} {
type FakeFieldIndexer (line 77) | type FakeFieldIndexer struct
method IndexField (line 79) | func (f *FakeFieldIndexer) IndexField(_ context.Context, _ client.Obje...
function main (line 83) | func main() {
FILE: hack/docs/metrics_gen/main.go
type metricInfo (line 37) | type metricInfo struct
method qualifiedName (line 54) | func (i metricInfo) qualifiedName() string {
function main (line 61) | func main() {
function getPackages (line 147) | func getPackages(root string) []*ast.Package {
function getMetricsFromPackages (line 178) | func getMetricsFromPackages(packages ...*ast.Package) []metricInfo {
function bySubsystem (line 200) | func bySubsystem(metrics []metricInfo) func(i int, j int) bool {
function handleVariableDeclaration (line 226) | func handleVariableDeclaration(v *ast.GenDecl) []metricInfo {
function getFuncPackage (line 293) | func getFuncPackage(fun ast.Expr) string {
function getBinaryExpr (line 316) | func getBinaryExpr(b *ast.BinaryExpr) string {
function getIdentMapping (line 338) | func getIdentMapping(identName string) (string, error) {
FILE: hack/docs/parse-redirects/main.go
type RedirectRule (line 26) | type RedirectRule struct
function getAvailableKarpenterVersions (line 32) | func getAvailableKarpenterVersions() []string {
function getRule (line 49) | func getRule(source string, target string, versions []string) []Redirect...
function main (line 76) | func main() {
FILE: hack/docs/version_compatibility_gen/main.go
function main (line 26) | func main() {
FILE: hack/tools/allocatable_diff/main.go
function init (line 45) | func init() {
function main (line 52) | func main() {
FILE: hack/tools/launchtemplate_counter/main.go
function main (line 45) | func main() {
FILE: kwok/cloudprovider/cloudprovider.go
type CloudProvider (line 32) | type CloudProvider struct
method Create (line 60) | func (c *CloudProvider) Create(ctx context.Context, nodeClaim *karpv1....
method List (line 69) | func (c *CloudProvider) List(ctx context.Context) ([]*karpv1.NodeClaim...
method Get (line 80) | func (c *CloudProvider) Get(ctx context.Context, providerID string) (*...
function New (line 36) | func New(
FILE: kwok/ec2/ec2.go
type Client (line 56) | type Client struct
method ReadBackup (line 118) | func (c *Client) ReadBackup(ctx context.Context) {
method backupInstances (line 151) | func (c *Client) backupInstances(ctx context.Context) error {
method StartBackupThread (line 238) | func (c *Client) StartBackupThread(ctx context.Context) {
method StartKillNodeThread (line 254) | func (c *Client) StartKillNodeThread(ctx context.Context) {
method DescribeLaunchTemplates (line 298) | func (c *Client) DescribeLaunchTemplates(_ context.Context, input *ec2...
method CreateFleet (line 395) | func (c *Client) CreateFleet(ctx context.Context, input *ec2.CreateFle...
method TerminateInstances (line 641) | func (c *Client) TerminateInstances(_ context.Context, input *ec2.Term...
method DescribeInstances (line 680) | func (c *Client) DescribeInstances(_ context.Context, input *ec2.Descr...
method RunInstances (line 731) | func (c *Client) RunInstances(_ context.Context, input *ec2.RunInstanc...
method CreateTags (line 752) | func (c *Client) CreateTags(_ context.Context, input *ec2.CreateTagsIn...
method CreateLaunchTemplate (line 811) | func (c *Client) CreateLaunchTemplate(_ context.Context, input *ec2.Cr...
method DeleteLaunchTemplate (line 844) | func (c *Client) DeleteLaunchTemplate(_ context.Context, input *ec2.De...
method toNode (line 885) | func (c *Client) toNode(ctx context.Context, instance ec2types.Instanc...
function NewClient (line 77) | func NewClient(region, namespace string, ec2Client *ec2.Client, rateLimi...
function removeNullFields (line 284) | func removeNullFields(bytes []byte) []byte {
FILE: kwok/ec2/ratelimiting.go
type RateLimiterProvider (line 21) | type RateLimiterProvider interface
type NopRateLimiter (line 32) | type NopRateLimiter struct
method TryAccept (line 34) | func (*NopRateLimiter) TryAccept() bool {
method Stop (line 38) | func (*NopRateLimiter) Stop() {}
method QPS (line 40) | func (*NopRateLimiter) QPS() float32 {
type NopRateLimiterProvider (line 44) | type NopRateLimiterProvider struct
method DescribeLaunchTemplates (line 54) | func (p NopRateLimiterProvider) DescribeLaunchTemplates() flowcontrol....
method CreateFleet (line 58) | func (p NopRateLimiterProvider) CreateFleet() flowcontrol.PassiveRateL...
method TerminateInstances (line 62) | func (p NopRateLimiterProvider) TerminateInstances() flowcontrol.Passi...
method DescribeInstances (line 66) | func (p NopRateLimiterProvider) DescribeInstances() flowcontrol.Passiv...
method RunInstances (line 70) | func (p NopRateLimiterProvider) RunInstances() flowcontrol.PassiveRate...
method CreateTags (line 74) | func (p NopRateLimiterProvider) CreateTags() flowcontrol.PassiveRateLi...
method CreateLaunchTemplate (line 78) | func (p NopRateLimiterProvider) CreateLaunchTemplate() flowcontrol.Pas...
method DeleteLaunchTemplate (line 82) | func (p NopRateLimiterProvider) DeleteLaunchTemplate() flowcontrol.Pas...
function NewNopRateLimiterProvider (line 48) | func NewNopRateLimiterProvider() *NopRateLimiterProvider {
type DefaultRateLimiterProvider (line 86) | type DefaultRateLimiterProvider struct
method DescribeLaunchTemplates (line 106) | func (p *DefaultRateLimiterProvider) DescribeLaunchTemplates() flowcon...
method CreateFleet (line 110) | func (p *DefaultRateLimiterProvider) CreateFleet() flowcontrol.Passive...
method TerminateInstances (line 114) | func (p *DefaultRateLimiterProvider) TerminateInstances() flowcontrol....
method DescribeInstances (line 118) | func (p *DefaultRateLimiterProvider) DescribeInstances() flowcontrol.P...
method RunInstances (line 122) | func (p *DefaultRateLimiterProvider) RunInstances() flowcontrol.Passiv...
method CreateTags (line 126) | func (p *DefaultRateLimiterProvider) CreateTags() flowcontrol.PassiveR...
method CreateLaunchTemplate (line 130) | func (p *DefaultRateLimiterProvider) CreateLaunchTemplate() flowcontro...
method DeleteLaunchTemplate (line 134) | func (p *DefaultRateLimiterProvider) DeleteLaunchTemplate() flowcontro...
function NewDefaultRateLimiterProvider (line 95) | func NewDefaultRateLimiterProvider() *DefaultRateLimiterProvider {
FILE: kwok/main.go
function main (line 32) | func main() {
FILE: kwok/operator/operator.go
function init (line 72) | func init() {
type Operator (line 77) | type Operator struct
function NewOperator (line 99) | func NewOperator(ctx context.Context, operator *operator.Operator) (cont...
function WithUserAgent (line 223) | func WithUserAgent(cfg aws.Config) aws.Config {
function CheckEC2Connectivity (line 233) | func CheckEC2Connectivity(ctx context.Context, api sdk.EC2API) error {
function ResolveClusterEndpoint (line 244) | func ResolveClusterEndpoint(ctx context.Context, eksAPI sdk.EKSAPI) (str...
function GetCABundle (line 258) | func GetCABundle(ctx context.Context, restConfig *rest.Config) (*string,...
function KubeDNSIP (line 277) | func KubeDNSIP(ctx context.Context, kubernetesInterface kubernetes.Inter...
function SetupIndexers (line 292) | func SetupIndexers(ctx context.Context, mgr manager.Manager) {
FILE: kwok/strategy/strategy.go
type Strategy (line 28) | type Strategy interface
type LowestPrice (line 32) | type LowestPrice struct
method GetScore (line 45) | func (p *LowestPrice) GetScore(instanceType, capacityType, availabilit...
function NewLowestPrice (line 36) | func NewLowestPrice(pricingAPI sdk.PricingAPI, ec2API sdk.EC2API, region...
FILE: pkg/apis/v1/doc.go
function init (line 30) | func init() {
FILE: pkg/apis/v1/ec2nodeclass.go
type EC2NodeClassSpec (line 32) | type EC2NodeClassSpec struct
type SubnetSelectorTerm (line 150) | type SubnetSelectorTerm struct
type SecurityGroupSelectorTerm (line 165) | type SecurityGroupSelectorTerm struct
type CapacityReservationSelectorTerm (line 181) | type CapacityReservationSelectorTerm struct
type AMISelectorTerm (line 204) | type AMISelectorTerm struct
type KubeletConfiguration (line 245) | type KubeletConfiguration struct
type MetadataOptions (line 311) | type MetadataOptions struct
type BlockDeviceMapping (line 359) | type BlockDeviceMapping struct
type BlockDevice (line 374) | type BlockDevice struct
type InstanceStorePolicy (line 451) | type InstanceStorePolicy
constant InstanceStorePolicyRAID0 (line 458) | InstanceStorePolicyRAID0 InstanceStorePolicy = "RAID0"
type EC2NodeClass (line 469) | type EC2NodeClass struct
method Hash (line 491) | func (in *EC2NodeClass) Hash() string {
method LegacyInstanceProfileName (line 505) | func (in *EC2NodeClass) LegacyInstanceProfileName(clusterName, region ...
method InstanceProfileName (line 509) | func (in *EC2NodeClass) InstanceProfileName(clusterName, region string...
method InstanceProfileRole (line 513) | func (in *EC2NodeClass) InstanceProfileRole() string {
method InstanceProfileTags (line 517) | func (in *EC2NodeClass) InstanceProfileTags(clusterName string, region...
method BlockDeviceMappings (line 526) | func (in *EC2NodeClass) BlockDeviceMappings() []*BlockDeviceMapping {
method InstanceStorePolicy (line 530) | func (in *EC2NodeClass) InstanceStorePolicy() *InstanceStorePolicy {
method KubeletConfiguration (line 534) | func (in *EC2NodeClass) KubeletConfiguration() *KubeletConfiguration {
method AMIFamily (line 543) | func (in *EC2NodeClass) AMIFamily() string {
method Alias (line 567) | func (in *EC2NodeClass) Alias() *Alias {
constant EC2NodeClassHashVersion (line 489) | EC2NodeClassHashVersion = "v4"
type Alias (line 554) | type Alias struct
method String (line 563) | func (a *Alias) String() string {
constant AliasVersionLatest (line 560) | AliasVersionLatest = "latest"
function amiFamilyFromAlias (line 580) | func amiFamilyFromAlias(alias string) string {
function amiVersionFromAlias (line 601) | func amiVersionFromAlias(alias string) string {
type EC2NodeClassList (line 611) | type EC2NodeClassList struct
FILE: pkg/apis/v1/ec2nodeclass_defaults.go
method SetDefaults (line 22) | func (in *EC2NodeClass) SetDefaults(_ context.Context) {}
FILE: pkg/apis/v1/ec2nodeclass_status.go
constant ConditionTypeSubnetsReady (line 35) | ConditionTypeSubnetsReady = "SubnetsReady"
constant ConditionTypeSecurityGroupsReady (line 36) | ConditionTypeSecurityGroupsReady = "SecurityGroupsReady"
constant ConditionTypeAMIsReady (line 37) | ConditionTypeAMIsReady = "AMIsReady"
constant ConditionTypeInstanceProfileReady (line 38) | ConditionTypeInstanceProfileReady = "InstanceProfileReady"
constant ConditionTypeCapacityReservationsReady (line 39) | ConditionTypeCapacityReservationsReady = "CapacityReservationsReady"
constant ConditionTypeValidationSucceeded (line 40) | ConditionTypeValidationSucceeded = "ValidationSucceeded"
type Subnet (line 44) | type Subnet struct
type SecurityGroup (line 57) | type SecurityGroup struct
type AMI (line 67) | type AMI struct
type CapacityReservation (line 82) | type CapacityReservation struct
type CapacityReservationType (line 121) | type CapacityReservationType
method Values (line 128) | func (CapacityReservationType) Values() []CapacityReservationType {
constant CapacityReservationTypeDefault (line 124) | CapacityReservationTypeDefault CapacityReservationType = "default"
constant CapacityReservationTypeCapacityBlock (line 125) | CapacityReservationTypeCapacityBlock CapacityReservationType = "capacity...
type CapacityReservationState (line 135) | type CapacityReservationState
constant CapacityReservationStateActive (line 138) | CapacityReservationStateActive CapacityReservationState = "active"
constant CapacityReservationStateExpiring (line 139) | CapacityReservationStateExpiring CapacityReservationState = "expiring"
type EC2NodeClassStatus (line 143) | type EC2NodeClassStatus struct
method StatusConditions (line 168) | func (in *EC2NodeClass) StatusConditions() status.ConditionSet {
method GetConditions (line 182) | func (in *EC2NodeClass) GetConditions() []status.Condition {
method SetConditions (line 186) | func (in *EC2NodeClass) SetConditions(conditions []status.Condition) {
method AMIs (line 190) | func (in *EC2NodeClass) AMIs() []AMI {
method CapacityReservations (line 194) | func (in *EC2NodeClass) CapacityReservations() []CapacityReservation {
type ZoneInfo (line 198) | type ZoneInfo struct
method ZoneInfo (line 203) | func (in *EC2NodeClass) ZoneInfo() []ZoneInfo {
function CapacityReservationTypeFromEC2 (line 212) | func CapacityReservationTypeFromEC2(capacityReservationType ec2types.Cap...
function CapacityReservationFromEC2 (line 228) | func CapacityReservationFromEC2(clk clock.Clock, cr *ec2types.CapacityRe...
FILE: pkg/apis/v1/labels.go
function init (line 31) | func init() {
FILE: pkg/apis/v1/suite_test.go
function TestAPIs (line 40) | func TestAPIs(t *testing.T) {
FILE: pkg/apis/v1/zz_generated.deepcopy.go
method DeepCopyInto (line 29) | func (in *AMI) DeepCopyInto(out *AMI) {
method DeepCopy (line 41) | func (in *AMI) DeepCopy() *AMI {
method DeepCopyInto (line 51) | func (in *AMISelectorTerm) DeepCopyInto(out *AMISelectorTerm) {
method DeepCopy (line 63) | func (in *AMISelectorTerm) DeepCopy() *AMISelectorTerm {
method DeepCopyInto (line 73) | func (in *Alias) DeepCopyInto(out *Alias) {
method DeepCopy (line 78) | func (in *Alias) DeepCopy() *Alias {
method DeepCopyInto (line 88) | func (in *BlockDevice) DeepCopyInto(out *BlockDevice) {
method DeepCopy (line 138) | func (in *BlockDevice) DeepCopy() *BlockDevice {
method DeepCopyInto (line 148) | func (in *BlockDeviceMapping) DeepCopyInto(out *BlockDeviceMapping) {
method DeepCopy (line 163) | func (in *BlockDeviceMapping) DeepCopy() *BlockDeviceMapping {
method DeepCopyInto (line 173) | func (in *CapacityReservation) DeepCopyInto(out *CapacityReservation) {
method DeepCopy (line 182) | func (in *CapacityReservation) DeepCopy() *CapacityReservation {
method DeepCopyInto (line 192) | func (in *CapacityReservationSelectorTerm) DeepCopyInto(out *CapacityRes...
method DeepCopy (line 204) | func (in *CapacityReservationSelectorTerm) DeepCopy() *CapacityReservati...
method DeepCopyInto (line 214) | func (in *EC2NodeClass) DeepCopyInto(out *EC2NodeClass) {
method DeepCopy (line 223) | func (in *EC2NodeClass) DeepCopy() *EC2NodeClass {
method DeepCopyObject (line 233) | func (in *EC2NodeClass) DeepCopyObject() runtime.Object {
method DeepCopyInto (line 241) | func (in *EC2NodeClassList) DeepCopyInto(out *EC2NodeClassList) {
method DeepCopy (line 255) | func (in *EC2NodeClassList) DeepCopy() *EC2NodeClassList {
method DeepCopyObject (line 265) | func (in *EC2NodeClassList) DeepCopyObject() runtime.Object {
method DeepCopyInto (line 273) | func (in *EC2NodeClassSpec) DeepCopyInto(out *EC2NodeClassSpec) {
method DeepCopy (line 374) | func (in *EC2NodeClassSpec) DeepCopy() *EC2NodeClassSpec {
method DeepCopyInto (line 384) | func (in *EC2NodeClassStatus) DeepCopyInto(out *EC2NodeClassStatus) {
method DeepCopy (line 420) | func (in *EC2NodeClassStatus) DeepCopy() *EC2NodeClassStatus {
method DeepCopyInto (line 430) | func (in *KubeletConfiguration) DeepCopyInto(out *KubeletConfiguration) {
method DeepCopy (line 505) | func (in *KubeletConfiguration) DeepCopy() *KubeletConfiguration {
method DeepCopyInto (line 515) | func (in *MetadataOptions) DeepCopyInto(out *MetadataOptions) {
method DeepCopy (line 540) | func (in *MetadataOptions) DeepCopy() *MetadataOptions {
method DeepCopyInto (line 550) | func (in *SecurityGroup) DeepCopyInto(out *SecurityGroup) {
method DeepCopy (line 555) | func (in *SecurityGroup) DeepCopy() *SecurityGroup {
method DeepCopyInto (line 565) | func (in *SecurityGroupSelectorTerm) DeepCopyInto(out *SecurityGroupSele...
method DeepCopy (line 577) | func (in *SecurityGroupSelectorTerm) DeepCopy() *SecurityGroupSelectorTe...
method DeepCopyInto (line 587) | func (in *Subnet) DeepCopyInto(out *Subnet) {
method DeepCopy (line 592) | func (in *Subnet) DeepCopy() *Subnet {
method DeepCopyInto (line 602) | func (in *SubnetSelectorTerm) DeepCopyInto(out *SubnetSelectorTerm) {
method DeepCopy (line 614) | func (in *SubnetSelectorTerm) DeepCopy() *SubnetSelectorTerm {
method DeepCopyInto (line 624) | func (in *ZoneInfo) DeepCopyInto(out *ZoneInfo) {
method DeepCopy (line 629) | func (in *ZoneInfo) DeepCopy() *ZoneInfo {
FILE: pkg/aws/sdk.go
type EC2API (line 29) | type EC2API interface
type IAMAPI (line 47) | type IAMAPI interface
type EKSAPI (line 57) | type EKSAPI interface
type PricingAPI (line 61) | type PricingAPI interface
type SSMAPI (line 65) | type SSMAPI interface
type SQSAPI (line 69) | type SQSAPI interface
type TimestreamWriteAPI (line 75) | type TimestreamWriteAPI interface
FILE: pkg/batcher/batcher.go
type Options (line 32) | type Options struct
type Result (line 43) | type Result struct
type request (line 52) | type request struct
type Batcher (line 60) | type Batcher struct
type BatchExecutor (line 78) | type BatchExecutor
type RequestHasher (line 81) | type RequestHasher
function NewBatcher (line 84) | func NewBatcher[T input, U output](ctx context.Context, options Options[...
method Add (line 100) | func (b *Batcher[T, U]) Add(ctx context.Context, input *T) Result[U] {
function DefaultHasher (line 118) | func DefaultHasher[T input](_ context.Context, input *T) uint64 {
function OneBucketHasher (line 127) | func OneBucketHasher[T input](_ context.Context, _ *T) uint64 {
method run (line 131) | func (b *Batcher[T, U]) run() {
method waitForIdle (line 162) | func (b *Batcher[T, U]) waitForIdle() {
method runCalls (line 184) | func (b *Batcher[T, U]) runCalls(requests []*request[T, U]) {
FILE: pkg/batcher/createfleet.go
type CreateFleetBatcher (line 32) | type CreateFleetBatcher struct
method CreateFleet (line 47) | func (b *CreateFleetBatcher) CreateFleet(ctx context.Context, createFl...
function NewCreateFleetBatcher (line 36) | func NewCreateFleetBatcher(ctx context.Context, ec2api sdk.EC2API) *Crea...
function execCreateFleetBatch (line 55) | func execCreateFleetBatch(ec2api sdk.EC2API) BatchExecutor[ec2.CreateFle...
FILE: pkg/batcher/describeinstances.go
type DescribeInstancesBatcher (line 34) | type DescribeInstancesBatcher struct
method DescribeInstances (line 50) | func (b *DescribeInstancesBatcher) DescribeInstances(ctx context.Conte...
function NewDescribeInstancesBatcher (line 38) | func NewDescribeInstancesBatcher(ctx context.Context, ec2api sdk.EC2API)...
function FilterHasher (line 58) | func FilterHasher(ctx context.Context, input *ec2.DescribeInstancesInput...
function execDescribeInstancesBatch (line 66) | func execDescribeInstancesBatch(ec2api sdk.EC2API) BatchExecutor[ec2.Des...
function prepareAggregatedInput (line 129) | func prepareAggregatedInput(inputs []*ec2.DescribeInstancesInput) *ec2.D...
FILE: pkg/batcher/ec2api.go
type EC2API (line 23) | type EC2API struct
function EC2 (line 29) | func EC2(ctx context.Context, ec2api sdk.EC2API) *EC2API {
FILE: pkg/batcher/metrics.go
constant batcherSubsystem (line 26) | batcherSubsystem = "cloudprovider_batcher"
constant batcherNameLabel (line 27) | batcherNameLabel = "batcher"
function SizeBuckets (line 32) | func SizeBuckets() []float64 {
FILE: pkg/batcher/suite_test.go
function TestAWS (line 39) | func TestAWS(t *testing.T) {
type FakeBatcher (line 133) | type FakeBatcher struct
function NewFakeBatcher (line 139) | func NewFakeBatcher(ctx context.Context, requestLength time.Duration, ma...
FILE: pkg/batcher/terminateinstances.go
type TerminateInstancesBatcher (line 33) | type TerminateInstancesBatcher struct
method TerminateInstances (line 49) | func (b *TerminateInstancesBatcher) TerminateInstances(ctx context.Con...
function NewTerminateInstancesBatcher (line 37) | func NewTerminateInstancesBatcher(ctx context.Context, ec2api sdk.EC2API...
function execTerminateInstancesBatch (line 57) | func execTerminateInstancesBatch(ec2api sdk.EC2API) BatchExecutor[ec2.Te...
FILE: pkg/cache/cache.go
constant DefaultTTL (line 26) | DefaultTTL = time.Minute
constant UnavailableOfferingsTTL (line 29) | UnavailableOfferingsTTL = 3 * time.Minute
constant CapacityReservationAvailabilityTTL (line 33) | CapacityReservationAvailabilityTTL = 24 * time.Hour
constant InstanceTypesZonesAndOfferingsTTL (line 35) | InstanceTypesZonesAndOfferingsTTL = 5 * time.Minute
constant InstanceProfileTTL (line 37) | InstanceProfileTTL = 15 * time.Minute
constant AvailableIPAddressTTL (line 39) | AvailableIPAddressTTL = 5 * time.Minute
constant AssociatePublicIPAddressTTL (line 41) | AssociatePublicIPAddressTTL = 5 * time.Minute
constant SSMCacheTTL (line 44) | SSMCacheTTL = 24 * time.Hour
constant DiscoveredCapacityCacheTTL (line 47) | DiscoveredCapacityCacheTTL = 60 * 24 * time.Hour
constant ValidationTTL (line 49) | ValidationTTL = 30 * time.Minute
constant RecreationTTL (line 51) | RecreationTTL = 1 * time.Minute
constant ProtectedProfilesTTL (line 53) | ProtectedProfilesTTL = 1 * time.Hour
constant DefaultCleanupInterval (line 58) | DefaultCleanupInterval = time.Minute
constant UnavailableOfferingsCleanupInterval (line 62) | UnavailableOfferingsCleanupInterval = time.Second * 10
FILE: pkg/cache/suite_test.go
function TestAWS (line 33) | func TestAWS(t *testing.T) {
FILE: pkg/cache/unavailableofferings.go
type UnavailableOfferings (line 33) | type UnavailableOfferings struct
method SeqNum (line 74) | func (u *UnavailableOfferings) SeqNum(instanceType ec2types.InstanceTy...
method IsUnavailable (line 83) | func (u *UnavailableOfferings) IsUnavailable(instanceType ec2types.Ins...
method MarkUnavailable (line 91) | func (u *UnavailableOfferings) MarkUnavailable(ctx context.Context, in...
method MarkCapacityTypeUnavailable (line 113) | func (u *UnavailableOfferings) MarkCapacityTypeUnavailable(capacityTyp...
method MarkAZUnavailable (line 118) | func (u *UnavailableOfferings) MarkAZUnavailable(zone string) {
method Delete (line 123) | func (u *UnavailableOfferings) Delete(instanceType ec2types.InstanceTy...
method Flush (line 127) | func (u *UnavailableOfferings) Flush() {
method key (line 134) | func (u *UnavailableOfferings) key(instanceType ec2types.InstanceType,...
function NewUnavailableOfferings (line 46) | func NewUnavailableOfferings() *UnavailableOfferings {
FILE: pkg/cloudprovider/cloudprovider.go
type CloudProvider (line 60) | type CloudProvider struct
method Create (line 97) | func (c *CloudProvider) Create(ctx context.Context, nodeClaim *karpv1....
method List (line 157) | func (c *CloudProvider) List(ctx context.Context) ([]*karpv1.NodeClaim...
method Get (line 177) | func (c *CloudProvider) Get(ctx context.Context, providerID string) (*...
method GetInstanceTypes (line 199) | func (c *CloudProvider) GetInstanceTypes(ctx context.Context, nodePool...
method getInstanceType (line 218) | func (c *CloudProvider) getInstanceType(ctx context.Context, nodePool ...
method Delete (line 242) | func (c *CloudProvider) Delete(ctx context.Context, nodeClaim *karpv1....
method DisruptionReasons (line 255) | func (c *CloudProvider) DisruptionReasons() []karpv1.DisruptionReason {
method IsDrifted (line 259) | func (c *CloudProvider) IsDrifted(ctx context.Context, nodeClaim *karp...
method Name (line 289) | func (c *CloudProvider) Name() string {
method GetSupportedNodeClasses (line 293) | func (c *CloudProvider) GetSupportedNodeClasses() []status.Object {
method RepairPolicies (line 297) | func (c *CloudProvider) RepairPolicies() []cloudprovider.RepairPolicy {
method resolveNodeClassFromNodeClaim (line 340) | func (c *CloudProvider) resolveNodeClassFromNodeClaim(ctx context.Cont...
method resolveNodeClassFromNodePool (line 354) | func (c *CloudProvider) resolveNodeClassFromNodePool(ctx context.Conte...
method resolveInstanceTypeFromInstance (line 367) | func (c *CloudProvider) resolveInstanceTypeFromInstance(ctx context.Co...
method resolveNodeClassFromInstance (line 381) | func (c *CloudProvider) resolveNodeClassFromInstance(ctx context.Conte...
method resolveNodePoolFromInstance (line 398) | func (c *CloudProvider) resolveNodePoolFromInstance(ctx context.Contex...
method instanceToNodeClaim (line 410) | func (c *CloudProvider) instanceToNodeClaim(i *instance.Instance, inst...
function New (line 72) | func New(
function newTerminatingNodeClassError (line 479) | func newTerminatingNodeClassError(name string) *errors.StatusError {
FILE: pkg/cloudprovider/drift.go
constant AMIDrift (line 36) | AMIDrift cloudprovider.DriftReason = "AMIDrift"
constant SubnetDrift (line 37) | SubnetDrift cloudprovider.DriftReason = "SubnetDrift"
constant SecurityGroupDrift (line 38) | SecurityGroupDrift cloudprovider.DriftReason = "SecurityGroupDrift"
constant CapacityReservationDrift (line 39) | CapacityReservationDrift cloudprovider.DriftReason = "CapacityReservatio...
constant NodeClassDrift (line 40) | NodeClassDrift cloudprovider.DriftReason = "NodeClassDrift"
method isNodeClassDrifted (line 43) | func (c *CloudProvider) isNodeClassDrifted(ctx context.Context, nodeClai...
method isAMIDrifted (line 78) | func (c *CloudProvider) isAMIDrifted(ctx context.Context, nodeClaim *kar...
method isSubnetDrifted (line 106) | func (c *CloudProvider) isSubnetDrifted(instance *instance.Instance, nod...
method areSecurityGroupsDrifted (line 124) | func (c *CloudProvider) areSecurityGroupsDrifted(ec2Instance *instance.I...
method isCapacityReservationDrifted (line 141) | func (c *CloudProvider) isCapacityReservationDrifted(instance *instance....
method areStaticFieldsDrifted (line 149) | func (c *CloudProvider) areStaticFieldsDrifted(nodeClaim *karpv1.NodeCla...
method getInstance (line 165) | func (c *CloudProvider) getInstance(ctx context.Context, providerID stri...
FILE: pkg/cloudprovider/events/events.go
function NodePoolFailedToResolveNodeClass (line 24) | func NodePoolFailedToResolveNodeClass(nodePool *v1.NodePool) events.Event {
function NodeClaimFailedToResolveNodeClass (line 33) | func NodeClaimFailedToResolveNodeClass(nodeClaim *v1.NodeClaim) events.E...
FILE: pkg/cloudprovider/suite_test.go
function TestAWS (line 76) | func TestAWS(t *testing.T) {
FILE: pkg/controllers/capacityreservation/capacitytype/controller.go
type Controller (line 40) | type Controller struct
method Name (line 52) | func (*Controller) Name() string {
method Register (line 56) | func (c *Controller) Register(_ context.Context, m manager.Manager) er...
method Reconcile (line 63) | func (c *Controller) Reconcile(ctx context.Context) (reconciler.Result...
method syncCapacityType (line 109) | func (c *Controller) syncCapacityType(ctx context.Context, capacityTyp...
function NewController (line 45) | func NewController(kubeClient client.Client, cp cloudprovider.CloudProvi...
FILE: pkg/controllers/capacityreservation/capacitytype/suite_test.go
function TestAWS (line 56) | func TestAWS(t *testing.T) {
FILE: pkg/controllers/capacityreservation/expiration/controller.go
type Controller (line 50) | type Controller struct
method Name (line 71) | func (c *Controller) Name() string {
method Reconcile (line 75) | func (c *Controller) Reconcile(ctx context.Context) (reconciler.Result...
method Register (line 130) | func (c *Controller) Register(_ context.Context, m manager.Manager) er...
function NewController (line 57) | func NewController(
FILE: pkg/controllers/capacityreservation/expiration/suite_test.go
function TestAWS (line 56) | func TestAWS(t *testing.T) {
function withReservationType (line 163) | func withReservationType(crt ec2types.CapacityReservationType) mockCapac...
function withEndTime (line 169) | func withEndTime(t time.Time) mockCapacityReservationOpts {
function withInterruptible (line 175) | func withInterruptible(interruptible bool) mockCapacityReservationOpts {
function makeCapacityReservation (line 181) | func makeCapacityReservation(id string, opts ...mockCapacityReservationO...
FILE: pkg/controllers/controllers.go
function NewControllers (line 66) | func NewControllers(
FILE: pkg/controllers/interruption/controller.go
type Action (line 54) | type Action
constant CordonAndDrain (line 57) | CordonAndDrain Action = "CordonAndDrain"
constant NoAction (line 58) | NoAction Action = "NoAction"
type Controller (line 64) | type Controller struct
method Reconcile (line 101) | func (c *Controller) Reconcile(ctx context.Context) (reconciler.Result...
method Register (line 144) | func (c *Controller) Register(_ context.Context, m manager.Manager) er...
method parseMessage (line 152) | func (c *Controller) parseMessage(raw *sqstypes.Message) (messages.Mes...
method handleMessage (line 165) | func (c *Controller) handleMessage(ctx context.Context, msg messages.M...
method deleteMessage (line 204) | func (c *Controller) deleteMessage(ctx context.Context, msg *sqstypes....
method handleNodeClaim (line 213) | func (c *Controller) handleNodeClaim(ctx context.Context, msg messages...
method deleteNodeClaim (line 250) | func (c *Controller) deleteNodeClaim(ctx context.Context, msg messages...
method notifyForMessage (line 268) | func (c *Controller) notifyForMessage(msg messages.Message, nodeClaim ...
function NewController (line 77) | func NewController(
function actionForMessage (line 292) | func actionForMessage(msg messages.Message) Action {
FILE: pkg/controllers/interruption/events/events.go
function SpotInterrupted (line 24) | func SpotInterrupted(node *corev1.Node, nodeClaim *karpv1.NodeClaim) (ev...
function CapacityReservationInstanceInterrupted (line 44) | func CapacityReservationInstanceInterrupted(node *corev1.Node, nodeClaim...
function RebalanceRecommendation (line 64) | func RebalanceRecommendation(node *corev1.Node, nodeClaim *karpv1.NodeCl...
function Stopping (line 84) | func Stopping(node *corev1.Node, nodeClaim *karpv1.NodeClaim) (evts []ev...
function Terminating (line 104) | func Terminating(node *corev1.Node, nodeClaim *karpv1.NodeClaim) (evts [...
function Unhealthy (line 124) | func Unhealthy(node *corev1.Node, nodeClaim *karpv1.NodeClaim) (evts []e...
function TerminatingOnInterruption (line 144) | func TerminatingOnInterruption(node *corev1.Node, nodeClaim *karpv1.Node...
FILE: pkg/controllers/interruption/interruption_benchmark_test.go
function BenchmarkNotification15000 (line 58) | func BenchmarkNotification15000(b *testing.B) {
function BenchmarkNotification5000 (line 62) | func BenchmarkNotification5000(b *testing.B) {
function BenchmarkNotification1000 (line 66) | func BenchmarkNotification1000(b *testing.B) {
function BenchmarkNotification100 (line 70) | func BenchmarkNotification100(b *testing.B) {
function benchmarkNotificationController (line 75) | func benchmarkNotificationController(b *testing.B, messageCount int) {
type providerSet (line 160) | type providerSet struct
method makeInfrastructure (line 177) | func (p *providerSet) makeInfrastructure(ctx context.Context) (string,...
method cleanupInfrastructure (line 190) | func (p *providerSet) cleanupInfrastructure(queueURL string) error {
method provisionMessages (line 199) | func (p *providerSet) provisionMessages(ctx context.Context, messages ...
method monitorMessagesProcessed (line 208) | func (p *providerSet) monitorMessagesProcessed(ctx context.Context, ev...
function newProviders (line 166) | func newProviders(ctx context.Context, kubeClient client.Client) provide...
function provisionNodes (line 226) | func provisionNodes(ctx context.Context, kubeClient client.Client, nodes...
function makeDiverseMessagesAndNodes (line 238) | func makeDiverseMessagesAndNodes(count int) ([]any, []*corev1.Node) {
function makeScheduledChangeMessagesAndNodes (line 259) | func makeScheduledChangeMessagesAndNodes(count int) ([]any, []*corev1.No...
function makeStateChangeMessagesAndNodes (line 277) | func makeStateChangeMessagesAndNodes(count int, states []string) ([]any,...
function makeSpotInterruptionMessagesAndNodes (line 296) | func makeSpotInterruptionMessagesAndNodes(count int) ([]any, []*corev1.N...
FILE: pkg/controllers/interruption/messages/capacityreservationinterruption/model.go
type Message (line 23) | type Message struct
method EC2InstanceIDs (line 34) | func (m Message) EC2InstanceIDs() []string {
method Kind (line 38) | func (Message) Kind() messages.Kind {
type Detail (line 29) | type Detail struct
FILE: pkg/controllers/interruption/messages/capacityreservationinterruption/parser.go
type Parser (line 24) | type Parser struct
method Parse (line 26) | func (p Parser) Parse(raw string) (messages.Message, error) {
method Version (line 34) | func (p Parser) Version() string {
method Source (line 38) | func (p Parser) Source() string {
method DetailType (line 42) | func (p Parser) DetailType() string {
FILE: pkg/controllers/interruption/messages/noop/model.go
type Message (line 21) | type Message struct
method EC2InstanceIDs (line 25) | func (Message) EC2InstanceIDs() []string {
method Kind (line 29) | func (Message) Kind() messages.Kind {
FILE: pkg/controllers/interruption/messages/rebalancerecommendation/model.go
type Message (line 23) | type Message struct
method EC2InstanceIDs (line 33) | func (m Message) EC2InstanceIDs() []string {
method Kind (line 37) | func (Message) Kind() messages.Kind {
type Detail (line 29) | type Detail struct
FILE: pkg/controllers/interruption/messages/rebalancerecommendation/parser.go
type Parser (line 24) | type Parser struct
method Parse (line 26) | func (p Parser) Parse(raw string) (messages.Message, error) {
method Version (line 34) | func (p Parser) Version() string {
method Source (line 38) | func (p Parser) Source() string {
method DetailType (line 42) | func (p Parser) DetailType() string {
FILE: pkg/controllers/interruption/messages/scheduledchange/model.go
type Message (line 23) | type Message struct
method EC2InstanceIDs (line 29) | func (m Message) EC2InstanceIDs() []string {
method Kind (line 37) | func (Message) Kind() messages.Kind {
type Detail (line 41) | type Detail struct
type EventDescription (line 52) | type EventDescription struct
type AffectedEntity (line 57) | type AffectedEntity struct
FILE: pkg/controllers/interruption/messages/scheduledchange/parser.go
constant acceptedService (line 25) | acceptedService = "EC2"
constant acceptedEventTypeCategory (line 26) | acceptedEventTypeCategory = "scheduledChange"
type Parser (line 29) | type Parser struct
method Parse (line 31) | func (p Parser) Parse(raw string) (messages.Message, error) {
method Version (line 45) | func (p Parser) Version() string {
method Source (line 49) | func (p Parser) Source() string {
method DetailType (line 53) | func (p Parser) DetailType() string {
FILE: pkg/controllers/interruption/messages/spotinterruption/model.go
type Message (line 23) | type Message struct
method EC2InstanceIDs (line 34) | func (m Message) EC2InstanceIDs() []string {
method Kind (line 38) | func (Message) Kind() messages.Kind {
type Detail (line 29) | type Detail struct
FILE: pkg/controllers/interruption/messages/spotinterruption/parser.go
type Parser (line 24) | type Parser struct
method Parse (line 26) | func (p Parser) Parse(raw string) (messages.Message, error) {
method Version (line 34) | func (p Parser) Version() string {
method Source (line 38) | func (p Parser) Source() string {
method DetailType (line 42) | func (p Parser) DetailType() string {
FILE: pkg/controllers/interruption/messages/statechange/model.go
type Message (line 25) | type Message struct
method EC2InstanceIDs (line 36) | func (m Message) EC2InstanceIDs() []string {
method Kind (line 40) | func (m Message) Kind() messages.Kind {
type Detail (line 31) | type Detail struct
FILE: pkg/controllers/interruption/messages/statechange/parser.go
type Parser (line 29) | type Parser struct
method Parse (line 31) | func (p Parser) Parse(raw string) (messages.Message, error) {
method Version (line 44) | func (p Parser) Version() string {
method Source (line 48) | func (p Parser) Source() string {
method DetailType (line 52) | func (p Parser) DetailType() string {
FILE: pkg/controllers/interruption/messages/types.go
type Parser (line 21) | type Parser interface
type Message (line 29) | type Message interface
type Kind (line 35) | type Kind
constant RebalanceRecommendationKind (line 38) | RebalanceRecommendationKind Kind = "rebalance_recommendation"
constant ScheduledChangeKind (line 39) | ScheduledChangeKind Kind = "scheduled_change"
constant SpotInterruptionKind (line 40) | SpotInterruptionKind Kind = "spot_interrupted"
constant InstanceStoppedKind (line 41) | InstanceStoppedKind Kind = "instance_stopped"
constant InstanceTerminatedKind (line 42) | InstanceTerminatedKind Kind = "instance_terminated"
constant CapacityReservationInterruptionKind (line 43) | CapacityReservationInterruptionKind Kind = "capacity_reservation_interru...
constant NoOpKind (line 44) | NoOpKind Kind = "no_op"
type Metadata (line 47) | type Metadata struct
method StartTime (line 58) | func (m Metadata) StartTime() time.Time {
FILE: pkg/controllers/interruption/metrics.go
constant interruptionSubsystem (line 26) | interruptionSubsystem = "interruption"
constant messageTypeLabel (line 27) | messageTypeLabel = "message_type"
FILE: pkg/controllers/interruption/parser.go
type parserKey (line 32) | type parserKey struct
function newParserKey (line 38) | func newParserKey(metadata messages.Metadata) parserKey {
function newParserKeyFromParser (line 46) | func newParserKeyFromParser(p messages.Parser) parserKey {
type EventParser (line 64) | type EventParser struct
method Parse (line 76) | func (p EventParser) Parse(msg string) (messages.Message, error) {
function NewEventParser (line 68) | func NewEventParser(parsers ...messages.Parser) *EventParser {
FILE: pkg/controllers/interruption/suite_test.go
constant defaultAccountID (line 67) | defaultAccountID = "000000000000"
constant ec2Source (line 68) | ec2Source = "aws.ec2"
constant healthSource (line 69) | healthSource = "aws.health"
function TestAPIs (line 81) | func TestAPIs(t *testing.T) {
function ExpectMessagesCreated (line 336) | func ExpectMessagesCreated(messages ...any) {
function smithyErrWithCode (line 350) | func smithyErrWithCode(code string) smithy.APIError {
function spotInterruptionMessage (line 357) | func spotInterruptionMessage(involvedInstanceID string) spotinterruption...
function capacityReservationInterruptionMessage (line 378) | func capacityReservationInterruptionMessage(involvedInstanceID string) c...
function stateChangeMessage (line 399) | func stateChangeMessage(involvedInstanceID, state string) statechange.Me...
function scheduledChangeMessage (line 420) | func scheduledChangeMessage(involvedInstanceID string) scheduledchange.M...
FILE: pkg/controllers/metrics/controller.go
type metricDimensions (line 33) | type metricDimensions struct
type Controller (line 39) | type Controller struct
method Reconcile (line 52) | func (c *Controller) Reconcile(ctx context.Context) (reconciler.Result...
method Register (line 101) | func (c *Controller) Register(_ context.Context, m manager.Manager) er...
function NewController (line 44) | func NewController(kubeClient client.Client, cloudProvider cloudprovider...
FILE: pkg/controllers/metrics/metrics.go
constant cloudProviderSubsystem (line 25) | cloudProviderSubsystem = "cloudprovider"
constant instanceTypeLabel (line 26) | instanceTypeLabel = "instance_type"
constant capacityTypeLabel (line 27) | capacityTypeLabel = "capacity_type"
constant zoneLabel (line 28) | zoneLabel = "zone"
FILE: pkg/controllers/metrics/suite_test.go
function TestAWS (line 60) | func TestAWS(t *testing.T) {
FILE: pkg/controllers/nodeclaim/garbagecollection/controller.go
type Controller (line 41) | type Controller struct
method Reconcile (line 55) | func (c *Controller) Reconcile(ctx context.Context) (reconciler.Result...
method garbageCollect (line 93) | func (c *Controller) garbageCollect(ctx context.Context, nodeClaim *ka...
method Register (line 112) | func (c *Controller) Register(_ context.Context, m manager.Manager) er...
function NewController (line 47) | func NewController(kubeClient client.Client, cloudProvider cloudprovider...
FILE: pkg/controllers/nodeclaim/garbagecollection/suite_test.go
function TestAPIs (line 59) | func TestAPIs(t *testing.T) {
FILE: pkg/controllers/nodeclaim/tagging/controller.go
type Controller (line 48) | type Controller struct
method Reconcile (line 62) | func (c *Controller) Reconcile(ctx context.Context, nodeClaim *karpv1....
method Register (line 91) | func (c *Controller) Register(_ context.Context, m manager.Manager) er...
method tagInstance (line 105) | func (c *Controller) tagInstance(ctx context.Context, nc *karpv1.NodeC...
function NewController (line 54) | func NewController(kubeClient client.Client, cloudProvider cloudprovider...
function isTaggable (line 131) | func isTaggable(nc *karpv1.NodeClaim) bool {
FILE: pkg/controllers/nodeclaim/tagging/suite_test.go
function TestAPIs (line 55) | func TestAPIs(t *testing.T) {
FILE: pkg/controllers/nodeclass/ami.go
type AMI (line 35) | type AMI struct
method Reconcile (line 47) | func (a *AMI) Reconcile(ctx context.Context, nodeClass *v1.EC2NodeClas...
function NewAMIReconciler (line 40) | func NewAMIReconciler(provider amifamily.Provider) *AMI {
FILE: pkg/controllers/nodeclass/capacityreservation.go
constant capacityReservationPollPeriod (line 36) | capacityReservationPollPeriod = time.Minute
type CapacityReservation (line 38) | type CapacityReservation struct
method Reconcile (line 52) | func (c *CapacityReservation) Reconcile(ctx context.Context, nc *v1.EC...
method requeueAfter (line 94) | func (c *CapacityReservation) requeueAfter(reservations ...*ec2types.C...
function NewCapacityReservationReconciler (line 44) | func NewCapacityReservationReconciler(clk clock.Clock, provider capacity...
FILE: pkg/controllers/nodeclass/capacityreservation_test.go
constant selfOwnerID (line 33) | selfOwnerID = "012345678901"
constant altOwnerID (line 34) | altOwnerID = "123456789012"
FILE: pkg/controllers/nodeclass/controller.go
type Controller (line 64) | type Controller struct
method Name (line 112) | func (c *Controller) Name() string {
method Reconcile (line 117) | func (c *Controller) Reconcile(ctx context.Context, nodeClass *v1.EC2N...
method cleanupInstanceProfiles (line 168) | func (c *Controller) cleanupInstanceProfiles(ctx context.Context, node...
method finalize (line 183) | func (c *Controller) finalize(ctx context.Context, nodeClass *v1.EC2No...
method Register (line 229) | func (c *Controller) Register(_ context.Context, m manager.Manager) er...
function NewController (line 74) | func NewController(
FILE: pkg/controllers/nodeclass/events.go
function WaitingOnNodeClaimTerminationEvent (line 28) | func WaitingOnNodeClaimTerminationEvent(nodeClass *v1.EC2NodeClass, name...
FILE: pkg/controllers/nodeclass/garbagecollection/controller.go
type Controller (line 38) | type Controller struct
method getActiveProfiles (line 54) | func (c *Controller) getActiveProfiles(ctx context.Context) (sets.Set[...
method getCurrentProfiles (line 71) | func (c *Controller) getCurrentProfiles(ctx context.Context) (sets.Set...
method shouldDeleteProfile (line 87) | func (c *Controller) shouldDeleteProfile(profileName string, currentPr...
method cleanupInactiveProfiles (line 103) | func (c *Controller) cleanupInactiveProfiles(ctx context.Context) error {
method Reconcile (line 134) | func (c *Controller) Reconcile(ctx context.Context) (reconciler.Result...
method Register (line 143) | func (c *Controller) Register(_ context.Context, m manager.Manager) er...
function NewController (line 45) | func NewController(kubeClient client.Client, cloudProvider cloudprovider...
FILE: pkg/controllers/nodeclass/garbagecollection/suite_test.go
function TestAPIs (line 60) | func TestAPIs(t *testing.T) {
FILE: pkg/controllers/nodeclass/hash/controller.go
type Controller (line 37) | type Controller struct
method Reconcile (line 47) | func (c *Controller) Reconcile(ctx context.Context, nodeClass *v1.EC2N...
method Register (line 71) | func (c *Controller) Register(_ context.Context, m manager.Manager) er...
method updateNodeClaimHash (line 86) | func (c *Controller) updateNodeClaimHash(ctx context.Context, nodeClas...
function NewController (line 41) | func NewController(kubeClient client.Client) *Controller {
FILE: pkg/controllers/nodeclass/hash/suite_test.go
function TestAPIs (line 51) | func TestAPIs(t *testing.T) {
FILE: pkg/controllers/nodeclass/instanceprofile.go
type InstanceProfile (line 31) | type InstanceProfile struct
method protectProfile (line 49) | func (ip *InstanceProfile) protectProfile(profile string) {
method Reconcile (line 55) | func (ip *InstanceProfile) Reconcile(ctx context.Context, nodeClass *v...
function NewInstanceProfileReconciler (line 37) | func NewInstanceProfileReconciler(instanceProfileProvider instanceprofil...
function generateCacheKey (line 45) | func generateCacheKey(nodeClass *v1.EC2NodeClass) string {
FILE: pkg/controllers/nodeclass/securitygroup.go
type SecurityGroup (line 31) | type SecurityGroup struct
method Reconcile (line 41) | func (sg *SecurityGroup) Reconcile(ctx context.Context, nodeClass *v1....
function NewSecurityGroupReconciler (line 35) | func NewSecurityGroupReconciler(securityGroupProvider securitygroup.Prov...
FILE: pkg/controllers/nodeclass/subnet.go
type Subnet (line 31) | type Subnet struct
method Reconcile (line 41) | func (s *Subnet) Reconcile(ctx context.Context, nodeClass *v1.EC2NodeC...
function NewSubnetReconciler (line 35) | func NewSubnetReconciler(subnetProvider subnet.Provider) *Subnet {
FILE: pkg/controllers/nodeclass/suite_test.go
function TestAPIs (line 59) | func TestAPIs(t *testing.T) {
FILE: pkg/controllers/nodeclass/validation.go
constant requeueAfterTime (line 52) | requeueAfterTime = 10 * time.Minute
constant ConditionReasonCreateFleetAuthFailed (line 53) | ConditionReasonCreateFleetAuthFailed = "CreateFleetAuthCheckFai...
constant ConditionReasonCreateLaunchTemplateAuthFailed (line 54) | ConditionReasonCreateLaunchTemplateAuthFailed = "CreateLaunchTemplateAut...
constant ConditionReasonRunInstancesAuthFailed (line 55) | ConditionReasonRunInstancesAuthFailed = "RunInstancesAuthCheckFa...
constant ConditionReasonDependenciesNotReady (line 56) | ConditionReasonDependenciesNotReady = "DependenciesNotReady"
constant ConditionReasonTagValidationFailed (line 57) | ConditionReasonTagValidationFailed = "TagValidationFailed"
constant ConditionReasonDryRunDisabled (line 58) | ConditionReasonDryRunDisabled = "DryRunDisabled"
type Validation (line 67) | type Validation struct
method Reconcile (line 101) | func (v *Validation) Reconcile(ctx context.Context, nodeClass *v1.EC2N...
method updateCacheOnFailure (line 196) | func (v *Validation) updateCacheOnFailure(nodeClass *v1.EC2NodeClass, ...
method validateCreateLaunchTemplateAuthorization (line 205) | func (v *Validation) validateCreateLaunchTemplateAuthorization(
method validateCreateFleetAuthorization (line 240) | func (v *Validation) validateCreateFleetAuthorization(
method validateRunInstancesAuthorization (line 268) | func (v *Validation) validateRunInstancesAuthorization(
method requiredConditions (line 296) | func (*Validation) requiredConditions() []string {
method cacheKey (line 305) | func (*Validation) cacheKey(nodeClass *v1.EC2NodeClass, tags map[strin...
method clearCacheEntries (line 319) | func (v *Validation) clearCacheEntries(nodeClass *v1.EC2NodeClass) {
method getPrioritizedInstanceTypes (line 399) | func (v *Validation) getPrioritizedInstanceTypes(ctx context.Context, ...
method getInstanceTypesForNodeClass (line 453) | func (v *Validation) getInstanceTypesForNodeClass(ctx context.Context,...
method getTenancyType (line 483) | func (v *Validation) getTenancyType(ctx context.Context, nodeClass *v1...
function NewValidationReconciler (line 78) | func NewValidationReconciler(
function getRunInstancesInput (line 336) | func getRunInstancesInput(
function getFleetLaunchTemplateConfig (line 373) | func getFleetLaunchTemplateConfig(
function getAMICompatibleInstanceTypes (line 498) | func getAMICompatibleInstanceTypes(instanceTypes []*cloudprovider.Instan...
FILE: pkg/controllers/providers/instancetype/capacity/controller.go
type ControllerOpts (line 41) | type ControllerOpts struct
type Controller (line 45) | type Controller struct
method Reconcile (line 70) | func (c *Controller) Reconcile(ctx context.Context, node *corev1.Node)...
method Register (line 90) | func (c *Controller) Register(_ context.Context, m manager.Manager) er...
function NewController (line 52) | func NewController(
type EC2NodeClassProvider (line 115) | type EC2NodeClassProvider interface
type defaultNodeClassProvider (line 119) | type defaultNodeClassProvider struct
method GetEC2NodeClass (line 123) | func (p *defaultNodeClassProvider) GetEC2NodeClass(ctx context.Context...
function WithEC2NodeClassProvider (line 129) | func WithEC2NodeClassProvider(provider EC2NodeClassProvider) option.Func...
FILE: pkg/controllers/providers/instancetype/capacity/suite_test.go
function TestAWS (line 68) | func TestAWS(t *testing.T) {
FILE: pkg/controllers/providers/instancetype/controller.go
type Controller (line 33) | type Controller struct
method Reconcile (line 43) | func (c *Controller) Reconcile(ctx context.Context) (reconciler.Result...
method Register (line 62) | func (c *Controller) Register(_ context.Context, m manager.Manager) er...
function NewController (line 37) | func NewController(instanceTypeProvider *instancetype.DefaultProvider) *...
FILE: pkg/controllers/providers/instancetype/suite_test.go
function TestAWS (line 50) | func TestAWS(t *testing.T) {
FILE: pkg/controllers/providers/pricing/controller.go
type Controller (line 33) | type Controller struct
method Reconcile (line 43) | func (c *Controller) Reconcile(ctx context.Context) (reconciler.Result...
method Register (line 62) | func (c *Controller) Register(_ context.Context, m manager.Manager) er...
function NewController (line 37) | func NewController(pricingProvider pricing.Provider) *Controller {
FILE: pkg/controllers/providers/pricing/suite_test.go
function TestAWS (line 52) | func TestAWS(t *testing.T) {
FILE: pkg/controllers/providers/ssm/invalidation/controller.go
type Controller (line 42) | type Controller struct
method Name (line 54) | func (c *Controller) Name() string {
method Reconcile (line 58) | func (c *Controller) Reconcile(ctx context.Context) (reconciler.Result...
method Register (line 96) | func (c *Controller) Register(_ context.Context, m manager.Manager) er...
function NewController (line 47) | func NewController(ssmCache *cache.Cache, amiProvider amifamily.Provider...
FILE: pkg/controllers/providers/ssm/invalidation/suite_test.go
function TestAWS (line 48) | func TestAWS(t *testing.T) {
function getSSMCacheEntries (line 143) | func getSSMCacheEntries() map[string]string {
function deprecateAMIs (line 152) | func deprecateAMIs(amiIDs ...string) {
FILE: pkg/controllers/providers/version/controller.go
type UpdateVersion (line 31) | type UpdateVersion
type Controller (line 33) | type Controller struct
method Reconcile (line 45) | func (c *Controller) Reconcile(ctx context.Context) (reconciler.Result...
method Register (line 54) | func (c *Controller) Register(_ context.Context, m manager.Manager) er...
function NewController (line 38) | func NewController(versionProvider version.Provider, updateVersion Updat...
FILE: pkg/controllers/providers/version/suite_test.go
function TestAWS (line 47) | func TestAWS(t *testing.T) {
FILE: pkg/errors/errors.go
constant launchTemplateNameNotFoundCode (line 27) | launchTemplateNameNotFoundCode = "InvalidLaunchTemplateN...
constant RunInstancesInvalidParameterValueCode (line 28) | RunInstancesInvalidParameterValueCode = "InvalidParameterValue"
constant DryRunOperationErrorCode (line 29) | DryRunOperationErrorCode = "DryRunOperation"
constant UnauthorizedOperationErrorCode (line 30) | UnauthorizedOperationErrorCode = "UnauthorizedOperation"
constant RateLimitingErrorCode (line 31) | RateLimitingErrorCode = "RequestLimitExceeded"
constant ServiceLinkedRoleCreationNotPermittedErrorCode (line 32) | ServiceLinkedRoleCreationNotPermittedErrorCode = "AuthFailure.ServiceLin...
constant InsufficientFreeAddressesInSubnetErrorCode (line 33) | InsufficientFreeAddressesInSubnetErrorCode = "InsufficientFreeAddres...
constant MaxFleetCountExceededErrorCode (line 34) | MaxFleetCountExceededErrorCode = "MaxFleetCountExceeded"
function IsNotFound (line 70) | func IsNotFound(err error) bool {
function IgnoreNotFound (line 80) | func IgnoreNotFound(err error) error {
function IsAlreadyExists (line 87) | func IsAlreadyExists(err error) bool {
function IgnoreAlreadyExists (line 97) | func IgnoreAlreadyExists(err error) error {
function IsDryRunError (line 104) | func IsDryRunError(err error) bool {
function IgnoreDryRunError (line 114) | func IgnoreDryRunError(err error) error {
function IsUnauthorizedOperationError (line 121) | func IsUnauthorizedOperationError(err error) bool {
function IgnoreUnauthorizedOperationError (line 131) | func IgnoreUnauthorizedOperationError(err error) error {
function IsRateLimitedError (line 138) | func IsRateLimitedError(err error) bool {
function IgnoreRateLimitedError (line 148) | func IgnoreRateLimitedError(err error) error {
function IsServerError (line 155) | func IsServerError(err error) bool {
function IgnoreServerError (line 165) | func IgnoreServerError(err error) error {
function IsUnfulfillableCapacity (line 174) | func IsUnfulfillableCapacity(err ec2types.CreateFleetError) bool {
function IsServiceLinkedRoleCreationNotPermitted (line 178) | func IsServiceLinkedRoleCreationNotPermitted(err ec2types.CreateFleetErr...
function IsInsufficientFreeAddressesInSubnet (line 182) | func IsInsufficientFreeAddressesInSubnet(err ec2types.CreateFleetError) ...
function IsReservationCapacityExceeded (line 188) | func IsReservationCapacityExceeded(err ec2types.CreateFleetError) bool {
function IsLaunchTemplateNotFound (line 192) | func IsLaunchTemplateNotFound(err error) bool {
function IsInstanceProfileNotFound (line 202) | func IsInstanceProfileNotFound(err error) bool {
function ToReasonMessage (line 215) | func ToReasonMessage(err error) (string, string) {
FILE: pkg/fake/atomic.go
type AtomicPtr (line 29) | type AtomicPtr struct
method Set (line 34) | func (a *AtomicPtr[T]) Set(v *T) {
method IsNil (line 40) | func (a *AtomicPtr[T]) IsNil() bool {
method Clone (line 46) | func (a *AtomicPtr[T]) Clone() *T {
function clone (line 52) | func clone[T any](v *T) *T {
method Reset (line 66) | func (a *AtomicPtr[T]) Reset() {
type AtomicError (line 72) | type AtomicError struct
method Reset (line 80) | func (e *AtomicError) Reset() {
method IsNil (line 88) | func (e *AtomicError) IsNil() bool {
method Get (line 96) | func (e *AtomicError) Get() error {
method Set (line 106) | func (e *AtomicError) Set(err error, opts ...AtomicErrorOption) {
type AtomicErrorOption (line 118) | type AtomicErrorOption
function MaxCalls (line 120) | func MaxCalls(maxCalls int) AtomicErrorOption {
type AtomicPtrSlice (line 132) | type AtomicPtrSlice struct
method Reset (line 137) | func (a *AtomicPtrSlice[T]) Reset() {
method Add (line 143) | func (a *AtomicPtrSlice[T]) Add(input *T) {
method Len (line 149) | func (a *AtomicPtrSlice[T]) Len() int {
method Pop (line 155) | func (a *AtomicPtrSlice[T]) Pop() *T {
method At (line 164) | func (a *AtomicPtrSlice[T]) At(index int) *T {
method ForEach (line 171) | func (a *AtomicPtrSlice[T]) ForEach(fn func(*T)) {
FILE: pkg/fake/cloudprovider.go
constant DefaultRegion (line 37) | DefaultRegion = "us-west-2"
constant DefaultAccount (line 38) | DefaultAccount = "123456789"
type CloudProvider (line 43) | type CloudProvider struct
method Create (line 48) | func (c *CloudProvider) Create(_ context.Context, _ *karpv1.NodeClaim)...
method GetInstanceTypes (line 60) | func (c *CloudProvider) GetInstanceTypes(_ context.Context, _ *karpv1....
method IsDrifted (line 69) | func (c *CloudProvider) IsDrifted(_ context.Context, nodeClaim *karpv1...
method Get (line 73) | func (c *CloudProvider) Get(context.Context, string) (*karpv1.NodeClai...
method List (line 77) | func (c *CloudProvider) List(context.Context) ([]*karpv1.NodeClaim, er...
method Delete (line 81) | func (c *CloudProvider) Delete(context.Context, *karpv1.NodeClaim) err...
method DisruptionReasons (line 85) | func (c *CloudProvider) DisruptionReasons() []karpv1.DisruptionReason {
method Name (line 90) | func (c *CloudProvider) Name() string {
method GetSupportedNodeClasses (line 94) | func (c *CloudProvider) GetSupportedNodeClasses() []status.Object {
method RepairPolicies (line 98) | func (c *CloudProvider) RepairPolicies() []corecloudprovider.RepairPol...
function GenerateDefaultPriceOutput (line 104) | func GenerateDefaultPriceOutput() (*ec2.DescribeSpotPriceHistoryOutput, ...
FILE: pkg/fake/ec2api.go
type CapacityPool (line 41) | type CapacityPool struct
type EC2Behavior (line 50) | type EC2Behavior struct
type EC2API (line 76) | type EC2API struct
method Reset (line 90) | func (e *EC2API) Reset() {
method CreateFleet (line 127) | func (e *EC2API) CreateFleet(_ context.Context, input *ec2.CreateFleet...
method TerminateInstances (line 251) | func (e *EC2API) TerminateInstances(_ context.Context, input *ec2.Term...
method CreateLaunchTemplate (line 268) | func (e *EC2API) CreateLaunchTemplate(ctx context.Context, input *ec2....
method CreateTags (line 293) | func (e *EC2API) CreateTags(_ context.Context, input *ec2.CreateTagsIn...
method DescribeInstances (line 317) | func (e *EC2API) DescribeInstances(_ context.Context, input *ec2.Descr...
method DescribeCapacityReservations (line 387) | func (e *EC2API) DescribeCapacityReservations(ctx context.Context, inp...
method DescribeImages (line 400) | func (e *EC2API) DescribeImages(ctx context.Context, input *ec2.Descri...
method DescribeLaunchTemplates (line 428) | func (e *EC2API) DescribeLaunchTemplates(_ context.Context, input *ec2...
method DeleteLaunchTemplate (line 456) | func (e *EC2API) DeleteLaunchTemplate(_ context.Context, input *ec2.De...
method DescribeSubnets (line 465) | func (e *EC2API) DescribeSubnets(_ context.Context, input *ec2.Describ...
method DescribeSecurityGroups (line 535) | func (e *EC2API) DescribeSecurityGroups(_ context.Context, input *ec2....
method DescribeAvailabilityZones (line 571) | func (e *EC2API) DescribeAvailabilityZones(context.Context, *ec2.Descr...
method DescribeInstanceTypes (line 587) | func (e *EC2API) DescribeInstanceTypes(_ context.Context, _ *ec2.Descr...
method DescribeInstanceTypeOfferings (line 598) | func (e *EC2API) DescribeInstanceTypeOfferings(_ context.Context, _ *e...
method DescribeSpotPriceHistory (line 609) | func (e *EC2API) DescribeSpotPriceHistory(_ context.Context, input *ec...
method RunInstances (line 616) | func (e *EC2API) RunInstances(ctx context.Context, input *ec2.RunInsta...
function NewEC2API (line 81) | func NewEC2API() *EC2API {
function filterInstances (line 342) | func filterInstances(instances []ec2types.Instance, filters []ec2types.F...
FILE: pkg/fake/eksapi.go
type EKSAPIBehavior (line 31) | type EKSAPIBehavior struct
type EKSAPI (line 35) | type EKSAPI struct
method Reset (line 46) | func (s *EKSAPI) Reset() {
method DescribeCluster (line 50) | func (s *EKSAPI) DescribeCluster(_ context.Context, input *eks.Describ...
function NewEKSAPI (line 40) | func NewEKSAPI() *EKSAPI {
FILE: pkg/fake/iamapi.go
type IAMAPIBehavior (line 37) | type IAMAPIBehavior struct
type IAMAPI (line 48) | type IAMAPI struct
method Reset (line 68) | func (s *IAMAPI) Reset() {
method GetInstanceProfile (line 81) | func (s *IAMAPI) GetInstanceProfile(_ context.Context, input *iam.GetI...
method CreateInstanceProfile (line 97) | func (s *IAMAPI) CreateInstanceProfile(_ context.Context, input *iam.C...
method DeleteInstanceProfile (line 121) | func (s *IAMAPI) DeleteInstanceProfile(_ context.Context, input *iam.D...
method TagInstanceProfile (line 145) | func (s *IAMAPI) TagInstanceProfile(_ context.Context, input *iam.TagI...
method AddRoleToInstanceProfile (line 164) | func (s *IAMAPI) AddRoleToInstanceProfile(_ context.Context, input *ia...
method RemoveRoleFromInstanceProfile (line 193) | func (s *IAMAPI) RemoveRoleFromInstanceProfile(_ context.Context, inpu...
method ListInstanceProfiles (line 220) | func (s *IAMAPI) ListInstanceProfiles(_ context.Context, input *iam.Li...
method GetRole (line 237) | func (s *IAMAPI) GetRole(_ context.Context, input *iam.GetRoleInput, _...
function NewIAMAPI (line 61) | func NewIAMAPI() *IAMAPI {
FILE: pkg/fake/pricingapi.go
type PricingAPI (line 28) | type PricingAPI struct
method Reset (line 33) | func (p *PricingAPI) Reset() {
method GetProducts (line 37) | func (p *PricingAPI) GetProducts(_ context.Context, input *pricing.Get...
function NewOnDemandPrice (line 45) | func NewOnDemandPrice(instanceType string, price float64) string {
function NewOnDemandPriceWithCurrency (line 50) | func NewOnDemandPriceWithCurrency(instanceType string, price float64, cu...
FILE: pkg/fake/sqsapi.go
constant dummyQueueURL (line 27) | dummyQueueURL = "https://sqs.us-west-2.amazonaws.com/000000000000/Karpen...
type SQSBehavior (line 32) | type SQSBehavior struct
type SQSAPI (line 38) | type SQSAPI struct
method Reset (line 45) | func (s *SQSAPI) Reset() {
method GetQueueUrl (line 52) | func (s *SQSAPI) GetQueueUrl(_ context.Context, input *sqs.GetQueueUrl...
method ReceiveMessage (line 60) | func (s *SQSAPI) ReceiveMessage(_ context.Context, input *sqs.ReceiveM...
method DeleteMessage (line 66) | func (s *SQSAPI) DeleteMessage(_ context.Context, input *sqs.DeleteMes...
FILE: pkg/fake/ssmapi.go
type SSMAPI (line 31) | type SSMAPI struct
method GetParameter (line 46) | func (a SSMAPI) GetParameter(_ context.Context, input *ssm.GetParamete...
method Reset (line 81) | func (a *SSMAPI) Reset() {
function NewSSMAPI (line 40) | func NewSSMAPI() *SSMAPI {
FILE: pkg/fake/types.go
type MockedFunction (line 26) | type MockedFunction struct
method Reset (line 40) | func (m *MockedFunction[I, O]) Reset() {
method Invoke (line 52) | func (m *MockedFunction[I, O]) Invoke(input *I, defaultTransformer func(...
method Calls (line 97) | func (m *MockedFunction[I, O]) Calls() int {
method SuccessfulCalls (line 101) | func (m *MockedFunction[I, O]) SuccessfulCalls() int {
method FailedCalls (line 105) | func (m *MockedFunction[I, O]) FailedCalls() int {
FILE: pkg/fake/utils.go
function InstanceID (line 32) | func InstanceID() string {
function RandomProviderID (line 36) | func RandomProviderID() string {
function ProviderID (line 40) | func ProviderID(id string) string {
function ImageID (line 44) | func ImageID() string {
function SecurityGroupID (line 47) | func SecurityGroupID() string {
function SubnetID (line 51) | func SubnetID() string {
function InstanceProfileID (line 55) | func InstanceProfileID() string {
function RoleID (line 59) | func RoleID() string {
function LaunchTemplateName (line 63) | func LaunchTemplateName() string {
function LaunchTemplateID (line 67) | func LaunchTemplateID() string {
function PrivateDNSName (line 71) | func PrivateDNSName() string {
function SubnetsFromFleetRequest (line 76) | func SubnetsFromFleetRequest(createFleetInput *ec2.CreateFleetInput) []s...
function FilterDescribeSecurtyGroups (line 90) | func FilterDescribeSecurtyGroups(sgs []ec2types.SecurityGroup, filters [...
function FilterDescribeSubnets (line 98) | func FilterDescribeSubnets(subnets []ec2types.Subnet, filters []ec2types...
function FilterDescribeCapacityReservations (line 104) | func FilterDescribeCapacityReservations(crs []ec2types.CapacityReservati...
function FilterDescribeImages (line 114) | func FilterDescribeImages(images []ec2types.Image, filters []ec2types.Fi...
function Filter (line 121) | func Filter(filters []ec2types.Filter, id, name, owner, state string, ta...
function FilterCapacityReservation (line 143) | func FilterCapacityReservation(filters []ec2types.Filter, id, name, owne...
function matchTags (line 154) | func matchTags(tags []ec2types.Tag, filter ec2types.Filter) bool {
function MakeInstances (line 179) | func MakeInstances() []ec2types.InstanceTypeInfo {
function MakeUniqueInstancesAndFamilies (line 210) | func MakeUniqueInstancesAndFamilies(instances []ec2types.InstanceTypeInf...
function MakeInstanceOfferings (line 232) | func MakeInstanceOfferings(instanceTypes []ec2types.InstanceTypeInfo) []...
FILE: pkg/operator/operator.go
function init (line 70) | func init() {
type Operator (line 75) | type Operator struct
function NewOperator (line 97) | func NewOperator(ctx context.Context, operator *operator.Operator) (cont...
function WithUserAgent (line 232) | func WithUserAgent(cfg aws.Config) aws.Config {
function CheckEC2Connectivity (line 242) | func CheckEC2Connectivity(ctx context.Context, api sdk.EC2API) error {
function ResolveClusterEndpoint (line 253) | func ResolveClusterEndpoint(ctx context.Context, eksAPI sdk.EKSAPI) (str...
function GetCABundle (line 267) | func GetCABundle(ctx context.Context, restConfig *rest.Config) (*string,...
function KubeDNSIP (line 286) | func KubeDNSIP(ctx context.Context, kubernetesInterface kubernetes.Inter...
function SetupIndexers (line 301) | func SetupIndexers(ctx context.Context, mgr manager.Manager) {
FILE: pkg/operator/options/options.go
function init (line 30) | func init() {
type optionsKey (line 34) | type optionsKey struct
type Options (line 36) | type Options struct
method AddFlags (line 48) | func (o *Options) AddFlags(fs *coreoptions.FlagSet) {
method Parse (line 60) | func (o *Options) Parse(fs *coreoptions.FlagSet, args ...string) error {
method ToContext (line 73) | func (o *Options) ToContext(ctx context.Context) context.Context {
function ToContext (line 77) | func ToContext(ctx context.Context, opts *Options) context.Context {
function FromContext (line 81) | func FromContext(ctx context.Context) *Options {
FILE: pkg/operator/options/options_validation.go
method Validate (line 25) | func (o *Options) Validate() error {
method validateEndpoint (line 34) | func (o *Options) validateEndpoint() error {
method validateVMMemoryOverheadPercent (line 47) | func (o *Options) validateVMMemoryOverheadPercent() error {
method validateReservedENIs (line 54) | func (o *Options) validateReservedENIs() error {
method validateRequiredFields (line 61) | func (o *Options) validateRequiredFields() error {
FILE: pkg/operator/options/suite_test.go
function TestAPIs (line 36) | func TestAPIs(t *testing.T) {
function expectOptionsEqual (line 129) | func expectOptionsEqual(optsA *options.Options, optsB *options.Options) {
FILE: pkg/operator/suite_test.go
function TestAWS (line 47) | func TestAWS(t *testing.T) {
FILE: pkg/providers/amifamily/al2.go
type AL2 (line 38) | type AL2 struct
method DescribeImageQuery (line 43) | func (a AL2) DescribeImageQuery(ctx context.Context, ssmProvider ssm.P...
method UserData (line 91) | func (a AL2) UserData(kubeletConfig *v1.KubeletConfiguration, taints [...
method DefaultBlockDeviceMappings (line 107) | func (a AL2) DefaultBlockDeviceMappings() []*v1.BlockDeviceMapping {
method EphemeralBlockDevice (line 114) | func (a AL2) EphemeralBlockDevice() *string {
FILE: pkg/providers/amifamily/al2023.go
type AL2023 (line 34) | type AL2023 struct
method DescribeImageQuery (line 39) | func (a AL2023) DescribeImageQuery(ctx context.Context, ssmProvider ss...
method resolvePath (line 73) | func (a AL2023) resolvePath(architecture, variant, k8sVersion, amiVers...
method UserData (line 82) | func (a AL2023) UserData(kubeletConfig *v1.KubeletConfiguration, taint...
method DefaultBlockDeviceMappings (line 99) | func (a AL2023) DefaultBlockDeviceMappings() []*v1.BlockDeviceMapping {
method EphemeralBlockDevice (line 106) | func (a AL2023) EphemeralBlockDevice() *string {
FILE: pkg/providers/amifamily/ami.go
type Provider (line 46) | type Provider interface
type DefaultProvider (line 50) | type DefaultProvider struct
method List (line 71) | func (p *DefaultProvider) List(ctx context.Context, nodeClass *v1.EC2N...
method DescribeImageQueries (line 83) | func (p *DefaultProvider) DescribeImageQueries(ctx context.Context, no...
method amis (line 173) | func (p *DefaultProvider) amis(ctx context.Context, nodeClass *v1.EC2N...
function NewDefaultProvider (line 60) | func NewDefaultProvider(clk clock.Clock, versionProvider version.Provide...
function MapToInstanceTypes (line 228) | func MapToInstanceTypes(instanceTypes []*cloudprovider.InstanceType, ami...
function compareAMI (line 251) | func compareAMI(i, j AMI) int {
FILE: pkg/providers/amifamily/bootstrap/bootstrap.go
type Options (line 31) | type Options struct
method kubeletExtraArgs (line 45) | func (o Options) kubeletExtraArgs() (args []string) {
method nodeTaintArg (line 79) | func (o Options) nodeTaintArg() string {
method nodeLabelArg (line 87) | func (o Options) nodeLabelArg() string {
function joinParameterArgs (line 102) | func joinParameterArgs[K comparable, V any](name string, m map[K]V, sepa...
type Bootstrapper (line 118) | type Bootstrapper interface
FILE: pkg/providers/amifamily/bootstrap/bottlerocket.go
type Bottlerocket (line 31) | type Bottlerocket struct
method Script (line 37) | func (b Bottlerocket) Script(ctx context.Context) (string, error) {
FILE: pkg/providers/amifamily/bootstrap/bottlerocket_test.go
function TestBootstrap (line 24) | func TestBootstrap(t *testing.T) {
FILE: pkg/providers/amifamily/bootstrap/bottlerocketsettings.go
function NewBottlerocketConfig (line 26) | func NewBottlerocketConfig(ctx context.Context, userdata *string) (*Bott...
type BottlerocketConfig (line 38) | type BottlerocketConfig struct
method UnmarshalTOML (line 130) | func (c *BottlerocketConfig) UnmarshalTOML(ctx context.Context, data [...
method MarshalTOML (line 169) | func (c *BottlerocketConfig) MarshalTOML() ([]byte, error) {
type BottlerocketSettings (line 45) | type BottlerocketSettings struct
type BottlerocketKubernetes (line 51) | type BottlerocketKubernetes struct
type BottlerocketStaticPod (line 100) | type BottlerocketStaticPod struct
type BottlerocketCredentialProvider (line 107) | type BottlerocketCredentialProvider struct
type BootstrapCommandMode (line 114) | type BootstrapCommandMode
constant BootstrapCommandModeAlways (line 117) | BootstrapCommandModeAlways BootstrapCommandMode = "always"
constant BootstrapCommandModeOnce (line 118) | BootstrapCommandModeOnce BootstrapCommandMode = "once"
constant BootstrapCommandModeOff (line 119) | BootstrapCommandModeOff BootstrapCommandMode = "off"
type BootstrapCommand (line 124) | type BootstrapCommand struct
FILE: pkg/providers/amifamily/bootstrap/custom.go
type Custom (line 24) | type Custom struct
method Script (line 28) | func (e Custom) Script(_ context.Context) (string, error) {
FILE: pkg/providers/amifamily/bootstrap/eksbootstrap.go
type EKS (line 36) | type EKS struct
method Script (line 47) | func (e EKS) Script(_ context.Context) (string, error) {
method eksBootstrapScript (line 58) | func (e EKS) eksBootstrapScript() string {
method mergeCustomUserData (line 87) | func (e EKS) mergeCustomUserData(userDatas ...string) (string, error) {
method isIPv6 (line 108) | func (e EKS) isIPv6() bool {
method mimeify (line 117) | func (e EKS) mimeify(customUserData string) (string, error) {
constant Boundary (line 42) | Boundary = "//"
constant MIMEVersionHeader (line 43) | MIMEVersionHeader = "MIME-Version: 1.0"
constant MIMEContentTypeHeaderTemplate (line 44) | MIMEContentTypeHeaderTemplate = "Content-Type: multipart/mixed; boundary...
function copyCustomUserDataParts (line 142) | func copyCustomUserDataParts(writer *multipart.Writer, customUserData st...
function getMultiPartReader (line 175) | func getMultiPartReader(userData string) (*multipart.Reader, error) {
FILE: pkg/providers/amifamily/bootstrap/mime/mime.go
type ContentType (line 32) | type ContentType
constant boundary (line 35) | boundary = "//"
constant versionHeader (line 36) | versionHeader = "MIME-Version: 1.0"
constant ContentTypeShellScript (line 38) | ContentTypeShellScript ContentType = `text/x-shellscript; charset="us-as...
constant ContentTypeNodeConfig (line 39) | ContentTypeNodeConfig ContentType = "application/" + admapi.GroupName
constant ContentTypeMultipart (line 40) | ContentTypeMultipart ContentType = `multipart/mixed; boundary="` + bou...
type Entry (line 43) | type Entry struct
type Archive (line 48) | type Archive
method Serialize (line 80) | func (ma Archive) Serialize() (string, error) {
method getReader (line 108) | func (Archive) getReader(content string) (*multipart.Reader, error) {
function NewArchive (line 50) | func NewArchive(content string) (Archive, error) {
FILE: pkg/providers/amifamily/bootstrap/mime/suite_test.go
function TestAWS (line 35) | func TestAWS(t *testing.T) {
FILE: pkg/providers/amifamily/bootstrap/nodeadm.go
type Nodeadm (line 36) | type Nodeadm struct
method Script (line 40) | func (n Nodeadm) Script(_ context.Context) (string, error) {
method getNodeConfigYAML (line 61) | func (n Nodeadm) getNodeConfigYAML() (string, error) {
method generateInlineKubeletConfiguration (line 109) | func (n Nodeadm) generateInlineKubeletConfiguration() (map[string]runt...
method parseUserData (line 128) | func (n Nodeadm) parseUserData() ([]mime.Entry, error) {
FILE: pkg/providers/amifamily/bootstrap/windows.go
type Windows (line 27) | type Windows struct
method Script (line 32) | func (w Windows) Script(_ context.Context) (string, error) {
FILE: pkg/providers/amifamily/bottlerocket.go
type Bottlerocket (line 39) | type Bottlerocket struct
method DescribeImageQuery (line 44) | func (b Bottlerocket) DescribeImageQuery(ctx context.Context, ssmProvi...
method UserData (line 80) | func (b Bottlerocket) UserData(kubeletConfig *v1.KubeletConfiguration,...
method resolveAMIVersion (line 97) | func (b Bottlerocket) resolveAMIVersion() string {
method getVersionFromAlias (line 113) | func (b Bottlerocket) getVersionFromAlias() string {
method getVersionFromName (line 126) | func (b Bottlerocket) getVersionFromName() string {
method getVersionFromID (line 138) | func (b Bottlerocket) getVersionFromID() string {
method findVersionByID (line 150) | func (b Bottlerocket) findVersionByID(id string) string {
method getVersionFromResolvedAMIs (line 159) | func (b Bottlerocket) getVersionFromResolvedAMIs() string {
method extractVersionFromName (line 171) | func (b Bottlerocket) extractVersionFromName(name string) string {
method DefaultBlockDeviceMappings (line 183) | func (b Bottlerocket) DefaultBlockDeviceMappings() []*v1.BlockDeviceMa...
method EphemeralBlockDevice (line 198) | func (b Bottlerocket) EphemeralBlockDevice() *string {
method FeatureFlags (line 214) | func (b Bottlerocket) FeatureFlags() FeatureFlags {
FILE: pkg/providers/amifamily/custom.go
type Custom (line 30) | type Custom struct
method UserData (line 36) | func (c Custom) UserData(_ *v1.KubeletConfiguration, _ []corev1.Taint,...
method DescribeImageQuery (line 44) | func (c Custom) DescribeImageQuery(_ context.Context, _ ssm.Provider, ...
method DefaultBlockDeviceMappings (line 48) | func (c Custom) DefaultBlockDeviceMappings() []*v1.BlockDeviceMapping {
method EphemeralBlockDevice (line 56) | func (c Custom) EphemeralBlockDevice() *string {
FILE: pkg/providers/amifamily/resolver.go
type Resolver (line 46) | type Resolver interface
type DefaultResolver (line 51) | type DefaultResolver struct
method Resolve (line 136) | func (r DefaultResolver) Resolve(nodeClass *v1.EC2NodeClass, nodeClaim...
method defaultClusterDNS (line 232) | func (r DefaultResolver) defaultClusterDNS(opts *Options, kubeletConfi...
method resolveLaunchTemplates (line 249) | func (r DefaultResolver) resolveLaunchTemplates(
type Options (line 56) | type Options struct
method DefaultMetadataOptions (line 223) | func (o Options) DefaultMetadataOptions() *v1.MetadataOptions {
type LaunchTemplate (line 76) | type LaunchTemplate struct
type AMIFamily (line 93) | type AMIFamily interface
type DefaultAMIOutput (line 102) | type DefaultAMIOutput struct
type FeatureFlags (line 108) | type FeatureFlags struct
type DefaultFamily (line 116) | type DefaultFamily struct
method FeatureFlags (line 118) | func (d DefaultFamily) FeatureFlags() FeatureFlags {
function NewDefaultResolver (line 128) | func NewDefaultResolver(region string) *DefaultResolver {
function GetAMIFamily (line 204) | func GetAMIFamily(amiFamily string, options *Options) AMIFamily {
function RejectForbiddenLabels (line 338) | func RejectForbiddenLabels(labels map[string]string) map[string]string {
function isRestrictedLabel (line 349) | func isRestrictedLabel(label string) bool {
FILE: pkg/providers/amifamily/suite_test.go
function TestAWS (line 69) | func TestAWS(t *testing.T) {
constant amd64AMI (line 76) | amd64AMI = "ami-id-amd64"
constant arm64AMI (line 77) | arm64AMI = "ami-id-arm64"
constant amd64NvidiaAMI (line 78) | amd64NvidiaAMI = "ami-id-amd64-nvidia"
constant arm64NvidiaAMI (line 79) | arm64NvidiaAMI = "ami-id-arm64-nvidia"
type MockVersionProvider (line 149) | type MockVersionProvider struct
method Get (line 153) | func (m *MockVersionProvider) Get(ctx context.Context) string {
function amiProviderWithEKSVersionOverride (line 157) | func amiProviderWithEKSVersionOverride(version string) *amifamily.Defaul...
function ExpectConsistsOfAMIQueries (line 1241) | func ExpectConsistsOfAMIQueries(expected, actual []amifamily.DescribeIma...
FILE: pkg/providers/amifamily/types.go
type AMI (line 36) | type AMI struct
type AMIs (line 44) | type AMIs
method Sort (line 48) | func (a AMIs) Sort() {
function parseTimeWithDefault (line 60) | func parseTimeWithDefault(dateStr string, defaultTime time.Time) time.Ti...
type Variant (line 67) | type Variant
method Requirements (line 86) | func (v Variant) Requirements() scheduling.Requirements {
function NewVariant (line 77) | func NewVariant(v string) (Variant, error) {
type DescribeImageQuery (line 101) | type DescribeImageQuery struct
method DescribeImagesInput (line 111) | func (q DescribeImageQuery) DescribeImagesInput() *ec2.DescribeImagesI...
method RequirementsForImageWithArchitecture (line 123) | func (q DescribeImageQuery) RequirementsForImageWithArchitecture(image...
type AL2DeprecationError (line 133) | type AL2DeprecationError struct
function IsAl2DeprecationError (line 137) | func IsAl2DeprecationError(err error) bool {
type WS2025UnsupportedVersionError (line 145) | type WS2025UnsupportedVersionError struct
function IsWS2025UnsupportedVersionError (line 149) | func IsWS2025UnsupportedVersionError(err error) bool {
FILE: pkg/providers/amifamily/windows.go
type Windows (line 40) | type Windows struct
method DescribeImageQuery (line 50) | func (w Windows) DescribeImageQuery(ctx context.Context, ssmProvider s...
method UserData (line 73) | func (w Windows) UserData(kubeletConfig *v1.KubeletConfiguration, tain...
method DefaultBlockDeviceMappings (line 88) | func (w Windows) DefaultBlockDeviceMappings() []*v1.BlockDeviceMapping {
method EphemeralBlockDevice (line 97) | func (w Windows) EphemeralBlockDevice() *string {
method FeatureFlags (line 101) | func (w Windows) FeatureFlags() FeatureFlags {
FILE: pkg/providers/capacityreservation/provider.go
type Provider (line 34) | type Provider interface
type DefaultProvider (line 42) | type DefaultProvider struct
method List (line 69) | func (p *DefaultProvider) List(ctx context.Context, selectorTerms ...v...
method resolveCachedQueries (line 104) | func (p *DefaultProvider) resolveCachedQueries(queries ...*Query) (res...
method filterReservations (line 116) | func (p *DefaultProvider) filterReservations(reservations []*ec2types....
function NewProvider (line 52) | func NewProvider(
FILE: pkg/providers/capacityreservation/suite_test.go
function TestAPIs (line 43) | func TestAPIs(t *testing.T) {
FILE: pkg/providers/capacityreservation/types.go
type Query (line 32) | type Query struct
method CacheKey (line 56) | func (q *Query) CacheKey() string {
method DescribeCapacityReservationsInput (line 62) | func (q *Query) DescribeCapacityReservationsInput() *ec2.DescribeCapac...
function QueriesFromSelectorTerms (line 39) | func QueriesFromSelectorTerms(terms ...v1.CapacityReservationSelectorTer...
type availabilityCache (line 107) | type availabilityCache struct
method syncAvailability (line 118) | func (c *availabilityCache) syncAvailability(availability map[string]i...
method MarkLaunched (line 130) | func (c *availabilityCache) MarkLaunched(reservationID string) {
method MarkTerminated (line 150) | func (c *availabilityCache) MarkTerminated(reservationID string) {
method GetAvailableInstanceCount (line 164) | func (c *availabilityCache) GetAvailableInstanceCount(reservationID st...
method SetAvailableInstanceCount (line 175) | func (c *availabilityCache) SetAvailableInstanceCount(reservationID st...
method MarkUnavailable (line 184) | func (c *availabilityCache) MarkUnavailable(reservationIDs ...string) {
type availabilityCacheEntry (line 113) | type availabilityCacheEntry struct
FILE: pkg/providers/instance/events.go
function SpotServiceLinkedRoleCreationFailure (line 27) | func SpotServiceLinkedRoleCreationFailure(nodeClaim *v1.NodeClaim) event...
FILE: pkg/providers/instance/filter/filter.go
type Filter (line 35) | type Filter interface
function CompatibleAvailableFilter (line 42) | func CompatibleAvailableFilter(requirements scheduling.Requirements, req...
type compatibleAvailableFilter (line 49) | type compatibleAvailableFilter struct
method FilterReject (line 54) | func (f compatibleAvailableFilter) FilterReject(instanceTypes []*cloud...
method Name (line 69) | func (compatibleAvailableFilter) Name() string {
function CapacityReservationTypeFilter (line 76) | func CapacityReservationTypeFilter(requirements scheduling.Requirements)...
type capacityReservationTypeFilter (line 82) | type capacityReservationTypeFilter struct
method FilterReject (line 86) | func (f capacityReservationTypeFilter) FilterReject(instanceTypes []*c...
method Name (line 129) | func (f capacityReservationTypeFilter) Name() string {
method Partition (line 146) | func (f capacityReservationTypeFilter) Partition(instanceTypes []*clou...
type capacityReservationTypePartition (line 133) | type capacityReservationTypePartition struct
type capacityReservation (line 140) | type capacityReservation struct
function CapacityBlockFilter (line 202) | func CapacityBlockFilter(requirements scheduling.Requirements) Filter {
type capacityBlockFilter (line 208) | type capacityBlockFilter struct
method FilterReject (line 213) | func (f capacityBlockFilter) FilterReject(instanceTypes []*cloudprovid...
method shouldFilter (line 247) | func (f capacityBlockFilter) shouldFilter(instanceTypes []*cloudprovid...
method Name (line 266) | func (f capacityBlockFilter) Name() string {
function ReservedOfferingFilter (line 273) | func ReservedOfferingFilter(requirements scheduling.Requirements) Filter {
type reservedOfferingFilter (line 279) | type reservedOfferingFilter struct
method FilterReject (line 283) | func (f reservedOfferingFilter) FilterReject(instanceTypes []*cloudpro...
method Name (line 315) | func (reservedOfferingFilter) Name() string {
function ExoticInstanceTypeFilter (line 322) | func ExoticInstanceTypeFilter(requirements scheduling.Requirements) Filt...
type exoticInstanceFilter (line 328) | type exoticInstanceFilter struct
method FilterReject (line 332) | func (f exoticInstanceFilter) FilterReject(instanceTypes []*cloudprovi...
method Name (line 363) | func (exoticInstanceFilter) Name() string {
function SpotOfferingFilter (line 370) | func SpotOfferingFilter(requirements scheduling.Requirements) Filter {
type spotOfferingFilter (line 376) | type spotOfferingFilter struct
method FilterReject (line 381) | func (f spotOfferingFilter) FilterReject(instanceTypes []*cloudprovide...
method Name (line 429) | func (spotOfferingFilter) Name() string {
FILE: pkg/providers/instance/filter/filter_test.go
function TestAWS (line 43) | func TestAWS(t *testing.T) {
function expectInstanceTypes (line 683) | func expectInstanceTypes(instanceTypes []*cloudprovider.InstanceType, na...
function withRequirements (line 693) | func withRequirements(reqs ...*scheduling.Requirement) mockInstanceTypeO...
function withResource (line 702) | func withResource(name corev1.ResourceName, quantity resource.Quantity) ...
function withOfferings (line 711) | func withOfferings(offerings ...*cloudprovider.Offering) mockInstanceTyp...
function makeInstanceType (line 717) | func makeInstanceType(name string, opts ...mockInstanceTypeOptions) *clo...
function withReservationCapacity (line 733) | func withReservationCapacity(capacity int) mockOfferingOptions {
function withReservationID (line 739) | func withReservationID(id string) mockOfferingOptions {
function withCapacityReservationType (line 752) | func withCapacityReservationType(crt v1.CapacityReservationType) mockOff...
function withZone (line 765) | func withZone(zone string) mockOfferingOptions {
function withPrice (line 778) | func withPrice(price float64) mockOfferingOptions {
function withTag (line 784) | func withTag(tag string) mockOfferingOptions {
function makeOffering (line 797) | func makeOffering(capacityType string, available bool, opts ...mockOffer...
function withInterruptible (line 811) | func withInterruptible(interruptible bool) mockOfferingOptions {
FILE: pkg/providers/instance/instance.go
constant instanceTypeFlexibilityThreshold (line 61) | instanceTypeFlexibilityThreshold = 5
constant maxInstanceTypes (line 63) | maxInstanceTypes = 60
type Provider (line 79) | type Provider interface
type options (line 87) | type options struct
type DefaultProvider (line 97) | type DefaultProvider struct
method Create (line 133) | func (p *DefaultProvider) Create(ctx context.Context, nodeClass *v1.EC...
method Get (line 171) | func (p *DefaultProvider) Get(ctx context.Context, id string, opts ......
method List (line 200) | func (p *DefaultProvider) List(ctx context.Context) ([]*Instance, erro...
method Delete (line 237) | func (p *DefaultProvider) Delete(ctx context.Context, id string) error {
method CreateTags (line 257) | func (p *DefaultProvider) CreateTags(ctx context.Context, id string, t...
method filterInstanceTypes (line 273) | func (p *DefaultProvider) filterInstanceTypes(ctx context.Context, ins...
method launchInstance (line 304) | func (p *DefaultProvider) launchInstance(
method checkODFallback (line 371) | func (p *DefaultProvider) checkODFallback(nodeClaim *karpv1.NodeClaim,...
method getLaunchTemplateConfigs (line 391) | func (p *DefaultProvider) getLaunchTemplateConfigs(
method getOverrides (line 428) | func (p *DefaultProvider) getOverrides(
method updateUnavailableOfferingsCache (line 483) | func (p *DefaultProvider) updateUnavailableOfferingsCache(
method getCapacityReservationDetailsForInstance (line 542) | func (p *DefaultProvider) getCapacityReservationDetailsForInstance(ins...
function NewDefaultProvider (line 109) | func NewDefaultProvider(
function getTenancyType (line 565) | func getTenancyType(nodeClaim *karpv1.NodeClaim) string {
function getCapacityType (line 585) | func getCapacityType(nodeClaim *karpv1.NodeClaim, instanceTypes []*cloud...
function getCapacityReservationType (line 601) | func getCapacityReservationType(instanceTypes []*cloudprovider.InstanceT...
function getCapacityReservationInterruptible (line 612) | func getCapacityReservationInterruptible(instanceTypes []*cloudprovider....
function instancesFromOutput (line 623) | func instancesFromOutput(ctx context.Context, out *ec2.DescribeInstances...
function combineFleetErrors (line 640) | func combineFleetErrors(fleetErrs []ec2types.CreateFleetError) (errs err...
FILE: pkg/providers/instance/suite_test.go
function TestAWS (line 60) | func TestAWS(t *testing.T) {
FILE: pkg/providers/instance/types.go
type Instance (line 37) | type Instance struct
type CapacityReservationDetails (line 53) | type CapacityReservationDetails struct
function NewInstance (line 59) | func NewInstance(ctx context.Context, instance ec2types.Instance) *Insta...
function tenancyFromInstance (line 95) | func tenancyFromInstance(instance ec2types.Instance) string {
function capacityTypeFromInstance (line 100) | func capacityTypeFromInstance(ctx context.Context, instance ec2types.Ins...
function WithCapacityReservationDetails (line 114) | func WithCapacityReservationDetails(capacityReservationDetails *Capacity...
function WithEFAEnabled (line 120) | func WithEFAEnabled() NewInstanceFromFleetOpts {
function NewInstanceFromFleet (line 124) | func NewInstanceFromFleet(
type CreateFleetInputBuilder (line 147) | type CreateFleetInputBuilder struct
method WithContextID (line 174) | func (b *CreateFleetInputBuilder) WithContextID(contextID string) *Cre...
method WithOverlay (line 179) | func (b *CreateFleetInputBuilder) WithOverlay() *CreateFleetInputBuild...
method WithCapacityReservationType (line 184) | func (b *CreateFleetInputBuilder) WithCapacityReservationType(crt v1.C...
method defaultTargetCapacityType (line 193) | func (b *CreateFleetInputBuilder) defaultTargetCapacityType() ec2types...
method Build (line 209) | func (b *CreateFleetInputBuilder) Build() *ec2.CreateFleetInput {
function NewCreateFleetInputBuilder (line 158) | func NewCreateFleetInputBuilder(capacityType string, tags map[string]str...
FILE: pkg/providers/instanceprofile/instanceprofile.go
type Provider (line 37) | type Provider interface
type DefaultProvider (line 47) | type DefaultProvider struct
method Get (line 75) | func (p *DefaultProvider) Get(ctx context.Context, instanceProfileName...
method Create (line 90) | func (p *DefaultProvider) Create(
method ensureRole (line 143) | func (p *DefaultProvider) ensureRole(ctx context.Context, instanceProf...
method Delete (line 184) | func (p *DefaultProvider) Delete(ctx context.Context, instanceProfileN...
method ListClusterProfiles (line 212) | func (p *DefaultProvider) ListClusterProfiles(ctx context.Context) ([]...
method ListNodeClassProfiles (line 230) | func (p *DefaultProvider) ListNodeClassProfiles(ctx context.Context, n...
method IsProtected (line 248) | func (p *DefaultProvider) IsProtected(profileName string) bool {
method SetProtectedState (line 253) | func (p *DefaultProvider) SetProtectedState(profileName string, protec...
function NewDefaultProvider (line 55) | func NewDefaultProvider(
function GetProfileCacheKey (line 71) | func GetProfileCacheKey(profileName string) string {
function IsRoleNotFoundError (line 262) | func IsRoleNotFoundError(err error) bool {
type RoleNotFoundErrorCache (line 281) | type RoleNotFoundErrorCache struct
method HasError (line 286) | func (rc RoleNotFoundErrorCache) HasError(roleName string) (error, boo...
method SetError (line 293) | func (rc RoleNotFoundErrorCache) SetError(roleName string, err error) {
FILE: pkg/providers/instanceprofile/suite_test.go
constant nodeRole (line 51) | nodeRole = "NodeRole"
function TestAWS (line 59) | func TestAWS(t *testing.T) {
FILE: pkg/providers/instancetype/instancetype.go
type NodeClass (line 53) | type NodeClass interface
type Provider (line 64) | type Provider interface
type DefaultProvider (line 69) | type DefaultProvider struct
method List (line 123) | func (p *DefaultProvider) List(ctx context.Context, nodeClass NodeClas...
method Get (line 167) | func (p *DefaultProvider) Get(ctx context.Context, nodeClass NodeClass...
method get (line 198) | func (p *DefaultProvider) get(ctx context.Context, nodeClass NodeClass...
method cacheKey (line 219) | func (p *DefaultProvider) cacheKey(nodeClass NodeClass) string {
method UpdateInstanceTypes (line 231) | func (p *DefaultProvider) UpdateInstanceTypes(ctx context.Context) err...
method UpdateInstanceTypeOfferings (line 273) | func (p *DefaultProvider) UpdateInstanceTypeOfferings(ctx context.Cont...
method UpdateInstanceTypeCapacityFromNode (line 326) | func (p *DefaultProvider) UpdateInstanceTypeCapacityFromNode(ctx conte...
method Reset (line 353) | func (p *DefaultProvider) Reset() {
function NewDefaultProvider (line 93) | func NewDefaultProvider(
function discoveredCapacityCacheKey (line 360) | func discoveredCapacityCacheKey(instanceType string, nodeClass NodeClass...
FILE: pkg/providers/instancetype/metrics.go
constant cloudProviderSubsystem (line 26) | cloudProviderSubsystem = "cloudprovider"
constant instanceTypeLabel (line 27) | instanceTypeLabel = "instance_type"
FILE: pkg/providers/instancetype/offering/offering.go
type Provider (line 39) | type Provider interface
type NodeClass (line 43) | type NodeClass interface
type DefaultProvider (line 48) | type DefaultProvider struct
method InjectOfferings (line 70) | func (p *DefaultProvider) InjectOfferings(
method createOfferings (line 103) | func (p *DefaultProvider) createOfferings(
method cacheKeyFromInstanceType (line 200) | func (p *DefaultProvider) cacheKeyFromInstanceType(it *cloudprovider.I...
function NewDefaultProvider (line 56) | func NewDefaultProvider(
FILE: pkg/providers/instancetype/suite_test.go
function TestAWS (line 77) | func TestAWS(t *testing.T) {
function ExpectSameInstanceTypeLists (line 3002) | func ExpectSameInstanceTypeLists(instanceTypesLists ...[]*corecloudprovi...
function ExpectUniqueInstanceTypeLists (line 3023) | func ExpectUniqueInstanceTypeLists(instanceTypesLists ...[]*corecloudpro...
function ExpectIdenticalInstanceTypes (line 3041) | func ExpectIdenticalInstanceTypes(instanceTypes ...*corecloudprovider.In...
function generateSpotPricing (line 3060) | func generateSpotPricing(cp *cloudprovider.CloudProvider, nodePool *karp...
FILE: pkg/providers/instancetype/types.go
constant MemoryAvailable (line 44) | MemoryAvailable = "memory.available"
constant NodeFSAvailable (line 45) | NodeFSAvailable = "nodefs.available"
type ZoneData (line 52) | type ZoneData struct
type Resolver (line 58) | type Resolver interface
type DefaultResolver (line 65) | type DefaultResolver struct
method CacheKey (line 75) | func (d *DefaultResolver) CacheKey(nodeClass NodeClass) string {
method Resolve (line 93) | func (d *DefaultResolver) Resolve(ctx context.Context, info ec2types.I...
function NewDefaultResolver (line 69) | func NewDefaultResolver(region string) *DefaultResolver {
function NewInstanceType (line 123) | func NewInstanceType(
function computeRequirements (line 158) | func computeRequirements(
function getOS (line 306) | func getOS(info ec2types.InstanceTypeInfo, amiFamily amifamily.AMIFamily...
function getArchitecture (line 316) | func getArchitecture(info ec2types.InstanceTypeInfo) string {
function computeCapacity (line 325) | func computeCapacity(ctx context.Context, info ec2types.InstanceTypeInfo...
function cpu (line 345) | func cpu(info ec2types.InstanceTypeInfo) *resource.Quantity {
function memory (line 349) | func memory(ctx context.Context, info ec2types.InstanceTypeInfo) *resour...
function ephemeralStorage (line 362) | func ephemeralStorage(info ec2types.InstanceTypeInfo, amiFamily amifamil...
function awsPodENI (line 400) | func awsPodENI(instanceTypeName string) *resource.Quantity {
function nvidiaGPUs (line 409) | func nvidiaGPUs(info ec2types.InstanceTypeInfo) *resource.Quantity {
function amdGPUs (line 421) | func amdGPUs(info ec2types.InstanceTypeInfo) *resource.Quantity {
function awsNeuronCores (line 433) | func awsNeuronCores(info ec2types.InstanceTypeInfo) *resource.Quantity {
function awsNeuronDevices (line 443) | func awsNeuronDevices(info ec2types.InstanceTypeInfo) *resource.Quantity {
function habanaGaudis (line 453) | func habanaGaudis(info ec2types.InstanceTypeInfo) *resource.Quantity {
function efas (line 465) | func efas(info ec2types.InstanceTypeInfo) *resource.Quantity {
function ENILimitedPods (line 473) | func ENILimitedPods(ctx context.Context, info ec2types.InstanceTypeInfo,...
function privateIPv4Address (line 489) | func privateIPv4Address(instanceTypeName string) *resource.Quantity {
function systemReservedResources (line 498) | func systemReservedResources(systemReserved map[string]string) corev1.Re...
function kubeReservedResources (line 504) | func kubeReservedResources(cpus, pods *resource.Quantity, kubeReserved m...
function evictionThreshold (line 536) | func evictionThreshold(memory *resource.Quantity, storage *resource.Quan...
function pods (line 558) | func pods(ctx context.Context, info ec2types.InstanceTypeInfo, amiFamily...
function lowerKabobCase (line 575) | func lowerKabobCase(s string) string {
function computeEvictionSignal (line 581) | func computeEvictionSignal(capacity resource.Quantity, signalValue strin...
function mustParsePercentage (line 592) | func mustParsePercentage(v string) float64 {
FILE: pkg/providers/instancetype/zz_generated.vpclimits.go
type NetworkCard (line 27) | type NetworkCard struct
type VPCLimits (line 35) | type VPCLimits struct
FILE: pkg/providers/launchtemplate/launchtemplate.go
type defaultProviderOpts (line 58) | type defaultProviderOpts struct
function WithLaunchModeProvider (line 62) | func WithLaunchModeProvider(provider LaunchModeProvider) DefaultProvider...
type DefaultProvider (line 68) | type DefaultProvider struct
method EnsureAll (line 130) | func (p *DefaultProvider) EnsureAll(
method InvalidateCache (line 171) | func (p *DefaultProvider) InvalidateCache(ctx context.Context, ltName ...
method CreateAMIOptions (line 185) | func (p *DefaultProvider) CreateAMIOptions(ctx context.Context, nodeCl...
method ensureLaunchTemplate (line 216) | func (p *DefaultProvider) ensureLaunchTemplate(ctx context.Context, op...
method createLaunchTemplate (line 249) | func (p *DefaultProvider) createLaunchTemplate(ctx context.Context, op...
method hydrateCache (line 339) | func (p *DefaultProvider) hydrateCache(ctx context.Context) {
method cachedEvictedFunc (line 369) | func (p *DefaultProvider) cachedEvictedFunc(ctx context.Context) func(...
method DeleteAll (line 388) | func (p *DefaultProvider) DeleteAll(ctx context.Context, nodeClass *v1...
method ResolveClusterCIDR (line 431) | func (p *DefaultProvider) ResolveClusterCIDR(ctx context.Context) error {
function NewDefaultProvider (line 85) | func NewDefaultProvider(
function LaunchTemplateName (line 181) | func LaunchTemplateName(options *amifamily.LaunchTemplate) string {
function generateNetworkInterfaces (line 264) | func generateNetworkInterfaces(options *amifamily.LaunchTemplate, cluste...
function blockDeviceMappings (line 300) | func blockDeviceMappings(blockDeviceMappings []*v1.BlockDeviceMapping) [...
function volumeSize (line 329) | func volumeSize(quantity *resource.Quantity) *int32 {
function InjectDoNotSyncTaintsLabel (line 460) | func InjectDoNotSyncTaintsLabel(amiFamilyName string, labels map[string]...
FILE: pkg/providers/launchtemplate/suite_test.go
function TestAWS (line 86) | func TestAWS(t *testing.T) {
function ExpectTags (line 2714) | func ExpectTags(tags []ec2types.Tag, expected map[string]string) {
function ExpectLaunchTemplatesCreatedWithUserDataContaining (line 2724) | func ExpectLaunchTemplatesCreatedWithUserDataContaining(substrings ...st...
function ExpectLaunchTemplatesCreatedWithUserDataNotContaining (line 2736) | func ExpectLaunchTemplatesCreatedWithUserDataNotContaining(substrings .....
function ExpectLaunchTemplatesCreatedWithUserData (line 2748) | func ExpectLaunchTemplatesCreatedWithUserData(expected string) {
function ExpectUserDataExistsFromCreatedLaunchTemplates (line 2761) | func ExpectUserDataExistsFromCreatedLaunchTemplates() []string {
function ExpectParseNodeConfigs (line 2773) | func ExpectParseNodeConfigs(userData string) []admv1alpha1.NodeConfig {
function ExpectParseNodeConfigKubeletField (line 2790) | func ExpectParseNodeConfigKubeletField[T any](userData, fieldName string...
FILE: pkg/providers/launchtemplate/types.go
type Provider (line 33) | type Provider interface
type LaunchTemplate (line 42) | type LaunchTemplate struct
type LaunchMode (line 49) | type LaunchMode
constant LaunchModeOpen (line 52) | LaunchModeOpen LaunchMode = iota
constant LaunchModeTargeted (line 53) | LaunchModeTargeted
type LaunchModeProvider (line 56) | type LaunchModeProvider interface
type defaultLaunchModeProvider (line 60) | type defaultLaunchModeProvider struct
method LaunchMode (line 62) | func (defaultLaunchModeProvider) LaunchMode(ctx context.Context) Launc...
type CreateLaunchTemplateInputBuilder (line 69) | type CreateLaunchTemplateInputBuilder struct
method WithLaunchModeProvider (line 89) | func (b *CreateLaunchTemplateInputBuilder) WithLaunchModeProvider(prov...
method Build (line 94) | func (b *CreateLaunchTemplateInputBuilder) Build(ctx context.Context) ...
function NewCreateLaunchTemplateInputBuilder (line 76) | func NewCreateLaunchTemplateInputBuilder(
FILE: pkg/providers/pricing/pricing.go
type Provider (line 43) | type Provider interface
type DefaultProvider (line 58) | type DefaultProvider struct
method InstanceTypes (line 135) | func (p *DefaultProvider) InstanceTypes() []ec2types.InstanceType {
method OnDemandPrice (line 145) | func (p *DefaultProvider) OnDemandPrice(instanceType ec2types.Instance...
method SpotPrice (line 157) | func (p *DefaultProvider) SpotPrice(instanceType ec2types.InstanceType...
method UpdateOnDemandPricing (line 172) | func (p *DefaultProvider) UpdateOnDemandPricing(ctx context.Context) e...
method fetchOnDemandPricing (line 245) | func (p *DefaultProvider) fetchOnDemandPricing(ctx context.Context, ad...
method spotPage (line 300) | func (p *DefaultProvider) spotPage(ctx context.Context, output *ec2.De...
method onDemandPage (line 330) | func (p *DefaultProvider) onDemandPage(ctx context.Context, output *pr...
method UpdateSpotPricing (line 375) | func (p *DefaultProvider) UpdateSpotPricing(ctx context.Context) error {
method LivenessProbe (line 421) | func (p *DefaultProvider) LivenessProbe(_ *http.Request) error {
method Reset (line 439) | func (p *DefaultProvider) Reset() {
type zonal (line 77) | type zonal struct
function combineZonalPricing (line 82) | func combineZonalPricing(pricingData ...zonal) zonal {
function newZonalPricing (line 95) | func newZonalPricing(defaultPrice float64) zonal {
function NewAPI (line 104) | func NewAPI(cfg aws.Config) *pricing.Client {
function NewDefaultProvider (line 120) | func NewDefaultProvider(pricing sdk.PricingAPI, ec2Api sdk.EC2API, regio...
function populateInitialSpotPricing (line 431) | func populateInitialSpotPricing(pricing map[ec2types.InstanceType]float6...
FILE: pkg/providers/securitygroup/securitygroup.go
type Provider (line 36) | type Provider interface
type DefaultProvider (line 40) | type DefaultProvider struct
method List (line 56) | func (p *DefaultProvider) List(ctx context.Context, nodeClass *v1.EC2N...
method getSecurityGroups (line 73) | func (p *DefaultProvider) getSecurityGroups(ctx context.Context, nodeC...
function NewDefaultProvider (line 47) | func NewDefaultProvider(ec2api sdk.EC2API, cache *cache.Cache) *DefaultP...
function getFilterSets (line 101) | func getFilterSets(terms []v1.SecurityGroupSelectorTerm) (res [][]ec2typ...
FILE: pkg/providers/securitygroup/suite_test.go
function TestAWS (line 50) | func TestAWS(t *testing.T) {
function ExpectConsistsOfSecurityGroups (line 589) | func ExpectConsistsOfSecurityGroups(expected, actual []ec2types.Security...
FILE: pkg/providers/sqs/sqs.go
type Provider (line 32) | type Provider interface
type DefaultProvider (line 39) | type DefaultProvider struct
method Name (line 52) | func (p *DefaultProvider) Name() string {
method GetSQSMessages (line 57) | func (p *DefaultProvider) GetSQSMessages(ctx context.Context) ([]*sqst...
method SendMessage (line 79) | func (p *DefaultProvider) SendMessage(ctx context.Context, body any) (...
method DeleteSQSMessage (line 95) | func (p *DefaultProvider) DeleteSQSMessage(ctx context.Context, msg *s...
function NewDefaultProvider (line 45) | func NewDefaultProvider(client sdk.SQSAPI, queueURL string) (*DefaultPro...
function NewSQSProvider (line 107) | func NewSQSProvider(ctx context.Context, sqsapi *sqs.Client) (Provider, ...
FILE: pkg/providers/ssm/provider.go
type Provider (line 30) | type Provider interface
type DefaultProvider (line 34) | type DefaultProvider struct
method Get (line 47) | func (p *DefaultProvider) Get(ctx context.Context, parameter Parameter...
function NewDefaultProvider (line 40) | func NewDefaultProvider(ssmapi sdk.SSMAPI, cache *cache.Cache) *DefaultP...
FILE: pkg/providers/ssm/types.go
constant CustomParameterType (line 25) | CustomParameterType = "custom"
type Parameter (line 28) | type Parameter struct
method GetParameterInput (line 37) | func (p *Parameter) GetParameterInput() *ssm.GetParameterInput {
method CacheKey (line 43) | func (p *Parameter) CacheKey() string {
method GetCacheDuration (line 48) | func (p Parameter) GetCacheDuration() time.Duration {
type CacheEntry (line 55) | type CacheEntry struct
FILE: pkg/providers/subnet/subnet.go
type Provider (line 44) | type Provider interface
type DefaultProvider (line 51) | type DefaultProvider struct
method List (line 82) | func (p *DefaultProvider) List(ctx context.Context, nodeClass *v1.EC2N...
method ZonalSubnetsForLaunch (line 132) | func (p *DefaultProvider) ZonalSubnetsForLaunch(ctx context.Context, n...
method UpdateInflightIPs (line 181) | func (p *DefaultProvider) UpdateInflightIPs(createFleetInput *ec2.Crea...
method LivenessProbe (line 239) | func (p *DefaultProvider) LivenessProbe(_ *http.Request) error {
method minPods (line 246) | func (p *DefaultProvider) minPods(instanceTypes []*cloudprovider.Insta...
type Subnet (line 61) | type Subnet struct
function NewDefaultProvider (line 68) | func NewDefaultProvider(ec2api sdk.EC2API, cache *cache.Cache, available...
function getFilterSets (line 262) | func getFilterSets(terms []v1.SubnetSelectorTerm) (res [][]ec2types.Filt...
FILE: pkg/providers/subnet/suite_test.go
function TestAWS (line 50) | func TestAWS(t *testing.T) {
function ExpectConsistsOfSubnets (line 552) | func ExpectConsistsOfSubnets(expected, actual []ec2types.Subnet) {
FILE: pkg/providers/version/suite_test.go
function TestAWS (line 49) | func TestAWS(t *testing.T) {
FILE: pkg/providers/version/version.go
constant MinK8sVersion (line 43) | MinK8sVersion = "1.26"
constant MaxK8sVersion (line 44) | MaxK8sVersion = "1.35"
type Provider (line 47) | type Provider interface
type DefaultProvider (line 53) | type DefaultProvider struct
method Get (line 68) | func (p *DefaultProvider) Get(ctx context.Context) string {
method UpdateVersion (line 72) | func (p *DefaultProvider) UpdateVersion(ctx context.Context) error {
method UpdateVersionWithValidation (line 90) | func (p *DefaultProvider) UpdateVersionWithValidation(ctx context.Cont...
method getEKSVersion (line 131) | func (p *DefaultProvider) getEKSVersion(ctx context.Context) (string, ...
method getK8sVersion (line 141) | func (p *DefaultProvider) getK8sVersion() (string, error) {
function NewDefaultProvider (line 60) | func NewDefaultProvider(kubernetesInterface kubernetes.Interface, eksapi...
function SupportedK8sVersions (line 108) | func SupportedK8sVersions() []string {
function validateK8sVersion (line 118) | func validateK8sVersion(v string) error {
function SupportsDefaultBind (line 152) | func SupportsDefaultBind(amiVersion string) bool {
FILE: pkg/test/environment.go
function init (line 52) | func init() {
type Environment (line 57) | type Environment struct
method Reset (line 241) | func (env *Environment) Reset() {
function NewEnvironment (line 108) | func NewEnvironment(ctx context.Context, env *coretest.Environment) *Env...
function NodeInstanceIDFieldIndexer (line 284) | func NodeInstanceIDFieldIndexer(ctx context.Context) func(ctrlcache.Cach...
function NodeClaimInstanceIDFieldIndexer (line 299) | func NodeClaimInstanceIDFieldIndexer(ctx context.Context) func(ctrlcache...
FILE: pkg/test/nodeclass.go
function EC2NodeClass (line 29) | func EC2NodeClass(overrides ...v1.EC2NodeClass) *v1.EC2NodeClass {
type TestNodeClass (line 128) | type TestNodeClass struct
method InstanceProfileTags (line 132) | func (t *TestNodeClass) InstanceProfileTags(clusterName string) map[st...
FILE: pkg/test/options.go
type OptionsFields (line 26) | type OptionsFields struct
function Options (line 38) | func Options(overrides ...OptionsFields) *options.Options {
FILE: pkg/test/utils.go
function RemoveNodeClassTagValidation (line 23) | func RemoveNodeClassTagValidation(crds []*apiextensionsv1.CustomResource...
function DisableCapacityReservationIDValidation (line 38) | func DisableCapacityReservationIDValidation(crds []*apiextensionsv1.Cust...
FILE: pkg/utils/suite_test.go
function TestUtils (line 28) | func TestUtils(t *testing.T) {
FILE: pkg/utils/utils.go
function ParseInstanceID (line 41) | func ParseInstanceID(providerID string) (string, error) {
function EC2MergeTags (line 56) | func EC2MergeTags(tags ...map[string]string) []ec2types.Tag {
function IAMMergeTags (line 64) | func IAMMergeTags(tags ...map[string]string) []iamtypes.Tag {
function PrettySlice (line 72) | func PrettySlice[T any](s []T, maxItems int) string {
function WithDefaultFloat64 (line 88) | func WithDefaultFloat64(key string, def float64) float64 {
function GetTags (line 100) | func GetTags(nodeClass *v1.EC2NodeClass, nodeClaim *karpv1.NodeClaim, cl...
function GetNodeClassHash (line 125) | func GetNodeClassHash(nodeClass *v1.EC2NodeClass) string {
FILE: test/hack/resource/clean/main.go
constant sweeperCleanedResourcesTableName (line 35) | sweeperCleanedResourcesTableName = "sweeperCleanedResources"
function main (line 39) | func main() {
FILE: test/hack/resource/count/main.go
constant resourceCountTableName (line 31) | resourceCountTableName = "resourceCount"
function main (line 33) | func main() {
FILE: test/hack/resource/pkg/metrics/metrics.go
constant karpenterMetricRegion (line 28) | karpenterMetricRegion = "us-east-2"
constant karpenterMetricDatabase (line 29) | karpenterMetricDatabase = "karpenterTesting"
type Client (line 32) | type Client interface
type TimeStream (line 36) | type TimeStream struct
method FireMetric (line 44) | func (t *TimeStream) FireMetric(ctx context.Context, tableName string,...
function NewTimeStream (line 40) | func NewTimeStream(cfg aws.Config) *TimeStream {
function WithRegion (line 65) | func WithRegion(region string) func(*timestreamwrite.Options) {
FILE: test/hack/resource/pkg/resourcetypes/eni.go
type ENI (line 29) | type ENI struct
method String (line 37) | func (e *ENI) String() string {
method Global (line 41) | func (e *ENI) Global() bool {
method GetExpired (line 45) | func (e *ENI) GetExpired(ctx context.Context, expirationTime time.Time...
method CountAll (line 83) | func (e *ENI) CountAll(ctx context.Context) (count int, err error) {
method Get (line 92) | func (e *ENI) Get(ctx context.Context, clusterName string) (ids []stri...
method Cleanup (line 113) | func (e *ENI) Cleanup(ctx context.Context, ids []string) ([]string, er...
method getAllENIs (line 130) | func (e *ENI) getAllENIs(ctx context.Context, params *ec2.DescribeNetw...
function NewENI (line 33) | func NewENI(ec2Client *ec2.Client) *ENI {
FILE: test/hack/resource/pkg/resourcetypes/instance.go
type Instance (line 28) | type Instance struct
method String (line 36) | func (i *Instance) String() string {
method Global (line 40) | func (i *Instance) Global() bool {
method GetExpired (line 44) | func (i *Instance) GetExpired(ctx context.Context, expirationTime time...
method CountAll (line 76) | func (i *Instance) CountAll(ctx context.Context) (count int, err error) {
method Get (line 98) | func (i *Instance) Get(ctx context.Context, clusterName string) (ids [...
method Cleanup (line 123) | func (i *Instance) Cleanup(ctx context.Context, ids []string) ([]strin...
method getAllInstances (line 141) | func (i *Instance) getAllInstances(ctx context.Context, params *ec2.De...
function NewInstance (line 32) | func NewInstance(ec2Client *ec2.Client) *Instance {
FILE: test/hack/resource/pkg/resourcetypes/instanceprofile.go
type InstanceProfile (line 30) | type InstanceProfile struct
method String (line 38) | func (ip *InstanceProfile) String() string {
method Global (line 42) | func (ip *InstanceProfile) Global() bool {
method GetExpired (line 46) | func (ip *InstanceProfile) GetExpired(ctx context.Context, expirationT...
method CountAll (line 83) | func (ip *InstanceProfile) CountAll(ctx context.Context) (count int, e...
method Get (line 91) | func (ip *InstanceProfile) Get(ctx context.Context, clusterName string...
method Cleanup (line 119) | func (ip *InstanceProfile) Cleanup(ctx context.Context, names []string...
method getAllInstanceProfiles (line 141) | func (ip *InstanceProfile) getAllInstanceProfiles(ctx context.Context)...
function NewInstanceProfile (line 34) | func NewInstanceProfile(iamClient *iam.Client) *InstanceProfile {
FILE: test/hack/resource/pkg/resourcetypes/launchtemplate.go
type LaunchTemplate (line 28) | type LaunchTemplate struct
method String (line 36) | func (lt *LaunchTemplate) String() string {
method Global (line 40) | func (lt *LaunchTemplate) Global() bool {
method GetExpired (line 44) | func (lt *LaunchTemplate) GetExpired(ctx context.Context, expirationTi...
method CountAll (line 72) | func (lt *LaunchTemplate) CountAll(ctx context.Context) (count int, er...
method Get (line 81) | func (lt *LaunchTemplate) Get(ctx context.Context, clusterName string)...
method Cleanup (line 103) | func (lt *LaunchTemplate) Cleanup(ctx context.Context, names []string)...
method getAllLaunchTemplates (line 119) | func (lt *LaunchTemplate) getAllLaunchTemplates(ctx context.Context, p...
function NewLaunchTemplate (line 32) | func NewLaunchTemplate(ec2Client *ec2.Client) *LaunchTemplate {
FILE: test/hack/resource/pkg/resourcetypes/oidc.go
type OIDC (line 30) | type OIDC struct
method String (line 38) | func (o *OIDC) String() string {
method Global (line 42) | func (o *OIDC) Global() bool {
method GetExpired (line 46) | func (o *OIDC) GetExpired(ctx context.Context, expirationTime time.Tim...
method CountAll (line 83) | func (o *OIDC) CountAll(ctx context.Context) (count int, err error) {
method Get (line 92) | func (o *OIDC) Get(ctx context.Context, clusterName string) (names []s...
method Cleanup (line 98) | func (o *OIDC) Cleanup(ctx context.Context, arns []string) ([]string, ...
function NewOIDC (line 34) | func NewOIDC(iamClient *iam.Client) *OIDC {
FILE: test/hack/resource/pkg/resourcetypes/resourcetypes.go
constant karpenterClusterNameTag (line 23) | karpenterClusterNameTag = "eks:eks-cluster-name"
constant karpenterNodePoolTag (line 24) | karpenterNodePoolTag = "karpenter.sh/nodepool"
constant karpenterLaunchTemplateTag (line 25) | karpenterLaunchTemplateTag = "karpenter.k8s.aws/cluster"
constant karpenterSecurityGroupTag (line 26) | karpenterSecurityGroupTag = "karpenter.sh/discovery"
constant karpenterTestingTag (line 27) | karpenterTestingTag = "testing/cluster"
constant k8sClusterTag (line 28) | k8sClusterTag = "cluster.k8s.amazonaws.com/name"
constant githubRunURLTag (line 29) | githubRunURLTag = "github.com/run-url"
type Type (line 34) | type Type interface
FILE: test/hack/resource/pkg/resourcetypes/securitygroup.go
type SecurityGroup (line 29) | type SecurityGroup struct
method String (line 37) | func (sg *SecurityGroup) String() string {
method Global (line 41) | func (sg *SecurityGroup) Global() bool {
method GetExpired (line 45) | func (sg *SecurityGroup) GetExpired(ctx context.Context, expirationTim...
method CountAll (line 83) | func (sg *SecurityGroup) CountAll(ctx context.Context) (count int, err...
method Get (line 92) | func (sg *SecurityGroup) Get(ctx context.Context, clusterName string) ...
method Cleanup (line 114) | func (sg *SecurityGroup) Cleanup(ctx context.Context, ids []string) ([...
method getAllSecurityGroups (line 131) | func (sg *SecurityGroup) getAllSecurityGroups(ctx context.Context, par...
function NewSecurityGroup (line 33) | func NewSecurityGroup(ec2Client *ec2.Client) *SecurityGroup {
FILE: test/hack/resource/pkg/resourcetypes/stack.go
type Stack (line 28) | type Stack struct
method String (line 36) | func (s *Stack) String() string {
method Global (line 40) | func (s *Stack) Global() bool {
method GetExpired (line 44) | func (s *Stack) GetExpired(ctx context.Context, expirationTime time.Ti...
method CountAll (line 70) | func (s *Stack) CountAll(ctx context.Context) (count int, err error) {
method Get (line 79) | func (s *Stack) Get(ctx context.Context, clusterName string) (names []...
method Cleanup (line 97) | func (s *Stack) Cleanup(ctx context.Context, names []string) ([]string...
method getAllStacks (line 113) | func (s *Stack) getAllStacks(ctx context.Context) (stacks []cloudforma...
function NewStack (line 32) | func NewStack(cloudFormationClient *cloudformation.Client) *Stack {
FILE: test/hack/resource/pkg/resourcetypes/vpc_endpoint.go
type VPCEndpoint (line 27) | type VPCEndpoint struct
method String (line 35) | func (v *VPCEndpoint) String() string {
method Global (line 39) | func (v *VPCEndpoint) Global() bool {
method GetExpired (line 43) | func (v *VPCEndpoint) GetExpired(ctx context.Context, expirationTime t...
method CountAll (line 71) | func (v *VPCEndpoint) CountAll(ctx context.Context) (count int, err er...
method Get (line 80) | func (v *VPCEndpoint) Get(ctx context.Context, clusterName string) (id...
method Cleanup (line 101) | func (v *VPCEndpoint) Cleanup(ctx context.Context, ids []string) ([]st...
method getAllVpcEndpoints (line 110) | func (v *VPCEndpoint) getAllVpcEndpoints(ctx context.Context, params *...
function NewVPCEndpoint (line 31) | func NewVPCEndpoint(ec2Client *ec2.Client) *VPCEndpoint {
FILE: test/hack/resource/pkg/resourcetypes/vpc_peering_connection.go
type VPCPeeringConnection (line 27) | type VPCPeeringConnection struct
method String (line 35) | func (v *VPCPeeringConnection) String() string {
method Global (line 39) | func (v *VPCPeeringConnection) Global() bool {
method GetExpired (line 43) | func (v *VPCPeeringConnection) GetExpired(ctx context.Context, expirat...
method CountAll (line 74) | func (v *VPCPeeringConnection) CountAll(ctx context.Context) (count in...
method Get (line 83) | func (v *VPCPeeringConnection) Get(ctx context.Context, clusterName st...
method Cleanup (line 104) | func (v *VPCPeeringConnection) Cleanup(ctx context.Context, ids []stri...
method getAllVpcPeeringConnections (line 115) | func (v *VPCPeeringConnection) getAllVpcPeeringConnections(ctx context...
function NewVPCPeeringConnection (line 31) | func NewVPCPeeringConnection(ec2Client *ec2.Client) *VPCPeeringConnection {
FILE: test/hack/soak/get_clusters.go
type cluster (line 32) | type cluster struct
constant expirationTTL (line 38) | expirationTTL = time.Hour * 168
function main (line 42) | func main() {
FILE: test/pkg/debug/events.go
type EventClient (line 31) | type EventClient struct
method DumpEvents (line 43) | func (c *EventClient) DumpEvents(ctx context.Context) error {
method dumpPodEvents (line 50) | func (c *EventClient) dumpPodEvents(ctx context.Context) error {
method dumpNodeEvents (line 61) | func (c *EventClient) dumpNodeEvents(ctx context.Context) error {
method GetEvents (line 72) | func (c *EventClient) GetEvents(ctx context.Context, kind string, excl...
function NewEventClient (line 36) | func NewEventClient(kubeClient client.Client) *EventClient {
function filterTestEvents (line 85) | func filterTestEvents(events []corev1.Event, startTime time.Time) []core...
function coallateEvents (line 98) | func coallateEvents(events []corev1.Event) map[corev1.ObjectReference]*c...
function getEventInformation (line 113) | func getEventInformation(o corev1.ObjectReference, el *corev1.EventList)...
FILE: test/pkg/debug/monitor.go
type Monitor (line 31) | type Monitor struct
method MustStart (line 57) | func (m *Monitor) MustStart() {
method Stop (line 64) | func (m *Monitor) Stop() {
function New (line 38) | func New(ctx context.Context, config *rest.Config, kubeClient client.Cli...
function newControllers (line 69) | func newControllers(kubeClient client.Client) []controller.Controller {
FILE: test/pkg/debug/node.go
type NodeController (line 38) | type NodeController struct
method Reconcile (line 48) | func (c *NodeController) Reconcile(ctx context.Context, req reconcile....
method GetInfo (line 60) | func (c *NodeController) GetInfo(ctx context.Context, n *corev1.Node) ...
method Register (line 65) | func (c *NodeController) Register(ctx context.Context, m manager.Manag...
function NewNodeController (line 42) | func NewNodeController(kubeClient client.Client) *NodeController {
FILE: test/pkg/debug/nodeclaim.go
type NodeClaimController (line 35) | type NodeClaimController struct
method Reconcile (line 45) | func (c *NodeClaimController) Reconcile(ctx context.Context, req recon...
method GetInfo (line 57) | func (c *NodeClaimController) GetInfo(nc *karpv1.NodeClaim) string {
method Register (line 66) | func (c *NodeClaimController) Register(_ context.Context, m manager.Ma...
function NewNodeClaimController (line 39) | func NewNodeClaimController(kubeClient client.Client) *NodeClaimControll...
FILE: test/pkg/debug/pod.go
type PodController (line 37) | type PodController struct
method Reconcile (line 47) | func (c *PodController) Reconcile(ctx context.Context, req reconcile.R...
method GetInfo (line 59) | func (c *PodController) GetInfo(p *corev1.Pod) string {
method Register (line 71) | func (c *PodController) Register(_ context.Context, m manager.Manager)...
function NewPodController (line 41) | func NewPodController(kubeClient client.Client) *PodController {
FILE: test/pkg/debug/setup.go
constant NoWatch (line 29) | NoWatch = "NoWatch"
constant NoEvents (line 30) | NoEvents = "NoEvents"
function BeforeEach (line 36) | func BeforeEach(ctx context.Context, config *rest.Config, kubeClient cli...
function AfterEach (line 48) | func AfterEach(ctx context.Context) {
FILE: test/pkg/environment/aws/environment.go
function init (line 53) | func init() {
type Environment (line 62) | type Environment struct
method DefaultEC2NodeClass (line 141) | func (env *Environment) DefaultEC2NodeClass() *v1.EC2NodeClass {
type ZoneInfo (line 83) | type ZoneInfo struct
function NewEnvironment (line 89) | func NewEnvironment(t *testing.T) *Environment {
function GetTimeStreamAPI (line 131) | func GetTimeStreamAPI(ctx context.Context, cfg aws.Config) sdk.Timestrea...
FILE: test/pkg/environment/aws/expectations.go
constant fisRoleName (line 55) | fisRoleName = "FISInterruptionRole"
constant fisTargetLimit (line 56) | fisTargetLimit = 5
constant spotITNAction (line 57) | spotITNAction = "aws:ec2:send-spot-instance-interruptions"
method ExpectWindowsIPAMEnabled (line 60) | func (env *Environment) ExpectWindowsIPAMEnabled() {
method ExpectWindowsIPAMDisabled (line 67) | func (env *Environment) ExpectWindowsIPAMDisabled() {
method ExpectInstance (line 74) | func (env *Environment) ExpectInstance(nodeName string) Assertion {
method ExpectIPv6ClusterDNS (line 78) | func (env *Environment) ExpectIPv6ClusterDNS() string {
method ExpectSpotInterruptionExperiment (line 86) | func (env *Environment) ExpectSpotInterruptionExperiment(instanceIDs ......
method ExpectExperimentTemplateDeleted (line 120) | func (env *Environment) ExpectExperimentTemplateDeleted(id string) {
method EventuallyExpectInstanceProfileExists (line 128) | func (env *Environment) EventuallyExpectInstanceProfileExists(profileNam...
method EventuallyExpectInstanceProfilesNotFound (line 144) | func (env *Environment) EventuallyExpectInstanceProfilesNotFound(profile...
method GetInstance (line 157) | func (env *Environment) GetInstance(nodeName string) ec2types.Instance {
method ExpectInstanceStopped (line 162) | func (env *Environment) ExpectInstanceStopped(nodeName string) {
method ExpectInstanceTerminated (line 172) | func (env *Environment) ExpectInstanceTerminated(nodeName string) {
method GetInstanceByID (line 181) | func (env *Environment) GetInstanceByID(instanceID string) ec2types.Inst...
method GetVolume (line 192) | func (env *Environment) GetVolume(id string) ec2types.Volume {
method GetVolumes (line 198) | func (env *Environment) GetVolumes(ids ...string) []ec2types.Volume {
method GetNetworkInterface (line 206) | func (env *Environment) GetNetworkInterface(id string) ec2types.NetworkI...
method GetNetworkInterfaces (line 212) | func (env *Environment) GetNetworkInterfaces(ids ...string) []ec2types.N...
method GetSpotInstance (line 219) | func (env *Environment) GetSpotInstance(id string) ec2types.SpotInstance...
method GetSubnets (line 231) | func (env *Environment) GetSubnets(tags map[string]string) map[string][]...
type SubnetInfo (line 260) | type SubnetInfo struct
method GetSubnetInfo (line 267) | func (env *Environment) GetSubnetInfo(tags map[string]string) []SubnetIn...
type SecurityGroup (line 304) | type SecurityGroup struct
method GetSecurityGroups (line 310) | func (env *Environment) GetSecurityGroups(tags map[string]string) []Secu...
method ExpectMessagesCreated (line 341) | func (env *Environment) ExpectMessagesCreated(msgs ...any) {
method ExpectParsedProviderID (line 362) | func (env *Environment) ExpectParsedProviderID(providerID string) string {
method K8sVersion (line 369) | func (env *Environment) K8sVersion() string {
method K8sVersionWithOffset (line 375) | func (env *Environment) K8sVersionWithOffset(offset int) string {
method K8sMinorVersion (line 388) | func (env *Environment) K8sMinorVersion() int {
method GetAMIBySSMPath (line 396) | func (env *Environment) GetAMIBySSMPath(ssmPath string) string {
method GetDeprecatedAMI (line 406) | func (env *Environment) GetDeprecatedAMI(amiID string, amifamily string)...
method EventuallyExpectRunInstances (line 455) | func (env *Environment) EventuallyExpectRunInstances(instanceInput *ec2....
method ExpectSpotInterruptionRole (line 474) | func (env *Environment) ExpectSpotInterruptionRole() *iamtypes.Role {
method ExpectAccountID (line 483) | func (env *Environment) ExpectAccountID() string {
method ExpectInstanceProfileCreated (line 490) | func (env *Environment) ExpectInstanceProfileCreated(instanceProfileName...
method ExpectInstanceProfileDeleted (line 512) | func (env *Environment) ExpectInstanceProfileDeleted(instanceProfileName...
function ignoreAlreadyContainsRole (line 528) | func ignoreAlreadyContainsRole(err error) error {
function ExpectInterruptibleCapacityReservationCreated (line 537) | func ExpectInterruptibleCapacityReservationCreated(
function ExpectModifyInterruptibleCapacity (line 574) | func ExpectModifyInterruptibleCapacity(
function ExpectInterruptibleAndSourceCapacityCanceled (line 588) | func ExpectInterruptibleAndSourceCapacityCanceled(
function ExpectCapacityReservationCreated (line 625) | func ExpectCapacityReservationCreated(
function ExpectCapacityReservationsCanceled (line 651) | func ExpectCapacityReservationsCanceled(ctx context.Context, ec2api *ec2...
method EventuallyExpectNodeRoleCreated (line 664) | func (env *Environment) EventuallyExpectNodeRoleCreated(roleName string) {
method ExpectNodeRoleDeleted (line 738) | func (env *Environment) ExpectNodeRoleDeleted(roleName string) {
FILE: test/pkg/environment/aws/metrics.go
constant metricsDefaultRegion (line 36) | metricsDefaultRegion = "us-east-2"
constant databaseName (line 37) | databaseName = "karpenterTesting"
constant tableName (line 38) | tableName = "scaleTestDurations"
type NoOpTimeStreamAPI (line 41) | type NoOpTimeStreamAPI struct
method WriteRecords (line 45) | func (o NoOpTimeStreamAPI) WriteRecords(_ context.Context, _ *timestre...
type EventType (line 49) | type EventType
constant ProvisioningEventType (line 52) | ProvisioningEventType EventType = "provisioning"
constant DeprovisioningEventType (line 53) | DeprovisioningEventType EventType = "deprovisioning"
constant TestCategoryDimension (line 57) | TestCategoryDimension = "category"
constant TestNameDimension (line 58) | TestNameDimension = "name"
constant GitRefDimension (line 59) | GitRefDimension = "gitRef"
constant ProvisionedNodeCountDimension (line 60) | ProvisionedNodeCountDimension = "provisionedNodeCount"
constant DeprovisionedNodeCountDimension (line 61) | DeprovisionedNodeCountDimension = "deprovisionedNodeCount"
constant PodDensityDimension (line 62) | PodDensityDimension = "podDensity"
method MeasureProvisioningDurationFor (line 65) | func (env *Environment) MeasureProvisioningDurationFor(f func(), dimensi...
method MeasureDeprovisioningDurationFor (line 71) | func (env *Environment) MeasureDeprovisioningDurationFor(f func(), dimen...
method MeasureDurationFor (line 78) | func (env *Environment) MeasureDurationFor(f func(), eventType EventType...
method ExpectMetric (line 98) | func (env *Environment) ExpectMetric(name string, value float64, labels ...
FILE: test/pkg/environment/aws/setup.go
method BeforeEach (line 32) | func (env *Environment) BeforeEach() {
method Cleanup (line 37) | func (env *Environment) Cleanup() {
method AfterEach (line 42) | func (env *Environment) AfterEach() {
FILE: test/pkg/environment/common/environment.go
type ContextKey (line 48) | type ContextKey
constant GitRefContextKey (line 51) | GitRefContextKey = ContextKey("gitRef")
type Environment (line 54) | type Environment struct
method Stop (line 88) | func (env *Environment) Stop() {
method DefaultNodePool (line 133) | func (env *Environment) DefaultNodePool(nodeClass *v1.EC2NodeClass) *k...
function NewEnvironment (line 66) | func NewEnvironment(t *testing.T) *Environment {
function NewConfig (line 92) | func NewConfig() *rest.Config {
function NewClient (line 100) | func NewClient(ctx context.Context, config *rest.Config) client.Client {
FILE: test/pkg/environment/common/expectations.go
method ExpectCreated (line 63) | func (env *Environment) ExpectCreated(objects ...client.Object) {
method ExpectDeleted (line 75) | func (env *Environment) ExpectDeleted(objects ...client.Object) {
method ExpectUpdated (line 90) | func (env *Environment) ExpectUpdated(objects ...client.Object) {
method ExpectStatusUpdated (line 111) | func (env *Environment) ExpectStatusUpdated(objects ...client.Object) {
function ReplaceNodeConditions (line 126) | func ReplaceNodeConditions(node *corev1.Node, conds ...corev1.NodeCondit...
method ExpectCreatedOrUpdated (line 141) | func (env *Environment) ExpectCreatedOrUpdated(objects ...client.Object) {
method ExpectSettings (line 158) | func (env *Environment) ExpectSettings() (res []corev1.EnvVar) {
method ExpectSettingsReplaced (line 169) | func (env *Environment) ExpectSettingsReplaced(vars ...corev1.EnvVar) {
method ExpectSettingsOverridden (line 186) | func (env *Environment) ExpectSettingsOverridden(vars ...corev1.EnvVar) {
method ExpectSettingsRemoved (line 210) | func (env *Environment) ExpectSettingsRemoved(vars ...corev1.EnvVar) {
method ExpectConfigMapExists (line 230) | func (env *Environment) ExpectConfigMapExists(key types.NamespacedName) ...
method ExpectConfigMapDataReplaced (line 237) | func (env *Environment) ExpectConfigMapDataReplaced(key types.Namespaced...
method ExpectConfigMapDataOverridden (line 260) | func (env *Environment) ExpectConfigMapDataOverridden(key types.Namespac...
method ExpectPodENIEnabled (line 278) | func (env *Environment) ExpectPodENIEnabled() {
method ExpectPodENIDisabled (line 284) | func (env *Environment) ExpectPodENIDisabled() {
method ExpectPrefixDelegationEnabled (line 290) | func (env *Environment) ExpectPrefixDelegationEnabled() {
method ExpectPrefixDelegationDisabled (line 296) | func (env *Environment) ExpectPrefixDelegationDisabled() {
method ExpectExists (line 302) | func (env *Environment) ExpectExists(obj client.Object) client.Object {
method EventuallyExpectBound (line 310) | func (env *Environment) EventuallyExpectBound(pods ...*corev1.Pod) {
method EventuallyExpectHealthy (line 320) | func (env *Environment) EventuallyExpectHealthy(pods ...*corev1.Pod) {
method EventuallyExpectTerminating (line 325) | func (env *Environment) EventuallyExpectTerminating(pods ...*corev1.Pod) {
method EventuallyExpectTerminatingWithTimeout (line 330) | func (env *Environment) EventuallyExpectTerminatingWithTimeout(timeout t...
method EventuallyExpectNoLeakedKubeNodeLease (line 340) | func (env *Environment) EventuallyExpectNoLeakedKubeNodeLease() {
method EventuallyExpectHealthyWithTimeout (line 351) | func (env *Environment) EventuallyExpectHealthyWithTimeout(timeout time....
method ConsistentlyExpectTerminatingPods (line 364) | func (env *Environment) ConsistentlyExpectTerminatingPods(duration time....
method ConsistentlyExpectActivePods (line 375) | func (env *Environment) ConsistentlyExpectActivePods(duration time.Durat...
method ConsistentlyExpectHealthyPods (line 386) | func (env *Environment) ConsistentlyExpectHealthyPods(duration time.Dura...
method ConsistentlyExpectPendingPods (line 400) | func (env *Environment) ConsistentlyExpectPendingPods(duration time.Dura...
method EventuallyExpectKarpenterRestarted (line 411) | func (env *Environment) EventuallyExpectKarpenterRestarted() {
method ExpectKarpenterLeaseOwnerChanged (line 418) | func (env *Environment) ExpectKarpenterLeaseOwnerChanged() {
method ExpectPodPortForwarded (line 431) | func (env *Environment) ExpectPodPortForwarded(ctx context.Context, pod ...
type PrometheusMetric (line 460) | type PrometheusMetric struct
method ExpectPodMetrics (line 466) | func (env *Environment) ExpectPodMetrics() (res []PrometheusMetric) {
function parseMetricsLine (line 497) | func parseMetricsLine(line string) (metric PrometheusMetric, err error) {
method EventuallyExpectRollout (line 516) | func (env *Environment) EventuallyExpectRollout(name, namespace string) {
method ExpectKarpenterPods (line 547) | func (env *Environment) ExpectKarpenterPods() []*corev1.Pod {
method ExpectActiveKarpenterPodName (line 556) | func (env *Environment) ExpectActiveKarpenterPodName() string {
method ExpectActiveKarpenterPod (line 568) | func (env *Environment) ExpectActiveKarpenterPod() *corev1.Pod {
method EventuallyExpectPendingPodCount (line 577) | func (env *Environment) EventuallyExpectPendingPodCount(selector labels....
method EventuallyExpectBoundPodCount (line 584) | func (env *Environment) EventuallyExpectBoundPodCount(selector labels.Se...
method EventuallyExpectHealthyPodCount (line 601) | func (env *Environment) EventuallyExpectHealthyPodCount(selector labels....
method EventuallyExpectHealthyPodCountWithTimeout (line 607) | func (env *Environment) EventuallyExpectHealthyPodCountWithTimeout(timeo...
method ExpectPodsMatchingSelector (line 617) | func (env *Environment) ExpectPodsMatchingSelector(selector labels.Selec...
method EventuallyExpectUniqueNodeNames (line 625) | func (env *Environment) EventuallyExpectUniqueNodeNames(selector labels....
method eventuallyExpectScaleDown (line 638) | func (env *Environment) eventuallyExpectScaleDown() {
method EventuallyExpectNotFound (line 647) | func (env *Environment) EventuallyExpectNotFound(objects ...client.Objec...
method ExpectCreatedNodeCount (line 658) | func (env *Environment) ExpectCreatedNodeCount(comparator string, count ...
method ExpectNodeCount (line 666) | func (env *Environment) ExpectNodeCount(comparator string, count int) []...
method ExpectNodeClaimCount (line 675) | func (env *Environment) ExpectNodeClaimCount(comparator string, count in...
function NodeClaimNames (line 684) | func NodeClaimNames(nodeClaims []*karpv1.NodeClaim) []string {
function NodeNames (line 690) | func NodeNames(nodes []*corev1.Node) []string {
method ConsistentlyExpectNodeCount (line 696) | func (env *Environment) ConsistentlyExpectNodeCount(comparator string, c...
method ConsistentlyExpectNoDisruptions (line 710) | func (env *Environment) ConsistentlyExpectNoDisruptions(nodeCount int, d...
method ConsistentlyExpectDisruptionsUntilNoneLeft (line 734) | func (env *Environment) ConsistentlyExpectDisruptionsUntilNoneLeft(nodes...
method EventuallyExpectTaintedNodeCount (line 781) | func (env *Environment) EventuallyExpectTaintedNodeCount(comparator stri...
method EventuallyExpectNodesUntaintedWithTimeout (line 793) | func (env *Environment) EventuallyExpectNodesUntaintedWithTimeout(timeou...
method EventuallyExpectLaunchedNodeClaimCount (line 804) | func (env *Environment) EventuallyExpectLaunchedNodeClaimCount(comparato...
method EventuallyExpectNodeCount (line 816) | func (env *Environment) EventuallyExpectNodeCount(comparator string, cou...
method EventuallyExpectNodeCountWithSelector (line 828) | func (env *Environment) EventuallyExpectNodeCountWithSelector(comparator...
method EventuallyExpectCreatedNodeCount (line 840) | func (env *Environment) EventuallyExpectCreatedNodeCount(comparator stri...
method EventuallyExpectDeletedNodeCount (line 852) | func (env *Environment) EventuallyExpectDeletedNodeCount(comparator stri...
method EventuallyExpectDeletedNodeCountWithSelector (line 864) | func (env *Environment) EventuallyExpectDeletedNodeCountWithSelector(com...
method EventuallyExpectInitializedNodeCount (line 879) | func (env *Environment) EventuallyExpectInitializedNodeCount(comparator ...
method EventuallyExpectCreatedNodeClaimCount (line 893) | func (env *Environment) EventuallyExpectCreatedNodeClaimCount(comparator...
method EventuallyExpectNodeClaimsReady (line 906) | func (env *Environment) EventuallyExpectNodeClaimsReady(nodeClaims ...*k...
method EventuallyExpectDrifted (line 917) | func (env *Environment) EventuallyExpectDrifted(nodeClaims ...*karpv1.No...
method ConsistentlyExpectNodeClaimsNotDrifted (line 927) | func (env *Environment) ConsistentlyExpectNodeClaimsNotDrifted(duration ...
method EventuallyExpectConsolidatable (line 939) | func (env *Environment) EventuallyExpectConsolidatable(nodeClaims ...*ka...
method GetNode (line 949) | func (env *Environment) GetNode(nodeName string) corev1.Node {
method ExpectNoCrashes (line 956) | func (env *Environment) ExpectNoCrashes() {
method printControllerLogs (line 969) | func (env *Environment) printControllerLogs(options *corev1.PodLogOption...
method EventuallyExpectMinUtilization (line 998) | func (env *Environment) EventuallyExpectMinUtilization(resource corev1.R...
method EventuallyExpectAvgUtilization (line 1005) | func (env *Environment) EventuallyExpectAvgUtilization(resource corev1.R...
method ExpectDaemonSetEnvironmentVariableUpdated (line 1012) | func (env *Environment) ExpectDaemonSetEnvironmentVariableUpdated(obj cl...
method ForcePodsToSpread (line 1042) | func (env *Environment) ForcePodsToSpread(nodes ...*corev1.Node) {
method ExpectActivePodsForNode (line 1089) | func (env *Environment) ExpectActivePodsForNode(nodeName string) []*core...
method ExpectCABundle (line 1099) | func (env *Environment) ExpectCABundle() string {
method GetDaemonSetCount (line 1113) | func (env *Environment) GetDaemonSetCount(np *karpv1.NodePool) int {
method GetDaemonSetOverhead (line 1134) | func (env *Environment) GetDaemonSetOverhead(np *karpv1.NodePool) corev1...
FILE: test/pkg/environment/common/monitor.go
type Monitor (line 36) | type Monitor struct
method Reset (line 63) | func (m *Monitor) Reset() {
method RestartCount (line 73) | func (m *Monitor) RestartCount(namespace string) map[string]int {
method NodeCount (line 92) | func (m *Monitor) NodeCount() int {
method NodeCountAtReset (line 98) | func (m *Monitor) NodeCountAtReset() int {
method CreatedNodeCount (line 103) | func (m *Monitor) CreatedNodeCount() int {
method NodesAtReset (line 108) | func (m *Monitor) NodesAtReset() []*corev1.Node {
method Nodes (line 115) | func (m *Monitor) Nodes() []*corev1.Node {
method CreatedNodes (line 121) | func (m *Monitor) CreatedNodes() []*corev1.Node {
method DeletedNodes (line 127) | func (m *Monitor) DeletedNodes() []*corev1.Node {
method PendingPods (line 133) | func (m *Monitor) PendingPods(selector labels.Selector) []*corev1.Pod {
method PendingPodsCount (line 146) | func (m *Monitor) PendingPodsCount(selector labels.Selector) int {
method RunningPods (line 151) | func (m *Monitor) RunningPods(selector labels.Selector) []*corev1.Pod {
method RunningPodsCount (line 164) | func (m *Monitor) RunningPodsCount(selector labels.Selector) int {
method poll (line 168) | func (m *Monitor) poll() state {
method AvgUtilization (line 201) | func (m *Monitor) AvgUtilization(resource corev1.ResourceName) float64 {
method MinUtilization (line 210) | func (m *Monitor) MinUtilization(resource corev1.ResourceName) float64 {
method nodeUtilization (line 218) | func (m *Monitor) nodeUtilization(resource corev1.ResourceName) []floa...
type state (line 45) | type state struct
function NewMonitor (line 52) | func NewMonitor(ctx context.Context, kubeClient client.Client) *Monitor {
type copyable (line 236) | type copyable interface
function deepCopyMap (line 240) | func deepCopyMap[K comparable, V copyable[V]](m map[K]V) map[K]V {
function deepCopySlice (line 248) | func deepCopySlice[T copyable[T]](s []T) []T {
FILE: test/pkg/environment/common/setup.go
constant TestingFinalizer (line 48) | TestingFinalizer = "testing/finalizer"
method BeforeEach (line 72) | func (env *Environment) BeforeEach() {
method ExpectCleanCluster (line 82) | func (env *Environment) ExpectCleanCluster() {
method Cleanup (line 107) | func (env *Environment) Cleanup() {
method AfterEach (line 114) | func (env *Environment) AfterEach() {
method CleanupObjects (line 119) | func (env *Environment) CleanupObjects(cleanableObjects ...client.Object) {
method ExpectTestingFinalizerRemoved (line 148) | func (env *Environment) ExpectTestingFinalizerRemoved(obj client.Object)...
FILE: test/suites/ami/suite_test.go
function TestAMI (line 54) | func TestAMI(t *testing.T) {
function getInstanceAttribute (line 421) | func getInstanceAttribute(nodeName string, attribute string) *ec2.Descri...
function EventuallyExpectAMIsToExist (line 434) | func EventuallyExpectAMIsToExist(nodeClass *v1.EC2NodeClass) *v1.EC2Node...
FILE: test/suites/consolidation/suite_test.go
function TestConsolidation (line 53) | func TestConsolidation(t *testing.T) {
FILE: test/suites/drift/suite_test.go
function TestDrift (line 50) | func TestDrift(t *testing.T) {
FILE: test/suites/integration/cni_test.go
function eniLimitedPodsFor (line 69) | func eniLimitedPodsFor(instanceType string) int64 {
function reservedENIsFor (line 78) | func reservedENIsFor(instanceType string) int64 {
FILE: test/suites/integration/extended_resources_test.go
function ExpectNvidiaDevicePluginCreated (line 353) | func ExpectNvidiaDevicePluginCreated() {
function ExpectNeuronDevicePluginCreated (line 425) | func ExpectNeuronDevicePluginCreated() {
function ExpectK8sNeuronSchedulerCreated (line 592) | func ExpectK8sNeuronSchedulerCreated() {
function ExpectNeuronSchedulerExtensionCreated (line 736) | func ExpectNeuronSchedulerExtensionCreated() {
function ExpectAMDDevicePluginCreated (line 938) | func ExpectAMDDevicePluginCreated() {
function ExpectHabanaDevicePluginCreated (line 1012) | func ExpectHabanaDevicePluginCreated() {
function ExpectEFADevicePluginCreated (line 1082) | func ExpectEFADevicePluginCreated() {
FILE: test/suites/integration/nodeclass_test.go
function EventuallyExpectWithDryRunCacheInvalidation (line 169) | func EventuallyExpectWithDryRunCacheInvalidation(f func(g Gomega, curren...
FILE: test/suites/integration/security_group_test.go
function EventuallyExpectSecurityGroups (line 97) | func EventuallyExpectSecurityGroups(env *aws.Environment, nodeClass *v1....
FILE: test/suites/integration/subnet_test.go
function ExpectResourceBasedNamingEnabled (line 147) | func ExpectResourceBasedNamingEnabled(subnetIDs ...string) {
function ExpectResourceBasedNamingDisabled (line 164) | func ExpectResourceBasedNamingDisabled(subnetIDs ...string) {
function ExceptNodeNameToContainInstanceID (line 181) | func ExceptNodeNameToContainInstanceID(nodeName string) {
type SubnetInfo (line 188) | type SubnetInfo struct
function EventuallyExpectSubnets (line 193) | func EventuallyExpectSubnets(env *aws.Environment, nodeClass *v1.EC2Node...
FILE: test/suites/integration/suite_test.go
function TestIntegration (line 33) | func TestIntegration(t *testing.T) {
FILE: test/suites/integration/tags_test.go
constant createdAtTag (line 40) | createdAtTag = "node.k8s.amazonaws.com/createdAt"
FILE: test/suites/interruption/suite_test.go
function TestInterruption (line 50) | func TestInterruption(t *testing.T) {
function scheduledChangeMessage (line 272) | func scheduledChangeMessage(region, accountID, involvedInstanceID string...
FILE: test/suites/ipv6/suite_test.go
function TestIPv6 (line 40) | func TestIPv6(t *testing.T) {
FILE: test/suites/localzone/suite_test.go
function TestLocalZone (line 40) | func TestLocalZone(t *testing.T) {
FILE: test/suites/nodeclaim/suite_test.go
function TestNodeClaim (line 39) | func TestNodeClaim(t *testing.T) {
FILE: test/suites/scale/deprovisioning_test.go
constant deprovisioningTypeKey (line 49) | deprovisioningTypeKey = "testing/deprovisioning-type"
constant consolidationValue (line 50) | consolidationValue = "consolidation"
constant emptinessValue (line 51) | emptinessValue = "emptiness"
constant expirationValue (line 52) | expirationValue = "expiration"
constant noExpirationValue (line 53) | noExpirationValue = "noExpiration"
constant driftValue (line 54) | driftValue = "drift"
constant multipleDeprovisionersTestGroup (line 58) | multipleDeprovisionersTestGroup = "multipleDeprovisioners"
constant consolidationTestGroup (line 59) | consolidationTestGroup = "consolidation"
constant emptinessTestGroup (line 60) | emptinessTestGroup = "emptiness"
constant expirationTestGroup (line 61) | expirationTestGroup = "expiration"
constant driftTestGroup (line 62) | driftTestGroup = "drift"
constant interruptionTestGroup (line 63) | interruptionTestGroup = "interruption"
constant defaultTestName (line 65) | defaultTestName = "default"
function scheduledChangeMessage (line 745) | func scheduledChangeMessage(region, accountID, involvedInstanceID string...
FILE: test/suites/scale/provisioning_test.go
constant testGroup (line 38) | testGroup = "provisioning"
FILE: test/suites/scale/suite_test.go
function TestScale (line 29) | func TestScale(t *testing.T) {
FILE: test/suites/scheduling/suite_test.go
function TestScheduling (line 51) | func TestScheduling(t *testing.T) {
function ephemeralInitContainer (line 1133) | func ephemeralInitContainer(requirements corev1.ResourceRequirements) co...
FILE: test/suites/storage/suite_test.go
function TestStorage (line 53) | func TestStorage(t *testing.T) {
function ExpectSetEBSDriverLimit (line 403) | func ExpectSetEBSDriverLimit(limit int) {
function ExpectRemoveEBSDriverLimit (line 420) | func ExpectRemoveEBSDriverLimit() {
FILE: tools/kompat/cmd/kompat/main.go
constant OutputJSON (line 34) | OutputJSON = "json"
constant OutputYAML (line 35) | OutputYAML = "yaml"
constant OutputTable (line 36) | OutputTable = "table"
constant OutputMarkdown (line 37) | OutputMarkdown = "md"
type GlobalOptions (line 44) | type GlobalOptions struct
type RootOptions (line 50) | type RootOptions struct
function main (line 92) | func main() {
function PrettyEncode (line 108) | func PrettyEncode(data any) string {
function PrettyTable (line 118) | func PrettyTable[T any](data []T, wide bool) string {
FILE: tools/kompat/pkg/kompat/kompat.go
type List (line 42) | type List
method JSON (line 165) | func (k List) JSON() string {
method YAML (line 179) | func (k List) YAML() string {
method Markdown (line 210) | func (k List) Markdown(opts ...Options) string {
method k8sVersions (line 263) | func (k List) k8sVersions() []string {
type Kompat (line 44) | type Kompat struct
method Validate (line 141) | func (k Kompat) Validate() error {
method JSON (line 161) | func (k Kompat) JSON() string {
method YAML (line 175) | func (k Kompat) YAML() string {
method Markdown (line 188) | func (k Kompat) Markdown(_ ...Options) string {
method expand (line 277) | func (k Kompat) expand() map[string][]string {
type Compatibility (line 49) | type Compatibility struct
type Options (line 55) | type Options struct
function IsCompatible (line 60) | func IsCompatible(filePath string, appVersion string, k8sVersion string)...
function Parse (line 92) | func Parse(filePaths ...string) (List, error) {
function toKompats (line 121) | func toKompats(contents []byte) (List, error) {
function mergeOptions (line 256) | func mergeOptions(opts ...Options) Options {
function k8sVersions (line 289) | func k8sVersions(min string, max string) []string {
function toURL (line 300) | func toURL(str string) (string, bool) {
function readFromURL (line 321) | func readFromURL(url string) ([]byte, error) {
function readFromFile (line 340) | func readFromFile(file string) ([]byte, error) {
function semverRange (line 356) | func semverRange(semvers []string, allSemvers ...string) string {
function sortSemvers (line 374) | func sortSemvers(semvers []string) {
Copy disabled (too large)
Download .json
Condensed preview — 982 files, each showing path, character count, and a content snippet. Download the .json file for the full structured content (15,553K chars).
[
{
"path": ".github/ISSUE_TEMPLATE/bug.yaml",
"chars": 1053,
"preview": "name: Bug\ndescription: Report a bug\nlabels:\n- bug\n- needs-triage\nbody:\n- type: markdown\n attributes:\n value: |\n "
},
{
"path": ".github/ISSUE_TEMPLATE/documentation.yaml",
"chars": 695,
"preview": "name: Documentation\ndescription: How the docs be improved?\nlabels:\n- documentation\n- needs-triage\nbody:\n- type: textarea"
},
{
"path": ".github/ISSUE_TEMPLATE/feature.yaml",
"chars": 975,
"preview": "name: Feature\ndescription: Suggest an idea for a new feature\nlabels:\n- feature\n- needs-triage\nbody:\n- type: markdown\n a"
},
{
"path": ".github/actionlint-matcher.json",
"chars": 434,
"preview": "{\n \"problemMatcher\": [\n {\n \"owner\": \"actionlint\",\n \"pattern\": [\n {\n \"regexp\": \"^(?:\\\\x1b\\\\"
},
{
"path": ".github/actions/commit-status/end/action.yaml",
"chars": 1700,
"preview": "name: CommitStatusEnd\ndescription: 'Adds a commit status at the end of the test run based on success, failure, or cancel"
},
{
"path": ".github/actions/commit-status/start/action.yaml",
"chars": 1003,
"preview": "name: CommitStatusStart\ndescription: 'Adds a commit status at the start of the test run to set the status to pending'\nin"
},
{
"path": ".github/actions/deploy-website/action.yml",
"chars": 3461,
"preview": "name: 'Deploy Website to Amplify'\ndescription: 'Build Hugo site and deploy to AWS Amplify'\ninputs:\n role:\n descripti"
},
{
"path": ".github/actions/download-artifact/action.yaml",
"chars": 1235,
"preview": "name: DownloadArtifacts\ndescription: 'Downloads and unarchives artifacts for a workflow that runs on workflow_run so tha"
},
{
"path": ".github/actions/e2e/cleanup/action.yaml",
"chars": 1783,
"preview": "name: Cleanup\ndescription: 'Runs all the cleanup tasks to cleanup resources deployed during E2E'\ninputs:\n account_id:\n "
},
{
"path": ".github/actions/e2e/dump-logs/action.yaml",
"chars": 1348,
"preview": "name: DumpLogs\ndescription: 'Dump logs and debug information from the cluster after a test run'\ninputs:\n account_id:\n "
},
{
"path": ".github/actions/e2e/install-eksctl/action.yaml",
"chars": 806,
"preview": "name: InstallEKSCTL\ndescription: 'Installs eksctl'\ninputs:\n version:\n description: \"Version of EKSCTL to use for the"
},
{
"path": ".github/actions/e2e/install-helm/action.yaml",
"chars": 461,
"preview": "name: InstallHelm\ndescription: 'Installs helm'\ninputs:\n version:\n description: \"Version of Helm to install\"\n requ"
},
{
"path": ".github/actions/e2e/install-karpenter/action.yaml",
"chars": 2546,
"preview": "name: InstallKarpenter\ndescription: 'Installs Go Downloads and installs Karpenter Dependencies'\ninputs:\n account_id:\n "
},
{
"path": ".github/actions/e2e/install-prometheus/action.yaml",
"chars": 1820,
"preview": "name: InstallPrometheus\ndescription: 'Installs prometheus'\ninputs:\n account_id:\n description: \"Account ID to access "
},
{
"path": ".github/actions/e2e/install-prometheus/values.yaml",
"chars": 1838,
"preview": "prometheusOperator:\n tolerations:\n - key: CriticalAddonsOnly\n operator: Exists\n admissionWebhooks:\n patch:\n"
},
{
"path": ".github/actions/e2e/run-tests-private-cluster/action.yaml",
"chars": 6492,
"preview": "name: RunTestsPrivateCluster\ndescription: 'Installs Karpenter, Prometheus, runs tests on private cluster and performs cl"
},
{
"path": ".github/actions/e2e/setup-cluster/action.yaml",
"chars": 12924,
"preview": "name: SetupCluster\ndescription: 'Installs Go Downloads and installs Karpenter Dependencies'\ninputs:\n account_id:\n de"
},
{
"path": ".github/actions/e2e/slack/notify/action.yaml",
"chars": 1957,
"preview": "name: SlackNotify\ndescription: 'Notifies slack of the success or failure of the suite'\ninputs:\n cluster_name:\n descr"
},
{
"path": ".github/actions/e2e/slack/send-message/action.yaml",
"chars": 590,
"preview": "name: SlackSendMessage\ndescription: 'Notifies slack of the success or failure of the suite'\ninputs:\n message:\n descr"
},
{
"path": ".github/actions/e2e/upgrade-crds/action.yaml",
"chars": 1230,
"preview": "name: UpgradeCRDs\ndescription: 'Installs Go Downloads and installs Karpenter Dependencies'\ninputs:\n account_id:\n des"
},
{
"path": ".github/actions/install-deps/action.yaml",
"chars": 1570,
"preview": "name: InstallDependencies\ndescription: 'Installs Go Downloads and installs Karpenter Dependencies'\ninputs:\n k8sVersion:"
},
{
"path": ".github/dependabot.yaml",
"chars": 5539,
"preview": "# See https://docs.github.com/en/github/administering-a-repository/configuration-options-for-dependency-updates#package-"
},
{
"path": ".github/pull-request-template.md",
"chars": 1275,
"preview": "<!-- Please follow the guidelines at https://www.conventionalcommits.org/en/v1.0.0/ and use one of the following in your"
},
{
"path": ".github/security-notice.md",
"chars": 1777,
"preview": "# Github Workflows Security Notice\n\nWriting security workflows that can be accessed by third parties outside of your rep"
},
{
"path": ".github/workflows/approval-comment.yaml",
"chars": 1146,
"preview": "name: ApprovalComment\non:\n pull_request_review:\n types: [submitted]\njobs:\n approval-comment:\n if: startsWith(git"
},
{
"path": ".github/workflows/ci-test.yaml",
"chars": 910,
"preview": "name: CI-TEST\non:\n push:\n branches:\n - 'main'\n - 'release-v*'\n - 'staging/*'\n pull_request:\n workfl"
},
{
"path": ".github/workflows/ci.yaml",
"chars": 511,
"preview": "name: CI\non:\n push:\n branches:\n - 'main'\n - 'release-v*'\n - 'staging/*'\n pull_request:\n workflow_di"
},
{
"path": ".github/workflows/codegen.yaml",
"chars": 2741,
"preview": "name: \"CodeGenCI\"\non:\n workflow_dispatch:\n schedule:\n - cron: '0 13 * * MON'\njobs:\n codegen:\n permissions:\n "
},
{
"path": ".github/workflows/codeql-analysis.yaml",
"chars": 1687,
"preview": "name: \"CodeQL\"\non:\n push:\n branches:\n - 'main'\n - 'release-v*'\n - 'staging/*'\n pull_request:\n sched"
},
{
"path": ".github/workflows/dryrun-gen-pr.yaml",
"chars": 379,
"preview": "name: DryRunGenPR\non:\n pull_request:\n workflow_dispatch:\njobs:\n dryrun-gen:\n if: github.repository == 'aws/karpent"
},
{
"path": ".github/workflows/dryrun-gen.yaml",
"chars": 962,
"preview": "name: DryRunGen\non:\n push:\n branches:\n - 'main'\n - 'release-v*'\n - 'staging/*'\njobs:\n dryrun-gen:\n "
},
{
"path": ".github/workflows/e2e-cleanup.yaml",
"chars": 1349,
"preview": "name: E2ECleanup\non:\n workflow_dispatch:\n inputs:\n cluster_name:\n type: string\n required: true\n "
},
{
"path": ".github/workflows/e2e-matrix-trigger.yaml",
"chars": 1443,
"preview": "name: E2EMatrixTrigger\non:\n schedule:\n - cron: '7 */8 * * *'\n push:\n branches:\n - 'main'\n - 'release-v"
},
{
"path": ".github/workflows/e2e-matrix.yaml",
"chars": 3882,
"preview": "name: E2EMatrix\non:\n workflow_call:\n inputs:\n region:\n type: string\n default: \"us-east-2\"\n k"
},
{
"path": ".github/workflows/e2e-private-cluster-trigger.yaml",
"chars": 593,
"preview": "name: E2EPrivateClusterTrigger\non:\n schedule:\n - cron: '7 0 * * 4'\njobs:\n private-cluster-trigger:\n if: github.r"
},
{
"path": ".github/workflows/e2e-scale-trigger.yaml",
"chars": 1521,
"preview": "name: E2EScaleTrigger\non:\n schedule:\n - cron: '7 18 * * *'\n workflow_run:\n workflows: [ApprovalComment]\n type"
},
{
"path": ".github/workflows/e2e-soak-trigger.yaml",
"chars": 2046,
"preview": "name: E2ESoakTrigger\non:\n schedule:\n - cron: '0 */3 * * *'\njobs:\n resolve_cluster:\n permissions:\n id-token:"
},
{
"path": ".github/workflows/e2e-upgrade.yaml",
"chars": 7532,
"preview": "name: E2EUpgrade\non:\n workflow_dispatch:\n inputs:\n from_git_ref:\n type: string\n required: true\n "
},
{
"path": ".github/workflows/e2e-version-compatibility-trigger.yaml",
"chars": 1661,
"preview": "name: E2EVersionCompatibilityTrigger\non:\n schedule:\n # The test will run every Monday, Thursday at 12:07 AM UTC\n "
},
{
"path": ".github/workflows/e2e.yaml",
"chars": 9959,
"preview": "name: E2E\non:\n workflow_dispatch:\n inputs:\n git_ref:\n type: string\n region:\n type: choice\n "
},
{
"path": ".github/workflows/image-canary.yaml",
"chars": 1402,
"preview": "name: ImageCanary\non:\n workflow_dispatch:\n schedule:\n - cron: '0 */1 * * *'\njobs:\n image-canary:\n runs-on: ubuntu"
},
{
"path": ".github/workflows/postsubmit.yaml",
"chars": 530,
"preview": "name: PostSubmit\non:\n push:\n branches:\n - main\n workflow_dispatch:\njobs:\n postsubmit:\n if: github.reposito"
},
{
"path": ".github/workflows/release.yaml",
"chars": 3102,
"preview": "name: Release\non:\n push:\n # Only release on supported semantic version tagging e.g. v0.0.1-rc.0\n tags:\n - 'v"
},
{
"path": ".github/workflows/resolve-args.yaml",
"chars": 1438,
"preview": "name: ResolveArgs\non:\n workflow_call:\n inputs:\n allowed_comment:\n type: string\n required: true\n "
},
{
"path": ".github/workflows/resource-count.yaml",
"chars": 1167,
"preview": "name: ResourceCount\non:\n schedule:\n - cron: '3 */1 * * *' # every hour\n workflow_dispatch:\npermissions:\n id-token:"
},
{
"path": ".github/workflows/snapshot-pr.yaml",
"chars": 3250,
"preview": "name: SnapshotPR\non:\n workflow_run:\n workflows:\n - ApprovalComment\n types:\n - completed\njobs:\n snapsho"
},
{
"path": ".github/workflows/snapshot.yaml",
"chars": 805,
"preview": "name: Snapshot\non:\n push:\n branches:\n - 'main'\n - 'release-v*'\n - 'staging/*'\njobs:\n snapshot:\n p"
},
{
"path": ".github/workflows/stale.yaml",
"chars": 1644,
"preview": "name: StaleBot\non:\n workflow_dispatch:\n schedule:\n - cron: '0 12 * * *'\njobs:\n StaleBot:\n runs-on: ubuntu-lates"
},
{
"path": ".github/workflows/sweeper.yaml",
"chars": 1443,
"preview": "name: Sweeper\non:\n schedule:\n - cron: '0 */12 * * *'\n workflow_dispatch:\njobs:\n sweeper:\n permissions:\n id"
},
{
"path": ".github/workflows/website-cleanup-preview.yaml",
"chars": 1119,
"preview": "name: Cleanup Website PR Preview\non:\n pull_request_target:\n types: [ closed ]\njobs:\n cleanup:\n runs-on: ubuntu-l"
},
{
"path": ".github/workflows/website-deploy.yaml",
"chars": 735,
"preview": "name: Deploy Website to Amplify\non:\n push:\n branches: [ main ]\n paths: [ website/** ]\njobs:\n deploy:\n runs-on"
},
{
"path": ".github/workflows/website-preview-trigger.yaml",
"chars": 954,
"preview": "name: WebsitePreviewTrigger\non:\n pull_request:\n types: [ opened, synchronize, reopened ]\njobs:\n preview-trigger:\n "
},
{
"path": ".github/workflows/website-preview.yaml",
"chars": 3822,
"preview": "name: Deploy Website Preview to Amplify\non:\n workflow_run:\n workflows: [ WebsitePreviewTrigger ]\n types: [ comple"
},
{
"path": ".gitignore",
"chars": 202,
"preview": "# Go toolchain\ncoverage.out\ncoverage.html\n*.test\n*.cpuprofile\n*.heapprofile\ngo.work\ngo.work.sum\n\n# Environment\n.idea\n.vs"
},
{
"path": ".gitmodules",
"chars": 0,
"preview": ""
},
{
"path": ".golangci.yaml",
"chars": 2047,
"preview": "version: \"2\"\nrun:\n tests: true\n timeout: 5m\nlinters:\n enable:\n - asciicheck\n - bidichk\n - copyloopvar\n - "
},
{
"path": ".ko.yaml",
"chars": 132,
"preview": "defaultBaseImage: public.ecr.aws/eks-distro-build-tooling/eks-distro-minimal-base\ndefaultPlatforms:\n - linux/arm64\n - "
},
{
"path": "ADOPTERS.md",
"chars": 9760,
"preview": "# Who is using Karpenter?\nKarpenter has a variety of users and use cases for scaling Kubernetes.\nMany customers want to "
},
{
"path": "CODEOWNERS",
"chars": 243,
"preview": "# Require approvals from someone in the owner team before merging\n# More information here: https://docs.github.com/en/re"
},
{
"path": "CODE_OF_CONDUCT.md",
"chars": 153,
"preview": "# Code of Conduct\nThe Karpenter project follows the [CNCF Community Code of Conduct](https://github.com/cncf/foundation/"
},
{
"path": "LICENSE",
"chars": 11358,
"preview": "\n Apache License\n Version 2.0, January 2004\n "
},
{
"path": "Makefile",
"chars": 9707,
"preview": "CLUSTER_NAME ?= $(shell kubectl config view --minify -o jsonpath='{.clusters[].name}' | rev | cut -d\"/\" -f1 | rev | cut "
},
{
"path": "NOTICE",
"chars": 77,
"preview": "Karpenter\nCopyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n"
},
{
"path": "README.md",
"chars": 2973,
"preview": "[](https://github.co"
},
{
"path": "THIRD_PARTY_LICENSES",
"chars": 241924,
"preview": "** go.uber.org/zap; v1.24.0 ---\n\n\nCopyright (c) 2016-2017 Uber Technologies, Inc.\n\nPermission is hereby granted, free of"
},
{
"path": "charts/index.yaml",
"chars": 31091,
"preview": "apiVersion: v1\nentries:\n karpenter:\n - apiVersion: v2\n appVersion: 0.16.3\n created: \"2022-09-27T14:35:08.091269-"
},
{
"path": "charts/karpenter/.helmignore",
"chars": 349,
"preview": "# Patterns to ignore when building packages.\n# This supports shell glob matching, relative path matching, and\n# negation"
},
{
"path": "charts/karpenter/Chart.yaml",
"chars": 1093,
"preview": "apiVersion: v2\nname: karpenter\ndescription: A Helm chart for Karpenter, an open-source node provisioning project built f"
},
{
"path": "charts/karpenter/README.md",
"chars": 13693,
"preview": "# karpenter\n\nA Helm chart for Karpenter, an open-source node provisioning project built for Kubernetes.\n\n![Version: 1.10"
},
{
"path": "charts/karpenter/README.md.gotmpl",
"chars": 2025,
"preview": "{{ template \"chart.header\" . }}\n{{ template \"chart.description\" . }}\n\n{{ template \"chart.versionBadge\" . }}{{ template \""
},
{
"path": "charts/karpenter/artifacthub-repo.yaml",
"chars": 197,
"preview": "repositoryID: 356cb63f-9ee3-4956-9c20-003e416715c7\nowners: []\n# - name: awsadmin1\n# email: artifacthub1@aws.com\nig"
},
{
"path": "charts/karpenter/templates/_helpers.tpl",
"chars": 5443,
"preview": "{{/*\nExpand the name of the chart.\n*/}}\n{{- define \"karpenter.name\" -}}\n{{- default .Chart.Name .Values.nameOverride | t"
},
{
"path": "charts/karpenter/templates/aggregate-clusterrole.yaml",
"chars": 667,
"preview": "apiVersion: rbac.authorization.k8s.io/v1\nkind: ClusterRole\nmetadata:\n name: {{ include \"karpenter.fullname\" . }}-admin\n"
},
{
"path": "charts/karpenter/templates/clusterrole-core.yaml",
"chars": 2338,
"preview": "apiVersion: rbac.authorization.k8s.io/v1\nkind: ClusterRoleBinding\nmetadata:\n name: {{ include \"karpenter.fullname\" . }}"
},
{
"path": "charts/karpenter/templates/clusterrole.yaml",
"chars": 1075,
"preview": "apiVersion: rbac.authorization.k8s.io/v1\nkind: ClusterRoleBinding\nmetadata:\n name: {{ include \"karpenter.fullname\" . }}"
},
{
"path": "charts/karpenter/templates/deployment.yaml",
"chars": 9888,
"preview": "apiVersion: apps/v1\nkind: Deployment\nmetadata:\n name: {{ include \"karpenter.fullname\" . }}\n namespace: {{ .Release.Nam"
},
{
"path": "charts/karpenter/templates/poddisruptionbudget.yaml",
"chars": 504,
"preview": "apiVersion: {{ include \"karpenter.pdb.apiVersion\" . }}\nkind: PodDisruptionBudget\nmetadata:\n name: {{ .Values.podDisrupt"
},
{
"path": "charts/karpenter/templates/role.yaml",
"chars": 1221,
"preview": "apiVersion: rbac.authorization.k8s.io/v1\nkind: Role\nmetadata:\n name: {{ include \"karpenter.fullname\" . }}\n namespace: "
},
{
"path": "charts/karpenter/templates/rolebinding.yaml",
"chars": 1110,
"preview": "apiVersion: rbac.authorization.k8s.io/v1\nkind: RoleBinding\nmetadata:\n name: {{ include \"karpenter.fullname\" . }}\n name"
},
{
"path": "charts/karpenter/templates/service.yaml",
"chars": 692,
"preview": "apiVersion: v1\nkind: Service\nmetadata:\n name: {{ include \"karpenter.fullname\" . }}\n namespace: {{ .Release.Namespace }"
},
{
"path": "charts/karpenter/templates/serviceaccount.yaml",
"chars": 581,
"preview": "{{- if .Values.serviceAccount.create -}}\napiVersion: v1\nkind: ServiceAccount\nmetadata:\n name: {{ include \"karpenter.ser"
},
{
"path": "charts/karpenter/templates/servicemonitor.yaml",
"chars": 1253,
"preview": "{{- if and .Values.serviceMonitor.enabled (.Capabilities.APIVersions.Has \"monitoring.coreos.com/v1\") -}}\napiVersion: mon"
},
{
"path": "charts/karpenter/values.yaml",
"chars": 10768,
"preview": "# -- Overrides the chart's name.\nnameOverride: \"\"\n# -- Overrides the chart's computed fullname.\nfullnameOverride: \"\"\n# -"
},
{
"path": "charts/karpenter-crd/.helmignore",
"chars": 349,
"preview": "# Patterns to ignore when building packages.\n# This supports shell glob matching, relative path matching, and\n# negation"
},
{
"path": "charts/karpenter-crd/Chart.yaml",
"chars": 415,
"preview": "apiVersion: v2\nname: karpenter-crd\ndescription: A Helm chart for Karpenter Custom Resource Definitions (CRDs).\ntype: app"
},
{
"path": "charts/karpenter-crd/README.md",
"chars": 805,
"preview": "# karpenter-crd\n\n ![Type: a"
},
{
"path": "charts/karpenter-crd/README.md.gotmpl",
"chars": 507,
"preview": "{{ template \"chart.header\" . }}\n{{ template \"chart.deprecationWarning\" . }}\n\n{{ template \"chart.badgesSection\" . }}\n\n{{ "
},
{
"path": "charts/karpenter-crd/artifacthub-repo.yaml",
"chars": 201,
"preview": "repositoryID: 2cfb6f76-afe1-447f-b036-cd2e230d07d7\nowners: []\n# - name: awsadmin1\n# email: artifacthub1@aws.com\nig"
},
{
"path": "charts/karpenter-crd/templates/karpenter.k8s.aws_ec2nodeclasses.yaml",
"chars": 51341,
"preview": "---\napiVersion: apiextensions.k8s.io/v1\nkind: CustomResourceDefinition\nmetadata:\n annotations:\n {{- with .Values.add"
},
{
"path": "charts/karpenter-crd/templates/karpenter.sh_nodeclaims.yaml",
"chars": 21818,
"preview": "---\napiVersion: apiextensions.k8s.io/v1\nkind: CustomResourceDefinition\nmetadata:\n annotations:\n {{- with .Values.add"
},
{
"path": "charts/karpenter-crd/templates/karpenter.sh_nodeoverlays.yaml",
"chars": 12807,
"preview": "---\napiVersion: apiextensions.k8s.io/v1\nkind: CustomResourceDefinition\nmetadata:\n annotations:\n {{- with .Values.add"
},
{
"path": "charts/karpenter-crd/templates/karpenter.sh_nodepools.yaml",
"chars": 34831,
"preview": "---\napiVersion: apiextensions.k8s.io/v1\nkind: CustomResourceDefinition\nmetadata:\n annotations:\n {{- with .Values.add"
},
{
"path": "charts/karpenter-crd/values.yaml",
"chars": 91,
"preview": "# -- Additional annotations for the custom resource definitions.\nadditionalAnnotations: {}\n"
},
{
"path": "cmd/controller/main.go",
"chars": 2590,
"preview": "/*\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with t"
},
{
"path": "designs/README.md",
"chars": 587,
"preview": "## Designs\n\nThe designs in this folder are merged RFCs. They are historical artifacts that demonstrate the designs of fe"
},
{
"path": "designs/ami-selector.md",
"chars": 2904,
"preview": "# Background\n\nThe `AMISelector` field of the [`v1alpha1` `AWSNodeTemplate` resource](/pkg/apis/v1alpha1/awsnodetemplate."
},
{
"path": "designs/aws-launch-templates-options.md",
"chars": 11509,
"preview": "# AWS Launch Template Options\n*Authors: JacobGabrielson@*\n## Intro\n\nThis document presents some options for how the AWS-"
},
{
"path": "designs/aws-launch-templates-v2.md",
"chars": 12768,
"preview": "## Karpenter and AWS LaunchTemplates\n\n\nThis document focuses on how to evolve Karpenter’s support for AWS LaunchTemplate"
},
{
"path": "designs/bin-packing.md",
"chars": 2191,
"preview": "# Bin Packing Design Considerations\n*Authors: prateekgogia@*\n\n> Note: this is not a final design; this is still in POC s"
},
{
"path": "designs/capacity-block-support.md",
"chars": 5601,
"preview": "# Capacity Block Support\n\n## Overview\n\nIn v1.3.0 Karpenter introduced formal support for on-demand capacity reservations"
},
{
"path": "designs/consolidation.md",
"chars": 9012,
"preview": "# Cluster Consolidation\n\n## Consolidation Mechanisms\n\nKarpenter will implement two consolidation mechanisms for the firs"
},
{
"path": "designs/custom-user-data-and-amis.md",
"chars": 18348,
"preview": "The goal of this document is to describe how custom user data and AMIs will be supported within Karpenter.\n\n### Current "
},
{
"path": "designs/deprecated-ami-observability.md",
"chars": 6334,
"preview": "# Observability for Deprecated AMIs\n\n## Background\n\nWith the recent introduction of a significant feature through [PR #6"
},
{
"path": "designs/deprovisioning.md",
"chars": 3204,
"preview": "# Karpenter - Deprovisioning Controller\n\nKarpenter will implement a mechanism to detect and reconcile nodes that drift f"
},
{
"path": "designs/integration-testing.md",
"chars": 3581,
"preview": "# Integration Testing\nauthor: @njtran\n\nCurrently, users can only test Karpenter by adding to a list of integration tests"
},
{
"path": "designs/interruption-handling.md",
"chars": 14167,
"preview": "# Spot Interruption Handling in Karpenter\n\n**Author: Brandon Wagner (wagnerbm@)**\n\n## Goals\n\n* Gracefully drain EC2 inst"
},
{
"path": "designs/limits.md",
"chars": 7453,
"preview": "# Karpenter Limits\n\nThis document proposes an approach to limit the scaling that Karpenter will perform in order to cont"
},
{
"path": "designs/metrics.md",
"chars": 25197,
"preview": "# Karpenter Metrics / Dashboard Design\n\n## Motivation\n\nWhile Karpenter already instruments several Prometheus metrics (["
},
{
"path": "designs/node-ownership.md",
"chars": 27273,
"preview": "# Karpenter Node Ownership\n\n_Provisioning is used throughout this doc to reference Karpenter scheduling and spinning up "
},
{
"path": "designs/node-upgrades.md",
"chars": 19335,
"preview": "# Karpenter Node Upgrades - AMI Upgrades\n\n## Overview\n\nKarpenter users are requesting for Node Upgrades, generally askin"
},
{
"path": "designs/odcr.md",
"chars": 35146,
"preview": "# On-Demand Capacity Reservations\n\nThis document proposes supporting ODCR in Karpenter\n\n- [On-Demand Capacity Reservatio"
},
{
"path": "designs/provisioner-priority.md",
"chars": 14267,
"preview": "# Prioritizing Provisioners\n\n## Goals\n\n- Allowing a user to describe a logical ordering to their provisioners\n- Allowing"
},
{
"path": "designs/runtime-defaulting.md",
"chars": 15522,
"preview": "# Parameter Defaulting \n(IP Family, Bare Metal, and Instance Types)\n\n## Goals\n\n* A consistent or understood approach to"
},
{
"path": "designs/termination.md",
"chars": 13917,
"preview": "# Karpenter Graceful Node Termination\n*Authors: njtran@*\n## Overview\nKarpenter's scale down implementation is currently "
},
{
"path": "designs/unmanaged-launch-template-removal.md",
"chars": 6353,
"preview": "# RFC: Unmanaged LaunchTemplate Removal\n\n## Overview\n\nEC2 fleet requires a launch template to be created and referenced "
},
{
"path": "designs/v1-api.md",
"chars": 10445,
"preview": "# Karpenter v1 API\n\n_This RFC is an extension of the [v1 API RFC](https://github.com/kubernetes-sigs/karpenter/blob/main"
},
{
"path": "designs/v1-roadmap.md",
"chars": 6297,
"preview": "# Karpenter v1 Roadmap\n\n_This RFC is an extension of the [v1 Roadmap RFC](https://github.com/kubernetes-sigs/karpenter/b"
},
{
"path": "designs/v1alpha4-api.md",
"chars": 6651,
"preview": "# v1alpha4 API Proposal\nThis document proposes comprehensive Provisioner API improvements prior to the v0.4 release. Due"
},
{
"path": "designs/v1beta1-api.md",
"chars": 13005,
"preview": "# Karpenter v1beta1 APIs\n\nThis document formalizes the [v1beta1 laundry list](https://github.com/aws/karpenter/issues/13"
},
{
"path": "designs/v1beta1-full-changelist.md",
"chars": 15070,
"preview": "# Karpenter v1beta1 Full Change List\n\nThis document formalizes the [v1beta1 laundry list](https://github.com/aws/karpent"
},
{
"path": "examples/README.md",
"chars": 396,
"preview": "## Examples\n\nCheckout example Provisioner and workload specs to demo with Karpenter.\n\n## Usage:\n\nProvisioner specs expec"
},
{
"path": "examples/v1/100-cpu-limit.yaml",
"chars": 1621,
"preview": "# This example NodePool limits the amount of compute managed by\n# Karpenter for this NodePool. Karpenter will not provis"
},
{
"path": "examples/v1/al2-custom-ami.yaml",
"chars": 1918,
"preview": "# This example NodePool will provision instances using a custom EKS-Optimized AMI that belongs to the\n# AL2 AMIFamily. I"
},
{
"path": "examples/v1/al2-custom-userdata.yaml",
"chars": 1870,
"preview": "# This example NodePool will provision instances using the AL2 EKS-Optimized AMI.\n# The UserData defined in spec.UserDat"
},
{
"path": "examples/v1/al2-kubelet-log-query.yaml",
"chars": 2430,
"preview": "# This example NodePool will provision instances using the AL2 EKS-Optimized AMI\n# and will be prepended to a Karpenter "
},
{
"path": "examples/v1/al2023-custom-userdata.yaml",
"chars": 1937,
"preview": "# This example NodePool will provision instances using the AL2023 EKS-Optimized AMI.\n---\napiVersion: karpenter.sh/v1\nkin"
},
{
"path": "examples/v1/bottlerocket.yaml",
"chars": 1780,
"preview": "# This example NodePool will provision instances\n# running Bottlerocket OS\n---\napiVersion: karpenter.sh/v1\nkind: NodePoo"
},
{
"path": "examples/v1/br-custom-userdata.yaml",
"chars": 1629,
"preview": "# This example NodePool will provision instances\n# running Bottlerocket OS and the user data settings specified in\n# thi"
},
{
"path": "examples/v1/custom-family-with-alias.yaml",
"chars": 1981,
"preview": "# This example NodePool provisions instances using an AMI that belongs to a custom AMIFamily with an Alisa\n# Keep in min"
},
{
"path": "examples/v1/custom-family.yaml",
"chars": 1970,
"preview": "# This example NodePool provisions instances using an AMI that belongs to a custom AMIFamily\n# Keep in mind, that you're"
},
{
"path": "examples/v1/general-purpose.yaml",
"chars": 1449,
"preview": "# This example NodePool will provision general purpose instances\n---\napiVersion: karpenter.sh/v1\nkind: NodePool\nmetadata"
},
{
"path": "examples/v1/instance-store-ephemeral-storage.yaml",
"chars": 1693,
"preview": "# This example NodePool will provision AL2 instances with\n# local NVMe instance-store disks used for node ephemeral stor"
},
{
"path": "examples/v1/large-instances.yaml",
"chars": 1280,
"preview": "# This example NodePool will avoid small instance types in the cluster\n---\napiVersion: karpenter.sh/v1\nkind: NodePool\nme"
},
{
"path": "examples/v1/max-node-lifetime.yaml",
"chars": 1820,
"preview": "# This example NodePool will provision instances\n# that are replaced every 7 days and drain after 1 minute\n# with no wor"
},
{
"path": "examples/v1/min-values-family.yaml",
"chars": 1701,
"preview": "# This example will use spot instance type for all provisioned instances\n# and enforces minValues to instance families w"
},
{
"path": "examples/v1/min-values-multiple-keys.yaml",
"chars": 2038,
"preview": "# This example will use spot instance type for all provisioned instances and enforces minValues to various keys where it"
},
{
"path": "examples/v1/multiple-arch.yaml",
"chars": 2332,
"preview": "# This example allows you to create arm64 AND amd64 workloads\n# Karpenter will choose the NodePool that suits the worklo"
},
{
"path": "examples/v1/multiple-ebs.yaml",
"chars": 1872,
"preview": "# This example NodePool will provision instances\n# with multiple EBS volumes attached\n---\napiVersion: karpenter.sh/v1\nki"
},
{
"path": "examples/v1/spot.yaml",
"chars": 1436,
"preview": "# This example will use spot instance type for all\n# provisioned instances\n---\napiVersion: karpenter.sh/v1\nkind: NodePoo"
},
{
"path": "examples/v1/windows-2019.yaml",
"chars": 1532,
"preview": "# This example NodePool will provision instances running Windows Server 2019\n---\napiVersion: karpenter.sh/v1\nkind: NodeP"
},
{
"path": "examples/v1/windows-2022.yaml",
"chars": 1533,
"preview": "# This example NodePool will provision instances running Windows Server 2022\n---\napiVersion: karpenter.sh/v1\nkind: NodeP"
},
{
"path": "examples/v1/windows-2025.yaml",
"chars": 1533,
"preview": "# This example NodePool will provision instances running Windows Server 2025\n---\napiVersion: karpenter.sh/v1\nkind: NodeP"
},
{
"path": "examples/v1/windows-custom-userdata.yaml",
"chars": 1920,
"preview": "# This example NodePool provisions instances using the Windows 2022 EKS-Optimized AMI.\n# The UserData defined in spec.Us"
},
{
"path": "examples/workloads/arm64.yaml",
"chars": 596,
"preview": "apiVersion: apps/v1\nkind: Deployment\nmetadata:\n name: arm64\nspec:\n replicas: 1\n selector:\n matchLabels:\n app:"
},
{
"path": "examples/workloads/disruption-budget.yaml",
"chars": 735,
"preview": "apiVersion: policy/v1\nkind: PodDisruptionBudget\nmetadata:\n name: pdb\nspec:\n minAvailable: \"80%\"\n selector:\n matchL"
},
{
"path": "examples/workloads/gpu-amd.yaml",
"chars": 597,
"preview": "apiVersion: apps/v1\nkind: Deployment\nmetadata:\n name: gpu-amd\nspec:\n replicas: 0\n selector:\n matchLabels:\n ap"
},
{
"path": "examples/workloads/gpu-nvidia.yaml",
"chars": 612,
"preview": "apiVersion: apps/v1\nkind: Deployment\nmetadata:\n name: gpu-nvidia\nspec:\n replicas: 0\n selector:\n matchLabels:\n "
},
{
"path": "examples/workloads/inflate.yaml",
"chars": 536,
"preview": "apiVersion: apps/v1\nkind: Deployment\nmetadata:\n name: inflate\nspec:\n selector:\n matchLabels:\n app: inflate\n t"
},
{
"path": "examples/workloads/neuron.yaml",
"chars": 603,
"preview": "apiVersion: apps/v1\nkind: Deployment\nmetadata:\n name: neuron\nspec:\n replicas: 0\n selector:\n matchLabels:\n app"
},
{
"path": "examples/workloads/prefer-arm.yaml",
"chars": 1049,
"preview": "apiVersion: apps/v1\nkind: Deployment\nmetadata:\n name: prefer-arm\nspec:\n replicas: 0\n selector:\n matchLabels:\n "
},
{
"path": "examples/workloads/spot.yaml",
"chars": 598,
"preview": "apiVersion: apps/v1\nkind: Deployment\nmetadata:\n name: spot\nspec:\n replicas: 0\n selector:\n matchLabels:\n app: "
},
{
"path": "examples/workloads/spread-hostname-zone.yaml",
"chars": 993,
"preview": "apiVersion: apps/v1\nkind: Deployment\nmetadata:\n name: host-zone-spread\nspec:\n replicas: 50\n selector:\n matchLabels"
},
{
"path": "examples/workloads/spread-hostname.yaml",
"chars": 778,
"preview": "apiVersion: apps/v1\nkind: Deployment\nmetadata:\n name: host-spread\nspec:\n replicas: 10\n selector:\n matchLabels:\n "
},
{
"path": "examples/workloads/spread-zone.yaml",
"chars": 783,
"preview": "apiVersion: apps/v1\nkind: Deployment\nmetadata:\n name: zone-spread\nspec:\n replicas: 0\n selector:\n matchLabels:\n "
},
{
"path": "go.mod",
"chars": 6900,
"preview": "module github.com/aws/karpenter-provider-aws\n\ngo 1.26.1\n\n// TODO: migrate tablewriter to v1.0.8\n// https://github.com/ol"
},
{
"path": "go.sum",
"chars": 35563,
"preview": "github.com/Masterminds/semver/v3 v3.4.0 h1:Zog+i5UMtVoCU8oKka5P7i9q9HgrJeGzI9SA1Xbatp0=\ngithub.com/Masterminds/semver/v3"
},
{
"path": "hack/boilerplate.go.txt",
"chars": 531,
"preview": "/*\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with t"
},
{
"path": "hack/boilerplate.sh",
"chars": 215,
"preview": "#!/bin/bash\nset -eu -o pipefail\n\nfor i in $(\n find ./tools ./cmd ./pkg ./test ./hack -name \"*.go\"\n); do\n if ! grep -q "
},
{
"path": "hack/code/bandwidth_gen/example/gp.html",
"chars": 350546,
"preview": "<!DOCTYPE html>\n<html xmlns=\"http://www.w3.org/1999/xhtml\" lang=\"en-US\"><head><meta http-equiv=\"Content-Type\" content=\"t"
},
{
"path": "hack/code/bandwidth_gen/main.go",
"chars": 6220,
"preview": "/*\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with t"
},
{
"path": "hack/code/instancetype_testdata_gen/main.go",
"chars": 12099,
"preview": "/*\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with t"
},
{
"path": "hack/code/prices_gen/main.go",
"chars": 5900,
"preview": "/*\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with t"
},
{
"path": "hack/code/vpc_limits_gen/main.go",
"chars": 1788,
"preview": "/*\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with t"
},
{
"path": "hack/codegen.sh",
"chars": 3320,
"preview": "#!/usr/bin/env bash\nset -euo pipefail\n\nif [ -z ${ENABLE_GIT_PUSH+x} ]; then\n ENABLE_GIT_PUSH=false\nfi\n\necho \"codegen ru"
},
{
"path": "hack/docgen.sh",
"chars": 1222,
"preview": "#!/usr/bin/env bash\nset -euo pipefail\n\ncompatibilitymatrix() {\n # versionCount is the number of K8s versions to displ"
},
{
"path": "hack/docs/compatibilitymatrix_gen/compatibility.yaml",
"chars": 2081,
"preview": "name: \"karpenter\"\ncompatibility:\n - appVersion: 0.21.x\n minK8sVersion: 1.21\n maxK8sVersion: 1.24\n - appVersion: "
},
{
"path": "hack/docs/compatibilitymatrix_gen/main.go",
"chars": 2016,
"preview": "/*\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with t"
},
{
"path": "hack/docs/configuration_gen/main.go",
"chars": 2573,
"preview": "/*\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with t"
},
{
"path": "hack/docs/instancetypes_gen/main.go",
"chars": 8900,
"preview": "/*\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with t"
},
{
"path": "hack/docs/metrics_gen/main.go",
"chars": 12453,
"preview": "/*\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with t"
},
{
"path": "hack/docs/parse-redirects/go.mod",
"chars": 82,
"preview": "module github.com/aws/karpenter-provider-aws/hack/docs/parse-redirects\n\ngo 1.24.4\n"
},
{
"path": "hack/docs/parse-redirects/main.go",
"chars": 2844,
"preview": "/*\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with t"
},
{
"path": "hack/docs/version_compatibility_gen/main.go",
"chars": 1411,
"preview": "/*\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with t"
},
{
"path": "hack/github/community-contributors.sh",
"chars": 3023,
"preview": "#!/usr/bin/env bash\nset -euo pipefail\n\nUSAGE='Usage: '.$0.' [<previous release> <latest release>]'\nTOKEN=$(gh auth token"
},
{
"path": "hack/github/count-flakes.sh",
"chars": 3293,
"preview": "#!/usr/bin/env bash\n# Count test flakes in karpenter PRs using GraphQL for efficiency\n# Flake = matrix run with at least"
},
{
"path": "hack/github/dependabot.sh",
"chars": 981,
"preview": "#!/usr/bin/env bash\nset -euo pipefail\n\n# This script ensures that we get all the directories that contain an \"action.yam"
},
{
"path": "hack/github/feature_request_reactions.py",
"chars": 1734,
"preview": "#!/usr/bin/env python3\n\nimport csv\nimport os\nimport sys\nfrom operator import itemgetter\nfrom typing import Union\n\n# This"
},
{
"path": "hack/github/label_issue_count.py",
"chars": 1320,
"preview": "#!/usr/bin/env python3\n\nimport csv\nimport os\nimport sys\n\n# This script requires the python GitHub client:\n# pip install "
},
{
"path": "hack/github/requirements.txt",
"chars": 15,
"preview": "PyGithub==1.55\n"
},
{
"path": "hack/image_canary.sh",
"chars": 1433,
"preview": "#!/usr/bin/env bash\n\nGH_REPO=\"${GH_REPO:-aws/karpenter-provider-aws}\"\nRELEASE_COUNT=\"${RELEASE_COUNT:-10}\"\n\n# Translates"
},
{
"path": "hack/mutation/crd_annotations.sh",
"chars": 337,
"preview": "#!/usr/bin/env bash\n\n# Add additional annotations variable to the CRDS\n\nCRDS=\"charts/karpenter-crd/templates/*.yaml\"\nfor"
},
{
"path": "hack/release/common.sh",
"chars": 8079,
"preview": "#!/usr/bin/env bash\nset -euo pipefail\n\nECR_GALLERY_NAME=\"karpenter\"\nRELEASE_REPO_ECR=\"public.ecr.aws/${ECR_GALLERY_NAME}"
},
{
"path": "hack/release/prepare-website.sh",
"chars": 451,
"preview": "#!/usr/bin/env bash\nset -euo pipefail\n\nSCRIPT_DIR=\"$(cd -- \"$(dirname -- \"${BASH_SOURCE[0]}\")\" &>/dev/null && pwd)\"\n# sh"
},
{
"path": "hack/release/release.sh",
"chars": 530,
"preview": "#!/usr/bin/env bash\nset -euo pipefail\n\nSCRIPT_DIR=\"$(cd -- \"$(dirname -- \"${BASH_SOURCE[0]}\")\" &>/dev/null && pwd)\"\n# sh"
},
{
"path": "hack/release/snapshot.sh",
"chars": 353,
"preview": "#!/usr/bin/env bash\nset -euo pipefail\n\nSCRIPT_DIR=\"$(cd -- \"$(dirname -- \"${BASH_SOURCE[0]}\")\" &>/dev/null && pwd)\"\n# sh"
},
{
"path": "hack/release/stable-pr.sh",
"chars": 1003,
"preview": "#!/usr/bin/env bash\nset -euo pipefail\n\nSCRIPT_DIR=\"$(cd -- \"$(dirname -- \"${BASH_SOURCE[0]}\")\" &>/dev/null && pwd)\"\n# sh"
},
{
"path": "hack/toolchain.sh",
"chars": 2027,
"preview": "#!/usr/bin/env bash\nset -euo pipefail\n\nK8S_VERSION=\"${K8S_VERSION:=\"1.34.x\"}\"\nKUBEBUILDER_ASSETS=\"${KUBEBUILDER_ASSETS:-"
},
{
"path": "hack/tools/allocatable_diff/README.md",
"chars": 541,
"preview": "# Allocatable Diff Tool\n\nThe allocatable diff tool iterates through your list of currently deployed nodes and compares t"
},
{
"path": "hack/tools/allocatable_diff/main.go",
"chars": 4750,
"preview": "/*\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with t"
},
{
"path": "hack/tools/launchtemplate_counter/main.go",
"chars": 5350,
"preview": "/*\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with t"
},
{
"path": "hack/validation/kubelet.sh",
"chars": 1945,
"preview": "# Kubelet Validation \n\n# The regular expression adds validation for kubelet.kubeReserved and kubelet.systemReserved valu"
},
{
"path": "hack/validation/labels.sh",
"chars": 1487,
"preview": "# Labels Validation\n\nfunction injectDomainLabelRestrictions() {\n domain=$1\n\trule=\"self.all(x, x in [\\\"${domain}/insta"
},
{
"path": "hack/validation/requirements.sh",
"chars": 3057,
"preview": "# Requirements Validation\n\nfunction injectDomainRequirementRestrictions() {\n domain=$1\n rule=\"self in [\\\"${domain}"
},
{
"path": "kwok/Makefile",
"chars": 2837,
"preview": "KARPENTER_NAMESPACE ?= kube-system\nKO_DOCKER_REPO ?= ${AWS_ACCOUNT_ID}.dkr.ecr.${AWS_DEFAULT_REGION}.amazonaws.com/kwok-"
},
{
"path": "kwok/README.md",
"chars": 2718,
"preview": "# AWS KWOK Provider\n\nBefore using the aws kwok provider, make sure that you don't have an installed version of Karpenter"
},
{
"path": "kwok/cloudprovider/cloudprovider.go",
"chars": 2748,
"preview": "// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance wit"
},
{
"path": "kwok/ec2/ec2.go",
"chars": 35447,
"preview": "// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance wit"
},
{
"path": "kwok/ec2/ratelimiting.go",
"chars": 4061,
"preview": "// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance wit"
},
{
"path": "kwok/main.go",
"chars": 2883,
"preview": "// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance wit"
},
{
"path": "kwok/manifests/clusterrole.yaml",
"chars": 529,
"preview": "apiVersion: rbac.authorization.k8s.io/v1\nkind: ClusterRole\nmetadata:\n name: kwok-karpenter-extra\nrules:\n - apiGroups: "
}
]
// ... and 782 more files (download for full content)
About this extraction
This page contains the full source code of the aws/karpenter-provider-aws GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 982 files (14.1 MB), approximately 3.8M tokens, and a symbol index with 1596 extracted functions, classes, methods, constants, and types. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.
Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.