GH GambleHub

Kubernetes: 클러스터 및 헬름 차트

Kubernetes: 클러스터 및 헬름 차트

1) 클러스터 아키텍처-최고보기

제어 비행기: 'kube-apiserver', 'etcd', 'kube-scheduler', 'kube-controller-manager' (일부는 제어 구름에 숨겨져 있음).
작업자: 'kubelet', CRI 런타임 (containerd/CRI-O), CNI 플러그인, kube-proxy/ebpf-proxy.
클러스터 내 네트워크: Pod-to-Pod, Service-VIP/ClusterIP, DNA CoreDNA.
스토리지: CSI 드라이버, 동적 PVC → PV 프로비저닝 (StorageClass).
실패 제한: 노드/AZ/지역. 구역별로 복제본을 배치하십시오 (TopologySpreadConstraints/anti-acification).

전형적인 역할

플랫폼 명령: 클러스터 생성/업그레이드, CNI/CSI/Ingress, 정책 및 GitOps.
제품 팀: 예금 차트/릴리스, 보안 정책 및 리소스를 따릅니다.

2) 클러스터 수명주기

창조: kOps, kubeadm, Rancher, EKS/AKS/GKE. OIDC 인증 및 감사를 즉시 사용하십시오.
업그레이드: 최대 버전으로 제어되는 사소한 버전 (제어 평면 → 노드) 은 스테이징에 대한 테스트입니다.
추가 기능 (모두 Helm/GitOps를 통해): CNI (Calico/Cilium), CSI 드라이버, Ingress 컨트롤러 (NGINX/Gateway API/Contour/Traefik), Metrics-Server, Cluster-Autoscaler, Node-Local PS, 로깅/metrics/추적.
백업: etcd 스냅 샷 (자체 관리되는 경우), 네임 스페이스/PVC 용 Velero.

3) 네트워크, 서비스 및 진입

CNI: Calico (NetworkPolicy), Cilium (eBPF/servicemesh-자이언트).
서비스: 'ClusterIP', 'NodePort', 'LoadBalancer' (L4 클라우드 밸런싱), 'ExternalName'.
침입/게이트웨이 API: 주변의 L7 라우팅, TLS, 속도 제한/WAF 이력.
네트워크 정책: 기본적으로 네임 스페이스/레이블로 거부 + 명시 적 허용.
StatefulSet 및 서비스 검색을위한 헤드리스 서비스 ('clusterIP: None').

4) 저장 (CSI) 및 상태

StorageClass: 'reacimPolicy', 'volumeBindingMode' (더 나은 배치를위한 'WaitForFirstConsumer').
상태 설정: 빠른 스캔을위한 안정적인 이름/볼륨 ('volumeClaimtemplem'), 'podManagementPolicy: Parallel'.
읽기: 분산 파일 (EFS/Filestore) 을주의 깊게 사용하십시오-대기 시간을 평가하십시오.
스냅 샷: 'VolumeSnapshotClass' + 크론 백업.

5) 다중 임대 및 정치

제품/환경 별 네임 스페이스.
RBAC: 최소한의 역할, 별도의 서비스 계정, 가능한 경우 'ClusterRole' 대신 'Role '/' RoleBinding'.
PSA (Pod Security Admission): '기준선 '/' 제한된' 모드 (PSP 교체).
ResourceQuote/LimitRange: CPU/Memory/PVC/LoadBalancer.
OPA 게이트 키퍼/Kyverno: 입학 정책 (예: 금지 ': 최신', 요구 사항 '리소스', 'readOnlyRootFilesystem').
ImagePolicy/webhooks: 이미지 서명 확인 (cosign/policy-controller).

6) 관찰 및 운영

측정 항목: Prometheus 스택, kube-state-metrics, 노드 수출 업체.
로그: Fluent Bit/Vector → 객체/ES/OpenSearch, 노드 회전.
트레일: OpenTelemetry Collector.
SLO 대시 보드: 진입 및 주요 서비스에 대한 RED 모델.
Autoscale: HPA (응용 프로그램 메트릭 별), 배경 용 VPA, 노드 용 Cluster-Autoscaler.

7) 매니페스트 패턴 (치트 시트)

