Skip to content

Commit ef0762b

Browse files
committed
YOLO
1 parent 08f8a87 commit ef0762b

File tree

21 files changed

+510
-95
lines changed

21 files changed

+510
-95
lines changed

.github/workflows/destroy.yml

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,15 @@ jobs:
2424
echo "MONITORING_NAMESPACE: ${{ vars.MONITORING_NAMESPACE }}"
2525
echo "ARGOCD_NAMESPACE: ${{ vars.ARGOCD_NAMESPACE }}"
2626
echo "APP_NAME: ${{ vars.APP_NAME }}"
27+
echo "KARPENTER_NODEPOOL_NAME: ${{ vars.KARPENTER_NODEPOOL_NAME }}"
28+
echo "KARPENTER_NODECLASS_NAME: ${{ vars.KARPENTER_NODECLASS_NAME }}"
29+
echo "KARPENTER_NAMESPACE: ${{ vars.KARPENTER_NAMESPACE }}"
30+
if [[ -z "${{ vars.KARPENTER_NODEPOOL_NAME }}" ]]; then
31+
echo "WARNING: KARPENTER_NODEPOOL_NAME variable not found. Karpenter resources may not be deployed."
32+
fi
33+
if [[ -z "${{ vars.KARPENTER_NAMESPACE }}" ]]; then
34+
echo "WARNING: KARPENTER_NAMESPACE variable not found. Karpenter resources may not be deployed."
35+
fi
2736
if [[ -z "${{ vars.CLUSTER_NAME }}" ]]; then
2837
echo "ERROR: CLUSTER_NAME variable not found. Infrastructure may not be deployed."
2938
exit 1
@@ -63,6 +72,17 @@ jobs:
6372
kubectl delete application kube-prometheus-stack -n ${{ vars.ARGOCD_NAMESPACE }} --ignore-not-found
6473
continue-on-error: true
6574

75+
# ---------------------------
76+
# Delete Karpenter Resources
77+
# ---------------------------
78+
- name: Delete Karpenter Resources
79+
run: |
80+
kubectl delete nodepool ${{ vars.KARPENTER_NODEPOOL_NAME }} -n ${{ vars.KARPENTER_NAMESPACE }} --ignore-not-found || true
81+
kubectl delete ec2nodeclass ${{ vars.KARPENTER_NODECLASS_NAME }} -n ${{ vars.KARPENTER_NAMESPACE }} --ignore-not-found || true
82+
helm uninstall karpenter-config -n ${{ vars.KARPENTER_NAMESPACE }} || true
83+
helm uninstall karpenter -n ${{ vars.KARPENTER_NAMESPACE }} || true
84+
continue-on-error: true
85+
6686
# ---------------------------
6787
# Uninstall Helm Releases
6888
# ---------------------------
@@ -82,6 +102,7 @@ jobs:
82102
kubectl delete namespace ${{ vars.APP_NAMESPACE }} --ignore-not-found
83103
kubectl delete namespace ${{ vars.MONITORING_NAMESPACE }} --ignore-not-found
84104
kubectl delete namespace ${{ vars.ARGOCD_NAMESPACE }} --ignore-not-found
105+
kubectl delete namespace ${{ vars.KARPENTER_NAMESPACE }} --ignore-not-found
85106
kubectl delete namespace ingress-nginx --ignore-not-found
86107
continue-on-error: true
87108

@@ -133,6 +154,9 @@ jobs:
133154
gh variable delete MONITORING_NAMESPACE --repo $GITHUB_REPOSITORY || true
134155
gh variable delete ARGOCD_NAMESPACE --repo $GITHUB_REPOSITORY || true
135156
gh variable delete APP_NAME --repo $GITHUB_REPOSITORY || true
157+
gh variable delete KARPENTER_NODEPOOL_NAME --repo $GITHUB_REPOSITORY || true
158+
gh variable delete KARPENTER_NODECLASS_NAME --repo $GITHUB_REPOSITORY || true
159+
gh variable delete KARPENTER_NAMESPACE --repo $GITHUB_REPOSITORY || true
136160
env:
137161
GITHUB_TOKEN: ${{ secrets.PAT_GITHUB }}
138162
continue-on-error: true

.github/workflows/karpenter.yml

