Skip to content

Commit

Permalink
πŸ“ docs: Helm Chart λ₯Ό μ΄μš©ν•œ Argo CD 배포
Browse files Browse the repository at this point in the history
  • Loading branch information
Han-Joon-Hyeok committed May 4, 2024
1 parent 8e41a7b commit e8e700d
Show file tree
Hide file tree
Showing 9 changed files with 370 additions and 0 deletions.
9 changes: 9 additions & 0 deletions argocd/helm-charts-generator/output/Chart.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
apiVersion: v2
name: ngnix-demo
description: A Helm chart for Kubernetes

type: application

version: 0.1.0

appVersion: "1.0.0"
35 changes: 35 additions & 0 deletions argocd/helm-charts-generator/output/templates/deployment.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
apiVersion: apps/v1
kind: Deployment
metadata:
name: {{ .Values.app.name }}
labels:
app: {{ .Values.app.name }}
namespace: {{ .Release.Namespace | quote }}
spec:
replicas: {{ .Values.app.replicas }}
selector:
matchLabels:
app: {{ .Values.app.name }}
template:
metadata:
{{- with .Values.podAnnotations }}
annotations:
{{- toYaml .Values.podAnnotations | nindent 8 }}
{{- end }}
labels:
app: {{ .Values.app.name }}
{{- with .Values.podLabels }}
{{- toYaml . | nindent 8 }}
{{- end }}
spec:
containers:
- image: {{ .Values.app.image }}
name: {{ .Values.app.name }}
{{- with .Values.app.resources }}
resources:
{{- toYaml . | nindent 10 }}
{{- end }}
ports:
- name: http
protocol: TCP
containerPort: {{ .Values.app.port }}
22 changes: 22 additions & 0 deletions argocd/helm-charts-generator/output/templates/ingress.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
{{- if .Values.service.enabled }}
{{- if .Values.ingress.enabled }}
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: {{ .Values.app.name }}
namespace: {{ .Release.Namespace | quote }}
spec:
ingressClassName: {{ .Values.ingress.className }}
rules:
- host: {{ .Values.ingress.host }}
http:
paths:
- path: {{ .Values.ingress.path }}
pathType: {{ .Values.ingress.pathType }}
backend:
service:
name: {{ .Values.app.name }}
port:
number: {{ .Values.service.port }}
{{- end }}
{{- end }}
17 changes: 17 additions & 0 deletions argocd/helm-charts-generator/output/templates/service.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
{{- if .Values.service.enabled }}
apiVersion: v1
kind: Service
metadata:
labels:
app: {{ .Values.app.name }}
name: {{ .Values.app.name }}
namespace: {{ .Release.Namespace | quote }}
spec:
ports:
- port: {{ .Values.service.port }}
protocol: TCP
name: http
targetPort: {{ .Values.app.port }}
selector:
app: {{ .Values.app.name }}
{{- end }}
27 changes: 27 additions & 0 deletions argocd/helm-charts-generator/output/values.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
app:
name: "ngnix-demo"
replicas: 1
image: "nginx:stable-alpine3.19-perl"
port: 80
resources:
requests:
cpu: "1m"
memory: "128Mi"
limits:
cpu: "1m"
memory: "128Mi"

podAnnotations: {}
podLabels:
tier: backend

ingress:
enabled: true
className: nginx
host: ""
path: ""
pathType: Prefix

service:
enabled: true
port: 80
260 changes: 260 additions & 0 deletions documents/2024-05-04-helm-chart-with-argocd.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,260 @@
# κ°œμš”

Helm Chart λ₯Ό μ΄μš©ν•΄μ„œ μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ„ Argo CD 둜 λ°°ν¬ν•˜λŠ” 과정을 μ •λ¦¬ν–ˆμŠ΅λ‹ˆλ‹€.

## μ‹€ν–‰ ν™˜κ²½

- OS: Ubuntu 20.04 Desktop
- Helm: v3.14.4
- ArgoCD: v2.9.7

