--no-managed.
Prerequisites
Register your environment
Before you enroll, your account team registers your environment and enables managed mode for your organization. Give them:- your AWS account id, region, and EKS cluster name
- whether the connector runs on a Linux VM or in the cluster
- the node group for platform components
- the namespace prefix for services (default
ns-) - how your cluster pulls ClickHouse images: through the registry access ClickHouse Cloud sets up for your account, or your own mirror
For every install
- Connector v0.17.0 or later. Earlier releases have no managed mode,
platformcommands, orinstances create. The installer serves the latest release unless you pass--version. - Your connector endpoint and enrollment token, provided during registration.
- Egress on port 443 to
https://<subdomain>.<connector-domain>andhttps://<subdomain>.enroll.<connector-domain>, plusreleases.clicklink.clickhouse.comand Amazon ECR Public at install time. In managed mode the executor also reaches Amazon ECR and STS when a platform sync or create pulls a chart from ECR. If any of these is unreachable, see air-gapped and mirrored installs. - An Amazon EKS cluster for managed mode.
initrefuses managed mode on any other cluster and points to--no-managedfor an install without the executor. - Cluster admin for the executor’s grant. The grant creates a ClusterRole, a ClusterRoleBinding, and a ValidatingAdmissionPolicy that confines the executor to namespaces under your prefix. On Kubernetes, the kubeconfig you run
initwith needs it. On a VM, the host’s kubeconfig needs it; when the host has no admin,initprints the command to run from a host that does. - No ClickHouse yet. A managed install starts with no services; the ones the executor creates register themselves. In managed mode
initregisters no ClickHouse you run yourself (on Kubernetes it refuses--instanceand--instance-namespace). To observe such a cluster, install a separate connector deployment with--no-managed.--ch-user-suffixlets the two deployments share an instance without colliding on the connector’s users. That deployment needs a reachable native listener, secure 9440 or plaintext 9000, auto-detected on Kubernetes. It also needs ClickHouse admin access for provisioning: a passwordlessdefaultuser, a password passed with--ch-admin-password-stdinor at the prompt, or CR injection for operator-managed instances. - cosign wherever you download release artifacts. The installer always verifies the SHA-256 checksum. With cosign installed it also verifies the release signature, and with
CLICKLINK_REQUIRE_COSIGN=1it refuses to proceed without cosign.
For Kubernetes (Helm) installs
- A kubeconfig whose current context points at the EKS cluster. It must be able to create and read the connector namespace, apply Secrets, create ServiceAccounts, Roles, and RoleBindings, install the chart, and grant the executor its cluster-wide access.
- AWS credentials on the workstation (environment or profile) with
eks:DescribeClusterandec2:DescribeVpcs.inituses them to read your cluster VPC’s CIDR blocks for the NetworkPolicy. If the lookup fails, it warns and leaves that list for you to fill in. - The CIDRs behind your connector endpoint, to enable the chart’s default-deny NetworkPolicy at install time. Without them,
initstages the policy disabled and prints how to enable it later. - A default StorageClass, or a class to pass with
--storage-class; the troubleshooter and the executor keep state on PersistentVolumeClaims. - Image pull access: cluster nodes must be able to pull the public ECR image, or a mirror you host.
For Linux VM (systemd) installs
- Any systemd Linux host, amd64 or arm64. Linux builds run in FIPS mode.
- Root access for the installer and for
init. - Free ports 8082, 8084, and 8086 for health and metrics, 9999 on the loopback interface for the executor’s local API, and 8443 when the support-session gateway is enabled.
- Admin access to the Kubernetes API server for provisioning and the executor’s grant: a kubeconfig on the host,
--serverand--ca-data, or the prompts. Access bundles are anchored to Kubernetes ServiceAccounts on both targets. In managed mode the kubeconfig’s current context must point at the EKS cluster you manage;initrefuses to grant through any other context.
On a VM,
--skip-provision is the only way around the Kubernetes API server requirement, and it is stage-only. It skips ClickHouse user provisioning, the executor’s grant, the unit enable, and verification, so it produces no running connector by itself. On Kubernetes it skips ClickHouse user provisioning only. The executor’s grant is still applied, because the chart’s executor cannot schedule without the granted ServiceAccount.Install and enroll
1
Get your connector endpoint and enrollment token
Both come from your account team once your environment is registered. The endpoint has the form:The token is single-use and expires quickly, so enroll soon after you receive it. Treat it as a secret: the CLI reads it from a hidden prompt or the first line of stdin, never from command-line arguments, disk, or logs. If it expires before you enroll, ask your account team for a fresh one.
2
Install and verify the CLI
One command installs a verified For a VM install, run the same script on the host with Both forms accept
clicklink binary. It detects your platform (macOS or Linux, amd64 or arm64), downloads the current release, and verifies the SHA-256 checksum. With cosign installed it also verifies the release signature. It installs into /usr/local/bin when that is writable, otherwise into ~/.local/bin (add that to your PATH if needed; --bin-dir overrides). For a Kubernetes install, run it on any workstation with kubeconfig access to the cluster:--host. After the verified download it creates the clicklink system user, the /etc/clicklink, /var/lib/clicklink, and /var/log/clicklink directories, and the systemd units for all three components. It seeds /etc/clicklink/redaction-patterns.yaml with a starter set of patterns (an existing file is preserved), so the next step is enrollment:--version vX.Y.Z to pin a release. Re-running either is safe: the host install backs up the previous binary and preserves your live configuration. To inspect the script before running it, or to fetch and verify the release tarball yourself, see manual download and verification.3
Enroll and install the connector
init --enroll redeems your token, obtains a signed client certificate and the executor’s cluster-wide grant, then installs and verifies the connector.On a terminal, init asks Enable managed mode (ClickHouse manages the lifecycle of ClickHouse services in this cluster)? with yes preselected. Pass --managed to skip the prompt, or --no-managed for an observe-only install without the executor. An unattended fresh install with neither flag leaves managed mode off (a --force re-run keeps the replaced configuration’s posture), so always pass --managed in scripts.- Kubernetes
- Linux VM
From your workstation, with the kube context pointed at your EKS cluster, run:Paste the enrollment token at the hidden prompt. Pass
init reads the cluster’s name, region, and AWS account from the current context’s EKS ARN, so you type nothing about the cluster. It then prompts for:- the connector namespace (default
clicklink) - a StorageClass, only when the cluster marks no default
- the CIDRs behind your connector endpoint, for the NetworkPolicy egress allowlist (leave empty to stage the policy disabled)
- the support-session posture and, if enabled, the operator email allowlist
init redeems the token and saves the enrollment bundle as handoff.yaml in the working directory. It stages the Helm values overlay clicklink-values.yaml with the executor block and your cluster VPC’s ranges as the NetworkPolicy’s API server CIDRs. It creates the namespace, applies the clicklink-hmac Secret, generates the private key inside the clicklink-mtls Secret, and writes the CSR. It grants the executor’s cluster-wide access into the connector namespace and has ClickHouse Cloud sign the client certificate. It installs the clicklink-connector Helm release with its built-in Helm client (no helm binary required) and verifies health.For unattended runs, answer the prompts with flags instead. Use the saved bundle as the entry point, or pipe the enrollment token to --enroll as the first line of stdin:--no-gateway instead of --operators to disable support sessions; the two flags are mutually exclusive.init prints Managed mode is on with the command that prepares your first service. Continue with create a service.4
Verify success
init verifies the install before it reports success. On Kubernetes it polls the /livez endpoint of each enabled component, the executor included, for up to five minutes. When the support-session gateway is enabled, it also requires the gateway to answer unauthenticated probes with 401. On a VM it waits for each daemon’s /livez, then runs the full preflight suite. The suite checks config, files, port conflicts, network reachability, ClickHouse connectivity, systemd unit state for all three units, per-component access, disk, and redaction patterns.To confirm by hand on Kubernetes:Running and ready: the scraper, the troubleshooter, and the executor.To confirm by hand on a VM:0 when every check passes and 2 on any failure, and prints the failing checks.5
Clean up
The enrollment bundle The running connector holds its own copy of the credentials; upgrades and configuration changes never need the file. If you need
handoff.yaml (mode 0600, in the working directory) lets re-runs and recovery during the install proceed without a second token. It holds the connector’s API secret in plaintext, so delete it once the install has verified:init again later, request a fresh enrollment token from your account team and run init --enroll --force.Air-gapped and mirrored installs
Two independent pieces can move out of band, depending on what your environment can reach. The executor needs nothing extra. It authenticates with the same client certificate and API credentials as the other components. You apply its cluster-wide grant through your kubeconfig, not over the network. Bundle delivery. If you prefer not to redeem a token online, your account team can deliver the enrollment bundle directly during onboarding; runclicklink clctl init --handoff <bundle-file> in place of --enroll. --handoff replaces only the token redemption. Certificate signing still happens over the enrollment endpoint, so use --handoff alone only when that endpoint is reachable from where you run init.
Out-of-band certificate signing. When the enrollment endpoint is unreachable from where you run init, add --no-auto-sign: init stages everything and writes clicklink.csr. Send the CSR to your account team, then complete the install with the returned certificate and chain. On a VM, run sudo clicklink clctl init --signed-cert client.crt --chain ca-chain.crt. On Kubernetes, run clicklink clctl init --signed-cert client.crt --chain ca-chain.crt --target helm --target-namespace <connector-namespace> --values clicklink-values.yaml; the staged run prints an equivalent kubectl patch plus helm upgrade --install sequence. Only the CSR travels; the private key never leaves your environment.
On Kubernetes, --chart accepts a chart name resolved through --chart-repo, an oci:// reference, a direct URL, or a local archive or directory. --chart-version defaults to the CLI’s own version, so the binary and chart move together. To serve images from your own registry, mirror the container image and set image.repository in the values overlay. If your egress path presents a private CA to the connector, pass --api-private-ca. The connector then verifies your connector endpoint against the system roots plus the CA chain from the enrollment bundle.
The installer works from a mirror too: host the release artifacts and install.sh on your own mirror and point at it with CLICKLINK_MIRROR_URL.
Manual download and verification
When you prefer not to pipe the installer, fetch and verify the release yourself. The block detects your platform and architecture; run it as is on macOS or Linux, amd64 or arm64:sudo ./install.sh from the extracted directory. Next to its release artifacts, it performs the same host install as --host.
If something fails
Re-run the same command.init is idempotent: re-runs converge on the same state, keep your existing config and staged files, and skip completed work. When a step fails partway through, the CLI prints the exact recovery commands; they are safe to repeat.
If enrollment is refused, the token was already redeemed, invalid, or expired. For a redeemed token, re-run with --handoff handoff.yaml, which exists until the cleanup step. Otherwise ask your account team for a fresh token. If enrollment fails with a transport error, re-run the same command. A refused re-run means the first attempt spent the token, so request a fresh one.
If managed mode is refused because the cluster is not EKS, re-run with --no-managed to install without the executor. On a VM, a kubeconfig whose current context points elsewhere is refused too: switch context with kubectl config use-context and re-run.
If the executor’s grant cannot be applied:
- On a VM,
initdoes not fail. It stages the bundle and prints a warning with the exact command to run from a kubeconfig that has cluster admin. The verifying preflight reports the executor’s state as it is. Run the printed command, then re-run the sameinitcommand to verify:
- On Kubernetes, a refused grant stops
initbefore the chart is deployed, because the executor binds to the granted ServiceAccount and cannot start without it. The staged overlay, Secrets, and CSR are kept, andinitprints the two commands to run from a host with cluster admin. Run them, then re-run the sameinitcommand to continue:
--force is an explicit reset; a routine retry does not need it. It overwrites the kept config or values overlay, regenerates the client key, and supersedes an unexpired client certificate (a 409 from the signing endpoint means one already exists). It preserves the connector’s cluster UUID and its managed-mode posture. Unattended re-runs keep the posture, and on a terminal the prompt defaults to it, unless you pass --managed or --no-managed. Use --force to rotate credentials or supersede a certificate; see operations for the full re-run and recovery model.