7746570ec0
images/·scripts/build/build-hardened-image.sh·suggest-go-upgrades.py·
build-image.yml·.claude/image-authoring.md·이미지 ADR(0001·0002·0004)을 삭제했다 —
전부 별도 public 레포 security-images 로 이미 이관됐다.
카탈로그 쪽에는 "무엇을 배포 중인가"를 아는 부분만 남긴다:
- catalog/image-map/<image>.env — 옛 catalog.env 의 카탈로그 레이아웃 정보만 뗀 것
- scripts/build/check-rebuild-needed.py — 드리프트 탐지(A 파트)만 남기고 핀 판단
(B 파트: pin_changes/apply_changes/parse_module_specs)은 제거
- scripts/build/apply-published-tags.py(신규) — security-images 의 published.json
을 읽어 카탈로그 values 를 패치
- .github/workflows/{self-build-drift-check,catalog-tag-update}.yml(신규) — 각각
드리프트 스캔+트리거, 발행 태그 반영
effective_severity 를 cve-gate.py 로 옮겼다 — check-rebuild-needed.py 가 핀 도구를
거치지 않고 게이트를 직접 로드하게 하기 위한 선행 작업이다.
두 레포의 계약은 published.json 스키마 하나뿐이다 — security-images 는 이 카탈로그를
모른다(단방향 의존). 이관 배경·결합점 전체는
doc/migrations/self-build-images-to-security-images.md.
부수 수정: 자체 빌드 이미지를 참조하는 차트 values/README 의 죽은 링크(images/**,
doc/decisions/000{1,2,4}, .claude/image-authoring.md)를 security-images 레포를
가리키는 서술로 교체. deploy-test 스크립트·CUSTOM-README 의 개인 Docker Hub 계정
(docker.io/wbsong111) 을 docker.io/paasup 로 교체.
pitfalls.md 의 "스캐너 결과를 그대로 믿지 말 것" 절은 sbom-cve-gate skill 이 차트
축 설명에 실제로 참조하고 있어 남겼다 — "이미지 태그의 베이스 OS" 절만 제거했다
(다른 참조 없음, security-images 문서로 이관 완료).
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Etcd
Changelog
see RELEASENOTES.md
A Helm chart for a Etcd HA-cluster on Kubernetes
TL;DR
helm repo add groundhog2k https://groundhog2k.github.io/helm-charts/
helm install my-release groundhog2k/etcd
Introduction
This chart uses the original Etcd image from Quay.io to deploy a stateful Etcd cluster in Kubernetes.
It fully supports deployment of the multi-architecture docker image.
Prerequisites
- Kubernetes 1.12+
- Helm 3.x
- PV provisioner support in the underlying infrastructure
Installing the Chart
To install the chart with the release name my-release:
helm install my-release groundhog2k/etcd
Uninstalling the Chart
To uninstall/delete the my-release deployment:
helm uninstall my-release
Common parameters
| Key | Type | Default | Description |
|---|---|---|---|
| fullnameOverride | string | "" |
Fully override the deployment name |
| nameOverride | string | "" |
Partially override the deployment name |
Deployment parameters
| Key | Type | Default | Description |
|---|---|---|---|
| image.pullPolicy | string | "IfNotPresent" |
Image pull policy |
| image.registry | string | "quay.io/coreos" |
Image registry |
| image.repository | string | "etcd" |
Image name |
| image.tag | string | "" |
Image tag |
| initImage.pullPolicy | string | "IfNotPresent" |
Init image pull policy |
| initImage.registry | string | "docker.io" |
Image registry |
| initImage.repository | string | "busybox" |
Init image name |
| initImage.tag | string | "stable" |
Init image tag |
| imagePullSecrets | list | [] |
Image pull secrets |
| extraInitContainers | list | [] |
Extra init containers |
| extaContainers | list | [] |
Extra containers for usage as sidecars |
| startupProbe | object | see values.yaml |
Startup probe configuration |
| livenessProbe | object | see values.yaml |
Liveness probe configuration |
| readinessProbe | object | see values.yaml |
Readiness probe configuration |
| customStartupProbe | object | {} |
Custom startup probe (overwrites default startup probe configuration) |
| customLivenessProbe | object | {} |
Custom liveness probe (overwrites default liveness probe configuration) |
| customReadinessProbe | object | {} |
Custom readiness probe (overwrites default readiness probe configuration) |
| resources | object | {} |
Resource limits and requests |
| priorityClassName | string | "" |
Deployment priority class name |
| nodeSelector | object | {} |
Deployment node selector |
| customLabels | object | {} |
Additional labels for Deployment or StatefulSet |
| customAnnotations | object | {} |
Additional annotations for Deployment or StatefulSet |
| podAnnotations | object | {} |
Additional pod annotations |
| podLabels | object | {} |
Additional pod labels |
| podSecurityContext | object | see values.yaml |
Pod security context |
| securityContext | object | see values.yaml |
Container security context |
| env | list | [] |
Additional container environmment variables |
| args | list | [] |
Additional container command arguments |
| rbac.create | bool | true |
Enable creation of RBAC |
| serviceAccount.annotations | object | {} |
Additional service account annotations |
| serviceAccount.create | bool | true |
Enable service account creation |
| serviceAccount.name | string | "" |
Optional name of the service account |
| serviceAccount.automountServiceAccountToken | bool | true |
Specifies whether a service account token should be automatically mounted |
| affinity | object | {} |
Affinity for pod assignment |
| tolerations | list | [] |
Tolerations for pod assignment |
| topologySpreadConstraints | object | {} |
Topology spread constraints for pods |
| podManagementPolicy | string | "Parallel" |
Pod management policy |
| updateStrategyType | string | "RollingUpdate" |
Pod update strategy |
| replicas | int | 1 |
Number of replicas (Due to the nature of etcd cluster initialization this value must be set before deploying the cluster) |
| revisionHistoryLimit | int | nil |
Maximum number of revisions maintained in revision history |
| podDisruptionBudget | object | {} |
Pod disruption budget |
| podDisruptionBudget.minAvailable | int | nil |
Minimum number of pods that must be available after eviction |
| podDisruptionBudget.maxUnavailable | int | nil |
Maximum number of pods that can be unavailable after eviction |
| clusterDomain | string | "cluster.local" |
Kubernetes cluster domain (DNS) suffix |
Service parameters
| Key | Type | Default | Description |
|---|---|---|---|
| service.type | string | "ClusterIP" |
Service type |
| service.clusterIP | string | nil |
The cluster ip address (only relevant for type LoadBalancer or NodePort) |
| service.loadBalancerIP | string | nil |
The load balancer ip address (only relevant for type LoadBalancer) |
| service.loadBalancerSourceRanges | list | [] |
The list of IP CIDR ranges that are allowed to access the load balancer (only relevent for type LoadBalancer) |
| service.client.port | int | 2379 |
Client service port |
| service.client.nodePort | int | nil |
Service node port (only relevant for type LoadBalancer or NodePort) |
| service.peer.port | int | 2380 |
Peer service port |
| service.peer.nodePort | int | nil |
Service node port (only relevant for type LoadBalancer or NodePort) |
| service.annotations | object | {} |
Additional service annotations |
| service.labels | object | {} |
Additional service labels |
Service monitor parameters
| Key | Type | Default | Description |
|---|---|---|---|
| serviceMonitor.enabled | bool | false |
Enable service monitor |
| serviceMonitor.additionalLabels | object | {} |
Additional labels for the service monitor object |
| serviceMonitor.annotations | object | {} |
Annotations for the service monitor object |
| serviceMonitor.interval | Duration | nil |
Scrape interval for prometheus |
| serviceMonitor.scrapeTimeout | Duration | nil |
Scrape timeout value |
| serviceMonitor.extraEndpointParameters | object | nil |
Extra parameters rendered to the service monitor endpoint |
| serviceMonitor.extraParameters | object | nil |
Extra parameters rendered to the service monitor object |
Network policies
Allows to define optional network policies for ingress and egress The policyTypes will be automatically set
| Key | Type | Default | Description |
|---|---|---|---|
| networkPolicy.ingress | object | {} |
Ingress network policies |
| networkPolicy.egress | object | {} |
Egress network policies |
Storage parameters
| Key | Type | Default | Description |
|---|---|---|---|
| storage.accessModes[0] | string | "ReadWriteOnce" |
Storage access mode |
| storage.volumeName | string | "etcd-data" |
Internal volume name and prefix of a created PVC |
| storage.persistentVolumeClaimName | string | nil |
PVC name when existing storage volume should be used |
| storage.requestedSize | string | nil |
Size for new PVC, when no existing PVC is used |
| storage.className | string | nil |
Storage class name |
| storage.annotations | object | {} |
Additional storage annotations |
| storage.labels | object | {} |
Additional storage labels |
| extraStorage | list | [] |
A list of additional existing PVC that will be mounted into the container |
| extraStorage[].name | string | nil |
Internal name of the volume |
| extraStorage[].pvcName | string | nil |
Name of the existing PVC |
| extraStorage[].mountPath | string | nil |
Mount path where the PVC should be mounted into the container |
Etcd settings
| Key | Type | Default | Description |
|---|---|---|---|
| settings.clusterToken | bool | "etcd-cluster-0" |
Unique cluser token |
| settings.https.enabled | bool | false |
Enable HTTPS |
| settings.https.autoTls | bool | false |
Automatic TLS mode of etcd (TLS certs. created automaically) |
| settings.shutdownDelay | int | 3 |
Delay after termination request to give etcd process time for graceful shutdown |
Etcd secrets and configuration
| Key | Type | Default | Description |
|---|---|---|---|
| extraSecrets | list | [] |
A list of additional existing secrets that will be mounted into the container |
| extraSecrets[].name | string | nil |
Name of the existing K8s secret |
| extraSecrets[].defaultMode | int | 0440 |
Mount default access mode |
| extraSecrets[].mountPath | string | nil |
Mount path where the secret should be mounted into the container (f.e. /mysecretfolder) |
| extraConfigs | list | [] |
A list of additional existing configMaps that will be mounted into the container |
| extraConfigs[].name | string | nil |
Name of the existing K8s configMap |
| extraConfigs[].defaultMode | int | 0440 |
Mount default access mode |
| extraConfigs[].mountPath | string | nil |
Mount path where the configMap should be mounted into the container (f.e. /myconfigfolder) |
| extraEnvSecrets | list | [] |
A list of existing secrets that will be mounted into the container as environment variables |