Files
wbsong111 16321b52c7 dipup 사용 차트를 카탈로그에 동기화 (7개 갱신 + 5개 신규)
dipup 이 go:embed 로 직접 보관·관리하던 Helm 차트를 카탈로그로 옮기는 첫 단계다.
두 저장소가 각자 CVE/SBOM 파이프라인을 운영하는 이중화를 해소하려면, 먼저 카탈로그가
dipup 과 같은 차트·같은 이미지를 보게 만들어야 한다.

배경: CVE 파이프라인 구성 이전에 두 곳에서 같은 차트를 유지하기 어려워 dipup 이 별도로
차트를 관리해 왔고, 그 결과 버전이 갈라졌다. 겹치는 10개 중 버전까지 일치하는 것은
postgresql-ha·dnsup 2개뿐이었다.

## 버전 갱신 (7개) — 신규 버전 디렉토리 추가, 구버전은 보존

| 차트 | 기존 | 신규 | appVersion |
|---|---|---|---|
| apisix | 2.14.0 | 2.16.0 | 3.16.0 → 3.17.0 |
| argo-cd | 7.7.0 | 7.8.11 | v2.13.0 → v2.14.5 |
| cert-manager | v1.16.1 | v1.21.0 | 동일 |
| gitea | 12.4.0 | 12.6.0 | 1.24.6 → 1.26.1 |
| harbor | 1.16.2 | 1.19.1 | 2.12.2 → 2.15.1 |
| kyverno | 3.4.1 | 3.8.2 | v1.14.1 → v1.18.2 |
| rancher | 2.10.1 | 2.14.3 | v2.10.1 → v2.14.3 |

차트 본문은 dipup 이 임베딩한 .tgz 를 그대로 전개했다(네트워크 pull 이 아니라 dipup 이
실제 배포하는 바이트와 동일함을 보장하기 위함). BUILD-README/CUSTOM-README/custom-values
3개 파일은 구버전에서 승계했다.

## 신규 추가 (5개)

infisical-standalone 1.9.0, longhorn 109.3.1+up1.11.2, longhorn-crd 109.3.1+up1.11.2,
metallb 0.16.1, secrets-operator v0.10.33.

longhorn/longhorn-crd 는 업스트림이 아니라 Rancher 패키징 차트(109.x 라인, Rancher 2.14
계열과 짝)다. BUILD-README 의 `helm repo add` 라인은 chart_version_detector 가 파싱하는
계약이라 실제 업스트림 repo 를 검증해 기재했고, 감지기로 현재/최신 버전이 정상 조회되는
것을 확인했다.

## custom-values — 버전과 결합된 이미지 핀 정리

카탈로그 스캐너가 dipup 의 effective image 를 보게 하려면 이미지 핀이 맞아야 한다.

- **kyverno: 승계본이 3.8.2 에서 깨져 재작성.** 3.4.1 은 정리 훅이
  `registry: ~ / repository: bitnami/kubectl` 이라 bitnamilegacy 오버라이드가 맞았지만,
  3.8.2 는 `registry: ghcr.io / repository: kyverno/readiness-checker` 로 바뀌었다.
  그대로 옮기면 ghcr.io/bitnamilegacy/kubectl 이라는 없는 좌표가 된다. 해당 오버라이드를
  제거하고, 3.8.2 에서 삭제된 policyReportsCleanup 키도 함께 뺐다. 남는 조치는 tag 고정뿐
  (기본 tag 가 비어 latest 로 떨어짐 → v1.18.2 로 고정).
- apisix: 3.16.0-keycloak-authz → 3.17.0-keycloak-authz (차트 appVersion 과 함께 이동)
- gitea: image.tag 1.26.4 핀 추가 — 차트 기본 1.26.1 대비 CRITICAL 2→0, HIGH 44→12
- infisical: image.tag v0.162.7 핀 — 기본 v0.158.x 는 stale Debian base 로 OS 기인 CVE
  다수(fixable CRITICAL 53→5, HIGH 491→55). redis/postgresql 은 bitnamilegacy 좌표로.
- longhorn: 실측 기반 리소스 튜닝(manager request, guaranteedInstanceManagerCPU,
  systemManagedCSIComponentsResourceLimits). replica 수처럼 노드 수에 의존하는 값은
  넣지 않았다 — 소비 측에서 주입한다.

## 검증

12개 차트 전부 `helm template --kube-version 1.34.1` 렌더 성공. 렌더 결과 이미지가
dipup 배포 이미지와 일치함을 확인(paasup/apisix:3.17.0-keycloak-authz,
gitea:1.26.4-rootless, readiness-checker:v1.18.2, infisical:v0.162.7).

## 범위에서 뺀 것

- **keycloak**: 카탈로그는 codecentric(app 17.0.1-legacy), dipup 은 bitnami(app 26.2.4)로
  계보가 다르다. 이슈 #1(bitnami 대체 방안 검토)의 결론이 나온 뒤 처리한다.
