Helm과 Kubernetes 연동 심화
9️⃣ Helm과 Kubernetes 연동 심화
Helm은 Kubernetes 애플리케이션을 관리하는 강력한 도구로, Kubernetes의 다양한 리소스를 효율적으로 설정하고 배포할 수 있게 도와줍니다. 이번 섹션에서는 Helm과 Kubernetes 리소스를 심화적으로 연동하는 방법을 다룹니다.
1 Helm과 ConfigMap, Secret 연동
Helm은 ConfigMap과 Secret 리소스를 통해 애플리케이션의 환경 설정 및 비밀 정보를 관리할 수 있습니다. Helm 차트를 작성할 때 이러한 리소스를 쉽게 정의하고, 필요에 따라 값을 설정하여 Kubernetes에서 활용할 수 있습니다.
📌 Helm에서 ConfigMap 사용 예시
values.yaml
파일에서 값을 정의하고, ConfigMap
리소스를 Helm 템플릿에서 참조합니다.
values.yaml
config:
app_mode: production
log_level: debug
configmap.yaml (Helm 템플릿)
apiVersion: v1
kind: ConfigMap
metadata:
name: {{ .Release.Name }}-config
data:
APP_MODE: {{ .Values.config.app_mode }}
LOG_LEVEL: {{ .Values.config.log_level }}
위 예시에서는 ConfigMap 리소스를 정의하고 values.yaml
에서 제공하는 값을 참조하여 환경 변수를 설정합니다.
📌 Helm에서 Secret 사용 예시
values.yaml
secrets:
db_password: supersecretpassword
secret.yaml (Helm 템플릿)
apiVersion: v1
kind: Secret
metadata:
name: {{ .Release.Name }}-secret
type: Opaque
data:
DB_PASSWORD: {{ .Values.secrets.db_password | b64enc }}
b64enc
함수는 값을 Base64 인코딩하여 Secret으로 안전하게 저장할 수 있도록 합니다.
2 Helm을 활용한 Ingress Controller 설정
Helm을 사용하여 Ingress Controller를 설치하고 구성하는 방법을 배워봅니다. Ingress는 Kubernetes 클러스터 내에서 외부 요청을 적절한 서비스로 라우팅하는 역할을 합니다.
📌 Ingress Controller 설치 예시
- Helm을 사용하여 Ingress Controller를 설치합니다. 예를 들어, NGINX Ingress Controller를 설치합니다.
helm install nginx-ingress ingress-nginx/ingress-nginx --namespace kube-system
- Ingress 리소스를 사용하여 트래픽을 라우팅합니다.
ingress.yaml (Helm 템플릿)
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: {{ .Release.Name }}-ingress
namespace: {{ .Release.Namespace }}
spec:
rules:
- host: {{ .Values.ingress.host }}
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: {{ .Release.Name }}-service
port:
number: 80
values.yaml
ingress:
host: my-app.example.com
위 예시에서는 Ingress Controller가 my-app.example.com
도메인의 트래픽을 해당 서비스로 라우팅하도록 설정하고 있습니다.
3 Helm으로 StatefulSet 배포 (데이터베이스, Kafka 등)
StatefulSet은 상태를 가진 애플리케이션을 Kubernetes에서 관리하는 리소스입니다. 데이터베이스나 Kafka와 같은 상태ful 애플리케이션을 배포할 때 주로 사용됩니다.
📌 StatefulSet 배포 예시
statefulset.yaml (Helm 템플릿)
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: {{ .Release.Name }}-statefulset
spec:
serviceName: {{ .Release.Name }}-headless
replicas: 3
selector:
matchLabels:
app: {{ .Release.Name }}
template:
metadata:
labels:
app: {{ .Release.Name }}
spec:
containers:
- name: {{ .Release.Name }}-container
image: {{ .Values.image.repository }}:{{ .Values.image.tag }}
ports:
- containerPort: 8080
volumeMounts:
- name: data
mountPath: /data
volumeClaimTemplates:
- metadata:
name: data
spec:
accessModes: ["ReadWriteOnce"]
resources:
requests:
storage: 1Gi
values.yaml
image:
repository: my-db-image
tag: latest
위 예시는 StatefulSet을 사용하여 데이터베이스와 같은 상태ful 애플리케이션을 배포하는 방법을 보여줍니다. volumeClaimTemplates
를 통해 Persistent Volume을 사용할 수 있습니다.
4 Helm과 Persistent Volume (PVC) 사용법
**Persistent Volume (PVC)**은 Kubernetes에서 데이터 저장소를 관리하는 리소스로, 데이터를 지속적으로 저장하고 관리할 수 있습니다. Helm을 통해 PVC를 관리하여 애플리케이션에 필요한 저장소를 제공합니다.
📌 Persistent Volume Claim (PVC) 사용 예시
pvc.yaml (Helm 템플릿)
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: {{ .Release.Name }}-pvc
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 5Gi
위 예시는 **Persistent Volume Claim (PVC)**을 정의하여 애플리케이션에 5Gi의 저장소를 요청하는 방법을 보여줍니다.
📌 PVC와 StatefulSet 연동 예시
statefulset.yaml (Helm 템플릿)
volumeClaimTemplates:
- metadata:
name: data
spec:
accessModes: ["ReadWriteOnce"]
resources:
requests:
storage: 5Gi
이 예시에서는 StatefulSet 내에서 PVC를 사용하여 애플리케이션의 데이터 저장소를 관리합니다.