Docs Home
Viewing docs for
Self-ManagedNot available for BYOC

Install Ververica Platform on Minikube

Install Ververica Platform 3.1.1 on a minikube cluster on an AWS EC2 instance for evaluation, with MySQL as the metadata database and MinIO as S3-compatible blob storage.

On this page

This guide installs Ververica Platform 3.1.1 on a single-node minikube cluster on an AWS EC2 instance. MySQL runs as the metadata database and MinIO as S3-compatible blob storage, both inside the cluster. To install Ververica Platform on your own Kubernetes cluster, database, and blob storage, see Getting Started: Self-managed v3.x.

Prerequisites

  • An AWS EC2 m5.4xlarge instance (16 vCPUs, 64 GB of memory) running an Amazon Linux 2023 AMI. To run larger Flink jobs, use an m5.8xlarge (32 vCPUs, 128 GB of memory). For the resources Ververica Platform needs, see System Requirements.
  • An x86_64 (amd64) AMI and instance type.
  • An inbound rule for port 8080 in the instance's security group, limited to your own IP address.
  • Credentials for registry.ververica.cloud. The Ververica Platform images are private. Contact Ververica Customer Support to get image pull access.

Install the Tools

Connect to the instance over SSH and run all commands in this guide as root (sudo su). Install kubectl, minikube, Helm, and Docker:

BASH
1# Install kubectl
2curl -LO "https://dl.k8s.io/release/$(curl -L -s https://dl.k8s.io/release/stable.txt)/bin/linux/amd64/kubectl"
3sudo install -o root -g root -m 0755 kubectl /bin/kubectl
4
5# Install minikube
6curl -LO https://github.com/kubernetes/minikube/releases/latest/download/minikube-linux-amd64
7sudo install minikube-linux-amd64 /bin/minikube
8
9# Install helm
10curl -fsSL -o get_helm.sh https://raw.githubusercontent.com/helm/helm/main/scripts/get-helm-3
11chmod 700 get_helm.sh
12sudo HELM_INSTALL_DIR=/bin ./get_helm.sh
13
14# Install docker
15sudo yum update -y
16sudo yum install -y docker
17sudo service docker start

Start Minikube

BASH
1sudo minikube start --memory=40G --cpus=12 --force

Ververica Platform 3 supports Kubernetes 1.24 to 1.34. The latest minikube release might start a newer Kubernetes version. To stay in the supported range, add --kubernetes-version=v1.34.0 to the command.

Create the Namespaces and Registry Secrets

Create a namespace for the platform (vvp-system) and one for your Flink deployments (vvp-deploy), and an image pull secret in each:

BASH
1kubectl create ns vvp-system
2kubectl create ns vvp-deploy
3
4kubectl -n vvp-system create secret docker-registry ververica-registry \
5  --docker-username=<username> \
6  --docker-password=<password> \
7  --docker-server=registry.ververica.cloud
8kubectl -n vvp-deploy create secret docker-registry ververica-registry \
9  --docker-username=<username> \
10  --docker-password=<password> \
11  --docker-server=registry.ververica.cloud

Deploy MySQL

Create the secret that holds the MySQL root password:

BASH
1kubectl -n vvp-system create secret generic mysql-secret --from-literal=mysql-root-password='admin123'

Save the following manifest as mysql.yaml. It runs MySQL 8.0 with lower_case_table_names=1, which Ververica Platform requires.

