Kubernetes configuration
Prepare your project
The Kubernetes version of Qodana Self-Hosted is deployed on a Kubernetes cluster.
Kubernetes cluster
All requirements to a cluster are described in the Kubernetes version chapter. For resilience, we recommend deploying your cluster on at least three nodes.
Make sure that all nodes of your cluster have unique hostnames.
Below are the links to the Kubernetes documentation that you can use to deploy a cluster:
This is the minimum list of tools that should be deployed and configured on your cluster:
Tool | Description | Control plane nodes | Worker nodes |
|---|---|---|---|
Run pods of your cluster | Required | Required | |
Delegate tasks to the container runtime | Required | Required | |
Interact with the cluster API using a command line interface | Required | Not required | |
kubeadm or other similar tools | Bootstrap and manage Kubernetes clusters | Required | Not required |
CNI or container network interface plugin (flannel or other) * | Assign IP addresses to pods | Required | Required |
* You need to select a Pod Network CIDR that does not overlap with your host network. For example, for flannel this can be 10.244.0.0/16.
After deployment, make sure that all these components are running and healthy.
Helm Chart
In the Kubernetes version of Qodana Self-Hosted, the deployment is configurable via a Helm Chart deployed on an up-and-running Kubernetes cluster. To install Helm on your control plane node, run the following command:
Once installed, Helm needs a Chart contained in the values.yaml file. This file lets you customize endpoints, resources, secrets, integrations, and security policies.
The actual version of the Qodana Helm Chart is 1.0.3. Run the following command to pull the actual version of the product:
Navigate to the directory where the values.yaml file is located and run the following command to install the product, for example:
After deploying a cluster, run the kubectl get svc command to see the list of services deployed.
Ingress controller
You can use any ingress controller to expose Qodana Self-Hosted to the internet. Examples include: NGINX, Traefik, Kong, AWS ALB, GKE, etc. For each type of ingress controller, you have to configure the following aspects:
Redirect behavior
Client identity propagation
Size/buffering limits
Also, decide where TLS terminates and what performs HTTP to HTTPS redirects; if your edge LB/CDN already enforces HTTPS, then disable redirects at the ingress to avoid loops and double hops.
Besides that, ensure that your applications see the real client IP, scheme, and host: choose the appropriate mechanism your controller supports (X-Forwarded-* headers, Forwarded header, or PROXY protocol) and restrict trust to known upstream CIDRs so users can’t spoof IPs.
Finally, right-size limits for request headers, request bodies, and response buffering to match your workloads like SSO cookies, many Set-Cookie headers, file uploads, and streaming.
Each controller exposes different knobs and names for these concepts, but they map to the same concerns: header buffer sizes, large-header buffers, max body size, proxy buffer sizes, forwarded header handling, and optional proxy protocol. Review your controller’s documentation for the exact settings, mirror the intent of the examples shown for NGINX, and validate under load tests to confirm no 400/413 responses, no misreported client IPs, and consistent redirect behavior.
Here is an example of the NGINX configuration:
Configure your project
All configuration snippets here are provided for the values.yaml file.
Prerequisites
This guide explains how to configure Qodana Self-Hosted URLs when switching from qodana.local to a new domain.
Before you start, make sure that the following requirements are met:
The new domain is registered, and DNS records for Qodana Self-Hosted are configured to point to your Kubernetes ingress controller. For example, it can be
externalurls.local. The DNS records that point (CNAME) to the DNS record of your ingress controller are the following:externalurls.localapi.externalurls.locallintersapi.externalurls.localfiles.externalurls.locallogin.externalurls.local
The API, UI, Linters API, Object Storage, and Identity Provider Helm Chart services must be updated for a new domain.
Internal URL of your Ingress Controller Load Balancer. Example:
ingress-nginx-controller.kube-ingress.svc.cluster.local.Sufficient permissions are provided to modify the namespace where Qodana is deployed.
Update URLs
Update URLs for the following services:
Update ingress hostnames
Ensure that ingress hostnames match the updated URLs by using YAML pointers (*) for consistency. Modify the following sections:
Update organization name and memory settings
Update the organization name as follows:
Memory settings for the API service can be configured as follows:
Configuration example
Here is an example of the values.yaml file containing these modifications:
Configure via CLI
You can override the existing Qodana Self-Hosted Helm Chart settings, here is an example of a memory limit override:
Apply the generated manifests to your cluster using kubectl: