kali ini kita akan coba menggunakan Helm
Flow Setelah Full Helm
Developer Push
↓
GitLab CI Build
↓
Push Registry
↓
Helm Deploy
↓
Kubernetes
↓
Rollback 1 Command
Install Helm
Di kube1 atau di server Runner:
curl https://raw.githubusercontent.com/helm/helm/main/scripts/get-helm-3 | bash
Verifikasi
helm version
1. Hapus Resource Lama
Misal namespace production:
kubectl delete deployment nginx-app -n production
kubectl delete svc nginx-service -n production
kubectl delete namespace production
helm uninstall nginx-prod
helm uninstall nginx-dev
namespace development :
kubectl delete deployment nginx-app -n development
kubectl delete svc nginx-service -n development
kubectl delete namespace development
2. Pastikan Bersih
kubectl get all -n production
kubectl get all -n development
3. Cek Registry
kubectl get secret -n development
kubectl get secret -n production
harus ada gitlab – registry
root@kube1:~# kubectl get secret -n development
NAME TYPE DATA AGE
gitlab-registry kubernetes.io/dockerconfigjson 1 19m
sh.helm.release.v1.nginx-dev.v1 helm.sh/release.v1 1 40m
kalau hilang terhapus . tambahkan secret nya
kubectl create secret docker-registry gitlab-registry \
--docker-server=registry.gitlab.com \
--docker-username=USERNAME_GITLAB \
--docker-password=TOKEN_GITLAB \
--docker-email=EMAIL \
-n development
Struktur Project Baru
belajar-gitlab/
├── .gitlab-ci.yml
├── Dockerfile
├── index.html
│
└── helm/
└── nginx-app/
├── Chart.yaml
├── values.yaml
├── values-dev.yaml
├── values-prod.yaml
│
└── templates/
├── deployment.yaml
└── service.yaml
Bisa copy code dari -> https://github.com/kyuby13/belajar-gitlab-helm
GitLab CI Versi Helm
stages:
- build
- deploy
variables:
IMAGE_NAME: registry.gitlab.com/project7112620/belajar-gitlab/nginx-app
# =========================
# BUILD
# =========================
build:
image: docker:latest
stage: build
tags:
- main-runner
services:
- docker:dind
variables:
DOCKER_HOST: tcp://docker:2375
DOCKER_TLS_CERTDIR: ""
script:
- docker login -u gitlab-ci-token -p $CI_JOB_TOKEN registry.gitlab.com
- docker build -t $IMAGE_NAME:$CI_COMMIT_SHORT_SHA .
- docker push $IMAGE_NAME:$CI_COMMIT_SHORT_SHA
# =========================
# DEVELOPMENT
# =========================
deploy-dev:
image:
name: alpine/helm:latest
entrypoint: [""]
stage: deploy
environment:
name: development
url: http://192.168.10.15:30082
only:
- develop
tags:
- main-runner
variables:
KUBECONFIG: /kubeconfig
script:
- >
helm upgrade --install nginx-dev ./helm/nginx-app
--namespace development
--create-namespace
-f ./helm/nginx-app/values-dev.yaml
--set image.tag=$CI_COMMIT_SHORT_SHA
# =========================
# PRODUCTION
# =========================
deploy-prod:
image:
name: alpine/helm:latest
entrypoint: [""]
stage: deploy
environment:
name: production
url: http://192.168.10.15:30081
only:
- main
tags:
- main-runner
variables:
KUBECONFIG: /kubeconfig
script:
- >
helm upgrade --install nginx-prod ./helm/nginx-app
--namespace production
--create-namespace
-f ./helm/nginx-app/values-prod.yaml
--set image.tag=$CI_COMMIT_SHORT_SHA
Chart.yaml
Identitas Helm chart.
apiVersion: v2
name: nginx-app
description: Nginx Application Helm Chart
type: application
version: 0.1.0
appVersion: "1.0"
values.yaml
Default value.
appName: nginx-app
replicaCount: 1
namespace: default
image:
repository: registry.gitlab.com/project7112620/belajar-gitlab/nginx-app
tag: latest
service:
type: NodePort
port: 80
nodePort: 30080
values-dev.yaml
Khusus development.
namespace: development
replicaCount: 1
service:
nodePort: 30081
values-prod.yaml
Khusus production.
namespace: production
replicaCount: 3
service:
nodePort: 30080
templates/deployment.yaml
Template deployment.
apiVersion: apps/v1
kind: Deployment
metadata:
name: {{ .Values.appName }}
namespace: {{ .Values.namespace }}
spec:
replicas: {{ .Values.replicaCount }}
selector:
matchLabels:
app: {{ .Values.appName }}
template:
metadata:
labels:
app: {{ .Values.appName }}
spec:
imagePullSecrets:
- name: gitlab-registry
containers:
- name: {{ .Values.appName }}
image: "{{ .Values.image.repository }}:{{ .Values.image.tag }}"
imagePullPolicy: Always
ports:
- containerPort: 80
templates/service.yaml
apiVersion: v1
kind: Service
metadata:
name: nginx-service
namespace: {{ .Values.namespace }}
spec:
type: {{ .Values.service.type }}
selector:
app: {{ .Values.appName }}
ports:
- port: {{ .Values.service.port }}
targetPort: 80
nodePort: {{ .Values.service.nodePort }}
Cara Deploy Manual
Development
helm upgrade --install nginx-dev ./helm/nginx-app \
-f ./helm/nginx-app/values-dev.yaml
Production
helm upgrade --install nginx-prod ./helm/nginx-app \
-f ./helm/nginx-app/values-prod.yaml
Cara RoleBack
kubectl get pods -A
helm history nginx-dev -n development
REVISION UPDATED STATUS CHART APP VERSION DESCRIPTION
1 Tue May 19 10:11:01 2026 superseded nginx-app-0.1.0 1.0 Install complete
2 Tue May 19 10:18:21 2026 superseded nginx-app-0.1.0 1.0 Upgrade complete
3 Tue May 19 10:35:05 2026 superseded nginx-app-0.1.0 1.0 Rollback to 1
4 Tue May 19 10:36:02 2026 deployed nginx-app-0.1.0 1.0 Rollback to 2
helm rollback nginx-dev 1 -n development
Verifikasi Pod
kubectl get pods -n development
Verifikasi Image
kubectl describe deployment nginx-app -n development
lihat:
Image:
harus berubah ke image tag revision lama.
Kalau Mau Rollback Production
helm rollback nginx-prod 1 -n production
Cara Cek Resource Dikelola Helm
helm list -A
Cek Manifest Helm
helm get manifest nginx-prod -n production
Kelebihan Besar Helm
Nanti kamu bisa:
Lihat Release
helm list -A
Lihat History
helm history nginx-prod -n production
Rollback
helm rollback nginx-prod 1 -n production
Upgrade
helm upgrade
Uninstall
helm uninstall nginx-prod -n production
Helm Sangat Penting Di Kubernetes Modern
Karena hampir semua install production:
helm install prometheus
helm install grafana
helm install argocd
helm install loki