YAML
1apiVersion: v1
2kind: ConfigMap
3metadata:
4  name: mysql-config
5  namespace: vvp-system
6data:
7  my.cnf: |
8    [mysqld]
9    lower_case_table_names=1
10    default_authentication_plugin=mysql_native_password
11---
12apiVersion: v1
13kind: PersistentVolumeClaim
14metadata:
15  name: mysql-pvc
16  namespace: vvp-system
17spec:
18  accessModes:
19    - ReadWriteOnce
20  resources:
21    requests:
22      storage: 5Gi
23  storageClassName: standard
24---
25apiVersion: apps/v1
26kind: Deployment
27metadata:
28  name: mysql
29  namespace: vvp-system
30spec:
31  replicas: 1
32  selector:
33    matchLabels:
34      app: mysql
35  template:
36    metadata:
37      labels:
38        app: mysql
39    spec:
40      containers:
41        - name: mysql
42          image: mysql:8.0
43          args:
44            - "--lower-case-table-names=1"
45            - "--default-authentication-plugin=mysql_native_password"
46          ports:
47            - containerPort: 3306
48          env:
49            - name: MYSQL_ROOT_PASSWORD
50              valueFrom:
51                secretKeyRef:
52                  name: mysql-secret
53                  key: mysql-root-password
54          volumeMounts:
55            - name: mysql-data
56              mountPath: /var/lib/mysql
57            - name: mysql-config
58              mountPath: /etc/mysql/conf.d
59          readinessProbe:
60            exec:
61              command: ["bash","-lc","mysqladmin ping -h 127.0.0.1 -uroot -p$MYSQL_ROOT_PASSWORD"]
62            initialDelaySeconds: 20
63            periodSeconds: 10
64          livenessProbe:
65            exec:
66              command: ["bash","-lc","mysqladmin ping -h 127.0.0.1 -uroot -p$MYSQL_ROOT_PASSWORD"]
67            initialDelaySeconds: 60
68            periodSeconds: 20
69      volumes:
70        - name: mysql-data
71          persistentVolumeClaim:
72            claimName: mysql-pvc
73        - name: mysql-config
74          configMap:
75            name: mysql-config
76---
77apiVersion: v1
78kind: Service
79metadata:
80  name: mysql
81  namespace: vvp-system
82spec:
83  selector:
84    app: mysql
85  ports:
86    - name: mysql
87      port: 3306
88      targetPort: 3306
89  type: ClusterIP

Apply it and wait until MySQL is ready:

BASH
1kubectl apply -f mysql.yaml
2kubectl -n vvp-system rollout status deploy/mysql

Deploy MinIO

The official MinIO container images are no longer publicly available. This guide installs the MinIO Helm chart with the images of pgsty, a community-maintained, S3-compatible fork of MinIO. Ververica Platform works with any S3-compatible object storage.

Save the following values as values-minio.yaml. They create the vvp bucket that Ververica Platform uses as its blob storage.

YAML
1image:
2  repository: docker.io/pgsty/minio
3  tag: RELEASE.2026-08-04T00-00-00Z
4
5mcImage:
6  repository: docker.io/pgsty/mc
7  tag: RELEASE.2026-09-16T00-00-00Z
8
9mode: standalone
10replicas: 1
11
12rootUser: admin
13rootPassword: password
14
15buckets:
16  - name: vvp
17    policy: none
18
19environment:
20  MINIO_API_CORS_ALLOW_ORIGIN: "*"
21  CONSOLE_SECURE_HEADERS: "off"
22
23resources:
24  requests:
25    memory: 512Mi
26    cpu: 250m
27  limits:
28    memory: 1Gi
29    cpu: 1000m

Install the chart:

BASH
1helm --namespace vvp-system upgrade --install minio minio \
2  --repo https://charts.min.io/ \
3  --version 5.4.0 \
4  --values values-minio.yaml

Install Ververica Platform

Save the following values as values-vvp.yaml. They connect Ververica Platform to MySQL and MinIO, and the vvp.globalDeploymentDefaults block gives every new deployment small resource requests and the MinIO endpoint and credentials, so Flink jobs can reach MinIO.

