๐ K8S, Namespace
๐ณ๏ธโ๐ [๊ถ๊ธํ์ ]
- namespace ์ญ์ ๋ฅผ ์ ์ฑ
์ ์ผ๋ก ๋ฐฉ์ง
- namespace ๋ณ๋ก ์์ ์ฌ์ฉ๋์ ์ ํ
๐[๋ชฉ์ฐจ]
๋ค์ ์คํ์ด์ค
๋ค์์คํ์ด์ค(Namespace)๋ Kubernetes์์ ๋ฆฌ์์ค ๊ฒฉ๋ฆฌ์ ๋ค์ค ์ฌ์ฉ์/์๋น์ค ํ๊ฒฝ ๊ด๋ฆฌ๋ฅผ ์ํ ๋
ผ๋ฆฌ์ ๊ตฌํ์ด๋ค. ํ๋์ ํด๋ฌ์คํฐ ์์์ ์ฌ๋ฌ ๊ฐ์ ๋
๋ฆฝ๋ "๋
ผ๋ฆฌ์ ๊ณต๊ฐ"์ ๋ง๋ค์ด ํ, ํ๋ก์ ํธ, ์๋น์ค ๋จ์๋ก ๋ฆฌ์์ค๋ฅผ ๊ตฌ๋ถํด ์ฌ์ฉํ ์ ์๊ฒ ํด์ค๋ค.
- ๋ค์์คํ์ด์ค ์ฌ์ฉ๋ชฉ์
| ๋ชฉ์ | ์ค๋ช
|
|---|
| ์์ ๊ฒฉ๋ฆฌ | ์๋ก ๋ค๋ฅธ ์๋น์ค/ํ ๊ฐ ๋ฆฌ์์ค๋ฅผ ๋ถ๋ฆฌํ์ฌ ์ถฉ๋ ๋ฐฉ์ง |
| ์ ๊ทผ ์ ์ด | ๋ค์์คํ์ด์ค๋ณ๋ก RBAC ์ค์ ๊ฐ๋ฅ (์: Aํ์ A ๋ค์์คํ์ด์ค๋ง ์ ๊ทผ ๊ฐ๋ฅ) |
| ๋ฆฌ์์ค ํ ๋น ์ ํ | ResourceQuota๋ฅผ ํตํด ์์ ํ ๋น๋ ์ ํ ๊ฐ๋ฅ |
| ๊ด๋ฆฌ ๋จ์ํ | ๋ค์์คํ์ด์ค ๋จ์๋ก ๋ฆฌ์์ค ๋ณด๊ธฐ, ์ญ์ , ๋ฐฐํฌ ๋ฑ ๊ฐํธ ๊ด๋ฆฌ |
| ํ
์คํธ์ ์ด์ ๋ถ๋ฆฌ | dev, test, prod ๊ฐ์ ํ๊ฒฝ๋ณ ๊ฒฉ๋ฆฌ ๊ฐ๋ฅ |
- ๊ธฐ๋ณธ ๋ค์์คํ์ด์ค
| ์ด๋ฆ | ์ค๋ช
|
|---|
default | ๊ธฐ๋ณธ ๋ค์์คํ์ด์ค, ๋ช
์ํ์ง ์์ผ๋ฉด ์ฌ๊ธฐ์ ์์ฑ๋จ |
kube-system | Kubernetes ์์คํ
์ปดํฌ๋ํธ๊ฐ ๋์ํ๋ ์์ญ (kube-dns, coredns ๋ฑ) |
kube-public | ๋ชจ๋ ์ฌ์ฉ์๊ฐ ์ฝ์ ์ ์๋ ๊ณต๊ฐ ์์ญ (๊ฑฐ์ ์ฌ์ฉ๋์ง ์์) |
kube-node-lease | ๋
ธ๋ heartbeat ์ฒดํฌ์ฉ lease ๊ฐ์ฒด ์ ์ฅ์ฉ (v1.13+์์ ์ถ๊ฐ๋จ) |
- ๋ค์์คํ์ด์ค ์ ์ ๊ธฐ์ค
| ๊ธฐ์ค | ์ค๋ช
| ์์ |
|---|
| ์๋น์ค/์ ํ๋ฆฌ์ผ์ด์
๊ธฐ์ค | ์๋น์ค ๋จ์๋ก ๋ถ๋ฆฌ | spark, trino, airflow, hms |
| ํ/์กฐ์ง ๊ธฐ์ค | ํ ๋๋ ๋ถ์ ๋จ์ ๋ถ๋ฆฌ | data-engineering, ml-team |
| ๋ฐฐํฌ ํ๊ฒฝ ๊ธฐ์ค | dev/test/staging/prod ๋ถ๋ฆฌ | dev-spark, prod-trino |
| ๋ณด์ ๊ฒฉ๋ฆฌ ๊ธฐ์ค | ์ ๊ทผ ์ ํ์ด ํ์ํ ๊ฒฝ์ฐ | secure-data, compliance-zone |
๋ค์์คํ์ด์ค ์์ฑ ๋ฐฉ๋ฒ
apiVersion: v1
kind: Namespace
metadata:
name: dev
๋ค์์คํ์ด์ค ์ฉ๋ ๋ณ ์ฌ์ฉ ์ฌ๋ก
| ํ์ฉ ์ | ์ค๋ช
|
|---|
team-a, team-b | ํ ๋จ์ ๋ถ๋ฆฌ (RBAC + ๋ฆฌ์์ค์ฟผํฐ ์ ์ฉ) |
airflow, spark, trino | ์ปดํฌ๋ํธ ๋จ์ ๊ฒฉ๋ฆฌ |
dev, stage, prod | ๋ฐฐํฌ ํ๊ฒฝ ๋ถ๋ฆฌ |
ci, cd | ํ์ดํ๋ผ์ธ์ฉ ๋ค์์คํ์ด์ค ๊ตฌ๋ถ |
๋ค์์คํ์ด์ค RBAC ์ ์ฉ
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
name: trino-readonly
namespace: trino
subjects:
- kind: User
name: alice
roleRef:
kind: Role
name: view
apiGroup: rbac.authorization.k8s.io
๋ฆฌ์์ค ์ ํ: ResourceQuota, LimitRange
- CPU, ๋ฉ๋ชจ๋ฆฌ ์์ฒญ/์ ํ
- Pod ๊ฐ์ ์ ํ
- PVC ๊ฐ์ ์ ํ
- ํน์ ๊ฐ์ฒด ๊ฐ์ ์ ํ (ConfigMap, Secret ๋ฑ)
apiVersion: v1
kind: ResourceQuota
metadata:
name: dev-quota
namespace: dev
spec:
hard:
requests.cpu: "8"
limits.memory: "32Gi"
pods: "20"
๋ค์์คํ์ด์ค ํ๊ณ
| ์ ํ์ | ์ค๋ช
|
|---|
| ํด๋ฌ์คํฐ ์์ค ์์์ ๊ฒฉ๋ฆฌ ๋ถ๊ฐ | ๋
ธ๋, CRD, IngressClass ๋ฑ์ ๋ค์์คํ์ด์ค์ ๋ฌด๊ด |
| ์๋ฒฝํ ๋ณด์ ๊ฒฝ๊ณ๋ ์๋ | ๋ณด์์ ์ผ๋ก๋ ๊ฐ์ ํด๋ฌ์คํฐ(vCluster) ์์ค์ ๋ถ๋ฆฌ ํ์ |
| ๋ค์์คํ์ด์ค ์ด๋ฆ์ ํด๋ฌ์คํฐ ๋ด ์ ์ผํด์ผ ํจ | ์ค๋ณต ๋ถ๊ฐ |
Kubernetes์์๋ ๋ค์์คํ์ด์ค๋ณ ResourceQuota์ ์ดํฉ์ด ํด๋ฌ์คํฐ ์ ์ฒด ์ค์ ์์์ ์ด๊ณผํด๋ ์ค์ ์ด ๊ฐ๋ฅํ๋ค. "Quota ์ดํฉ โค ์ค์ ์์"์ด๋ผ๋ ์ ํ์ ๊ฐ์ ๋์ง ์๋๋ค.
ResourceQuota๋ ์์ "๋ณด์ฅ"์ด ์๋ "์ ํ"์ ์ํ ๋ฉ์ปค๋์ฆ์ด๊ธฐ ๋๋ฌธ์ด๋ค.
์: ์ ์ฒด ๋
ธ๋ ์์์ด ์๋์ ๊ฐ๋ค๊ณ ๊ฐ์
์ด ๋
ธ๋ ์์:
- CPU: 32์ฝ์ด
- Memory: 128Gi
์์๋ก ์๋ชป๋ Quota ์ค์ ์ด ๊ฐ๋ฅํจ
| ๋ค์์คํ์ด์ค | CPU ์ฟผํฐ | Memory ์ฟผํฐ |
|---|
spark | 24 | 96Gi |
trino | 16 | 64Gi |
airflow | 8 | 32Gi |
โ CPU ์ดํฉ: 48์ฝ์ด, Memory ์ดํฉ: 192Gi โ ์ค์ ์์๋ณด๋ค ์ด๊ณผํ์ง๋ง ์ค์ ์ ๊ฐ๋ฅํจ.
๋ฆฌ์์ค ์ฟผํฐ ์ด๊ณผ ํ์ฉ ์ด์
| ์ด์ | ์ค๋ช
|
|---|
| ๋ฆฌ์์ค ํ ๋น์ "์์ฝ"์ด ์๋๋ผ "์ ํ" ๋ชฉ์ | ์ค์ ์ฌ์ฉํ์ง ์์ผ๋ฉด ๋ฌธ์ ์์ |
| ๋ฆฌ์์ค๋ ๋์ ์ฌ์ฉ๋จ (Spark executor ๋ฑ) | ํผํฌ์น๋ก ๊ณ์ฐํ ๊ฒฝ์ฐ ์ด๊ณผ ๊ฐ๋ฅ |
| Quota๋ ๋ค์์คํ์ด์ค ๋ด๋ถ ์ ํ์ฉ | ๋ค๋ฅธ ๋ค์์คํ์ด์ค์ ํ์๋ ๋ณด์ฅ์ ์๋ |
| ๋ฆฌ์์ค ์ค์ผ์ค๋ง์ kube-scheduler๊ฐ ๋ด๋น | ์ค์ ๋
ธ๋์ ์์์ด ์์ผ๋ฉด Pending ์ํ ์ ์ง |
๋ฆฌ์์ค ์ฟผํฐ ์ค๋ฌด ํ์ฉ
| ์ ๋ต | ์ค๋ช
|
|---|
| ํด๋ฌ์คํฐ ์ด๋๋ณด๋ค ์ฝ๊ฐ ์ฌ์ ๋กญ๊ฒ ํ ๋น | ์: ์ด ์์์ 80~90%๋ง ๋ค์์คํ์ด์ค ์ฟผํฐ๋ก ๋ฐฐ๋ถ |
| Quota ํฉ์ฐ ๋์๋ณด๋ ๊ตฌ์ฑ | Prometheus + Grafana ๋๋ Kubecost์์ ์ถ์ ๊ฐ๋ฅ |
| ๋ฆฌ์์ค oversubscription ์ ์ฑ
๋ฌธ์ํ | ์: Spark maxExecutor ์ ์ ํ ๋ฑ |
ํ์ ์ LimitRange๋ก ๊ฐ๋ณ Pod ์ ํ | Quota๋ ๋ค์์คํ์ด์ค ๋จ์, ์ค์ ์ฌ์ฉ์ Pod ๋จ์ |
๋์ (๋ณด๋ค ์ ๋ฐํ ์ ์ด)
| ๋๊ตฌ | ๊ธฐ๋ฅ |
|---|
| Kubecost | ๋ค์์คํ์ด์ค๋ณ ์ค์ฌ์ฉ ๋ฆฌ์์ค ์ถ์ , Quota ์ด๊ณผ ๊ฐ์ง |
| OPA Gatekeeper | ์ ์ฑ
๊ธฐ๋ฐ์ผ๋ก ์ดํฉ ์ด๊ณผ ๋ฐฉ์ง ๊ฐ๋ฅ (์: Template ์ ์ฑ
์์ฑ) |
| Karmada / Hierarchical Namespace Controller | ์กฐ์ง/ํ์ ๊ตฌ์กฐ ๊ธฐ๋ฐ Quota ๋ฐฐ๋ถ ๊ฐ๋ฅ |
๋ค์์คํ์ด์ค ์ญ์
Kubernetes์์ ๋ค์์คํ์ด์ค(Namespace) ๋ฅผ ์ญ์ ํ๋ฉด, ๊ทธ ์์ ์กด์ฌํ๋ ๋ชจ๋ ๋ฆฌ์์ค(Pod, Service, Deployment, PVC, ConfigMap ๋ฑ) ๊ฐ ํจ๊ป ์๊ตฌ์ ์ผ๋ก ์ญ์ ๋๋ค. ์ด๋ก ์ธํด ๋ค์๊ณผ ๊ฐ์ ์ํ ์์๊ฐ ์กด์ฌํ๋ค.
๋ค์์คํ์ด์ค ์ญ์ ์ ์ฃผ์ ์ํ
| ์ํ ์์ | ์ค๋ช
|
|---|
| ๋ชจ๋ ๋ฆฌ์์ค ์ญ์ | ๋ค์์คํ์ด์ค ํ์์ ๋ชจ๋ ๋ฆฌ์์ค๊ฐ ์ข
์์ ์ผ๋ก ์ ๊ฑฐ๋จ |
| ๋ณต๊ตฌ ์ด๋ ค์ | ๋ฆฌ์์ค๋ฅผ ๋ณต๊ตฌํ๋ ค๋ฉด ๋ฐฑ์
์ด๋ GitOps ๋ฑ์ ๋ณ๋ ์ด๋ ฅ์ด ํ์ |
| ๊ณต์ ๋ฆฌ์์ค ์ญ์ ์ํ | ๋ค์์คํ์ด์ค ์์ ๋ค๋ฅธ ํ ํน์ ์๋น์ค๊ฐ ํจ๊ป ์ฐ๋ ๋ฆฌ์์ค๊ฐ ์์ผ๋ฉด ํจ๊ป ์ญ์ ๋จ |
| ์ข
์ ์ธ๋ถ ๋ฆฌ์์ค ์์ | ์: PVC ์ญ์ โ ์์ ์คํ ๋ฆฌ์ง๊น์ง ์ญ์ ๋ ์ ์์ (์คํ ๋ฆฌ์งClass ์ค์ ์ ๋ฐ๋ผ ๋ค๋ฆ) |
์ค๋ฌด์์ ์์ ํ๊ฒ ๋ค๋ฃจ๋ ๋ฐฉ๋ฒ
| ๋ฐฉ๋ฒ | ์ค๋ช
|
|---|
kubectl delete๋ก ๊ฐ๋ณ ๋ฆฌ์์ค ์ญ์ | ๋ค์์คํ์ด์ค ์ญ์ ๋์ ๋ฆฌ์์ค ํ์
๋ณ๋ก ์ ํ์ ์ญ์ ๊ถ์ฅ |
| ๋ค์์คํ์ด์ค ์ญ์ ์ ๋ฐฑ์
| kubectl get all --namespace=<ns> -o yaml > backup.yaml |
| GitOps ๊ด๋ฆฌ ์ฌ์ฉ | Argo CD, Flux ๋ฑ์ ์ฌ์ฉํด ์ ์ธ์ ์ํ์์ ๋ณต์ ๊ฐ๋ฅํ๊ฒ ์ด์ |
| Finalizer ํ์ธ | ๋ค์์คํ์ด์ค ์ญ์ ๊ฐ ์ค๋ ๊ฑธ๋ฆด ๋๋ finalizer ๊ฐ ๊ฑธ๋ ค ์๋์ง ํ์ธ ํ์ |
--wait=false ์ต์
์ฌ์ฉ ์์ | ๊ฐ์ ์ญ์ ์ ์ผ๋ถ ๋ฆฌ์์ค๊ฐ ์ ๋ น์ฒ๋ผ ๋จ๋ ๊ฒฝ์ฐ ์์ |
๋ฆฌ์์ค ๋ณดํธ์ฉ ๋ค์์คํ์ด์ค๋ deletion ๊ถํ ์ ํ
โ ์: admin๋ง ์ญ์ ๊ฐ๋ฅํ๊ฒ RBAC ๊ตฌ์ฑ
--dry-run=client๋ก ์ฌ์ ๊ฒํ
โ ์ญ์ ๋ช
๋ น์ด ์ค์ ๋ก ์ด๋ค ๋ฆฌ์์ค๋ฅผ ์ ๊ฑฐํ๋์ง ์๋ฎฌ๋ ์ด์
๊ฐ๋ฅ
ํ์ํ์๋ค๋ฉด ๋ค์์คํ์ด์ค ์ญ์ ์ ์ ๋ฆฌ์์ค๋ฅผ ์์ ํ๊ฒ ์ ๋ฆฌํ๊ฑฐ๋ ๋ฐฑ์
ํ๋ ์คํฌ๋ฆฝํธ๋ ๋ง๋ค์ด๋๋ฆด ์
RBAC ๊ตฌ์ฑ ๋ฐฉ๋ฒ
Kubernetes์์ RBAC(Role-Based Access Control) ์ ์ฌ์ฉ์ ๋๋ ์๋น์ค ๊ณ์ ์ด ๋ฌด์์, ์ด๋์์, ์ด๋ป๊ฒ ํ ์ ์๋์ง๋ฅผ ์ ์ดํ๋ ํต์ฌ ๋ณด์ ๋ฉ์ปค๋์ฆ์ด๋ค.
RBAC ๊ตฌ์ฑ ์์
| ๊ฐ์ฒด | ์ค๋ช
|
|---|
Role | ํน์ ๋ค์์คํ์ด์ค ๋ด์์์ ๊ถํ์ ์ ์ |
ClusterRole | ํด๋ฌ์คํฐ ์ ์ฒด ๋๋ ์ฌ๋ฌ ๋ค์์คํ์ด์ค์ ๊ฑธ์น ๊ถํ ์ ์ |
RoleBinding | Role์ ์ฌ์ฉ์/๊ทธ๋ฃน/์๋น์ค๊ณ์ ์ ๋ฐ์ธ๋ฉ (๋ค์์คํ์ด์ค ํ์ ) |
ClusterRoleBinding | ClusterRole์ ํด๋ฌ์คํฐ ์ ์ฒด์ ๋ฐ์ธ๋ฉ |
RBAC ํ์ฉ
ํน์ ๋ค์์คํ์ด์ค์์ get, list๋ง ํ์ฉ
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
name: readonly-role
namespace: my-namespace
rules:
- apiGroups: [""]
resources: ["pods", "services"]
verbs: ["get", "list"]
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
name: readonly-binding
namespace: my-namespace
subjects:
- kind: User
name: alice@example.com
apiGroup: rbac.authorization.k8s.io
roleRef:
kind: Role
name: readonly-role
apiGroup: rbac.authorization.k8s.io
๋ค์์คํ์ด์ค ์ญ์ ๊ถํ ์ ๊ฑฐ
delete ๊ถํ์ ๋บ๋ค. ๋๋ ์์ ํ admin ClusterRole ๋์ ์ ํ๋ Role์ ์ง์ ์ ์ํด์ ์ฌ์ฉํ๋ค.
- ์: ๋ค์์คํ์ด์ค ์ญ์ ๊ถํ ์ ์ธํ Role
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
name: limited-admin
rules:
- apiGroups: [""]
resources: ["pods", "services", "configmaps", "secrets"]
verbs: ["get", "list", "create", "update", "patch", "delete"]
- apiGroups: ["apps"]
resources: ["deployments", "statefulsets"]
verbs: ["*"]
๊ทธ๋ฆฌ๊ณ ์ด๋ฅผ ํด๋ฌ์คํฐ ์์ค ๋๋ ํน์ ๋ค์์คํ์ด์ค์ ๋ฐ์ธ๋ฉํ๋ค.
๋ฐ์ธ๋ฉ ๋์ ์ข
๋ฅ
| kind | ์ค๋ช
|
|---|
User | kubectl ๋ฑ์ผ๋ก ๋ก๊ทธ์ธํ ์ฌ์ฉ์ |
Group | IDP ์ฐ๋ ์ ์ฌ์ฉ์ ๊ทธ๋ฃน (ex. OIDC) |
ServiceAccount | Pod ๋ด๋ถ์์ ์ฌ์ฉํ๋ ์ธ์ฆ ์ฃผ์ฒด |