Skip to main content

Kubernetes (K3s)

Overview

Centralize Management System mendukung deployment ke Kubernetes (K3s) untuk production environment.

Architecture

┌─────────────────────────────────────────────────────────────┐
│ K3s Cluster │
│ │
│ ┌──────────────┐ ┌──────────────┐ ┌──────────────┐ │
│ │ Namespace │ │ Ingress │ │ Service │ │
│ │ clm-prod │ │ Controller │ │ Mesh │ │
│ └──────────────┘ └──────────────┘ └──────────────┘ │
│ │
│ ┌──────────────┐ ┌──────────────┐ ┌──────────────┐ │
│ │ Backend │ │ Frontend │ │ Core │ │
│ │ Deployment │ │ Deployment │ │ Banking │ │
│ └──────────────┘ └──────────────┘ └──────────────┘ │
└─────────────────────────────────────────────────────────────┘

Namespace

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

Core Banking Deployment

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
- name: SPRING_DATASOURCE_USERNAME
valueFrom:
secretKeyRef:
name: clm-secrets
key: db-user
- name: SPRING_DATASOURCE_PASSWORD
valueFrom:
secretKeyRef:
name: clm-secrets
key: db-password
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
---
apiVersion: v1
kind: Service
metadata:
name: core-banking
namespace: clm-prod
spec:
selector:
app: core-banking
ports:
- port: 8080
targetPort: 8080
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"
nginx.ingress.kubernetes.io/proxy-body-size: "50m"
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
- path: /auth
pathType: Prefix
backend:
service:
name: core-banking
port:
number: 8080

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"
opensearch-password: "MyStrong@OpenSearch2026!"

ConfigMap

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

Deployment Script

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

set -e

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

# Apply namespace
kubectl apply -f k8s/namespace.yaml

# Apply secrets and config
kubectl apply -f k8s/secrets.yaml
kubectl apply -f k8s/configmap.yaml

# Deploy core banking
kubectl apply -f k8s/core-banking.yaml

# Deploy PostgreSQL
kubectl apply -f k8s/postgresql.yaml

# Deploy Redis
kubectl apply -f k8s/redis.yaml

# Apply ingress
kubectl apply -f k8s/ingress.yaml

# Wait for rollout
echo "⏳ Waiting for deployments..."
kubectl rollout status deployment/core-banking -n clm-prod --timeout=300s

echo "✅ Deployment complete!"

Monitoring

Prometheus ServiceMonitor

apiVersion: monitoring.coreos.com/v1
kind: ServiceMonitor
metadata:
name: core-banking
namespace: clm-prod
spec:
selector:
matchLabels:
app: core-banking
endpoints:
- port: http
path: /actuator/prometheus
interval: 30s

Next Steps