Skip to main content

Kubernetes (K3s)

Overview

Centralize Management System mendukung deployment ke K3s (lightweight Kubernetes).

Prerequisites

  • K3s installed
  • kubectl configured
  • Docker images built

Namespace

apiVersion: v1
kind: Namespace
metadata:
name: clm-prod
labels:
app.kubernetes.io/name: bjbs-clm
app.kubernetes.io/environment: production

Deployments

Core Banking

apiVersion: apps/v1
kind: Deployment
metadata:
name: core-banking
namespace: clm-prod
spec:
replicas: 2
selector:
matchLabels:
app: core-banking
template:
metadata:
labels:
app: core-banking
spec:
containers:
- name: core-banking
image: clm-core-banking:latest
ports:
- containerPort: 8080
env:
- name: SPRING_DATASOURCE_URL
valueFrom:
secretKeyRef:
name: clm-secrets
key: db-url
resources:
requests:
memory: "512Mi"
cpu: "500m"
limits:
memory: "1Gi"
cpu: "1000m"
readinessProbe:
httpGet:
path: /iso/health
port: 8080
initialDelaySeconds: 30
periodSeconds: 10
livenessProbe:
httpGet:
path: /iso/health
port: 8080
initialDelaySeconds: 60
periodSeconds: 30

Backend

apiVersion: apps/v1
kind: Deployment
metadata:
name: backend
namespace: clm-prod
spec:
replicas: 2
selector:
matchLabels:
app: backend
template:
metadata:
labels:
app: backend
spec:
containers:
- name: backend
image: clm-backend:latest
ports:
- containerPort: 8081
env:
- name: PORT
value: "8081"
- name: KEYCLOAK_BASE_URL
valueFrom:
configMapKeyRef:
name: clm-config
key: KEYCLOAK_BASE_URL
resources:
requests:
memory: "256Mi"
cpu: "250m"
limits:
memory: "512Mi"
cpu: "500m"

Frontend

apiVersion: apps/v1
kind: Deployment
metadata:
name: frontend
namespace: clm-prod
spec:
replicas: 2
selector:
matchLabels:
app: frontend
template:
metadata:
labels:
app: frontend
spec:
containers:
- name: frontend
image: clm-frontend:latest
ports:
- containerPort: 80
resources:
requests:
memory: "128Mi"
cpu: "100m"
limits:
memory: "256Mi"
cpu: "250m"

Services

apiVersion: v1
kind: Service
metadata:
name: backend
namespace: clm-prod
spec:
selector:
app: backend
ports:
- port: 8081
targetPort: 8081
type: ClusterIP
---
apiVersion: v1
kind: Service
metadata:
name: frontend
namespace: clm-prod
spec:
selector:
app: frontend
ports:
- port: 80
targetPort: 80
type: ClusterIP

Ingress

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: clm-ingress
namespace: clm-prod
annotations:
nginx.ingress.kubernetes.io/ssl-redirect: "true"
spec:
ingressClassName: nginx
rules:
- host: clm.bjbsyariah.co.id
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: frontend
port:
number: 80
- path: /api
pathType: Prefix
backend:
service:
name: backend
port:
number: 8081

Secrets

apiVersion: v1
kind: Secret
metadata:
name: clm-secrets
namespace: clm-prod
type: Opaque
stringData:
db-url: "jdbc:postgresql://postgres:5432/clm_db"
db-user: "clm"
db-password: "ClmBjbs2024!"
jwt-secret: "your-jwt-secret"

ConfigMap

apiVersion: v1
kind: ConfigMap
metadata:
name: clm-config
namespace: clm-prod
data:
KEYCLOAK_BASE_URL: "http://keycloak:8080"
OPENSEARCH_BASE_URL: "https://opensearch:9200"
PROMETHEUS_URL: "http://prometheus:9090"

Deployment Script

#!/bin/bash
# scripts/deploy.sh

set -e

echo "🚀 Deploying Centralize Management System to K3s..."

# Apply resources
kubectl apply -f k8s/namespace.yaml
kubectl apply -f k8s/secrets.yaml
kubectl apply -f k8s/configmap.yaml
kubectl apply -f k8s/core-banking.yaml
kubectl apply -f k8s/backend.yaml
kubectl apply -f k8s/frontend.yaml
kubectl apply -f k8s/ingress.yaml

# Wait for rollout
kubectl rollout status deployment/backend -n clm-prod --timeout=300s
kubectl rollout status deployment/frontend -n clm-prod --timeout=300s

echo "✅ Deployment complete!"

Monitoring

Check Pods

kubectl get pods -n clm-prod

Check Services

kubectl get svc -n clm-prod

Check Logs

kubectl logs -f deployment/backend -n clm-prod

Next Steps