Skip to content

Commit 65644c0

Browse files
committed
Add native-Go OHE support to Connect chart and update RBAC
- Add `kubernetes.enabled` and related values to rstudio-connect for native-Go off-host execution (OHE) support - Update templates and config to support new OHE mode, overlays, and init container - Add validation to prevent both `launcher.enabled` and `kubernetes.enabled` - Update RBAC in rstudio-library to grant endpointslice list/watch permissions - Bump rstudio-connect to 0.8.27 and rstudio-library to 0.1.37 - Update NEWS.md and README.md.gotmpl for both charts
1 parent 24cc500 commit 65644c0

File tree

15 files changed

+158
-21
lines changed

15 files changed

+158
-21
lines changed

charts/rstudio-connect/Chart.yaml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
name: rstudio-connect
22
description: Official Helm chart for Posit Connect
3-
version: 0.8.26
3+
version: 0.8.27
44
apiVersion: v2
55
appVersion: 2026.01.1
66
icon: https://raw.githubusercontent.com/rstudio/helm/main/images/posit-icon-fullcolor.svg
@@ -13,7 +13,7 @@ maintainers:
1313
url: https://github.com/sol-eng
1414
dependencies:
1515
- name: rstudio-library
16-
version: 0.1.35
16+
version: 0.1.37
1717
repository: https://helm.rstudio.com
1818
annotations:
1919
artifacthub.io/images: |

charts/rstudio-connect/NEWS.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,9 @@
11
# Changelog
22

3+
## 0.8.27
4+
5+
- Adds support for a native-Go implementation of Off-Host Execution (OHE) mode. Set `kubernetes.enabled = true` to switch to the new implementation. See the [migration guide](<todo: insert migration guide docs link>) in the Connect admin documentation for guidance on migrating existing configurations.
6+
37
## 0.8.26
48

59
- Fix bug in chart where sharedStorage.subPath did not propagate to launcher-managed job volumeMounts.

charts/rstudio-connect/README.md

Lines changed: 14 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
# Posit Connect
22

