πŸš€ Kubernetes 객체(Objects) μ‹€μ „ κ°œλ… 이해 - DevOps μ—”μ§€λ‹ˆμ–΄μ˜ νƒ„νƒ„ν•œ κΈ°λ³ΈκΈ°!

μ•„λž˜ μžμ„Έν•œ λ‚΄μš©μ„ ν™•μΈν•˜μ—¬, λ‹¨μˆœνžˆ Containerλ₯Ό λ°°ν¬ν•˜λŠ” μˆ˜μ€€μ„ λ„˜μ–΄, :rocket:ν”„λ‘œλ•μ…˜κΈ‰ 운영 μ—­λŸ‰μ„ κ°–μΆ”λ €λ©΄ Kubernetes 객체(Object) μ΄ν•΄λŠ” 선택이 μ•„λ‹Œ ν•„μˆ˜μž…λ‹ˆλ‹€!

[좜처] Engineers Don’t Fully Understand Kubernetes Objects | by Ray Sainiz | Sep, 2025

:clipboard:λ°˜λ“œμ‹œ μ΅ν˜€μ•Ό ν•  Kubernetes 객체듀:

  • Namespace, Pod, ReplicaSet, Deployment, Service, Ingress, Secret, ConfigMap, LimitRange, ResourceQuota, HorizontalPodAutoscaler, RBAC (Role/RoleBinding, ClusterRole/ClusterRoleBinding), StorageClass, PersistentVolumeClaim (PVC), PersistentVolume(PV), NetworkPolicy, Job, CronJob, StatefulSet, DaemonSet)

1- Namespace
ν΄λŸ¬μŠ€ν„° μ•ˆμ—μ„œ μžμ›μ„ λ…Όλ¦¬μ μœΌλ‘œ λΆ„λ¦¬ν•˜κ³  μ²΄κ³„μ μœΌλ‘œ 관리할 수 μžˆλ„λ‘ ν•΄μ€λ‹ˆλ‹€.

## Command
$ kubectl get ns

## Output
NAME              STATUS   AGE
default           Active   30d
dev               Active   10d
prod              Active   30d

2- Pod
κ°€μž₯ μž‘μ€ 배포 λ‹¨μœ„λ‘œ, ν•˜λ‚˜ μ΄μƒμ˜ λ°€μ ‘ν•˜κ²Œ μ—°κ΄€λœ μ»¨ν…Œμ΄λ„ˆλ₯Ό μ‹€ν–‰ν•©λ‹ˆλ‹€.

kubectl get pods

NAME              READY   STATUS    RESTARTS   AGE
web-app-abc123    1/1     Running   0          3h

3- ReplicaSet
둀링 μ—…λ°μ΄νŠΈμ™€ ν™•μž₯을 μœ„ν•΄ ReplicaSet을 μ„ μ–Έμ μœΌλ‘œ κ΄€λ¦¬ν•©λ‹ˆλ‹€.

kubectl get rs

NAME                 DESIRED   CURRENT   READY
web-app-6f7b6c7d8    3         3         3

4- Deployment
ReplicaSet을 μ„ μ–Έμ μœΌλ‘œ κ΄€λ¦¬ν•˜λ©°, 둀링 μ—…λ°μ΄νŠΈμ™€ ν™•μž₯을 μ†μ‰½κ²Œ ν•  수 있게 ν•΄μ€λ‹ˆλ‹€.

kubectl get rs

NAME                 DESIRED   CURRENT   READY
web-app-6f7b6c7d8    3         3         3

5- Service
Pod에 μ ‘κ·Όν•  수 μžˆλŠ” μ•ˆμ •μ μΈ IP/DNSλ₯Ό μ œκ³΅ν•˜κ³ , λ‘œλ“œ λ°ΈλŸ°μ‹± κΈ°λŠ₯도 μ§€μ›ν•©λ‹ˆλ‹€.

kubectl get svc

NAME         TYPE        CLUSTER-IP     EXTERNAL-IP   PORT(S)
web-svc      ClusterIP   10.96.0.1      <none>        80/TCP