배포:
yaml apiVersion: apps/v1 kind: Deployment metadata: { name: api, labels: { app: api } }
spec:
replicas: 3 strategy: { type: RollingUpdate, rollingUpdate: { maxUnavailable: 0, maxSurge: 1 } }
selector: { matchLabels: { app: api } }
template:
metadata:
labels: { app: api }
spec:
serviceAccountName: api-sa securityContext: { runAsNonRoot: true, fsGroup: 2000 }
containers:
- name: api image: registry. example. com/api:1. 2. 3 ports: [{ containerPort: 8080 }]
resources: { requests: { cpu: "200m", memory: "256Mi" }, limits: { cpu: "1", memory: "512Mi" } }
readinessProbe: { httpGet: { path: /healthz, port: 8080 }, periodSeconds: 5 }
livenessProbe: { httpGet: { path: /livez,  port: 8080 }, initialDelaySeconds: 20 }
상태 설정 (스 니펫):
yaml apiVersion: apps/v1 kind: StatefulSet metadata: { name: db }
spec:
serviceName: db replicas: 3 podManagementPolicy: Parallel selector: { matchLabels: { app: db } }
template:
metadata: { labels: { app: db } }
spec:
containers:
- name: db image: postgres:16-alpine volumeMounts: [{ name: data, mountPath: /var/lib/postgresql/data }]
volumeClaimTemplates:
- metadata: { name: data }
spec:
accessModes: ["ReadWriteOnce"]
resources: { requests: { storage: 100Gi } }
storageClassName: fast-ssd
PDB (PodDisruptionBudget):
yaml apiVersion: policy/v1 kind: PodDisruptionBudget metadata: { name: api-pdb }
spec:
minAvailable: 2 selector: { matchLabels: { app: api } }
침입 (Nginx, 브리핑):
yaml apiVersion: networking. k8s. io/v1 kind: Ingress metadata:
name: api annotations:
nginx. ingress. kubernetes. io/proxy-read-timeout: "30"
spec:
tls: [{ hosts: ["api. example. com"], secretName: api-tls }]
rules:
- host: api. example. com http:
paths:
- path: /
pathType: Prefix backend: { service: { name: api, port: { number: 80 } } }

8) Helm v3-기본 및 구조

차트 = 템플릿 + 값 + 메타 데이터.


mychart/
Chart. yaml     # name, version (semver), type (application/library), dependencies values. yaml # default values. schema. json # (recommended) validation values templates/# .yaml. gotmpl (Deployment, Service, Ingress, …)
templates/tests/  # helm tests (smoke)
charts/# local dependencies (or OCI dependencies)
차트. yaml (예):
yaml apiVersion: v2 name: api description: API service type: application version: 1. 4. 0 # chart version (semver)
appVersion: "1. 2. 3" # dependencies application version:
- name: redis version: 17. x.x repository: "oci://registry. example. com/charts"

9) 투구 템플릿-실습

'_ helpers에서 도우미를 사용하십시 이름/라벨/주석의 경우 tpl '.
모든 곳에서 '자원', '보안 컨텍스트', '준비/활력' 을 지정하십시오.
표준화 된 체계에 따라 라벨을 생성합니다 ('app. kubernetes. io/').
'값' (ingress/hpa/pdb/servicemonitor) 을 통해 기능을 선택하십시오.
'값 포함. 스키마. json '-잘못된 구성에서 중지하십시오.
민감한 데이터의 경우-외부 운영자 (외부 비밀, SOPS) 의 비밀이며 값에 저장되지 않습니다.

(PHP 3 = 3.0.6, P tpl '(조각):
gotmpl
{{- define "api. fullname" -}}
{{- printf "%s-%s".Chart. Name. Release. Name      trunc 63      trimSuffix "-" -}}
{{- end -}}
배포. tpl (조각):
gotmpl apiVersion: apps/v1 kind: Deployment metadata:
name: {{ include "api. fullname". }}
labels: {{- include "api. labels". nindent 4 }}
spec:
replicas: {{.Values. replicaCount }}
strategy:
rollingUpdate:
maxSurge: 1 maxUnavailable: 0 selector:
matchLabels: {{- include "api. selectorLabels". nindent 6 }}
template:
metadata:
labels: {{- include "api. selectorLabels". nindent 8 }}
spec:
serviceAccountName: {{ include "api. serviceAccountName". }}
securityContext: {{- toYaml. Values. podSecurityContext      nindent 8 }}
containers:
- name: {{.Chart. Name }}
image: "{{.Values. image. repository }}:{{.Values. image. tag }}"
imagePullPolicy: IfNotPresent ports: [{ containerPort: {{.Values. service. port }} }]
resources: {{- toYaml. Values. resources      nindent 10 }}
envFrom:
- secretRef: { name: {{.Values. secretsRef }} }

10) 의존성, 저장소 및 OCI

Helm v3은 'oci ://registry/org/chart' OCI 레지스터를 지원합니다.
잠금 종속성 버전 ('> 1. 2. 0`, `~1. 2 ')' 헬름 의존성 구축 '을 실행하십시오.
차트 (prov) 에 서명하고 아티팩트를 CI 아티팩트 저장소에 저장하십시오.
라이브러리 차트: 재사용을위한 일반 템플릿 (ingress/servicemonitor).

11) 후크, CRD 및 운영 순서

후크: '사전 설치', '사후 설치', '사전 업그레이드', '사후 업그레이드', '테스트'. 정책 추가 ('후크 생성 전', '후크 성공').
CRD: 'crds/' (템플릿으로 설정) 에 넣고 즉시 CRD 업데이트를 피하십시오-별도로 마이그레이션하십시오.
데이터베이스 마이그레이션/초기화-demotency 및 타임 아웃이있는 작업 후크.

12) 차트 및 CI 테스트