3-
![Version: 0.8.26](https://img.shields.io/badge/Version-0.8.26-informational?style=flat-square) ![AppVersion: 2026.01.1](https://img.shields.io/badge/AppVersion-2026.01.1-informational?style=flat-square)
3+
![Version: 0.8.27](https://img.shields.io/badge/Version-0.8.27-informational?style=flat-square) ![AppVersion: 2026.01.1](https://img.shields.io/badge/AppVersion-2026.01.1-informational?style=flat-square)
44

55
#### _Official Helm chart for Posit Connect_
66

@@ -30,11 +30,11 @@ To ensure reproducibility in your environment and insulate yourself from future
3030

3131
## Installing the chart
3232

33-
To install the chart with the release name `my-release` at version 0.8.26:
33+
To install the chart with the release name `my-release` at version 0.8.27:
3434

3535
```{.bash}
3636
helm repo add rstudio https://helm.rstudio.com
37-
helm upgrade --install my-release rstudio/rstudio-connect --version=0.8.26
37+
helm upgrade --install my-release rstudio/rstudio-connect --version=0.8.27
3838
```
3939

4040
To explore other chart versions, look at:
@@ -48,7 +48,7 @@ helm search repo rstudio/rstudio-connect -l
4848
### 0.8.0
4949

5050
- When upgrading to version 0.8.0 or later, Connect now runs in [Off-Host Execution mode](https://docs.posit.co/connect/admin/getting-started/off-host-install/) by default
51-
- If you desire to run Connect not in Off-Host Execution mode, then set `securityContext.privileged: true` and `launcher.enabled: false`
51+
- If you desire to run Connect in Local Execution mode, then set `securityContext.privileged: true` and `launcher.enabled: false`
5252

5353
## Required configuration
5454

@@ -248,6 +248,14 @@ The Helm `config` values are converted into the `rstudio-connect.gcfg` service c
248248
| ingress.ingressClassName | string | `""` | The ingressClassName for the ingress resource. Only used for clusters that support networking.k8s.io/v1 Ingress resources |
249249
| ingress.tls | list | `[]` | |
250250
| initContainers | bool | `false` | The initContainer spec that will be used verbatim |
251+
| kubernetes.defaultInitContainer.enabled | bool | `true` | Whether to enable the defaultInitContainer. If disabled, you must ensure that the session components are available another way. |
252+
| kubernetes.defaultInitContainer.repository | string | `"ghcr.io/rstudio/rstudio-connect-content-init"` | The repository to use for the Content InitContainer image |
253+
| kubernetes.defaultInitContainer.tag | string | `""` | Overrides the image tag whose default is the chart appVersion. |
254+
| kubernetes.defaultInitContainer.tagPrefix | string | `"ubuntu2204-"` | A tag prefix for the Content InitContainer image (common selections: jammy-, ubuntu2204-). Only used if tag is not defined |
255+
| kubernetes.defaultJobOverlay | object | `{"apiVersion":"batch/v1","kind":"Job","spec":{"template":{"spec":{"containers":[{"name":"connect-content","volumeMounts":[{"mountPath":"/opt/rstudio-connect/R","name":"rsc-volume","subPath":"R"},{"mountPath":"/opt/rstudio-connect/python","name":"rsc-volume","subPath":"python"},{"mountPath":"/opt/rstudio-connect/scripts","name":"rsc-volume","subPath":"scripts"},{"mountPath":"/opt/rstudio-connect/ext","name":"rsc-volume","subPath":"ext"}]}],"initContainers":[{"name":"connect-content-init","volumeMounts":[{"mountPath":"/mnt/rstudio-connect-runtime/","name":"rsc-volume"}]}],"volumes":[{"emptyDir":{},"name":"rsc-volume"}]}}}}` | defaultJobOverlay contains the Kubernetes Job definition which is used as an overlay "base" when launching a content job in Kubernetes. Conceptually this is a similar to a Kustomize base. Connect then applies any required job configuration on-top of the overlay base to produce a final job definition before submitting the Job to Kubernetes. https://docs.posit.co/connect/__unreleased__/admin/appendix/off-host/direct-runner/kubernetes-job-overlays.html https://kubernetes.io/docs/tasks/manage-kubernetes-objects/kustomization/#bases-and-overlays |
256+
| kubernetes.defaultServiceOverlay | object | `{}` | defaultServiceOverlay contains the Kubernetes Service definition which is used as an overlay "base" when creating a content job's Service in Kubernetes. Conceptually this is a similar to a Kustomize base. Connect then applies any required Service configuration on-top of the overlay base to produce a final Service definition. |
257+
| kubernetes.enabled | bool | `false` | Whether to enable the native Go implementation of off-host execution for running content-jobs in remote Kubernetes pods. |
258+
| kubernetes.namespace | string | `""` | The namespace to launch connect-content jobs into. Uses the Release namespace by default |
251259
| launcher.additionalRuntimeImages | list | `[]` | Optional. Additional images to append to the end of the "launcher.customRuntimeYaml" (in the "images" key). If `customRuntimeYaml` is a "map", then "additionalRuntimeImages" will only be used if it is a "list". |
252260
| launcher.customRuntimeYaml | string | `"base"` | Optional. The runtime.yaml definition of Kubernetes runtime containers. Defaults to "base", which pulls in the default runtime.yaml file. If changing this value, be careful to include the images that you have already used. If set to "pro", will pull in the "pro" versions of the default runtime images (i.e. including the pro drivers at the cost of a larger image). Starting with Connect v2023.05.0, this configuration is used to bootstrap the initial set of execution environments the first time the server starts. If any execution environments already exist in the database, these values are ignored; execution environments are not created or modified during subsequent restarts. |
253261
| launcher.defaultInitContainer | object | `{"enabled":true,"imagePullPolicy":"","repository":"ghcr.io/rstudio/rstudio-connect-content-init","resources":{},"securityContext":{},"tag":"","tagPrefix":"ubuntu2204-"}` | Image definition for the default Posit Connect Content InitContainer |
@@ -309,8 +317,8 @@ The Helm `config` values are converted into the `rstudio-connect.gcfg` service c
309317
| prometheusExporter.resources | object | `{}` | resource specification for the prometheus exporter sidecar |
310318
| prometheusExporter.securityContext | object | `{}` | securityContext for the prometheus exporter sidecar |
311319
| rbac.clusterRoleCreate | bool | `false` | Whether to create the ClusterRole that grants access to the Kubernetes nodes API. This is used by the Launcher to get all of the IP addresses associated with the node that is running a particular job. In most cases, this can be disabled as the node's internal address is sufficient to allow proper functionality. |
312-
| rbac.create | bool | `true` | Whether to create rbac. (also depends on launcher.enabled = true) |
313-
| rbac.serviceAccount | object | `{"annotations":{},"create":true,"labels":{},"name":""}` | The serviceAccount to be associated with rbac (also depends on launcher.enabled = true) |
320+
| rbac.create | bool | `true` | Whether to create rbac. (also depends on launcher.enabled = true or kubernetes.enabled = true) |
321+
| rbac.serviceAccount | object | `{"annotations":{},"create":true,"labels":{},"name":""}` | The serviceAccount to be associated with rbac (also depends on launcher.enabled = true or kubernetes.enabled = true) |
314322
| readinessProbe | object | `{"enabled":true,"failureThreshold":3,"httpGet":{"path":"/__ping__","port":3939},"initialDelaySeconds":3,"periodSeconds":3,"successThreshold":1,"timeoutSeconds":1}` | Used to configure the container's readinessProbe. Only included if enabled = true |
315323
| replicas | int | `1` | The number of replica pods to maintain for this service |
316324
| resources | object | `{}` | Defines resources for the rstudio-connect container |

charts/rstudio-connect/README.md.gotmpl

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@
1313
### 0.8.0
1414

1515
- When upgrading to version 0.8.0 or later, Connect now runs in [Off-Host Execution mode](https://docs.posit.co/connect/admin/getting-started/off-host-install/) by default
16-
- If you desire to run Connect not in Off-Host Execution mode, then set `securityContext.privileged: true` and `launcher.enabled: false`
16+
- If you desire to run Connect in Local Execution mode, then set `securityContext.privileged: true` and `launcher.enabled: false`
1717

1818
## Required configuration
1919

charts/rstudio-connect/templates/NOTES.txt

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,10 @@ Please consider removing this configuration value.
3434

3535
{{- /* chart deprecations and misconfiguration warnings */ -}}
3636

37+
{{- if and .Values.launcher.enabled .Values.kubernetes.enabled }}
38+
{{- fail "\n\n`launcher.enabled` and `kubernetes.enabled` cannot both be true"}}
39+
{{- end }}
40+
3741
{{- if and .Values.launcher.useTemplates .Values.launcher.enabled }}
3842
{{- range $k,$v := .Values.launcher.launcherKubernetesProfilesConf }}
3943
{{- if hasKey $v "job-json-overrides" }}

charts/rstudio-connect/templates/_helpers.tpl

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -76,6 +76,33 @@ app.kubernetes.io/instance: {{ .Release.Name }}
7676
{{- $launcherDict := dict "Launcher" ( $launcherSettingsDict ) }}
7777
{{- $defaultConfig = merge $defaultConfig $launcherDict }}
7878
{{- end }}
79+
{{- if .Values.kubernetes.enabled }}
80+
{{- $namespace := default $.Release.Namespace .Values.kubernetes.namespace }}
81+
{{- $kubernetesSettingsDict := dict "Enabled" ("true") "Namespace" ($namespace) }}
82+
{{- if and (or .Values.sharedStorage.create .Values.sharedStorage.mount) .Values.sharedStorage.mountContent }}
83+
{{- $dataDirPVCName := default (print (include "rstudio-connect.fullname" .) "-shared-storage" ) .Values.sharedStorage.name }}
84+
{{- $_ := set $kubernetesSettingsDict "DataDirPVCName" $dataDirPVCName }}
85+
{{- end }}
86+
{{- if .Values.kubernetes.defaultJobOverlay }}
87+
{{- if and .Values.kubernetes.defaultInitContainer.enabled }}
88+
{{- $defaultVersion := .Values.versionOverride | default $.Chart.AppVersion }}
89+
{{- $initContainerImageTag := .Values.kubernetes.defaultInitContainer.tag | default (printf "%s%s" .Values.kubernetes.defaultInitContainer.tagPrefix $defaultVersion )}}
90+
{{- $initContainerImage := print .Values.kubernetes.defaultInitContainer.repository ":" ( $initContainerImageTag ) }}
91+
{{- range (.Values.kubernetes.defaultJobOverlay.spec.template.spec).initContainers | default list }}
92+
{{- if eq .name "connect-content-init" }}
93+
{{- $_ := set . "image" $initContainerImage }}
94+
{{- break }}
95+
{{- end }}
96+
{{- end }}
97+
{{- end }}
98+
{{- $_ := set $kubernetesSettingsDict "DefaultJobOverlay" (default "/etc/rstudio-connect/job.yaml" .Values.config.Kubernetes.DefaultJobOverlay) }}
99+
{{- end }}
100+
{{- if .Values.kubernetes.defaultServiceOverlay }}
101+
{{- $_ = set $kubernetesSettingsDict "DefaultServiceOverlay" (default "/etc/rstudio-connect/service.yaml" .Values.config.Kubernetes.DefaultServiceOverlay) }}
102+
{{- end }}
103+
{{- $kubernetesDict := dict "Kubernetes" ( $kubernetesSettingsDict ) }}
104+
{{- $defaultConfig = merge $defaultConfig $kubernetesDict }}
105+
{{- end }}
79106
{{- /* default licensing configuration */}}
80107
{{- if .Values.license.server }}
81108
{{- $licenseDict := dict "Licensing" ( dict "LicenseType" ("Remote") ) }}

charts/rstudio-connect/templates/configmap-prestart.yaml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
{{- if .Values.launcher.enabled }}
1+
{{- if or .Values.launcher.enabled .Values.kubernetes.enabled }}
22
---
33
apiVersion: v1
44
kind: ConfigMap

charts/rstudio-connect/templates/configmap.yaml

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,16 @@ metadata:
77
data:
88
rstudio-connect.gcfg: |
99
{{- include "rstudio-connect.config" . | nindent 4 }}
10+
{{- if .Values.kubernetes.enabled }}
11+
{{- if .Values.kubernetes.defaultJobOverlay }}
12+
job.yaml: |
13+
{{ .Values.kubernetes.defaultJobOverlay | toYaml | indent 4 }}
14+
{{- end }}
15+
{{- if .Values.kubernetes.defaultServiceOverlay }}
16+
service.yaml: |
17+
{{ .Values.kubernetes.defaultServiceOverlay | toYaml | indent 4 }}
18+
{{- end }}
19+
{{- end }}
1020
{{- $sessionTemplate := deepCopy .Values.launcher.templateValues }}
1121
{{- if .Values.launcher.enabled }}
1222
runtime.yaml: |

charts/rstudio-connect/templates/deployment.yaml

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -186,6 +186,18 @@ spec:
186186
- name: rstudio-connect-config
187187
mountPath: "/etc/rstudio-connect/rstudio-connect.gcfg"
188188
subPath: "rstudio-connect.gcfg"
189+
{{- if .Values.kubernetes.enabled }}
190+
{{- if .Values.kubernetes.defaultJobOverlay }}
191+
- name: rstudio-connect-config
192+
mountPath: "/etc/rstudio-connect/job.yaml"
193+
subPath: "job.yaml"
194+
{{- end }}
195+
{{- if .Values.kubernetes.defaultServiceOverlay }}
196+
- name: rstudio-connect-config
197+
mountPath: "/etc/rstudio-connect/service.yaml"
198+
subPath: "service.yaml"
199+
{{- end }}
200+
{{- end }}
189201
{{- if .Values.launcher.enabled }}
190202
- name: rstudio-connect-config
191203
mountPath: "/etc/rstudio-connect/runtime.yaml"

charts/rstudio-connect/templates/rbac.yaml

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,11 @@
1-
{{- if and (.Values.rbac.create) (.Values.launcher.enabled) }}
1+
{{- if and (.Values.rbac.create) (or .Values.launcher.enabled .Values.kubernetes.enabled) }}
22
{{ $namespace := $.Release.Namespace }}
3-
{{ $targetNamespace := default $.Release.Namespace .Values.launcher.namespace }}
3+
{{ $targetNamespace := $.Release.Namespace }}
4+
{{- if .Values.launcher.enabled }}
5+
{{ $targetNamespace = default $targetNamespace .Values.launcher.namespace }}
6+
{{- else }}
7+
{{ $targetNamespace = default $targetNamespace .Values.kubernetes.namespace }}
8+
{{- end }}
49
{{ $serviceAccountName := default (include "rstudio-connect.fullname" .) .Values.rbac.serviceAccount.name }}
510
{{ $serviceAccountCreate := .Values.rbac.serviceAccount.create }}
611
{{ $serviceAccountAnnotations := .Values.rbac.serviceAccount.annotations }}

0 commit comments

Comments
 (0)