Skip to content

Commit a11f66f

Browse files
committed
refactor: switch version probe to shell-free clickhouse local execution for distroless compatibility
1 parent 963ff9a commit a11f66f

4 files changed

Lines changed: 35 additions & 8 deletions

File tree

internal/controller/clickhouse/sync.go

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -399,7 +399,6 @@ func (r *clickhouseReconciler) reconcileExternalSecret(ctx context.Context, log
399399

400400
func (r *clickhouseReconciler) reconcileVersionProbe(ctx context.Context, log ctrlutil.Logger) (chctrl.StepResult, error) {
401401
probeResult, err := r.VersionProbe(ctx, log, chctrl.VersionProbeConfig{
402-
Binary: "clickhouse-server",
403402
Labels: r.Cluster.Spec.Labels,
404403
Annotations: r.Cluster.Spec.Annotations,
405404
PodTemplate: r.Cluster.Spec.PodTemplate,

internal/controller/keeper/sync.go

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -204,7 +204,6 @@ func (r *keeperReconciler) reconcileClusterRevisions(ctx context.Context, log ct
204204
}
205205

206206
probeResult, err := r.VersionProbe(ctx, log, chctrl.VersionProbeConfig{
207-
Binary: "clickhouse-keeper",
208207
Labels: r.Cluster.Spec.Labels,
209208
Annotations: r.Cluster.Spec.Annotations,
210209
PodTemplate: r.Cluster.Spec.PodTemplate,

internal/controller/versionprobe.go

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -26,12 +26,12 @@ const (
2626
DefaultProbeCPURequest = "250m"
2727
DefaultProbeMemoryLimit = "1Gi"
2828
DefaultProbeMemoryRequest = "256Mi"
29+
versionProbeBinary = "/usr/bin/clickhouse"
30+
versionProbeQuery = "INSERT INTO FUNCTION file('/dev/termination-log', 'RawBLOB', 'version String') SELECT version()"
2931
)
3032

3133
// VersionProbeConfig holds parameters for the version probe Job.
3234
type VersionProbeConfig struct {
33-
// Name of the binary to run.
34-
Binary string
3535
// Labels to apply to the Job, inherited from the cluster spec.
3636
Labels map[string]string
3737
// Annotations to apply to the Job, inherited from the cluster spec.
@@ -250,7 +250,13 @@ func imageRevision(cfg VersionProbeConfig) (string, error) {
250250
return hash, nil
251251
}
252252

253+
func versionProbeCommand() ([]string, []string) {
254+
return []string{versionProbeBinary}, []string{"local", "--query", versionProbeQuery}
255+
}
256+
253257
func (rm *ResourceManager) buildVersionProbeJob(cfg VersionProbeConfig, revision string) (batchv1.Job, error) {
258+
command, args := versionProbeCommand()
259+
254260
job := batchv1.Job{
255261
ObjectMeta: metav1.ObjectMeta{
256262
Namespace: rm.owner.GetNamespace(),
@@ -280,7 +286,8 @@ func (rm *ResourceManager) buildVersionProbeJob(cfg VersionProbeConfig, revision
280286
SecurityContext: DefaultContainerSecurityContext(),
281287
TerminationMessagePolicy: corev1.TerminationMessageReadFile,
282288
TerminationMessagePath: corev1.TerminationMessagePathDefault,
283-
Command: []string{"sh", "-c", fmt.Sprintf("%s --version > %s 2>&1", cfg.Binary, corev1.TerminationMessagePathDefault)},
289+
Command: command,
290+
Args: args,
284291
Resources: corev1.ResourceRequirements{
285292
Requests: corev1.ResourceList{
286293
corev1.ResourceCPU: resource.MustParse(DefaultProbeCPURequest),

internal/controller/versionprobe_test.go

Lines changed: 25 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,8 @@ func baseJob() batchv1.Job {
5454
{
5555
Name: v1.VersionProbeContainerName,
5656
Image: "clickhouse/clickhouse-server:latest",
57-
Command: []string{"sh", "-c", "clickhouse-server --version"},
57+
Command: []string{versionProbeBinary},
58+
Args: []string{"local", "--query", versionProbeQuery},
5859
SecurityContext: &corev1.SecurityContext{
5960
RunAsNonRoot: new(true),
6061
},
@@ -189,7 +190,8 @@ var _ = Describe("patchResource with jobSchema (version probe overrides)", func(
189190

190191
By("verifying container command is preserved")
191192
Expect(container.Image).To(Equal("clickhouse/clickhouse-server:latest"))
192-
Expect(container.Command).To(Equal([]string{"sh", "-c", "clickhouse-server --version"}))
193+
Expect(container.Command).To(Equal([]string{versionProbeBinary}))
194+
Expect(container.Args).To(Equal([]string{"local", "--query", versionProbeQuery}))
193195
})
194196

195197
It("should deep-merge securityContext via SMP", func() {
@@ -311,7 +313,6 @@ func (f *fakeController) GetRecorder() events.EventRecorder { return f.recorder
311313
// probeCfg returns a VersionProbeConfig with the given image and cache values.
312314
func probeCfg(image, cachedVersion, cachedRevision string) VersionProbeConfig {
313315
return VersionProbeConfig{
314-
Binary: "clickhouse-server",
315316
ContainerTemplate: v1.ContainerTemplateSpec{
316317
Image: v1.ContainerImage{Repository: image, Tag: "latest"},
317318
},
@@ -320,6 +321,27 @@ func probeCfg(image, cachedVersion, cachedRevision string) VersionProbeConfig {
320321
}
321322
}
322323

324+
var _ = Describe("buildVersionProbeJob", func() {
325+
It("should use a shell-free ClickHouse local command for distroless images", func() {
326+
rm, _ := setupProbeTest()
327+
cfg := probeCfg("clickhouse/clickhouse-server", "", "")
328+
329+
revision, err := imageRevision(cfg)
330+
Expect(err).NotTo(HaveOccurred())
331+
332+
job, err := rm.buildVersionProbeJob(cfg, revision)
333+
Expect(err).NotTo(HaveOccurred())
334+
335+
container := job.Spec.Template.Spec.Containers[0]
336+
337+
Expect(container.Command).To(Equal([]string{versionProbeBinary}))
338+
Expect(container.Args).To(Equal([]string{"local", "--query", versionProbeQuery}))
339+
Expect(versionProbeQuery).To(ContainSubstring(corev1.TerminationMessagePathDefault))
340+
Expect(container.TerminationMessagePath).To(Equal(corev1.TerminationMessagePathDefault))
341+
Expect(container.TerminationMessagePolicy).To(Equal(corev1.TerminationMessageReadFile))
342+
})
343+
})
344+
323345
var _ = Describe("VersionProbe caching", func() {
324346
It("should return cached version on cache hit without creating a Job", func(ctx context.Context) {
325347
rm, log := setupProbeTest()

0 commit comments

Comments
 (0)