セッション Pod がブート失敗で Failed になると reaper が即削除し kubectl logs で 死因を追えなかった。「開く」で 502 になるだけで原因不明だった。 - session.reaper.terminatedRetentionSeconds(既定 900): 終了済み Pod を finishedAt からこの秒数は回収しない。manager 回収ループと reaper CronJob 両方が尊重 - GET /api/sessions/<id>/log: セッション Pod のログを text で返す(pods/log get のみ、追加権限なし) - UI: 「ログ」ボタン、状態の色分け、Failed 行に reason/exitCode/message 併記、 Running 以外は「開く」非表示 - session-entrypoint.sh: URL スキームと identity 型の不一致を警告。 git clone を --progress ... 2>&1 にして git/ssh の出力を Pod ログへ - helm lint / template 検証済み
74 lines
2.9 KiB
YAML
74 lines
2.9 KiB
YAML
{{- if .Values.session.reaper.cronjob.enabled }}
|
|
apiVersion: batch/v1
|
|
kind: CronJob
|
|
metadata:
|
|
name: {{ include "claude-code.fullname" . }}-reaper
|
|
namespace: {{ .Release.Namespace }}
|
|
labels:
|
|
{{- include "claude-code.labels" . | nindent 4 }}
|
|
app.kubernetes.io/component: reaper
|
|
spec:
|
|
schedule: {{ .Values.session.reaper.cronjob.schedule | quote }}
|
|
concurrencyPolicy: Forbid
|
|
successfulJobsHistoryLimit: 1
|
|
failedJobsHistoryLimit: 3
|
|
startingDeadlineSeconds: 120
|
|
jobTemplate:
|
|
spec:
|
|
activeDeadlineSeconds: 300
|
|
backoffLimit: 1
|
|
template:
|
|
metadata:
|
|
labels:
|
|
{{- include "claude-code.selectorLabels" . | nindent 12 }}
|
|
app.kubernetes.io/component: reaper
|
|
spec:
|
|
restartPolicy: Never
|
|
serviceAccountName: {{ include "claude-code.managerServiceAccountName" . }}
|
|
automountServiceAccountToken: true
|
|
securityContext:
|
|
{{- include "claude-code.podSecurityContext" . | nindent 12 }}
|
|
containers:
|
|
- name: reaper
|
|
image: "{{ .Values.image.manager.registry }}/{{ .Values.image.manager.repository }}:{{ .Values.image.manager.tag }}"
|
|
imagePullPolicy: {{ .Values.image.manager.pullPolicy }}
|
|
command: ["python3", "-u", "/app/manager.py", "--reap-once"]
|
|
env:
|
|
- name: PYTHONDONTWRITEBYTECODE
|
|
value: "1"
|
|
- name: LOG_LEVEL
|
|
value: {{ .Values.manager.logLevel | quote }}
|
|
- name: SESSIONS_NAMESPACE
|
|
value: {{ include "claude-code.sessionsNamespace" . | quote }}
|
|
- name: FULLNAME
|
|
value: {{ include "claude-code.fullname" . | quote }}
|
|
- name: IDLE_TIMEOUT_SECONDS
|
|
value: {{ .Values.session.idleTimeoutSeconds | quote }}
|
|
- name: MAX_LIFETIME_SECONDS
|
|
value: {{ .Values.session.maxLifetimeSeconds | quote }}
|
|
- name: TERMINATED_RETENTION_SECONDS
|
|
value: {{ .Values.session.reaper.terminatedRetentionSeconds | quote }}
|
|
- name: TTYD_PORT
|
|
value: {{ .Values.session.ttydPort | quote }}
|
|
securityContext:
|
|
{{- include "claude-code.containerSecurityContext" . | nindent 16 }}
|
|
resources:
|
|
requests: { cpu: 20m, memory: 32Mi }
|
|
limits: { cpu: 200m, memory: 128Mi }
|
|
volumeMounts:
|
|
- name: manager-app
|
|
mountPath: /app
|
|
readOnly: true
|
|
- name: tmp
|
|
mountPath: /tmp
|
|
volumes:
|
|
- name: manager-app
|
|
configMap:
|
|
name: {{ include "claude-code.fullname" . }}-manager
|
|
defaultMode: 0555
|
|
- name: tmp
|
|
emptyDir:
|
|
medium: Memory
|
|
sizeLimit: 8Mi
|
|
{{- end }}
|