YAML
1global:
2  database:
3    host: mysql.vvp-system.svc.cluster.local
4    port: 3306
5    user: root
6    password: admin123
7
8  blobStorage:
9    baseUri: s3i://vvp
10    s3:
11      endpoint: http://minio.vvp-system.svc:9000
12      accessKeyId: admin
13      secretAccessKey: password
14
15  authentication:
16    single-user:
17      enabled: true
18      username: admin
19      secureCookies: false
20
21  image:
22    registry: registry.ververica.cloud
23  imagePullSecretName: ververica-registry
24
25  rbac:
26    additionalNamespaces:
27      - vvp-deploy
28
29vvp:
30  globalDeploymentDefaults: |
31    spec:
32      state: RUNNING
33      template:
34        spec:
35          resources:
36            jobmanager:
37              cpu: 0.5
38              memory: 1G
39            taskmanager:
40              cpu: 0.5
41              memory: 1G
42          flinkConfiguration:
43            state.backend: filesystem
44            taskmanager.memory.managed.fraction: 0.0
45            high-availability: none
46            s3.access-key: 'admin'
47            s3.secret-key: 'password'
48            s3.endpoint: "http://minio.vvp-system.svc:9000"
49            s3.path.style.access: "true"
50            metrics.reporter.prom.class: org.apache.flink.metrics.prometheus.PrometheusReporter
51            execution.checkpointing.interval: 10s
52            execution.checkpointing.externalized-checkpoint-retention: RETAIN_ON_CANCELLATION

Install the chart:

BASH
1helm upgrade --install ververica-platform \
2  oci://registry.ververica.cloud/platform-charts/ververica-platform \
3  --version 3.1.1 \
4  --namespace vvp-system \
5  --values values-vvp.yaml

Until you install a license, the vvp-appmanager-0 and vvp-gateway-0 pods restart with No license found or misconfigured. This is expected. Wait until the Application Manager logs your installation token, then print it:

BASH
1until kubectl logs vvp-appmanager-0 -n vvp-system 2>/dev/null | grep -q "installation token"; do sleep 10; done
2kubectl logs vvp-appmanager-0 -n vvp-system | grep -A2 "installation token"

Email this token to license_request@ververica.com to receive your license.

Install the License

Save the license you receive as license-vvp.yaml, with the license JSON on a single line under global.vvp.license.data:

YAML
1global:
2  vvp:
3    license:
4      data: {"kind":"License","apiVersion":"v1","metadata":{...},"spec":{...}}

Before you upgrade, run the following commands. Without them, the upgrade fails with an invalid ownership metadata error:

BASH
1kubectl -n vvp-system annotate secret vvp-license-fingerprint \
2  meta.helm.sh/release-name=ververica-platform \
3  meta.helm.sh/release-namespace=vvp-system --overwrite
4kubectl -n vvp-system label secret vvp-license-fingerprint \
5  app.kubernetes.io/managed-by=Helm --overwrite

Upgrade the release with the license:

BASH
1helm upgrade --install ververica-platform \
2  oci://registry.ververica.cloud/platform-charts/ververica-platform \
3  --version 3.1.1 \
4  --namespace vvp-system \
5  --values values-vvp.yaml \
6  -f license-vvp.yaml

Restart the Application Manager and the gateway to apply the license:

BASH
1kubectl -n vvp-system delete pod vvp-appmanager-0 vvp-gateway-0

After a few minutes, all pods in vvp-system are Running and ready:

BASH
1kubectl -n vvp-system get pods

Open the Web Console

Forward the gateway service on all interfaces of the instance:

BASH
1kubectl port-forward svc/api-gateway 8080:8080 -n vvp-system --address 0.0.0.0

The port forward stops when the terminal closes. To keep it running in the background until the next reboot:

BASH
1nohup kubectl port-forward svc/api-gateway 8080:8080 -n vvp-system --address 0.0.0.0 > /var/log/vvp-port-forward.log 2>&1 &

Open http://<EC2_INSTANCE_DNS>:8080 in your browser, where <EC2_INSTANCE_DNS> is the public DNS name of the instance, shown in the EC2 console.

Next Steps

Clean Up

To remove the cluster and everything installed in it, terminate the EC2 instance.

Was this helpful?