דלגו לתוכן

values — לקרוא chart ולמלא אותו

ה-values.yaml של ה-chart הוא רשימת כל מה שאפשר להגדיר, עם ברירות מחדל והערות. ה-README מסביר את הצורות.

runs on: VM
helm show values <CHART_DIR> | less # inside less: /keyName then n
helm show readme <CHART_DIR> | less # tables: key, example, default, meaning
helm show values <CHART_DIR> | grep -n -B2 -A12 '^storage:'

סדר עבודה:

  1. מצא את המפתח ב-show values (חפש עם /).
  2. קרא את ההערה מעליו — לפעמים היא אומרת את הצורה (# -- ...).
  3. חפש דוגמה ב-show readme (העמודה "Example").
  4. כתוב ב-values, הרץ render, ובדוק עם grep -c.

מפתחות ברמה העליונה שאתה פוגש: releasePrefix, defaultImageTag, generic, configMaps, deployments, services, ingresses, networkPolicies. releasePrefix: "-" גורם לאובייקטים לקבל בדיוק את השם של המפתח שלהם (deployments.ingest-api נותן Deployment בשם ingest-api).

file: <FILE> (base.yaml / <ENV>.yaml)
generic:
labels: {app.kubernetes.io/part-of: trident}
podLabels: {app.kubernetes.io/part-of: trident}
imageRepository: <REGISTRY>/<GROUP>/trident-source
extraImagePullSecrets:
- name: <SECRET>
# TRIDENT: imageRepository: registry.gitlab.com/trident-lab00/trident-source
# TRIDENT: extraImagePullSecrets: [{name: trident-registry}]
  • הכל תחת generic: — ברמה אחת פנימה. ב-col 0 המפתח "מתאבד" בשקט.
  • <SECRET> הוא ה-Secret מסוג docker-registry, וחייב להיות קיים ב-namespace של ה-Pod (secrets).

איך מוודאים: grep -c 'image: /' /tmp/render.yaml חייב להיות 0, ו-grep -c 'imagePullSecrets' /tmp/render.yaml מצופה אחד לכל Deployment (3 ב-TRIDENT).

tpl: image ו-imageTag נבנים מ-values אחרים

Section titled “tpl: image ו-imageTag נבנים מ-values אחרים”
file: <FILE>
defaultImageTag: "" # only in versions/<ENV>.yaml, written by CI
deployments:
<SERVICE>:
containers:
- name: <SERVICE>
image: "{{ .Values.generic.imageRepository }}/<SERVICE>"
imageTag: "{{ .Values.defaultImageTag }}"

מחרוזות ב-image, imageTag, ו-configMaps.*.data עוברות tpl: הביטוי {{ ... }} מוחלף בערך מ-values. לכן TRIDENT_VERSION: "{{ .Values.defaultImageTag }}" מקבל את ה-candidate. איך מוודאים: grep 'TRIDENT_VERSION' /tmp/render.yaml מציג את ה-candidate. ביטוי {{ }} חייב להיות בתוך מרכאות ב-YAML.

file: <FILE>
configMaps:
trident-queue:
data:
REDIS_HOST: "redis"
REDIS_PORT: "6379"
trident-sensors:
data:
sensors.json: |
{"hydrophones": []}
deployments:
ingest-api:
containers:
- name: ingest-api
envConfigmaps: [trident-app, trident-queue]
  • envConfigmaps = רשימת ConfigMaps שנכנסים כ-envFrom ל-container. נותן רק מה שהשירות צריך (least knowledge — לפי ה-CONTRACT של הפרויקט).
  • מפתח עם נקודה/שם קובץ (sensors.json) מיועד לעלות כ-קובץ דרך volume.
  • REDIS_HOST חייב להיות שם ה-Service (fullnameOverride).

שני מקומות, שתי רמות הזחה. extraVolumes שייך ל-Pod (אחי containers), volumeMounts שייך ל-container.

file: <FILE>
deployments:
signal-processor:
containers:
- name: signal-processor
volumeMounts:
- {name: sensors, mountPath: /etc/trident, readOnly: true}
- {name: pg, mountPath: /run/secrets/trident, readOnly: true}
extraVolumes:
- {name: sensors, configMap: {name: trident-sensors}}
- {name: pg, secret: {secretName: trident-postgres}}
נושאכלל
name של volumeשם חופשי — חייב להתאים בין volumeMounts ל-extraVolumes
שם ה-ConfigMap / Secretקבוע חיצוני — כבר קיים (trident-sensors, trident-postgres)
mountPathקבוע חיצוני — האפליקציה מחפשת שם קובץ (SENSORS_FILE=/etc/trident/sensors.json)
Secretsecret: {secretName: ...} — secret באות קטנה
ConfigMapconfigMap: {name: ...} — configMap עם C גדולה באמצע

מה שקורה: Secret שמוטען כ-volume נותן קובץ לכל מפתח. מפתח postgres_password + mountPath: /run/secrets/trident = הקובץ /run/secrets/trident/postgres_password. את זה (הקובץ, לא התיקייה) מקבל POSTGRES_PASSWORD_FILE.

איך מוודאים: grep -n 'mountPath: /run/secrets' /tmp/render.yaml מציג /run/secrets/trident (לא /run/secrets לבד), ו-grep -c 'secretName: trident-postgres' /tmp/render.yaml = 1 לכל שירות שמטעין.

file: <FILE>
services:
ingest-api:
type: ClusterIP
extraSelectorLabels: {trident.dev/service: ingest-api}
ports: [{name: http, port: 8080, targetPort: http, protocol: TCP}]

extraSelectorLabels חייב להתאים ל-extraSelectorLabels של ה-Deployment — כך ה-Service מוצא את ה-Pods. אל תשתמש ב-app.kubernetes.io/name כ-selector: ה-chart הוא הבעלים שלו.

ingresses: ה-hostname מופיע פעמיים

Section titled “ingresses: ה-hostname מופיע פעמיים”
file: <FILE>
ingresses:
ingest-api:
ingressClassName: nginx
hosts:
- hostname: <HOST>
paths:
- {path: /, pathType: Prefix, serviceName: ingest-api, servicePort: 8080}
extraTls:
- hosts: [<HOST>]
secretName: trident-tls
# TRIDENT: <HOST> = dev.trident.test

איך מוודאים: grep -c '<HOST>' /tmp/render.yaml — מצופה 2 (rule + tls). grep 'secretName:' /tmp/render.yaml מציג את trident-tls. שם ה-Secret חייב להיות קיים ב-namespace. המשך: networking.

file: <FILE>
networkPolicies:
default-deny:
podSelector: {}
policyTypes: [Ingress]
allow-ingest:
podSelector:
matchLabels: {trident.dev/service: ingest-api}
policyTypes: [Ingress]
ingress:
- from:
- podSelector:
matchLabels: {trident.dev/service: acoustic-simulator}
ports:
- {protocol: TCP, port: 8080}

המפתח (default-deny) הופך לשם ה-NetworkPolicy. ההסבר על ה-CNI ועל בדיקה: networking.

file: <FILE> (postgres/base.yaml)
fullnameOverride: postgres
image: {repository: postgres, tag: "16.4"}
env:
- {name: POSTGRES_DB, value: trident}
- {name: POSTGRES_PASSWORD_FILE, value: /run/secrets/trident/postgres_password}
extraSecrets:
- {name: trident-postgres, mountPath: /run/secrets/trident}
customScripts:
01-schema.sql: |
CREATE TABLE detections (id serial);
storage:
className: course-local-path
requestedSize: 1Gi
מפתחמשמעות
fullnameOverrideשם ה-Service. חייב להתאים ל-POSTGRES_HOST ב-ConfigMap של האפליקציה
envרשימת {name, value} לסביבה של השרת. הסיסמה כקובץ: POSTGRES_PASSWORD_FILE, לא ערך
extraSecrets[{name: <Secret קיים>, mountPath: <dir>}] — כל המפתחות של ה-Secret הופכים לקבצים בתיקייה
customScriptsקבצי SQL שרצים פעם אחת על data dir ריק
storage.classNameה-StorageClass של ה-PVC. חובה כשאין default. מגדירים אותו כאן (ב-Git), לא הופכים StorageClass ל-default בקלאסטר — storage-probes
storage.requestedSizeגודל ה-PVC

איך מוודאים: grep -c 'storageClassName: course-local-path' /tmp/render.yaml = 1 (אם className חסר — 0 וה-PVC ייתקע ב-Pending, ראו storage-probes). grep -E '^kind: StatefulSet|secretName' /tmp/render.yaml מראה StatefulSet ו-secretName: trident-postgres.

file: <FILE> (redis/base.yaml)
fullnameOverride: redis
image: {repository: redis, tag: "7.2.7-alpine"}
redisConfig: |
protected-mode no
appendonly no
save ""
service:
serverPort: 6379
storage: {}
מפתחמשמעות
fullnameOverrideשם ה-Service, צריך להתאים ל-REDIS_HOST
redisConfigתוכן redis.conf (בלוק טקסט)
service.serverPortפורט ה-Service, ותואם ל-REDIS_PORT
storage: {}בלי PVC — emptyDir זמני (data נעלם עם ה-Pod)
haMode.enabled, metrics.enabledfalse במעבדה

איך מוודאים: helm template redis <CHART_DIR> -f base.yaml | grep -E '^ name:' כולל redis ו-redis-headless (Service נוסף נוצר), וגם redis-scripts.