Lines changed: 108 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,108 @@
1+
name: Karpenter Deployment
2+
on:
3+
workflow_dispatch:
4+
workflow_call:
5+
inputs:
6+
cluster_name:
7+
description: 'EKS Cluster Name'
8+
required: true
9+
type: string
10+
karpenter_nodepool_name:
11+
description: 'Karpenter NodePool Name'
12+
required: true
13+
type: string
14+
karpenter_nodeclass_name:
15+
description: 'Karpenter EC2NodeClass Name'
16+
required: true
17+
type: string
18+
karpenter_node_role:
19+
description: 'Karpenter Node IAM Role'
20+
required: true
21+
type: string
22+
karpenter_instance_profile:
23+
description: 'Karpenter Instance Profile'
24+
required: true
25+
type: string
26+
karpenter_namespace:
27+
description: 'Kubernetes namespace for Karpenter'
28+
required: true
29+
type: string
30+
karpenter_controller_cpu_request:
31+
description: 'CPU request for Karpenter controller'
32+
required: true
33+
type: string
34+
karpenter_controller_memory_request:
35+
description: 'Memory request for Karpenter controller'
36+
required: true
37+
type: string
38+
karpenter_controller_cpu_limit:
39+
description: 'CPU limit for Karpenter controller'
40+
required: true
41+
type: string
42+
karpenter_controller_memory_limit:
43+
description: 'Memory limit for Karpenter controller'
44+
required: true
45+
type: string
46+
47+
jobs:
48+
karpenter:
49+
name: Karpenter Installation & Configuration
50+
runs-on: ubuntu-latest
51+
environment: production
52+
53+
steps:
54+
- name: Checkout Repository
55+
uses: actions/checkout@v5
56+
57+
- name: Configure AWS credentials via OIDC
58+
uses: aws-actions/configure-aws-credentials@v4
59+
with:
60+
role-to-assume: arn:aws:iam::${{ secrets.AWS_ACCOUNT_ID }}:role/GitHubActionsInfraRole
61+
aws-region: us-east-1
62+
63+
- name: Update kubeconfig
64+
run: aws eks update-kubeconfig --name ${{ inputs.cluster_name }} --region us-east-1
65+
66+
- name: Install Helm
67+
uses: azure/[email protected]
68+
with:
69+
version: v3.14.0
70+
71+
- name: Add Karpenter Helm Repo
72+
run: |
73+
helm repo add karpenter https://charts.karpenter.sh/
74+
helm repo update
75+
76+
- name: Install/Upgrade Karpenter
77+
run: |
78+
helm upgrade --install karpenter karpenter/karpenter \
79+
--namespace ${{ inputs.karpenter_namespace }} \
80+
--create-namespace \
81+
--set "settings.clusterName=${{ inputs.cluster_name }}" \
82+
--set "serviceAccount.annotations.eks\.amazonaws\.com/role-arn=arn:aws:iam::${{ secrets.AWS_ACCOUNT_ID }}:role/KarpenterControllerRole-${{ inputs.cluster_name }}" \
83+
--set "settings.defaultInstanceProfile=${{ inputs.karpenter_instance_profile }}" \
84+
--set "settings.interruptionQueue=karpenter-interruption-queue-${{ inputs.cluster_name }}" \
85+
--set controller.resources.requests.cpu=${{ inputs.karpenter_controller_cpu_request }} \
86+
--set controller.resources.requests.memory=${{ inputs.karpenter_controller_memory_request }} \
87+
--set controller.resources.limits.cpu=${{ inputs.karpenter_controller_cpu_limit }} \
88+
--set controller.resources.limits.memory=${{ inputs.karpenter_controller_memory_limit }} \
89+
--wait
90+
91+
- name: Deploy Karpenter NodePool and EC2NodeClass
92+
run: |
93+
export KARPENTER_NODEPOOL_NAME=${{ inputs.karpenter_nodepool_name }}
94+
export KARPENTER_NODECLASS_NAME=${{ inputs.karpenter_nodeclass_name }}
95+
export KARPENTER_NODE_ROLE=${{ inputs.karpenter_node_role }}
96+
export KARPENTER_INSTANCE_PROFILE=${{ inputs.karpenter_instance_profile }}
97+
export KARPENTER_NAMESPACE=${{ inputs.karpenter_namespace }}
98+
export CLUSTER_NAME=${{ inputs.cluster_name }}
99+
envsubst < ./karpenter/karpenter-resources.yml | kubectl apply -f -
100+
101+
- name: Verify Karpenter Installation
102+
run: |
103+
echo "Checking Karpenter controller status..."
104+
kubectl get pods -n ${{ inputs.karpenter_namespace }}
105+
echo "Checking NodePool..."
106+
kubectl get nodepool -n ${{ inputs.karpenter_namespace }}
107+
echo "Checking EC2NodeClass..."
108+
kubectl get ec2nodeclass -n ${{ inputs.karpenter_namespace }}