- **rancher-monitoring(-crd)**: 14c05f1 에서 불필요 판단으로 제거된 차트이고
  victoria-metrics 스택으로 대체 예정이라 추가하지 않는다.
- **dip-api/dip-console**: 자체 개발 차트로 각 앱 저장소가 출처다. 대조 결과 앱 저장소와
  dipup 사본이 일치해 카탈로그가 개입할 이유가 없다.
- **postgresql-ha/dnsup**: 이미 버전이 일치해 작업 대상이 아니었다.

## 후속 과제

dnsup 은 카탈로그·dipup 사본(1.0.1)이 원본(dip-console-api helm/dnsup 1.0.0)보다 앞서
있다. 1.0.1 에만 있는 service.LoadBalancerIP·service.annotations 지원을 원본으로 백포트한
뒤, 카탈로그에서 dnsup 을 제거하는 것이 자체 개발 차트 출처 원칙에 맞다.
2026-08-06 09:42:24 +09:00
..

metallb

Version: 0.0.0 Type: application AppVersion: v0.0.0

A network load-balancer implementation for Kubernetes using standard routing protocols

Homepage: https://metallb.universe.tf

Source Code

Requirements

Kubernetes: >= 1.19.0-0

Repository Name Version
crds 0.0.0
https://metallb.github.io/frr-k8s frr-k8s 0.0.25

Values