체계의 'helm lint' + 검증.
Helm unittest (단위), 차트 테스트 (ct) -CI의 종류/미니 쿠브 조립/설치.
템플릿의 스냅 샷 테스트 ('helm 템플릿' → 템플릿과 비교).
연기 테스트 '투구 테스트' (검사와 함께 '포드' 올리기).

13) GitOps (아르고 CD/플럭스)

진실의 근원은 저장소입니다. 차트는 HelmRelease/HelmChart (Flux) 또는 Application (Argo) 으로 저장됩니다.
싱크 정책: 자두/자체 치료와 자동 동기화, 상태 및 건강 검진.
프로모션 버전: 태그 봇/세머 범위, PR 흐름.
앱 (차트) 과 env (오버라이드/값) 로 리포지토리를 나눕니다.
비밀 관리: SOPS (연령/KMS), 외부 비밀.

14) 안전: 최소 필요

PSA 제한: 권한 없음, 호스트 경로 없음, 제한된 기능, 읽기 전용 루트.
ImagePolicy-서명/신뢰할 수있는 이미지 만.
네트워크 정책: "기본적으로 잠금".
RBAC: 앱 당 서비스 계정, 네임 스페이스의 'Role '/' RoleBinding'.
입학 제어: 게이트 키퍼/Kyverno 규칙 (리소스/제한, 레이블, 최신 없음).
비밀: SOPS/외부 비밀; 가치/일반 Git에 비밀을 두지 마십시오.

15) 반 패턴

': 차트 및 이미지의 최신'; '값이 없습니다. 스키마. json '.
모듈 식 대신 "모든 것을위한" 하나의 거대한 차트.
CRD는 업그레이드시 '템플릿/' → 혼돈의 템플릿으로 업데이트됩니다.
템플릿에서 하드 코딩 된 이름/포트/네임 스페이스.
자원/제한 및 샘플 부족 → 대기 시간 드리프트 및 불안정성.
드레인/업그레이드시 PDB → 제로 다운 타임이 불가능합니다.
암호화없이 Git의 비밀; 수표 정책없이 나타납니다.

16) 구현 점검표 (0-45 일)

0-10 일

(PHP 3 = 3.0.6, PHP 4) tpl ', 라벨, 프로브, 리소스, PDB/Ingress 옵션.
PSA 제한, NetworkPolicy 거부-all, ResourceQuota/LimitRange.
GitOps (Argo/Flux) 설정, 개인 레지스터, 이미지/차트 서명.

11-25 일

차트를 모듈/종속성, 추가 값으로 나눕니다. 스키마. json ', 테스트 (' helm lint ', 단위, ct).
관찰 가능성 (ServiceMonitor/PodMonitor), 로그 에이전트, OTel.

업그레이드 프로세스를 입력하십시오: 스테이징 → 카나리아 → prod, 롤백으로 마이그레이션을 연

26-45 일

종속성 업데이트 자동화 (봇/세머 범위 + PR).
CI에 게이트 키퍼/Kyverno 정책 및 정책 보고서를 추가하십시오.
클러스터 업그레이드 런북, DR 절차 (Velero/etcd 스냅 샷) 를 문서화하십시오.

17) 성숙도 지표

응용 프로그램의 100% 는 'kubectl 적용' 없이 Helm/GitOps를 통해 고갈됩니다.
모든 차트에는 '값이 있습니다. 스키마. json ', 테스트, 서명 및 커밋 된 종속성 버전.
모든 네임 스페이스에서 PSA 제한/네트워크 정책이 활성화됩니다.
PDB 및 HPA는 모든 중요한 서비스에 있습니다.
SOPS/외부 비밀, 최신 정책 없음, 이미지 서명.
클러스터 및 차트 업그레이드는 다운 타임 (카나리아/청록색) 없이 수행되며 복원 테스트는 정기적입니다.

18) 결론

강력한 Kubernetes 재단 = 강력한 클러스터 아키텍처 + 엄격한 정책 + GitOps가 관리하는 산업 품질의 헬름 차트. 템플릿을 표준화하고 PSA/NetworkPolicy/RBAC 환경을 보호하며 값을 검증하며 테스트, 서명 및 프로모션을 자동화하십시오. 그런 다음 업그레이드 및 릴리스가 예측 가능해지고 플랫폼은 제품 팀에 안정적이고 편리해집니다.

Contact

문의하기

질문이나 지원이 필요하시면 언제든지 연락하십시오.우리는 항상 도울 준비가 되어 있습니다!

Telegram
@Gamble_GC
통합 시작

Email — 필수. Telegram 또는 WhatsApp — 선택 사항.

이름 선택 사항
Email 선택 사항
제목 선택 사항
메시지 선택 사항
Telegram 선택 사항
@
Telegram을 입력하시면 Email과 함께 Telegram에서도 답변드립니다.
WhatsApp 선택 사항
형식: +국가 코드 + 번호 (예: +82XXXXXXXXX).

버튼을 클릭하면 데이터 처리에 동의하는 것으로 간주됩니다.