Skip to content

Commit

Permalink
Add module release process (#19)
Browse files Browse the repository at this point in the history
* add startup taint

* add namespace and startup taint to template

* templatlize

* fix vals

* fewer things

* add a few missing values

* create ns

* update values

* add nodeSelector and tolerations

* remove digest

* node group

* fmt

* syntax and startupTaints

* fix syntax

* update values

* remove ng selector

* lower cpu requests

* use digest again

* simplify repository

* fix repository

* escape the .

* fix subnets_name

* subnet selector

* use the outputs from karpenter module

* create instance profile true

* cleanup

* without cluster tag

* pass in vpc

* enable debug and disable serviceMonitor

* fix merge issues

* update resources and set eksControlPlane true

* try enable_pod_identity

* update updated upstream

* more options for namings

* shorter

* validate role name length

* validate event rules name length

* shorter

* shorter still

* fix prefix

* name the queue

* 66 - 3 = 63, limit 64

* longest event name is InstanceStateChange

* another

* maybe

* name

* name_prefix

* or_not

* add module release process

* update module source

* update release actions
  • Loading branch information
morga471 committed Apr 3, 2025
1 parent b159e31 commit 2b84ab9
Show file tree
Hide file tree
Showing 8 changed files with 168 additions and 116 deletions.
40 changes: 40 additions & 0 deletions .github/workflows/terraform-release.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
name: Terraform CI/CD
on:
workflow_dispatch:
pull_request:
types: [closed]
branches:
- main
jobs:
terraform-ci-cd:
runs-on: 229685449397
permissions:
contents: write

steps:
- name: Checkout code
uses: CSVD/gh-actions-checkout@v4

- name: Setup GITHUB Credentials
id: github_credentials
uses: CSVD/gh-auth@main
with:
github_app_pem_file: ${{ secrets.GH_APP_PEM_FILE }}
github_app_installation_id: ${{ vars.GH_APP_INSTALLATION_ID }}
github_app_id: ${{ vars.GH_APP_ID }}

- name: Setup GitHub CLI
run: |
# Force manual authentication since setup-git might not work with GitHub Enterprise
echo "${{ steps.github_credentials.outputs.github_token }}" > /tmp/token.txt
gh auth login --with-token --hostname "github.e.it.census.gov" < /tmp/token.txt
rm /tmp/token.txt
# Test GitHub CLI auth status
gh auth status || echo "GitHub CLI authentication failed"
- name: Run Release Action
uses: CSVD/releaser@main
with:
github-token: ${{ steps.github_credentials.outputs.github_token }}
working-directory: '.'
42 changes: 42 additions & 0 deletions .github/workflows/terraform-validate.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
name: Terraform Validate
on:
pull_request:
workflow_dispatch:

jobs:

terraform-validate:
runs-on: "229685449397"
permissions:
contents: write
steps:
- name: Checkout code
uses: CSVD/gh-actions-checkout@v4

- name: Setup Terraform
uses: CSVD/gh-actions-setup-terraform@v2
with:
terraform_version: '1.7.3'

- name: Validate Terraform Configuration
id: validate
uses: CSVD/terraform-validate@main

- name: Check Validation/Test Results
if: always()
run: |
# Set default values if outputs are empty
IS_VALID="${{ steps.validate.outputs.is_valid }}"
TESTS_PASSED="${{ steps.validate.outputs.tests_passed }}"
# If outputs are empty, set them to false
[ -z "$IS_VALID" ] && IS_VALID="false"
[ -z "$TESTS_PASSED" ] && TESTS_PASSED="false"
if [[ "$IS_VALID" != "true" || "$TESTS_PASSED" != "true" ]]; then
echo "Validation or test errors found:"
echo "${{ steps.validate.outputs.stderr }}"
exit 1
else
echo "All validations and tests passed successfully!"
fi
101 changes: 0 additions & 101 deletions .github/workflows/terragrunt-cicd.yml

This file was deleted.

4 changes: 2 additions & 2 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -32,8 +32,8 @@ The module deploys Karpenter needed AWS resources, namely in IAM. It copies the

| Name | Source | Version |
|------|--------|---------|
| <a name="module_images"></a> [images](#module\_images) | git@github.e.it.census.gov:terraform-modules/aws-ecr-copy-images.git/ | tf-upgrade |
| <a name="module_karpenter_resources"></a> [karpenter\_resources](#module\_karpenter\_resources) | git@github.e.it.census.gov:SCT-Engineering/terraform-aws-eks.git//modules/karpenter | v20.33.1 |
| <a name="module_images"></a> [images](#module\_images) | git::https://github.e.it.census.gov/terraform-modules/aws-ecr-copy-images.git/ | tf-upgrade |
| <a name="module_karpenter_resources"></a> [karpenter\_resources](#module\_karpenter\_resources) | git::https://github.e.it.census.gov/SCT-Engineering/terraform-aws-eks.git//modules/karpenter | v20.35.0 |

## Resources

Expand Down
2 changes: 1 addition & 1 deletion copy_images.tf
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@ locals {
# 224384469011.dkr.ecr.us-gov-east-1.amazonaws.com/platform-test-1/karpenter:0.37.0
# map[repository:224384469011.dkr.ecr.us-gov-east-1.amazonaws.com/platform-test-1/karpenter tag:0.37.0]
module "images" {
source = "git@github.e.it.census.gov:terraform-modules/aws-ecr-copy-images.git/?ref=tf-upgrade"
source = "git::https://github.e.it.census.gov/terraform-modules/aws-ecr-copy-images.git/?ref=tf-upgrade"

profile = var.profile
application_name = var.cluster_name
Expand Down
26 changes: 20 additions & 6 deletions karpenter/values.yaml.tpl
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ settings:
clusterEndpoint: ${cluster_endpoint}
interruptionQueue: ${queue_name}
isolatedVPC: true
eksControlPlane: true
featureGates:
nodeRepair: true
reservedCapacity: true
Expand All @@ -19,17 +20,17 @@ serviceMonitor:
logLevel: debug

controller:
image:
repository: ${repository}
tag: ${tag}
digest: ${digest}
resources:
requests:
cpu: 1m
memory: 1Mi
cpu: 100m
memory: 1Gi
limits:
cpu: 500m
memory: 1Gi
image:
repository: ${repository}
tag: ${tag}
digest: ${digest}
env:
- name: AWS_REGION
value: ${region}
Expand All @@ -40,6 +41,19 @@ controller:
operator: "Exists"
effect: "NoSchedule"

nodeSelector:
kubernetes.io/os: linux

tolerations:
- key: CriticalAddonsOnly
operator: Exists
- key: node-role.kubernetes.io/master
operator: Exists
effect: NoSchedule
- key: node-role.kubernetes.io/control-plane
operator: Exists
effect: NoSchedule

affinity:
nodeAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
Expand Down
32 changes: 26 additions & 6 deletions main.tf
Original file line number Diff line number Diff line change
@@ -1,21 +1,41 @@
locals {
amd_ami_family = "Bottlerocket"
amd_ami_alias = "bottlerocket@latest"

# Calculate the role name with prefix
role_name_raw = format("%v%v-%v", local.prefixes["eks-role"], var.cluster_name, "karpenter-")

# Ensure role name stays within AWS limits (38 chars) when used as name_prefix
max_role_name_length = 37
node_iam_role_name = length(local.role_name_raw) > local.max_role_name_length ? substr(local.role_name_raw, 0, local.max_role_name_length) : local.role_name_raw

# EventBridge rule name validation
# Leave enough space for suffixes like "SpotInterrupt" and unique IDs generated by AWS
# EventBridge has a max length of 64 chars
rule_name_raw = format("%v%v", local.prefixes["event-rule"], var.cluster_name)
max_rule_name_length = 8
rule_name_prefix = length(local.rule_name_raw) > local.max_rule_name_length ? substr(local.rule_name_raw, 0, local.max_rule_name_length) : local.rule_name_raw
queue_name = format("%v%v", local.prefixes["eks-queue"], var.cluster_name)
}

# Replicating from here: https://github.e.it.census.gov/SCT-Engineering/terraform-aws-eks/tree/master/modules/karpenter
# Karpenter IRSA roles and policies
module "karpenter_resources" {
source = "git@github.e.it.census.gov:SCT-Engineering/terraform-aws-eks.git//modules/karpenter?ref=v20.33.1"
source = "git::https://github.e.it.census.gov/SCT-Engineering/terraform-aws-eks.git//modules/karpenter?ref=v20.35.0"

cluster_name = var.cluster_name
enable_irsa = true
irsa_oidc_provider_arn = var.oidc_provider_arn
irsa_namespace_service_accounts = ["${var.namespace}:karpenter"]
create_access_entry = true
create_instance_profile = true
create_node_iam_role = true
create_pod_identity_association = true
enable_irsa = true
enable_pod_identity = true
enable_v1_permissions = true
create_instance_profile = true

irsa_namespace_service_accounts = ["${var.namespace}:karpenter"]
irsa_oidc_provider_arn = var.oidc_provider_arn
node_iam_role_name = local.node_iam_role_name
queue_name = local.queue_name
rule_name_prefix = local.rule_name_prefix
# Attach additional IAM policies to the Karpenter node IAM role
node_iam_role_additional_policies = {
AmazonSSMManagedInstanceCore = format("arn:%v:iam::%v:%v", data.aws_arn.current.partition, "aws", "policy/AmazonSSMManagedInstanceCore")
Expand Down
37 changes: 37 additions & 0 deletions prefixes.tf
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
locals {
prefixes = {
"efs" = "v-efs-"
"s3" = "v-s3-"
"ebs" = "v-ebs-"
"kms" = "k-kms-"
"role" = "r-"
"policy" = "p-"
"group" = "g-"
"security-group" = "" # "sg-"
# VPC
"vpc" = ""
"dhcp-options" = ""
"vpc-peer" = "vpcp-"
"route-table" = "route-"
"subnet" = ""
"vpc-endpoint" = "vpce-"
"elastic-ip" = "eip-"
"nat-gateway" = "nat-"
"internet-gateway" = "igw-"
"network-acl" = "nacl-"
"customer-gateway" = "cgw-"
"vpn-gateway" = "vpcg-"
"vpn-connection" = "vpn_"
"log-group" = "lg-"
"log-stream" = "lgs-"
# EKS
"eks" = "eks-"
"eks-s3" = "v-s3-eks-"
"eks-user" = "s-eks-"
"eks-role" = "r-eks-"
"eks-policy" = "p-eks-"
"eks-security-group" = "eks-sg-" # "sg-eks-"
"event-rule" = "eks-ev-"
"eks-queue" = "eks-q-"
}
}

0 comments on commit 2b84ab9

Please sign in to comment.