Dokumen ini berisi panduan langkah-demi-langkah (playbook) untuk instalasi, konfigurasi, peningkatan (upgrade), serta manajemen operasional cluster Kubernetes Single Node yang dikonfigurasi bersama Confluent Manager for Apache Flink (CMF Cluster).
| Atribut | Informasi |
|---|---|
| Dibuat Oleh | System Administrator / Data Stream Engineer (Manual Setup) |
| Nama | Mohammad Wildan Nuryulda |
| nuryulda@gmail.com | |
| Tanggal Pembuatan | 4 Juni 2026 |
| Lingkungan (Environment) | Staging (staging-env) |
- Persiapan Sistem Operasi (OS Preparation)
- Instalasi Container Runtime (Containerd)
- Instalasi Komponen Kubernetes (v1.33)
- Inisialisasi Cluster & Konfigurasi CNI (Cilium)
- Prosedur Upgrade Kubernetes (v1.33 ke v1.35)
- Deployment Confluent Manager for Apache Flink (CMF)
- Manajemen Aplikasi Flink (FlinkApplication & Catalogs)
- Panduan Operasional, Query, & Troubleshooting (FAQ)
Langkah awal untuk memastikan sistem operasi siap menjalankan node Kubernetes tanpa interferensi dari manajemen memori atau kebijakan keamanan OS yang terlalu ketat.
Kubernetes mensyaratkan Swap dinonaktifkan agar manajemen alokasi resource pod berjalan akurat.
sudo swapoff -a sudo sed -i '/ swap / s/^(.*)$/#\1/g' /etc/fstab
sudo setenforce 0 sudo sed -i 's/^SELINUX=enforcing$/SELINUX=permissive/' /etc/selinux/config
cat <<EOF | sudo tee /etc/modules-load.d/k8s.conf overlay br_netfilter EOF
sudo modprobe overlay sudo modprobe br_netfilter
cat <<EOF | sudo tee /etc/sysctl.d/k8s.conf net.bridge.bridge-nf-call-iptables = 1 net.bridge.bridge-nf-call-ip6tables = 1 net.ipv4.ip_forward = 1 EOF
sudo sysctl --system
sudo dnf -y install dnf-plugins-core sudo dnf config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
sudo dnf install -y containerd.io
sudo mkdir -p /etc/containerd containerd config default | sudo tee /etc/containerd/config.toml > /dev/null
sudo sed -i 's/SystemdCgroup = false/SystemdCgroup = true/g' /etc/containerd/config.toml sudo sed -i 's|sandbox_image = ".*"|sandbox_image = "registry.k8s.io/pause:3.10"|g' /etc/containerd/config.toml
sudo systemctl daemon-reload sudo systemctl enable --now containerd
cat <<EOF | sudo tee /etc/yum.repos.d/kubernetes.repo [kubernetes] name=Kubernetes baseurl=https://pkgs.k8s.io/core:/stable:/v1.33/rpm/ enabled=1 gpgcheck=1 gpgkey=https://pkgs.k8s.io/core:/stable:/v1.33/rpm/repodata/repomd.xml.key exclude=kubelet kubeadm kubectl EOF
sudo dnf install -y kubelet kubeadm kubectl --disableexcludes=kubernetes
sudo systemctl enable --now kubelet
curl -LO https://get.helm.sh/helm-v3.17.3-linux-amd64.tar.gz tar -zxvf helm-v3.17.3-linux-amd64.tar.gz sudo mv linux-amd64/helm /usr/local/bin/helm rm -rf helm-v3.17.3-linux-amd64.tar.gz linux-amd64
helm version
helm repo add prometheus-community https://prometheus-community.github.io/helm-charts helm repo update
sudo kubeadm init
--apiserver-advertise-address=10.10.10.106
--pod-network-cidr=10.244.0.0/16
sudo kubeadm init --pod-network-cidr=10.0.0.0/16
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf
kubectl get nodes
curl -L --remote-name https://github.com/cilium/cilium-cli/releases/latest/download/cilium-linux-amd64.tar.gz sudo tar xzvf cilium-linux-amd64.tar.gz -C /usr/local/bin rm -fn cilium-linux-amd64.tar.gz
cilium install
kubectl get nodes cilium status
kubectl get pods -n kube-system
kubectl get pods -n kube-system -w
cat <<EOF | sudo tee /etc/yum.repos.d/kubernetes.repo [kubernetes] name=Kubernetes baseurl=https://pkgs.k8s.io/core:/stable:/v1.35/rpm/ enabled=1 gpgcheck=1 gpgkey=https://pkgs.k8s.io/core:/stable:/v1.35/rpm/repodata/repomd.xml.key exclude=kubelet kubeadm kubectl EOF
sudo dnf clean all
sudo dnf upgrade -y kubeadm --disableexcludes=kubernetes
sudo kubeadm upgrade apply v1.35.5 -y
sudo dnf upgrade -y kubelet kubectl --disableexcludes=kubernetes sudo systemctl daemon-reload && sudo systemctl restart kubelet
helm repo add confluentinc https://packages.confluent.io/helm helm repo update
kubectl create -f https://github.com/jetstack/cert-manager/releases/download/v1.18.2/cert-manager.yaml
helm upgrade --install cp-flink-kubernetes-operator confluentinc/flink-kubernetes-operator
--version "~1.140.0"
--namespace confluent-flink
--set watchNamespaces="{confluent-flink}"
kubectl create secret generic flink-license-secret
--from-file=license.txt=/data/flink/license.txt
-n confluent-flink
kubectl create secret generic cmf-postgres-secret
--from-literal=password='cmf_mwn'
-n confluent-flink
helm upgrade --install cmf confluentinc/confluent-manager-for-apache-flink
--namespace confluent-flink
--set license.secretRef="flink-license-secret"
--set resources.requests.cpu="500m"
--set resources.requests.memory="1024Mi"
--set resources.limits.cpu="1"
--set resources.limits.memory="2048Mi"
--set persistence.create=false
--set cmf.database.type="jdbc"
--set cmf.database.jdbc.engine="postgresql"
--set cmf.database.jdbc.url="10.10.10.105"
--set cmf.database.jdbc.port=5432
--set cmf.database.jdbc.database="cmf_mwn"
--set cmf.database.jdbc.user="cmf_mwn"
--set cmf.database.jdbc.password.kubernetesSecretName="cmf-postgres-secret"
--set cmf.database.jdbc.password.kubernetesSecretProperty="password"
kubectl logs -n confluent-flink -l app.kubernetes.io/name=confluent-manager-for-apache-flink --tail=100 -f
nohup kubectl port-forward -n confluent-flink deployment/confluent-manager-for-apache-flink 8080:8080 --address 0.0.0.0 > /dev/null 2>&1 &
apiVersion: cmf.confluent.io/v1
kind: FlinkApplication
metadata:
name: staging-state-machine
namespace: confluent-flink
spec:
flinkVersion: "v2_0"
image: confluentinc/cp-flink:2.0.1-cp1
serviceAccount: flink
flinkConfiguration:
metrics.reporter.prom.factory.class: "org.apache.flink.metrics.prometheus.PrometheusReporterFactory"
metrics.reporter.prom.port: "9249-9250"
taskmanager.numberOfTaskSlots: "4"
execution.checkpointing.interval: "1min"
execution.checkpointing.mode: "EXACTLY_ONCE"
execution.checkpointing.min-pause: "30s"
execution.checkpointing.max-concurrent-checkpoints: "1"
execution.checkpointing.externalized-checkpoint-retention: "RETAIN_ON_CANCELLATION"
state.backend.type: "rocksdb"
state.backend.incremental: "true"
state.checkpoints.dir: "file:///opt/flink/volume/checkpoints"
state.savepoints.dir: "file:///opt/flink/volume/savepoints"
high-availability.type: "kubernetes"
high-availability.storageDir: "file:///opt/flink/volume/ha"
restart-strategy.type: "exponential-delay"
restart-strategy.exponential-delay.initial-backoff: "10 s"
restart-strategy.exponential-delay.max-backoff: "2 min"
job:
jarURI: "local:///opt/flink/examples/streaming/StateMachineExample.jar"
parallelism: 2
state: "running"
upgradeMode: "last-state"
jobManager:
resource:
cpu: 0.5
memory: "1024m"
taskManager:
resource:
cpu: 0.5
memory: "6Gi"
podTemplate:
spec:
containers:
- name: flink-main-container
volumeMounts:
- name: flink-host-storage
mountPath: /opt/flink/volume
volumes:
- name: flink-host-storage
hostPath:
path: /data/flink/cmf/storage
type: Directory
confluent flink application apply staging-state-machine.yaml --environment staging-env --url http://10.10.10.106:8080 confluent flink application create staging-state-machine.yaml --environment staging-env --url http://10.10.10.106:8080 confluent flink application update staging-state-machine.yaml --environment staging-env --url http://10.10.10.106:8080
confluent flink compute-pool create /data/flink/cmf/apps/staging-shared-pool.yaml --environment staging-env --url http://10.10.10.106:8080
{ "apiVersion": "cmf.confluent.io/v1", "kind": "KafkaCatalog", "metadata": { "name": "staging-catalog" }, "spec": { "srInstance": { "connectionConfig": { "schema.registry.url": "http://10.10.10.106:8081" } } } }
curl -v -H "Content-Type: application/json" -X POST http://10.10.10.106:8080/cmf/api/v1/catalogs/kafka -d@/data/flink/cmf/apps/staging-catalog.json
{ "apiVersion": "cmf.confluent.io/v1", "kind": "KafkaDatabase", "metadata": { "name": "staging-database" }, "spec": { "kafkaCluster": { "connectionConfig": { "bootstrap.servers": "10.10.10.106:9092" } }, "ddlEnvironments": [ "staging-env" ] } }
curl -v -H "Content-Type: application/json" -X POST http://10.10.10.106:8080/cmf/api/v1/catalogs/kafka/staging-catalog/databases -d@/data/flink/cmf/apps/staging-database.json
DESCRIBE account
SELECT JSON_VALUE(CAST(val AS STRING), '$.headers.operation') AS operation, JSON_VALUE(CAST(val AS STRING), '$.headers.timestamp') AS attunity_timestamp, JSON_VALUE(CAST(val AS STRING), '$.data.RECID["com.cdc.RecidRecord"].string') AS recid, JSON_VALUE(CAST(val AS STRING), '$.data.XMLRECORD["com.cdc.XmlrecordRecord"].string') AS xmlrecord FROM account
curl -s http://10.10.10.106:8080/cmf/api/v1/environments/staging-env/statements/[MASUKKAN-ID-STATEMENT] | python3 -m json.tool
confluent flink statement web-ui-forward [MASUKKAN-ID-STATEMENT] --environment staging-env --url http://10.10.10.106:8080 --port 8081
confluent flink statement list --environment staging-env --compute-pool staging-shared-pool --url http://10.10.10.106:8080 confluent flink statement stop [ID-STATEMENT] --environment staging-env --url http://10.10.10.106:8080
\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
CARA BIKIN TABLE ?
table auto-create saat topic terbuat di kafka topics
KALAU SQL STATEMENT NYA PENDING / TIMEOUT ?
naikin resources pod FlinkEnvironment
CARA HITUNG NYA BERDASARKAN ?
resource memory taskmanager : taskmanager.numberOfTaskSlots cpu better start di 0.5/1
///////////////////////////////////////////////////////////
kubectl describe pod [NAMA-POD-TASKMANAGER] -n confluent-flink
kubectl rollout restart deployment/[nama-deployment] -n confluent-flink kubectl delete pod [NAMA-POD] -n confluent-flink --force --grace-period=0