6- Ingress
μ„œλΉ„μŠ€μ— λŒ€ν•œ μ™ΈλΆ€ 접근을 κ΄€λ¦¬ν•˜λ©°, λΌμš°νŒ…κ³Ό TLS μ’…λ£Œλ₯Ό μ§€μ›ν•©λ‹ˆλ‹€.

kubectl get ingress

NAME              CLASS   HOSTS                  ADDRESS         PORTS
web-ingress       nginx   app.example.com        34.120.0.10     80,443

7- Secret
λΉ„λ°€λ²ˆν˜Έλ‚˜ 토큰 같은 λ―Όκ°ν•œ 데이터λ₯Ό μ•ˆμ „ν•˜κ²Œ μ €μž₯ν•˜λ©°, base64둜 μΈμ½”λ”©λœ ν˜•νƒœλ‘œ κ΄€λ¦¬ν•©λ‹ˆλ‹€.

kubectl get secrets

NAME                   TYPE                DATA   AGE
db-credentials         Opaque              2      7d

8- ConfigMap
λ―Όκ°ν•˜μ§€ μ•Šμ€ μ• ν”Œλ¦¬μΌ€μ΄μ…˜ μ„€μ • 값을 key-value ν˜•νƒœλ‘œ μ €μž₯ν•©λ‹ˆλ‹€. μ½”λ“œμ™€ 섀정을 뢄리해 관리할 수 있게 ν•΄μ€λ‹ˆλ‹€.

kubectl get configmaps

NAME                DATA   AGE
app-config          3      2d

9- LimitRange
Podκ³Ό μ»¨ν…Œμ΄λ„ˆκ°€ μ‚¬μš©ν•  수 μžˆλŠ” μ΅œμ†ŒΒ·μ΅œλŒ€ μžμ› ν•œλ„λ₯Ό μ •μ˜ν•©λ‹ˆλ‹€. 이λ₯Ό 톡해 μžμ› λ‚¨μš©μ„ λ°©μ§€ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

kubectl get limitrange -n dev

NAME              AGE
container-limits  14d

10- ResourceQuota
Namespace μ „μ²΄μ—μ„œ μ‚¬μš©ν•  수 μžˆλŠ” μžμ› μ΄λŸ‰μ„ μ œν•œν•΄, μžμ›μ΄ κ³΅μ •ν•˜κ²Œ λ°°λΆ„λ˜λ„λ‘ ν•©λ‹ˆλ‹€.

kubectl get resourcequota -n dev

NAME          CPU(REQUEST)   MEMORY(REQUEST)   AGE
compute-quota 4              8Gi               14d

11- HorizontalPodAutoscaler
CPU, λ©”λͺ¨λ¦¬, ν˜Ήμ€ μ‚¬μš©μž μ •μ˜ μ§€ν‘œλ₯Ό 기반으둜 Pod 수λ₯Ό μžλ™μœΌλ‘œ λŠ˜λ¦¬κ±°λ‚˜ μ€„μž…λ‹ˆλ‹€.

kubectl get hpa

NAME              REFERENCE                TARGETS   MINPODS   MAXPODS   AGE
web-app-hpa       Deployment/web-app       50%/80%   2         5         7d

12- RBAC (Role/RoleBinding, ClusterRole/ClusterRoleBinding)
ν΄λŸ¬μŠ€ν„° λ‚΄ μ„Έλ°€ν•œ κΆŒν•œ 관리λ₯Ό μ œκ³΅ν•˜λŠ” μ—­ν•  기반 μ ‘κ·Ό μ œμ–΄ λ°©μ‹μž…λ‹ˆλ‹€.

kubectl get roles -n dev

NAME            AGE
dev-reader      20d

13- StorageClass
μŠ€ν† λ¦¬μ§€ μœ ν˜•μ„ μ •μ˜ν•˜κ³  동적 ν”„λ‘œλΉ„μ €λ‹μ„ μ§€μ›ν•©λ‹ˆλ‹€. ν΄λΌμš°λ“œ λ„€μ΄ν‹°λΈŒ ν™˜κ²½μ—μ„œ μœ μš©ν•˜κ²Œ μ“°μž…λ‹ˆλ‹€.

kubectl get storageclass

NAME              PROVISIONER                AGE
gp2 (default)     kubernetes.io/aws-ebs      30d