# μž‘μ—… κ³Όμ •

## 1. Helm Chart μ €μž₯ν•˜κΈ° μœ„ν•œ Github Repository 생성

42Cluster-Seoul 의 Github Organization 에 `helm-charts` λΌλŠ” μ΄λ¦„μ˜ [Repository](https://github.com/42Cluster-Seoul/helm-charts) λ₯Ό μƒμ„±ν–ˆμŠ΅λ‹ˆλ‹€.

Github λ₯Ό μ΄μš©ν•΄μ„œ Helm Repo 생성을 ν•˜κΈ° μœ„ν•΄ Github Pages 섀정도 ν•¨κ»˜ ν–ˆμŠ΅λ‹ˆλ‹€.

> 참고자료
>
> - [0. 사전쀀비: github에 helm repository λ§Œλ“€κΈ°](https://happycloud-lee.tistory.com/6) [ν‹°μŠ€ν† λ¦¬]
Helm Chart λ₯Ό Argo CD 둜 λ°°ν¬ν•˜κΈ° μœ„ν•΄ μ‚¬μš©ν•œ 방법은 2κ°€μ§€μž…λ‹ˆλ‹€.

1. Github Pages 을 μ΄μš©ν•œ Helm Repository
2. Github Repository 의 Helm Chart 경둜 지정

μž‘μ—…ν•œ Github Repository μ—λŠ” 2번 방식을 κΈ°μ€€μœΌλ‘œ Shell Script κ°€ μž‘μ„±λ˜μ–΄ μžˆμŠ΅λ‹ˆλ‹€λ§Œ, 1번 방식도 μ •μƒμ μœΌλ‘œ μž‘λ™ν•˜λŠ” 것을 ν™•μΈν–ˆμŠ΅λ‹ˆλ‹€.

μžμ„Έν•œ λ‚΄μš©μ€ **[3. Shell Script μž‘λ™ 원리]** μ—μ„œ μ„€λͺ…ν•˜κ² μŠ΅λ‹ˆλ‹€.

## 2. Helm Chart 생성을 μœ„ν•œ Shell Script μž‘μ„±

μ‚¬μš©μžμ˜ μž…λ ₯을 λ°›μ•„μ„œ Helm Chart λ₯Ό μƒμ„±ν•˜λŠ” Shell Script λ₯Ό μž‘μ„±ν–ˆμŠ΅λ‹ˆλ‹€.

Shell Script λŠ” `helm-charts` Github Repository 에 `helm-charts-generator` 디렉토리 ν•˜μœ„μ— `main.sh` 에 μžˆμŠ΅λ‹ˆλ‹€.

```bash
.
β”œβ”€β”€ README.md
β”œβ”€β”€ helm-charts-generator
β”‚ β”œβ”€β”€ main.sh
β”‚ └── template
β”‚ β”œβ”€β”€ Chart.yaml.template
β”‚ β”œβ”€β”€ templates
β”‚ β”‚ β”œβ”€β”€ application.yaml
β”‚ β”‚ β”œβ”€β”€ deployment.yaml
β”‚ β”‚ β”œβ”€β”€ ingress.yaml
β”‚ β”‚ └── service.yaml
β”‚ └── values.yaml.template
└── stable
```

`main.sh` μ½”λ“œλŠ” μ•„λž˜μ™€ κ°™μŠ΅λ‹ˆλ‹€.

```bash
read -p "Enter the value for application name: " app_name

# Variables
OUTPUT_DIRECTORY="../stable"
DESTINATION_DIRECTORY="$OUTPUT_DIRECTORY/$app_name"
OUTPUT_CHARTS_FILE="$DESTINATION_DIRECTORY/Chart.yaml"
OUTPUT_VALUES_FILE="$DESTINATION_DIRECTORY/values.yaml"
HELM_TEMPLATES_DIRECTORY="template/templates"
GITHUB_REPOSITORY="https://github.com/42Cluster-Seoul/helm-charts"

if [ ! -d "$DESTINATION_DIRECTORY" ]; then
mkdir -p "$DESTINATION_DIRECTORY"
else
rm -rf "$DESTINATION_DIRECTORY"
mkdir -p "$DESTINATION_DIRECTORY"
fi

cp template/values.yaml.template $OUTPUT_VALUES_FILE
cp template/Chart.yaml.template $OUTPUT_CHARTS_FILE

sed -i.tmp "s/\${app_name}/$app_name/g" $OUTPUT_CHARTS_FILE

read -p "Enter replicas count: " replicas_count
read -p "Enter image url: " image_url
read -p "Enter port number: " port_number

sed -i.tmp \
-e "s/\${app_name}/$app_name/g" \
-e "s/\${replicas_count}/$replicas_count/g" \
-e "s/\${image_url}/$image_url/g" \
-e "s/\${port_number}/$port_number/g" \
"$OUTPUT_VALUES_FILE"

rm -f "$OUTPUT_CHARTS_FILE.tmp" "$OUTPUT_VALUES_FILE.tmp"

cp -r "$HELM_TEMPLATES_DIRECTORY" "$DESTINATION_DIRECTORY"

sed -i.tmp "s/\${app_name}/$app_name/g" "$DESTINATION_DIRECTORY/templates/application.yaml"

rm -f "$DESTINATION_DIRECTORY/templates/application.yaml.tmp"

mv "$DESTINATION_DIRECTORY/templates/application.yaml" "$OUTPUT_DIRECTORY/$app_name-applcation.yaml"

echo -e "\nπŸͺ½ New Helm Charts created with app name: $app_name \n"

echo -e "βœ… Lint Check for application: $app_name\n"

helm lint $DESTINATION_DIRECTORY

echo -e "⏫ Uploading Helm Chart to Github Repository: $GITHUB_REPOSITORY \n"

git add $OUTPUT_DIRECTORY
git commit -m "Added new application: $app_name"
git push origin main

echo -e "\nπŸš€ Applying for application: $app_name-application.yaml\n"

kubectl create -f $OUTPUT_DIRECTORY/$app_name-applcation.yaml
```

μž‘λ™ μˆœμ„œλŠ” μ•„λž˜μ™€ κ°™μŠ΅λ‹ˆλ‹€.

### (1) μ• ν”Œλ¦¬μΌ€μ΄μ…˜ 정보 μž…λ ₯

μ•„λž˜μ™€ 같이 4가지 정보λ₯Ό μž…λ ₯ λ°›μŠ΅λ‹ˆλ‹€.

1. μ• ν”Œλ¦¬μΌ€μ΄μ…˜ 이름: λ°°ν¬ν•˜κ³ μž ν•˜λŠ” μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ˜ 이름
2. Replicas 개수: μ‹€ν–‰ν•  νŒŒλ“œμ˜ 개수
3. Image URL: νŒŒλ“œμ— 배포할 μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ˜ 이미지(DockerHub λ“±)의 URL
4. 포트 번호: Ingress λ₯Ό μ‚¬μš©ν•˜κΈ° μœ„ν•œ 포트 번호

### (2) μž…λ ₯ 받은 정보λ₯Ό ν…œν”Œλ¦Ώμ— μž…λ ₯

`sed` λͺ…λ Ήμ–΄λ₯Ό μ΄μš©ν•΄μ„œ ν‘œμ€€ μž…λ ₯으둜 받은 값을 ν…œν”Œλ¦Ώμ— μΉ˜ν™˜ν•©λ‹ˆλ‹€.

### (3) Helm Lint μˆ˜ν–‰

`stable/${app_name}` κ²½λ‘œμ— μƒμ„±λœ Helm Chart κ΄€λ ¨ yaml νŒŒμΌλ“€μ˜ 문법을 ν™•μΈν•˜κΈ° μœ„ν•΄ `helm lint` λ₯Ό μˆ˜ν–‰ν•©λ‹ˆλ‹€.

### (4) Github Repository Push

`stable` κ²½λ‘œμ— μƒμ„±λœ νŒŒμΌμ„ `helm-charts` Repository 에 μ—…λ‘œλ“œν•©λ‹ˆλ‹€.

### (5) Argo CD 배포

`kubectl create -f stable/${app_name}-application.yaml` λͺ…λ Ήμ–΄λ₯Ό μ΄μš©ν•΄μ„œ μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ„ λ°°ν¬ν•©λ‹ˆλ‹€.

## 3. Shell Script μž‘λ™ 원리

`helm-charts-generator/template` κ²½λ‘œμ—λŠ” Helm Chart λ₯Ό κ΅¬μ„±ν•˜κΈ° μœ„ν•œ Chart.yaml, values.yaml, 그리고 μ• ν”Œλ¦¬μΌ€μ΄μ…˜ ꡬ성을 μœ„ν•œ deployment, service, ingress, application(ArgoCD CRD) ν…œν”Œλ¦Ώμ΄ μžˆμŠ΅λ‹ˆλ‹€.

μ‚¬μš©μžλ‘œλΆ€ν„° 받은 μž…λ ₯ 값을 ν…œν”Œλ¦Ώ νŒŒμΌλ“€μ— μž…λ ₯ν•΄μ„œ `stable/${app_name}` κ²½λ‘œμ— μ €μž₯ν•©λ‹ˆλ‹€.

μ΄λ•Œ, application.yaml 은 Helm Chart 와 μ„žμ΄μ§€ μ•Šλ„λ‘ `stable` κ²½λ‘œμ— μ €μž₯ν•©λ‹ˆλ‹€.

`stable` 디렉토리 κ΅¬μ‘°λŠ” μ•„λž˜μ™€ κ°™μŠ΅λ‹ˆλ‹€.

```bash
stable
β”œβ”€β”€ demo-nginx
β”‚ β”œβ”€β”€ Chart.yaml
β”‚ β”œβ”€β”€ templates
β”‚ β”‚ β”œβ”€β”€ deployment.yaml
β”‚ β”‚ β”œβ”€β”€ ingress.yaml
β”‚ β”‚ └── service.yaml
β”‚ └── values.yaml
β”œβ”€β”€ demo-nginx-0.1.0.tgz
β”œβ”€β”€ demo-nginx-applcation.yaml
└── index.yaml
```

`demo-nginx` λŠ” Shell Script 둜 μž…λ ₯ν•œ μ• ν”Œλ¦¬μΌ€μ΄μ…˜ μ΄λ¦„μž…λ‹ˆλ‹€.

μ‹€ν–‰ν•˜λŠ” λͺ¨μŠ΅μ€ μ•„λž˜μ™€ κ°™μŠ΅λ‹ˆλ‹€.

![1.gif](../images/2024-05-04-helm-chart-with-argocd/1.gif)

### application.yaml

Argo CD μ—μ„œ Helm Chart λ₯Ό μ΄μš©ν•΄μ„œ 배포할 λ•Œ 2가지 방법을 μ§€μ›ν•©λ‹ˆλ‹€.

첫 λ²ˆμ§ΈλŠ” Github Repository λ‚΄ Helm Chart 경둜λ₯Ό μ§€μ •ν•˜λŠ” κ²ƒμž…λ‹ˆλ‹€.

`stable/${app_name}` κ²½λ‘œμ—λŠ” yaml νŒŒμΌλ“€λ‘œ κ΅¬μ„±λ˜μ–΄ μžˆμŠ΅λ‹ˆλ‹€.

```bash
stable/demo-nginx
β”œβ”€β”€ Chart.yaml
β”œβ”€β”€ templates
β”‚ β”œβ”€β”€ deployment.yaml
β”‚ β”œβ”€β”€ ingress.yaml
β”‚ └── service.yaml
└── values.yaml
```

이 경둜λ₯Ό application.yaml 에 μž…λ ₯ν•΄μ„œ 배포할 Helm Chart λ₯Ό 지정할 수 μžˆμŠ΅λ‹ˆλ‹€.

```yaml
spec:
project: default
source:
path: stable/${app_name}
repoURL: https://github.com/42Cluster-Seoul/helm-charts
targetRevision: HEAD
helm:
valueFiles:
- values.yaml
```
`${app_name}-application.yaml` νŒŒμΌμ€ `stable` κ²½λ‘œμ— μ €μž₯λ©λ‹ˆλ‹€.

```bash
stable
β”œβ”€β”€ demo-nginx
β”‚ β”œβ”€β”€ Chart.yaml
β”‚ β”œβ”€β”€ templates
β”‚ β”‚ β”œβ”€β”€ deployment.yaml
β”‚ β”‚ β”œβ”€β”€ ingress.yaml
β”‚ β”‚ └── service.yaml
β”‚ └── values.yaml
└── demo-nginx-applcation.yaml
```

두 λ²ˆμ§ΈλŠ” Helm Repo λ₯Ό μ΄μš©ν•˜λŠ” λ°©λ²•μž…λ‹ˆλ‹€.

application.yaml 에 μž…λ ₯ν•˜λŠ” 것은 거의 μœ μ‚¬ν•©λ‹ˆλ‹€.

repoURL 에 Github Pages 둜 μƒμ„±ν•œ Helm Repo λ₯Ό μž…λ ₯ν•˜κ³ , `source.chart` 속성에 chart 이름을 μž…λ ₯ν•΄μ£ΌλŠ” 것이 μ°¨μ΄μ μž…λ‹ˆλ‹€.

```yaml
spec:
project: default
source:
chart: demo-nginx
repoURL: https://42cluster-seoul.github.io/helm-charts/stable
targetRevision: 0.1.0
helm:
valueFiles:
- values.yaml
```

이λ₯Ό μ΄μš©ν•˜κΈ° μœ„ν•΄μ„œ `stable` κ²½λ‘œμ— Helm Chart 의 `index.yaml` 파일과 μ••μΆ•ν•œ νŒ¨ν‚€μ§€ νŒŒμΌμ„ ν•¨κ»˜ μ—…λ‘œλ“œ ν–ˆμŠ΅λ‹ˆλ‹€.

```bash
stable
β”œβ”€β”€ demo-nginx
β”‚ β”œβ”€β”€ Chart.yaml
β”‚ β”œβ”€β”€ templates
β”‚ β”‚ β”œβ”€β”€ deployment.yaml
β”‚ β”‚ β”œβ”€β”€ ingress.yaml
β”‚ β”‚ └── service.yaml
β”‚ └── values.yaml
β”œβ”€β”€ demo-nginx-0.1.0.tgz
β”œβ”€β”€ demo-nginx-applcation.yaml
└── index.yaml
```

ν…ŒμŠ€νŠΈ λͺ©μ μœΌλ‘œ nginx λ₯Ό λ°°ν¬ν–ˆκ³ , Cluster IP 둜 μ ‘κ·Όν•˜λ©΄ μ•„λž˜μ™€ 같은 화면이 λœΉλ‹ˆλ‹€.

![2.png](../images/2024-05-04-helm-chart-with-argocd/2.png)

λ‹€λ§Œ, Ingress 섀정을 잘λͺ»ν–ˆλŠ”지, ν˜„μž¬λŠ” μ•„λž˜μ˜ 이미지와 같이 Ingress κ°€ μ œλŒ€λ‘œ μ„€μΉ˜λ˜μ§€ μ•ŠλŠ” μƒνƒœμž…λ‹ˆλ‹€.

![3.png](../images/2024-05-04-helm-chart-with-argocd/3.png)
Binary file added images/2024-05-04-helm-chart-with-argocd/1.gif
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added images/2024-05-04-helm-chart-with-argocd/2.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added images/2024-05-04-helm-chart-with-argocd/3.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.

0 comments on commit e8e700d

Please sign in to comment.