Key Type Default Description
controller.affinity object {}
controller.enabled bool true
controller.extraContainers list []
controller.image.pullPolicy string nil
controller.image.repository string "quay.io/metallb/controller"
controller.image.tag string nil
controller.labels object {}
controller.livenessProbe.enabled bool true
controller.livenessProbe.failureThreshold int 3
controller.livenessProbe.initialDelaySeconds int 10
controller.livenessProbe.periodSeconds int 10
controller.livenessProbe.port int 17472
controller.livenessProbe.successThreshold int 1
controller.livenessProbe.timeoutSeconds int 1
controller.logLevel string "info" Controller log level. Must be one of: all, debug, info, warn, error or none
controller.nodeSelector object {}
controller.podAnnotations object {}
controller.priorityClassName string ""
controller.readinessProbe.enabled bool true
controller.readinessProbe.failureThreshold int 3
controller.readinessProbe.initialDelaySeconds int 10
controller.readinessProbe.periodSeconds int 10
controller.readinessProbe.port int 17472
controller.readinessProbe.successThreshold int 1
controller.readinessProbe.timeoutSeconds int 1
controller.resources object {}
controller.runtimeClassName string ""
controller.securityContext.fsGroup int 65534
controller.securityContext.runAsNonRoot bool true
controller.securityContext.runAsUser int 65534
controller.serviceAccount.annotations object {}
controller.serviceAccount.create bool true
controller.serviceAccount.name string ""
controller.strategy.type string "RollingUpdate"
controller.tolerations list []
controller.webhookMode string "enabled"
crds.enabled bool true
crds.validationFailurePolicy string "Fail"
frr-k8s.prometheus.serviceMonitor.enabled bool false Enable Prometheus ServiceMonitor for frr-k8s metrics.
frrk8s.enabled bool true If set, enables frrk8s as a backend. This is mutually exclusive to frr mode.
frrk8s.external bool false If true, uses an external frr-k8s installation instead of the bundled subchart.
frrk8s.namespace string "" Namespace where external frr-k8s is installed (only used when external=true).
fullnameOverride string ""
imagePullSecrets list []
loadBalancerClass string ""
nameOverride string ""
networkpolicies.apiPort int 6443
networkpolicies.defaultDeny bool false
networkpolicies.enabled bool false
prometheus.metricsPort int 9120
prometheus.namespace string ""
prometheus.podMonitor.additionalLabels object {}
prometheus.podMonitor.annotations object {}
prometheus.podMonitor.enabled bool false
prometheus.podMonitor.interval string nil
prometheus.podMonitor.jobLabel string "app.kubernetes.io/name"
prometheus.podMonitor.metricRelabelings list []
prometheus.podMonitor.relabelings list []
prometheus.prometheusRule.additionalLabels object {}
prometheus.prometheusRule.addressPoolExhausted.enabled bool true
prometheus.prometheusRule.addressPoolExhausted.excludePools string ""
prometheus.prometheusRule.addressPoolExhausted.labels.severity string "critical"
prometheus.prometheusRule.addressPoolUsage.enabled bool true
prometheus.prometheusRule.addressPoolUsage.excludePools string ""
prometheus.prometheusRule.addressPoolUsage.thresholds[0].labels.severity string "warning"
prometheus.prometheusRule.addressPoolUsage.thresholds[0].percent int 75
prometheus.prometheusRule.addressPoolUsage.thresholds[1].labels.severity string "warning"
prometheus.prometheusRule.addressPoolUsage.thresholds[1].percent int 85
prometheus.prometheusRule.addressPoolUsage.thresholds[2].labels.severity string "critical"
prometheus.prometheusRule.addressPoolUsage.thresholds[2].percent int 95
prometheus.prometheusRule.annotations object {}
prometheus.prometheusRule.bgpSessionDown.enabled bool true
prometheus.prometheusRule.bgpSessionDown.labels.severity string "critical"
prometheus.prometheusRule.configNotLoaded.enabled bool true
prometheus.prometheusRule.configNotLoaded.labels.severity string "warning"
prometheus.prometheusRule.enabled bool false
prometheus.prometheusRule.extraAlerts list []
prometheus.prometheusRule.staleConfig.enabled bool true
prometheus.prometheusRule.staleConfig.labels.severity string "warning"
prometheus.rbacPrometheus bool true
prometheus.scrapeAnnotations bool false
prometheus.serviceAccount string ""
prometheus.serviceMonitor.controller.additionalLabels object {}
prometheus.serviceMonitor.controller.annotations object {}
prometheus.serviceMonitor.controller.tlsConfig.insecureSkipVerify bool true
prometheus.serviceMonitor.enabled bool false
prometheus.serviceMonitor.interval string nil
prometheus.serviceMonitor.jobLabel string "app.kubernetes.io/name"
prometheus.serviceMonitor.metricRelabelings list []
prometheus.serviceMonitor.relabelings list []
prometheus.serviceMonitor.speaker.additionalLabels object {}
prometheus.serviceMonitor.speaker.annotations object {}
prometheus.serviceMonitor.speaker.tlsConfig.insecureSkipVerify bool true
rbac.create bool true
speaker.affinity object {}
speaker.bgpDebounceTimeout string nil BGP debounce timeout for FRR configuration reloads, in milliseconds. Only applies when BGP type is frr. Default (when unset) is 3000 ms. This feature is experimental
speaker.enabled bool true
speaker.excludeInterfaces.enabled bool true
speaker.extraContainers list []
speaker.frr.enabled bool false
speaker.frr.image.pullPolicy string nil
speaker.frr.image.repository string "quay.io/frrouting/frr"
speaker.frr.image.tag string "10.5.3"
speaker.frr.metricsPort int 9121
speaker.frr.resources object {}
speaker.frrMetrics.resources object {}
speaker.ignoreExcludeLB bool false
speaker.image.pullPolicy string nil
speaker.image.repository string "quay.io/metallb/speaker"
speaker.image.tag string nil
speaker.initContainers.cpFrrFiles.resources object {}
speaker.initContainers.cpMetrics.resources object {}
speaker.initContainers.cpReloader.resources object {}
speaker.labels object {}
speaker.livenessProbe.enabled bool true
speaker.livenessProbe.failureThreshold int 3
speaker.livenessProbe.initialDelaySeconds int 10
speaker.livenessProbe.periodSeconds int 10
speaker.livenessProbe.port int 17472
speaker.livenessProbe.successThreshold int 1
speaker.livenessProbe.timeoutSeconds int 1
speaker.logLevel string "info" Speaker log level. Must be one of: all, debug, info, warn, error or none
speaker.memberlist.enabled bool true When enabled: false, the speaker pods must run on all nodes
speaker.memberlist.mlBindAddrOverride string ""
speaker.memberlist.mlBindPort int 7946
speaker.memberlist.mlSecretKeyPath string "/etc/ml_secret_key"
speaker.nodeSelector object {}
speaker.podAnnotations object {}
speaker.priorityClassName string ""
speaker.readinessProbe.enabled bool true
speaker.readinessProbe.failureThreshold int 3
speaker.readinessProbe.initialDelaySeconds int 10
speaker.readinessProbe.periodSeconds int 10
speaker.readinessProbe.port int 17472
speaker.readinessProbe.successThreshold int 1
speaker.readinessProbe.timeoutSeconds int 1
speaker.reloader.resources object {}
speaker.resources object {}
speaker.runtimeClassName string ""
speaker.securityContext object {}
speaker.serviceAccount.annotations object {}
speaker.serviceAccount.create bool true
speaker.serviceAccount.name string ""
speaker.startupProbe.enabled bool true
speaker.startupProbe.failureThreshold int 30
speaker.startupProbe.periodSeconds int 5
speaker.tolerateMaster bool true
speaker.tolerations list []
speaker.updateStrategy.type string "RollingUpdate"
tls.cipherSuites string "" Comma-separated list of TLS cipher suites. If empty, uses Go defaults. Only applies to TLS 1.2.
tls.controllerMetricsTLSSecret string "" The name of the secret to be mounted in the controller pod to provide TLS certificates for metrics endpoints. If not present, a self-signed certificate is auto-generated.
tls.curvePreferences string "" Comma-separated list of numeric CurveID values (e.g. 29,4588). See https://pkg.go.dev/crypto/tls#CurveID. If empty, uses Go defaults.
tls.minVersion string "" Minimum TLS version (VersionTLS12 or VersionTLS13). Defaults to VersionTLS13.
tls.speakerMetricsTLSSecret string "" The name of the secret to be mounted in the speaker pod to provide TLS certificates for metrics endpoints. If not present, a self-signed certificate is auto-generated.

Autogenerated from chart metadata using helm-docs v1.10.0