.github/workflows/main-pipeline.yml

Lines changed: 41 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,11 @@ on:
3434
required: false
3535
default: false
3636
type: boolean
37+
skip-karpenter:
38+
description: 'Skip Karpenter deployment'
39+
required: false
40+
default: false
41+
type: boolean
3742
force-all: # Force all workflows
3843
description: 'Force run all workflows (ignore path detection)'
3944
required: false
@@ -77,6 +82,8 @@ jobs:
7782
infra:
7883
- 'Terraform/**'
7984
- '.github/workflows/terraform.yml'
85+
- '.github/workflows/karpenter.yml'
86+
- 'karpenter/**'
8087
- '.github/workflows/argocd.yml'
8188
- 'argocd/application.yml'
8289
- '.github/workflows/deploy.yml'
@@ -150,14 +157,45 @@ jobs:
150157
id-token: write
151158
actions: read
152159

153-
# ArgoCD - runs after terraform when infra changes or manual dispatch
160+
# Karpenter - runs after terraform when infra changes or manual dispatch
161+
karpenter:
162+
name: Deploy Karpenter
163+
needs: [terraform, detect-changes]
164+
if: |
165+
!cancelled() &&
166+
!inputs.skip-karpenter &&
167+
(needs.terraform.result == 'success' || (needs.terraform.result == 'skipped' && inputs.skip-terraform)) && (
168+
inputs.force-all ||
169+
(github.event_name == 'workflow_dispatch') ||
170+
needs.detect-changes.outputs.infra-changed == 'true'
171+
)
172+
uses: ./.github/workflows/karpenter.yml
173+
secrets: inherit
174+
with:
175+
cluster_name: ${{ needs.terraform.outputs.cluster_name }}
176+
karpenter_nodepool_name: ${{ needs.terraform.outputs.karpenter_nodepool_name }}
177+
karpenter_nodeclass_name: ${{ needs.terraform.outputs.karpenter_nodeclass_name }}
178+
karpenter_node_role: ${{ needs.terraform.outputs.karpenter_node_role }}
179+
karpenter_instance_profile: ${{ needs.terraform.outputs.karpenter_instance_profile }}
180+
karpenter_namespace: ${{ needs.terraform.outputs.karpenter_namespace }}
181+
karpenter_controller_cpu_request: ${{ needs.terraform.outputs.karpenter_controller_cpu_request }}
182+
karpenter_controller_memory_request: ${{ needs.terraform.outputs.karpenter_controller_memory_request }}
183+
karpenter_controller_cpu_limit: ${{ needs.terraform.outputs.karpenter_controller_cpu_limit }}
184+
karpenter_controller_memory_limit: ${{ needs.terraform.outputs.karpenter_controller_memory_limit }}
185+
permissions:
186+
contents: write
187+
packages: write
188+
id-token: write
189+
actions: read
190+
191+
# ArgoCD - runs after karpenter when infra changes or manual dispatch
154192
argocd:
155193
name: Deploy ArgoCD Applications
156-
needs: [terraform, detect-changes]
194+
needs: [terraform, karpenter, detect-changes]
157195
if: |
158196
!cancelled() &&
159197
!inputs.skip-argocd &&
160-
(needs.terraform.result == 'success' || (needs.terraform.result == 'skipped' && inputs.skip-terraform)) && (
198+
(needs.karpenter.result == 'success' || (needs.karpenter.result == 'skipped' && inputs.skip-karpenter)) && (
161199
inputs.force-all ||
162200
(github.event_name == 'workflow_dispatch') ||
163201
needs.detect-changes.outputs.infra-changed == 'true'

.github/workflows/terraform.yml

Lines changed: 57 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,21 @@ on:
2121
app_name:
2222
description: "Application name from Terraform outputs"
2323
value: ${{ jobs.terraform.outputs.app_name }}
24+
karpenter_nodepool_name:
25+
description: "Karpenter NodePool name from Terraform outputs"
26+
value: ${{ jobs.terraform.outputs.karpenter_nodepool_name }}
27+
karpenter_nodeclass_name:
28+
description: "Karpenter EC2NodeClass name from Terraform outputs"
29+
value: ${{ jobs.terraform.outputs.karpenter_nodeclass_name }}
30+
karpenter_node_role:
31+
description: "Karpenter node IAM role from Terraform outputs"
32+
value: ${{ jobs.terraform.outputs.karpenter_node_role }}
33+
karpenter_instance_profile:
34+
description: "Karpenter instance profile from Terraform outputs"
35+
value: ${{ jobs.terraform.outputs.karpenter_instance_profile }}
36+
karpenter_namespace:
37+
description: "Karpenter namespace from Terraform outputs"
38+
value: ${{ jobs.terraform.outputs.karpenter_namespace }}
2439

2540

2641

@@ -40,7 +55,11 @@ jobs:
4055
app_namespace: ${{ steps.terraform-outputs.outputs.app_namespace }}
4156
monitoring_namespace: ${{ steps.terraform-outputs.outputs.monitoring_namespace }}
4257
argocd_namespace: ${{ steps.terraform-outputs.outputs.argocd_namespace }}
43-
app_name: ${{ steps.terraform-outputs.outputs.app_name }}
58+
app_name: ${{ steps.terraform-outputs.outputs.app_name }}
59+
karpenter_nodepool_name: ${{ steps.terraform-outputs.outputs.karpenter_nodepool_name }}
60+
karpenter_nodeclass_name: ${{ steps.terraform-outputs.outputs.karpenter_nodeclass_name }}
61+
karpenter_node_role: ${{ steps.terraform-outputs.outputs.karpenter_node_role }}
62+
karpenter_instance_profile: ${{ steps.terraform-outputs.outputs.karpenter_instance_profile }}
4463

4564
steps:
4665
- name: Checkout Repository
@@ -102,6 +121,33 @@ jobs:
102121
echo "monitoring_namespace=$MONITORING_NAMESPACE" >> $GITHUB_OUTPUT
103122
echo "argocd_namespace=$ARGOCD_NAMESPACE" >> $GITHUB_OUTPUT
104123
echo "app_name=$APP_NAME" >> $GITHUB_OUTPUT
124+
125+
KARPENTER_NODEPOOL_NAME=$(terraform output -raw karpenter_nodepool_name)
126+
KARPENTER_NODECLASS_NAME=$(terraform output -raw karpenter_nodeclass_name)
127+
KARPENTER_NODE_ROLE=$(terraform output -raw karpenter_node_role)
128+
KARPENTER_INSTANCE_PROFILE=$(terraform output -raw karpenter_instance_profile)
129+
KARPENTER_NAMESPACE=$(terraform output -raw karpenter_namespace)
130+
131+
echo "KARPENTER_NODEPOOL_NAME=$KARPENTER_NODEPOOL_NAME" >> $GITHUB_ENV
132+
echo "KARPENTER_NODECLASS_NAME=$KARPENTER_NODECLASS_NAME" >> $GITHUB_ENV
133+
echo "KARPENTER_NODE_ROLE=$KARPENTER_NODE_ROLE" >> $GITHUB_ENV
134+
echo "KARPENTER_INSTANCE_PROFILE=$KARPENTER_INSTANCE_PROFILE" >> $GITHUB_ENV
135+
echo "KARPENTER_NAMESPACE=$KARPENTER_NAMESPACE" >> $GITHUB_ENV
136+
137+
echo "karpenter_nodepool_name=$KARPENTER_NODEPOOL_NAME" >> $GITHUB_OUTPUT
138+
echo "karpenter_nodeclass_name=$KARPENTER_NODECLASS_NAME" >> $GITHUB_OUTPUT
139+
echo "karpenter_node_role=$KARPENTER_NODE_ROLE" >> $GITHUB_OUTPUT
140+
echo "karpenter_instance_profile=$KARPENTER_INSTANCE_PROFILE" >> $GITHUB_OUTPUT
141+
echo "karpenter_namespace=$KARPENTER_NAMESPACE" >> $GITHUB_OUTPUT
142+
KARPENTER_CONTROLLER_CPU_REQUEST=$(terraform output -raw karpenter_controller_cpu_request)
143+
KARPENTER_CONTROLLER_MEMORY_REQUEST=$(terraform output -raw karpenter_controller_memory_request)
144+
KARPENTER_CONTROLLER_CPU_LIMIT=$(terraform output -raw karpenter_controller_cpu_limit)
145+
KARPENTER_CONTROLLER_MEMORY_LIMIT=$(terraform output -raw karpenter_controller_memory_limit)
146+
147+
echo "karpenter_controller_cpu_request=$KARPENTER_CONTROLLER_CPU_REQUEST" >> $GITHUB_OUTPUT
148+
echo "karpenter_controller_memory_request=$KARPENTER_CONTROLLER_MEMORY_REQUEST" >> $GITHUB_OUTPUT
149+
echo "karpenter_controller_cpu_limit=$KARPENTER_CONTROLLER_CPU_LIMIT" >> $GITHUB_OUTPUT
150+
echo "karpenter_controller_memory_limit=$KARPENTER_CONTROLLER_MEMORY_LIMIT" >> $GITHUB_OUTPUT
105151
working-directory: ./Terraform
106152

107153
- name: Set GitHub repository variables
@@ -111,13 +157,23 @@ jobs:
111157
MONITORING_NAMESPACE=$(terraform output -raw monitoring_namespace)
112158
ARGOCD_NAMESPACE=$(terraform output -raw argocd_namespace)
113159
APP_NAME=$(terraform output -raw app_name)
160+
KARPENTER_NODEPOOL_NAME=$(terraform output -raw karpenter_nodepool_name)
161+
KARPENTER_NODECLASS_NAME=$(terraform output -raw karpenter_nodeclass_name)
162+
KARPENTER_NODE_ROLE=$(terraform output -raw karpenter_node_role)
163+
KARPENTER_INSTANCE_PROFILE=$(terraform output -raw karpenter_instance_profile)
164+
KARPENTER_NAMESPACE=$(terraform output -raw karpenter_namespace)
114165
115166
# Create or update repo variables via GitHub CLI
116167
gh variable set CLUSTER_NAME --body "$CLUSTER_NAME" --repo $GITHUB_REPOSITORY
117168
gh variable set APP_NAMESPACE --body "$APP_NAMESPACE" --repo $GITHUB_REPOSITORY
118169
gh variable set MONITORING_NAMESPACE --body "$MONITORING_NAMESPACE" --repo $GITHUB_REPOSITORY
119170
gh variable set ARGOCD_NAMESPACE --body "$ARGOCD_NAMESPACE" --repo $GITHUB_REPOSITORY
120171
gh variable set APP_NAME --body "$APP_NAME" --repo $GITHUB_REPOSITORY
172+
gh variable set KARPENTER_NODEPOOL_NAME --body "$KARPENTER_NODEPOOL_NAME" --repo $GITHUB_REPOSITORY
173+
gh variable set KARPENTER_NODECLASS_NAME --body "$KARPENTER_NODECLASS_NAME" --repo $GITHUB_REPOSITORY
174+
gh variable set KARPENTER_NODE_ROLE --body "$KARPENTER_NODE_ROLE" --repo $GITHUB_REPOSITORY
175+
gh variable set KARPENTER_INSTANCE_PROFILE --body "$KARPENTER_INSTANCE_PROFILE" --repo $GITHUB_REPOSITORY
176+
gh variable set KARPENTER_NAMESPACE --body "$KARPENTER_NAMESPACE" --repo $GITHUB_REPOSITORY
121177
env:
122178
GITHUB_TOKEN: ${{ secrets.PAT_GITHUB }}
123179
working-directory: ./Terraform

.idea/.gitignore

Lines changed: 0 additions & 10 deletions
This file was deleted.

.idea/graduation-project-devops.iml

Lines changed: 0 additions & 20 deletions
This file was deleted.

.idea/misc.xml

Lines changed: 0 additions & 6 deletions
This file was deleted.

.idea/modules.xml

Lines changed: 0 additions & 8 deletions
This file was deleted.

.idea/terraform.xml

Lines changed: 0 additions & 6 deletions
This file was deleted.

.idea/vcs.xml

Lines changed: 0 additions & 6 deletions
This file was deleted.

0 commit comments

Comments
 (0)