From 162d9b2c2a50bc3144d0b13bfdebd01c9d1cd36a Mon Sep 17 00:00:00 2001 From: wbsong111 Date: Wed, 6 May 2026 09:00:16 +0900 Subject: [PATCH] Update jupyter configuration for network connection --- .../helm/jupyterlab/1.0.0/CUSTOM-README.md | 16 ++++++------- .../helm/jupyterlab/1.0.0/custom-values.yaml | 16 +++++++++++++ .../jupyterlab/1.0.0/templates/configmap.yaml | 7 ++++++ .../1.0.0/templates/deployment.yaml | 13 ++++++++++ .../jupyterlab/1.0.0/templates/service.yaml | 4 ++++ manifests/helm/jupyterlab/1.0.0/values.yaml | 24 +++++++++++++++++++ 6 files changed, 72 insertions(+), 8 deletions(-) diff --git a/manifests/helm/jupyterlab/1.0.0/CUSTOM-README.md b/manifests/helm/jupyterlab/1.0.0/CUSTOM-README.md index 83a4cc2..2d9fecb 100644 --- a/manifests/helm/jupyterlab/1.0.0/CUSTOM-README.md +++ b/manifests/helm/jupyterlab/1.0.0/CUSTOM-README.md @@ -132,24 +132,24 @@ groupVolumes: [] ```bash # 렌더링 미리보기 (실제 배포 없음) -helm template my-jupyter ./manifests/helm/jupyterlab \ - -f ./manifests/helm/jupyterlab/custom-values.yaml +helm template my-jupyter ./manifests/helm/jupyterlab/1.0.0 \ + -f ./manifests/helm/jupyterlab/1.0.0/custom-values.yaml # 신규 설치 -helm install my-jupyter ./manifests/helm/jupyterlab \ +helm install my-jupyter ./manifests/helm/jupyterlab/1.0.0 \ --namespace jupyter \ --create-namespace \ - -f ./manifests/helm/jupyterlab/custom-values.yaml + -f ./manifests/helm/jupyterlab/1.0.0/custom-values.yaml # 업그레이드 -helm upgrade my-jupyter ./manifests/helm/jupyterlab \ +helm upgrade my-jupyter ./manifests/helm/jupyterlab/1.0.0 \ -n jupyter \ - -f ./manifests/helm/jupyterlab/custom-values.yaml + -f ./manifests/helm/jupyterlab/1.0.0/custom-values.yaml # 변경 사항 확인 (helm-diff 플러그인 필요) -helm diff upgrade my-jupyter ./manifests/helm/jupyterlab \ +helm diff upgrade my-jupyter ./manifests/helm/jupyterlab/1.0.0 \ -n jupyter \ - -f ./manifests/helm/jupyterlab/custom-values.yaml + -f ./manifests/helm/jupyterlab/1.0.0/custom-values.yaml ``` ## 환경별 설정 예시 diff --git a/manifests/helm/jupyterlab/1.0.0/custom-values.yaml b/manifests/helm/jupyterlab/1.0.0/custom-values.yaml index ab4fcd7..8f6ebe6 100644 --- a/manifests/helm/jupyterlab/1.0.0/custom-values.yaml +++ b/manifests/helm/jupyterlab/1.0.0/custom-values.yaml @@ -20,6 +20,15 @@ resources: jupyterConfig: token: "" + idleCullTimeout: 3600 # 1시간 유휴 후 커널 종료 (테스트용) + idleCullInterval: 300 # 5분마다 체크 + +# KIC 3.x: timeout은 Kubernetes Service 어노테이션으로 설정 (단위: ms) +service: + annotations: + konghq.com/connect-timeout: "60000" # 60초 + konghq.com/read-timeout: "3600000" # 1시간 + konghq.com/write-timeout: "3600000" # 1시간 ingress: enabled: true @@ -29,6 +38,7 @@ ingress: cert-manager.io/duration: "8760h" cert-manager.io/renew-before: "720h" konghq.com/https-redirect-status-code: "301" + # Kong은 https 프로토콜로 WebSocket Upgrade를 자동 처리 (wss 별도 지정 불필요) konghq.com/protocols: "https" hosts: - host: "jupyter.example.com" @@ -53,3 +63,9 @@ dataVolume: groupVolumes: [] +tcpKeepalive: + enabled: true + time: 120 # 유휴 120초 후 첫 probe 전송 (Linux 기본: 7200초) + intvl: 10 # probe 간격 10초 (Linux 기본: 75초) + probes: 6 # 6회 무응답 시 연결 종료 (Linux 기본: 9회) + diff --git a/manifests/helm/jupyterlab/1.0.0/templates/configmap.yaml b/manifests/helm/jupyterlab/1.0.0/templates/configmap.yaml index b8bc238..768b63e 100644 --- a/manifests/helm/jupyterlab/1.0.0/templates/configmap.yaml +++ b/manifests/helm/jupyterlab/1.0.0/templates/configmap.yaml @@ -10,3 +10,10 @@ data: #!/bin/bash apt-get update -y python -m pip install --no-cache-dir --upgrade pip + jupyter_server_config.py: | + # Idle kernel culling + # idleCullTimeout=0: culling disabled; positive value: seconds before shutdown + c.MappingKernelManager.cull_idle_timeout = {{ int .Values.jupyterConfig.idleCullTimeout }} + c.MappingKernelManager.cull_interval = {{ int .Values.jupyterConfig.idleCullInterval }} + # Do not cull kernels that have an active connection (browser tab open) + c.MappingKernelManager.cull_connected = False diff --git a/manifests/helm/jupyterlab/1.0.0/templates/deployment.yaml b/manifests/helm/jupyterlab/1.0.0/templates/deployment.yaml index 72efafd..cce62f8 100644 --- a/manifests/helm/jupyterlab/1.0.0/templates/deployment.yaml +++ b/manifests/helm/jupyterlab/1.0.0/templates/deployment.yaml @@ -19,6 +19,15 @@ spec: securityContext: runAsUser: 1000 fsGroup: 100 + {{- if .Values.tcpKeepalive.enabled }} + sysctls: + - name: net.ipv4.tcp_keepalive_time + value: {{ .Values.tcpKeepalive.time | quote }} + - name: net.ipv4.tcp_keepalive_intvl + value: {{ .Values.tcpKeepalive.intvl | quote }} + - name: net.ipv4.tcp_keepalive_probes + value: {{ .Values.tcpKeepalive.probes | quote }} + {{- end }} {{- if .Values.imagePullSecrets }} imagePullSecrets: {{- toYaml .Values.imagePullSecrets | nindent 8 }} @@ -63,6 +72,10 @@ spec: - name: startup-script mountPath: /usr/local/bin/start-notebook.d/startup-script.sh subPath: startup-script.sh + - name: startup-script + mountPath: /etc/jupyter/jupyter_server_config.py + subPath: jupyter_server_config.py + readOnly: true {{- if .Values.homeVolume.enabled }} - name: home-volume mountPath: {{ include "jupyterlab.homeDir" . }} diff --git a/manifests/helm/jupyterlab/1.0.0/templates/service.yaml b/manifests/helm/jupyterlab/1.0.0/templates/service.yaml index 86ac94e..5427d4e 100644 --- a/manifests/helm/jupyterlab/1.0.0/templates/service.yaml +++ b/manifests/helm/jupyterlab/1.0.0/templates/service.yaml @@ -5,6 +5,10 @@ metadata: namespace: {{ .Release.Namespace }} labels: {{- include "jupyterlab.labels" . | nindent 4 }} + {{- with .Values.service.annotations }} + annotations: + {{- toYaml . | nindent 4 }} + {{- end }} spec: type: ClusterIP selector: diff --git a/manifests/helm/jupyterlab/1.0.0/values.yaml b/manifests/helm/jupyterlab/1.0.0/values.yaml index 183ea61..5dff9f5 100644 --- a/manifests/helm/jupyterlab/1.0.0/values.yaml +++ b/manifests/helm/jupyterlab/1.0.0/values.yaml @@ -30,6 +30,19 @@ resources: jupyterConfig: # Access token (leave empty to disable token authentication) token: "" + # Idle kernel culling: seconds of inactivity before kernel is shut down (0 = disabled) + idleCullTimeout: 0 + # Interval in seconds to check for idle kernels (only effective when idleCullTimeout > 0) + idleCullInterval: 300 + +# Kubernetes Service annotations. +# KIC 2.x+ reads timeout annotations from the Service resource (not Ingress). +# Values must be in milliseconds. +service: + annotations: + konghq.com/connect-timeout: "60000" + konghq.com/read-timeout: "60000" + konghq.com/write-timeout: "60000" # External access Ingress configuration ingress: @@ -77,5 +90,16 @@ groupVolumes: [] # /dev/shm shared memory size limit (e.g. "512Mi", "1Gi"). Leave empty for no limit. shmSizeLimit: "512Mi" +# TCP keepalive tuning at the Pod level. +# Requires kubelet flag: --allowed-unsafe-sysctls=net.ipv4.tcp_keepalive_time,net.ipv4.tcp_keepalive_intvl,net.ipv4.tcp_keepalive_probes +tcpKeepalive: + enabled: false + # Seconds of idle before the first keepalive probe is sent (Linux default: 7200) + time: 120 + # Seconds between consecutive keepalive probes (Linux default: 75) + intvl: 10 + # Number of unanswered probes before the connection is dropped (Linux default: 9) + probes: 6 + # imagePullSecrets for private registries imagePullSecrets: []