14- PersistentVolumeClaim (PVC)
Pod이 μŠ€ν† λ¦¬μ§€λ₯Ό μš”μ²­ν•  수 μžˆλ„λ‘ PersistentVolumeκ³Ό μ—°κ²°ν•΄μ€λ‹ˆλ‹€.

kubectl get pvc

NAME            STATUS   VOLUME   CAPACITY   AGE
db-storage      Bound    pv001    50Gi       12d

15- PersistentVolume (PV)
ν΄λŸ¬μŠ€ν„° λ‚΄ μ‹€μ œ μŠ€ν† λ¦¬μ§€λ₯Ό μ œκ³΅ν•˜λ©°, μˆ˜λ™ ν˜Ήμ€ λ™μ μœΌλ‘œ ν”„λ‘œλΉ„μ €λ‹λ©λ‹ˆλ‹€.

kubectl get pv

NAME       CAPACITY   ACCESS MODES   STATUS     AGE
pv001      50Gi       RWO            Bound      12d

16- NetworkPolicy
Pod κ°„ λ˜λŠ” Podκ³Ό μ„œλΉ„μŠ€ κ°„μ˜ 톡신을 μ œμ–΄ν•©λ‹ˆλ‹€. λ„€νŠΈμ›Œν¬ λ³΄μ•ˆμ— λ°˜λ“œμ‹œ ν•„μš”ν•œ μš”μ†Œμž…λ‹ˆλ‹€.

kubectl get networkpolicy

NAME             POD-SELECTOR   AGE
allow-frontend   app=frontend   10d

17- Job
μž‘μ—…μ΄ 성곡할 λ•ŒκΉŒμ§€ Pod을 μ‹€ν–‰ν•©λ‹ˆλ‹€. λ°μ΄ν„°λ² μ΄μŠ€ λ§ˆμ΄κ·Έλ ˆμ΄μ…˜ 같은 μΌνšŒμ„± μž‘μ—…μ— μ ν•©ν•©λ‹ˆλ‹€.

kubectl get jobs

NAME               COMPLETIONS   DURATION   AGE
data-migration     1/1           30s        2h

18- CronJob
Job을 μ •ν•΄μ§„ μ£ΌκΈ°λ§ˆλ‹€ μ‹€ν–‰ν•©λ‹ˆλ‹€. λ°±μ—…μ΄λ‚˜ μ •κΈ° 리포트 생성에 μœ μš©ν•©λ‹ˆλ‹€.

kubectl get cronjobs

NAME            SCHEDULE      SUSPEND   ACTIVE   LAST SCHEDULE
db-backup       0 2 * * *     False     0        4h ago

19- StatefulSet
κ³ μ •λœ ID와 영ꡬ μŠ€ν† λ¦¬μ§€λ₯Ό κ°–λŠ” Pod을 κ΄€λ¦¬ν•©λ‹ˆλ‹€. λ°μ΄ν„°λ² μ΄μŠ€ 같은 μƒνƒœ 기반 μ›Œν¬λ‘œλ“œμ— μ ν•©ν•©λ‹ˆλ‹€.

kubectl get statefulsets

NAME              READY   AGE
mysql-db          3/3     5d

20- DaemonSet
ν΄λŸ¬μŠ€ν„°μ˜ λͺ¨λ“  λ…Έλ“œμ—μ„œ Pod이 μ‹€ν–‰λ˜λ„λ‘ 보μž₯ν•©λ‹ˆλ‹€. λ‘œκΉ… μ—μ΄μ „νŠΈ, λͺ¨λ‹ˆν„°λ§, λ„€νŠΈμ›Œν‚Ή 등에 ν™œμš©λ©λ‹ˆλ‹€.

kubectl get daemonsets -n kube-system

NAME                DESIRED   CURRENT   READY
fluentd-logging     3         3         3

:backhand_index_pointing_right: μ°Έκ³ : 터미널 μ•ˆμ—μ„œ λ°”λ‘œ λ¬Έμ„œλ₯Ό ν™•μΈν•˜κ³  μ‹Άλ‹€λ©΄ μ•„λž˜ λͺ…령을 μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

kubectl explain <object-name>
6 Likes