KR_K8s_Basics - somaz94/DevOps-Engineer GitHub Wiki
Kubernetes๋ฅผ ์ฌ์ฉํ๋ฉด์๋ "์ Kubernetes๋ฅผ ์ฌ์ฉํด์ผ ํ ๊น?" ์ ๋ํ ์๋ฌธ์ ์ ๋ํด์ ํฌ๊ฒ ์๊ฐํด๋ณธ ์ ์ด ์์๋ค.
๊ทธ๋ ๋ค๋ฉด Kubernetes๋ฅผ ์ฌ์ฉํด์ผ๋ง ํ๋ ์ด์ ์ ๋ํด์ ์์๋ณด์.
Kubernetes๋ ์ ํ๋ฆฌ์ผ์ด์ ์ปจํ ์ด๋ ๋ฐฐํฌ, ํ์ฅ ๋ฐ ์ด์์ ์๋ํํ๋๋ก ์ค๊ณ๋ ์คํ ์์ค ์ปจํ ์ด๋ ์ค์ผ์คํธ๋ ์ด์ ํ๋ซํผ์ด๋ค. Google์์ ๊ฐ๋ฐํ์ผ๋ฉฐ ํ์ฌ Cloud Native Computing Foundation์์ ์ ์ง๊ด๋ฆฌ ํ๊ณ ์๋ค.
์ฃผ์ ์ด์ ์ ์๋์ ๊ฐ๋ค.
-
Container Orchestration(์ปจํ
์ด๋ ์ค์ผ์คํธ๋ ์ด์
)
- Kubernetes๋ ์ปจํ ์ด๋์ ์๋ช ์ฃผ๊ธฐ๋ฅผ ํจ์จ์ ์ผ๋ก ๊ด๋ฆฌํ์ฌ ๋จธ์ ํด๋ฌ์คํฐ ์ ๋ฐ์ ๊ฑธ์ณ ๋ฐฐํฌ, ํ์ฅ, ์ข ๋ฃ๋ฅผ ์ฒ๋ฆฌํ๋ค. ์ด๋ ๊ฒฉ๋ฆฌ๋๊ณ ์์ฒด ์ข ์์ฑ์ด ๋ฒ๋ค๋ก ํฌํจ๋ ์ปจํ ์ด๋์์ ์ ํ๋ฆฌ์ผ์ด์ ์ ์คํํ๋ ํ๋ก์ธ์ค๋ฅผ ๋จ์ํํ๋ค.
-
Scalability(ํ์ฅ์ฑ)
- Kubernetes๋ฅผ ์ฌ์ฉํ๋ฉด ๊ฐ๋จํ ๋ช ๋ น์ด๋ UI๋ฅผ ์ฌ์ฉํ๊ฑฐ๋ CPU/๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ๋์ ๋ฐ๋ผ ์๋์ผ๋ก ์ ํ๋ฆฌ์ผ์ด์ ์ ์๋์ผ๋ก ํ์ฅ ๋ฐ ์ถ์ํ ์ ์๋ค.
-
Load Balancing(๋ก๋ ๋ฐธ๋ฐ์ฑ)
- Kubernetes๋ ๋ฐฐํฌ๊ฐ ์์ ์ ์ด๋๋ก ๋คํธ์ํฌ ํธ๋ํฝ์ ๋ถ์ฐํ ์ ์๋ค. ์ฆ, ์ ํ๋ฆฌ์ผ์ด์ ์ ๋จ์ผ ์คํจ ์ง์ ์ ๋ํด ๊ฑฑ์ ํ ํ์๊ฐ ์๋ค.
-
High Availability(๊ณ ๊ฐ์ฉ์ฑ)
- Kubernetes๋ ์๋ ๋นํจํน, ์๊ฐ ๋ณต๊ตฌ(์๋ตํ์ง ์๋ ์ปจํ ์ด๋ ์๋์ผ๋ก ๋ค์ ์์), ๋ณต์ , ์ํ ํ์ฅ(ํ์์ ๋ฐ๋ผ ์๋์ผ๋ก ์ ํ๋ฆฌ์ผ์ด์ ํฌ๊ธฐ ์กฐ์ )๊ณผ ๊ฐ์ ๊ธฐ๋ฅ์ ์ ๊ณตํ์ฌ ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ฐ์ฉ์ฑ์ ๋ณด์ฅํ๋ค.
-
Automated Rollouts and Rollbacks(์๋ ๋กค์์ ๋กค๋ฐฑ)
- Kubernetes๋ฅผ ์ฌ์ฉํ์ฌ ๋ฐฐํฌ๋ ์ปจํ ์ด๋์ ๋ํด ์ํ๋ ์ํ๋ฅผ ์ค๋ช ํ ์ ์์ผ๋ฉฐ ์ ์ด๋ ์๋๋ก ์ค์ ์ํ๋ฅผ ์ํ๋ ์ํ๋ก ๋ณ๊ฒฝํ ์ ์๋ค. ์๋ฅผ ๋ค์ด Kubernetes๋ฅผ ์๋ํํ์ฌ ๋ฐฐํฌ๋ฅผ ์ํ ์ ์ปจํ ์ด๋๋ฅผ ์์ฑํ๊ณ , ๊ธฐ์กด ์ปจํ ์ด๋๋ฅผ ์ ๊ฑฐํ๊ณ , ๋ชจ๋ ๋ฆฌ์์ค๋ฅผ ์ ์ปจํ ์ด๋๋ก ๋ณ๊ฒฝ์์ผ ์ค ์ ์๋ค.
-
Service Discovery and Load Balancing(์๋น์ค ๊ฒ์ ๋ฐ ๋ก๋ ๋ฐธ๋ฐ์ฑ)
- Kubernetes๋ DNS ์ด๋ฆ์ด๋ ์์ฒด IP ์ฃผ์๋ฅผ ์ฌ์ฉํ์ฌ ์ปจํ ์ด๋๋ฅผ ๋ ธ์ถํ ์ ์๋ค. ์ปจํ ์ด๋์ ๋ํ ํธ๋ํฝ์ด ๋์ผ๋ฉด Kubernetes๋ ๋ฐฐํฌ๊ฐ ์์ ์ ์ด๋๋ก ๋คํธ์ํฌ ํธ๋ํฝ์ ๋ถํ๋ฅผ ๋ถ์ฐํ๊ณ ๋ถ์ฐํ ์ ์๋ค.
-
Storage Orchestration(์คํ ๋ฆฌ์ง ์ค์ผ์คํธ๋ ์ด์
)
- Kubernetes๋ฅผ ์ฌ์ฉํ๋ฉด ๋ก์ปฌ ์คํ ๋ฆฌ์ง, ํผ๋ธ๋ฆญ ํด๋ผ์ฐ๋ ๊ณต๊ธ์ ๋ฑ ์ํ๋ ์คํ ๋ฆฌ์ง ์์คํ ์ ์๋์ผ๋ก ๋ง์ดํธํ ์ ์๋ค.
-
Secret and Configuration Management(Secret ๋ฐ Configmap ๊ด๋ฆฌ)
- Kubernetes๋ ๋น๋ฐ๋ฒํธ, OAuth ํ ํฐ, SSH ํค์ ๊ฐ์ ๋ฏผ๊ฐํ ์ ๋ณด๋ฅผ ๊ด๋ฆฌํ ์ ์๋ค. ์ปจํ ์ด๋ ์ด๋ฏธ์ง๋ฅผ ๋ค์ ๋น๋ํ๊ฑฐ๋ ์คํ ๊ตฌ์ฑ์ Secret์ ๋ ธ์ถํ์ง ์๊ณ ๋ ๋น๋ฐ๊ณผ ์ ํ๋ฆฌ์ผ์ด์ ๊ตฌ์ฑ์ ๋ฐฐํฌํ๊ณ ์ ๋ฐ์ดํธํ ์ ์๋ค.
-
Self-healing(์๊ฐ ์น์ )
- Kubernetes๋ ์คํจํ ์ปจํ ์ด๋๋ฅผ ๋ค์ ์์ํ๊ณ , ์ฌ์ฉ์ ์ ์ ์ํ ๊ฒ์ฌ์ ์๋ตํ์ง ์๋ ์ปจํ ์ด๋๋ฅผ ๊ต์ฒดํ๋ฉฐ, ์๋น์ค ์ค๋น๊ฐ ๋ ๋๊น์ง ํด๋ผ์ด์ธํธ์ ์๋ฆฌ์ง ์๋๋ค.
-
Declarative Configuration(์ ์ธ์ ๊ตฌ์ฑ)
- ์์คํ ์ ์ํ๋ ์ํ๋ฅผ YAML ๋๋ JSON ํ์ผ๋ก ์ ์ธ์ ์ผ๋ก ์ ์ํ ์ ์์ผ๋ฉฐ, Kubernetes๋ ์๋์ผ๋ก ์ด ์ํ๋ฅผ ์ ์งํ๋ค.
์ปจํ ์ด๋ ์ค์ผ์คํธ๋ ์ด์ ์ ์ปจํ ์ด๋ ์๋ช ์ฃผ๊ธฐ๋ฅผ ์๋์ผ๋ก ๊ด๋ฆฌํ๋ ๊ฒ์ด๋ค. ์ฌ๊ธฐ์๋ ์ปจํ ์ด๋์ ๋ฐฐํฌ, ํ์ฅ, ๋คํธ์ํน, ์๋ช ์ฃผ๊ธฐ ๊ด๋ฆฌ ๋ฑ ๋ค์ํ ํ๋์ด ํฌํจ๋๋ค.
์ฆ, ์ปจํ ์ด๋ ์ค์ผ์คํธ๋ ์ด์ ์ ๊ฐ๋ณ ๊ตฌ์ฑ ์์์ ์ ํ๋ฆฌ์ผ์ด์ ๊ณ์ธต์ ์์ ์ ๊ตฌ์ฑํ๋ ํ๋ก์ธ์ค๋ฅผ ์๋ฏธํ๋ค.
- Efficiency(ํจ์จ์ฑ): ๋ง์ ์์ ์ปจํ ์ด๋๋ฅผ ํจ์จ์ ์ผ๋ก ๊ด๋ฆฌํ๊ณ ํ์ฅํ๋ค.
- Load Balancing(๋ก๋ ๋ฐธ๋ฐ์ฑ): ์ปจํ ์ด๋ ๊ฐ์ ๋ก๋์ ํธ๋ํฝ์ ์๋์ผ๋ก ๋ถ์ฐํ๋ค.
- High Availability(๊ณ ๊ฐ์ฉ์ฑ): ์ปจํ ์ด๋ ๋ณต์ ๋ณธ ๋ฐ ๊ต์ฒด๋ฅผ ๊ด๋ฆฌํ์ฌ ๊ฐ๋ ์ค์ง ์๊ฐ์ ๋ฐฉ์งํ๋ค.
- Container(์ปจํ ์ด๋): ์ฝ๋, ๋ฐํ์, ์์คํ ๋๊ตฌ, ๋ผ์ด๋ธ๋ฌ๋ฆฌ ๋ฐ ์ค์ ์ ํฌํจํ์ฌ ์ํํธ์จ์ด๋ฅผ ์คํํ๋ ๋ฐ ํ์ํ ๋ชจ๋ ๊ฒ์ด ํฌํจ๋ ๊ฒฝ๋์ ๋ ๋ฆฝํ ์คํ ๊ฐ๋ฅ ํจํค์ง์ด๋ค.
- Pod(ํ๋): ํ๋ ์ด์์ ์ปจํ ์ด๋๋ฅผ ํธ์คํ ํ ์ ์๋ Kubernetes์์ ๋ฐฐํฌ ๊ฐ๋ฅํ ๊ฐ์ฅ ์์ ๋จ์์ด๋ค.
- Node(๋ ธ๋): Kubernetes์ ์์ ์ ๋จธ์ ์ผ๋ก, ํด๋ฌ์คํฐ์ ๋ฐ๋ผ ๊ฐ์ ๋จธ์ ์ผ ์๋ ์๊ณ ๋ฌผ๋ฆฌ์ ๋จธ์ ์ผ ์๋ ์๋ค.
- Cluster(ํด๋ฌ์คํฐ): Kubernetes์์ ๊ด๋ฆฌํ๋ ์ปจํ ์ด๋ํ๋ ์ ํ๋ฆฌ์ผ์ด์ ์ ์คํํ๋ ๋ ธ๋ ์งํฉ์ด๋ค.
Kubernetes ์ธ์๋ ์ค์ผ์คํธ๋ ์ด์ ๊ธฐ๋ฅ์ ์ ๊ณตํ๋ Docker Swarm ๋ฐ Apache Mesos์ ๊ฐ์ ๋ค๋ฅธ ๋๊ตฌ๊ฐ ์๋ค.
Kubernetes๋ ๋จธ์ ํด๋ฌ์คํฐ ์ ์ฒด์์ ์ปจํ ์ด๋ํ๋ ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ด๋ฆฌํ๊ธฐ ์ํ ์์คํ ์ด๋ค.
๋ค์ํ ๋ฆฌ์์ค์ ๊ตฌ์ฑ ์์๋ฅผ ์ฌ์ฉํ์ฌ ์ ํ๋ฆฌ์ผ์ด์ ๋ฐฐํฌ ๋ฐ ๊ด๋ฆฌ์ ๋ค์ํ ์ธก๋ฉด์ ์ฒ๋ฆฌํ๋ค.
Kubernetes ๋ด์์ kube-system ๋ค์์คํ์ด์ค์๋ Kubernetes ํด๋ฌ์คํฐ์์ ์ค์ํ ์ญํ ์ ํ๋ ์ฌ๋ฌ ์ค์ํ ์์คํ
Pod๊ฐ ํฌํจ๋์ด ์๋ค.
- ์ ์ฒด Kubernetes ํด๋ฌ์คํฐ์ ์ค์ ์ ์ด๋ฅผ ๋ด๋นํ๋ค.
- ๋ด๋ถ ์์คํ ๊ตฌ์ฑ ์์๋ ๋ฌผ๋ก ์ธ๋ถ ์ฌ์ฉ์๊ฐ ์ฌ์ฉํ๋ Kubernetes API๋ฅผ ์ ๊ณตํ๋ค.
- Pod๊ฐ ์์ฑ๋๋ฉด
kube-apiserver๋ ์์ฒญ์ ์ฒ๋ฆฌํ๊ณ Pod ์ ๋ณด๋ฅผ etcd ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ ์ฅํ๋ค.
- ๋ชจ๋ ํด๋ฌ์คํฐ ๋ฐ์ดํฐ์ ๋ํ Kubernetes์ ๋ฐฑ์ ์ ์ฅ์๋ก ์ฌ์ฉ๋๋ ์ผ๊ด๋๊ณ ๊ฐ์ฉ์ฑ์ด ๋์ ํค ๊ฐ ์ ์ฅ์์ด๋ค.
- Pod๊ฐ ์์ฑ๋๋ฉด ํด๋น ๊ตฌ์ฑ๊ณผ ์ํ๊ฐ
etcd์ ์ ์ฅ๋๋ฏ๋ก ํด๋ฌ์คํฐ ์ํ๊ฐ ์ ์ง๋๊ณ ์ฅ์ ๋ฐ์ ์ ๋ณต๊ตฌ๋ ์ ์๋ค.
- ํ ๋น๋ ๋ ธ๋๊ฐ ์๋ ์๋ก ์์ฑ๋ Pod๋ฅผ ๊ฐ์ํ๊ณ ๋ฆฌ์์ค ์๊ตฌ ์ฌํญ, ์ ํธ๋ ์ฌ์, ๋ฐ์ดํฐ ์ง์ญ์ฑ, ์ํฌ๋ก๋ ๊ฐ ๋ฑ ๋ค์ํ ์ผ์ ๊ธฐ์ค์ ๋ฐ๋ผ ์คํํ ๋ ธ๋๋ฅผ ์ ํํ๋ค.
- Pod๊ฐ ์์ฑ๋ ํ
kube-scheduler๋ ์ด๋ฅผ ์ ํฉํ ๋ ธ๋์ ํ ๋นํ๋ค.
- ํด๋ฌ์คํฐ์์ ์ผ์์ ์ธ ์์ ์ ์ฒ๋ฆฌํ๋ background threads ์ปจํธ๋กค๋ฌ ํ๋ก์ธ์ค๋ฅผ ์คํํ๋ค.
- Pod ์์ฑ ์
kube-controller-manager์ ๊ด๋ จ ์ปจํธ๋กค๋ฌ๋ Pod์ ์ค์ ์ํ๊ฐ ์ฌ์ฉ์๊ฐ ์ง์ ํ ์ํ๋ ์ํ์ ์ผ์นํ๋์ง ํ์ธํ๋ค.
- ํด๋ฌ์คํฐ์ ๊ฐ ๋ ธ๋์์ ์คํ๋๋ kubelet์ ์ปจํ ์ด๋๊ฐ Pod์์ ์คํ๋๋์ง ํ์ธํ๋ ์ญํ ์ ํ๋ค.
- Pod๊ฐ ๋
ธ๋์ ์์ฝ๋๋ฉด ํด๋น ๋
ธ๋์ kubelet์
kube-apiserver์ ์์ฒญ์ ๋ฐ์ Pod์ ์ง์ ๋ ์ปจํ ์ด๋๋ฅผ ์์ํ๋ค.
- ๊ฐ ๋ ธ๋์์ ์คํ๋๋ฉฐ ๋คํธ์ํฌ ํ๋ก์๋ก, ํด๋ฌ์คํฐ ๋ด๋ถ ๋๋ ์ธ๋ถ์ ๋คํธ์ํฌ ์ธ์ ์์ Pod๋ก์ ๋คํธ์ํฌ ํต์ ์ ํ์ฉํ๋ ๋คํธ์ํฌ ๊ท์น์ ์ ์งํ๋ค.
- Pod๊ฐ ์์ฑ๋๋ฉด
kube-proxy๋ ํ๋์ IP ์ฃผ์๋ก IP ์ ๋ฌ์ ํ์ฉํ๋๋ก ๋ ธ๋์ ๋คํธ์ํฌ ๊ท์น์ ์ ๋ฐ์ดํธ ํ๋ค.
- Kubernetes ํด๋ฌ์คํฐ์ DNS ์๋น์ค๋ฅผ ์ ๊ณตํ์ฌ ์๋น์ค ๋ฐ Pod ์ด๋ฆ์ IP ์ฃผ์๋ก ๋ณํํ๋ค.
- Pod๊ฐ ์์ฑ๋๋ฉด IP ์ฃผ์์ DNS ์ด๋ฆ์ ์ป๋๋ค.
CoreDNS๋ ๋ ์ฝ๋๋ฅผ ์ ๋ฐ์ดํธํ์ฌ ํด๋ฌ์คํฐ ๋ด์ DNS ์ด๋ฆ์ ํตํด Pod์ ์ก์ธ์คํ ์ ์๋๋ก ํ๋ค.
- ์ปจํ ์ด๋ ๋ฐํ์์ ์ปจํ ์ด๋ ์คํ์ ๋ด๋นํ๋ ์ํํธ์จ์ด์ด๋ค.
- Containerd, CRI์ ๊ฐ์ ์ปจํ ์ด๋ ๋ฐํ์์ ์ง์ํ๋ค.
-
Addon์ ์ฟ ๋ฒ๋คํฐ์ค ๋ฆฌ์์ค(๋ฐ๋ชฌ์ , ๋ํด๋ก์ด๋จผํธ ๋ฑ)์ ์ด์ฉํ์ฌ ํด๋ฌ์คํฐ ๊ธฐ๋ฅ์ ๊ตฌํํ๋ค. - ํด๋ฌ์คํฐ ๋จ์์ ๊ธฐ๋ฅ์ ์ ๊ณตํ๊ธฐ ๋๋ฌธ์ ์ ๋์จ์ ๋ํ ๋ค์์คํ์ด์ค ๋ฆฌ์์ค๋ kube-system ๋ค์์คํ์ด์ค์ ์ํ๋ค.
-
kubectl (Execute):
- ์ฌ์ฉ์๊ฐ
kubectl apply -f k8s-deployment.yml์ ์คํํ๋ค. - YAML์ JSON์ผ๋ก ๋ณํํ์ฌ kube-apiserver๋ก ์ ์กํ๋ค.
- ์ฌ์ฉ์๊ฐ
-
kube-apiserver (Processing):
- API ์๋ฒ๊ฐ ๋ฐฐํฌ ์์ฒญ์ ๋ฐ๋๋ค.
- ์ฟ ๋ฒ๋คํฐ์ค ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ๋ฐฐํฌ ์ธ๋ถ ์ ๋ณด(๊ฐ์ฒด ์ ์)๋ฅผ ์ ์งํ๋ค.
-
etcd (Data Storage):
- etcd๋ ์ฟ ๋ฒ๋คํฐ์ค์์ ๊ตฌ์ฑ ๋ฐ ์ํ ์ ๋ณด๋ฅผ ํฌํจํ ๋ฐ์ดํฐ๋ฅผ ์ง์์ ์ผ๋ก ์ ์ฅํ๋๋ฐ ์ฌ์ฉ๋๋ ๊ณ ๊ฐ์ฉ์ฑ ํค-๊ฐ ์ ์ฅ์์ด๋ค.
- ๋ฐฐํฌ ๋ฆฌ์์ค๊ฐ etcd์ ์ ์ฅ๋๋ฉด ์ปจํธ๋กค๋ฌ ๋งค๋์ ์๊ฒ ์๋ฆผ์ด ์ ์ก๋๋ค.
-
kube-controller-manager (Resource Creation):
- ์ปจํธ๋กค๋ฌ ๋งค๋์ ๋ ๋ฐฐํฌ ์ ์ง์ ๋ replica ์์ ๋ฐ๋ผ pod ๋ฆฌ์์ค๋ฅผ ์์ฑํ๋ค.
-
kube-scheduler (Scheduling):
- ์ค์ผ์ค๋ฌ๋ ํ ์ํ๋ฅผ ๋ชจ๋ํฐ๋งํ๊ณ ์ธํ๋ผ์คํธ๋ญ์ฒ์ health๋ฅผ ํ๊ฐํ๋ค.
- ์ต์ ์ ๋ ธ๋๋ฅผ ์ ์ ํ๊ธฐ ์ํด ๋ ธ๋ ํํฐ๋ง ๋ฐ ์์ ๋งค๊ธฐ๊ธฐ(ranking)๋ฅผ ์ํํ๋ค.
- ์ค์ผ์ค๋ฌ๋
nodeNameํ๋๋ก ์ ํ๋ ๋ ธ๋๋ฅผ ๋ํ๋ด๋ฉฐ, etcd์์ pod์ ์ํ๋ฅผscheduled์ผ๋ก ์ ๋ฐ์ดํธํ๋ค.
-
kubelet (Node-Level Execution):
- ๊ฐ ์์ปค ๋
ธ๋๋ ๋ง์คํฐ ๋
ธ๋/์ปจํธ๋กค ํ๋ ์ธ๊ณผ ํต์ ํ๋
kubelet์ ์คํํ๋ค. -
kubelet์ pod์ ์ง์ ๋ ์ปจํ ์ด๋๊ฐ ์คํ ์ค์ธ์ง ํ์ธํ๋ค. - ์ปจํธ๋กค ํ๋ ์ธ์ ์ง์์ ๋ฐ๋ผ ๋ ธ๋์์ ์์ ์ ์คํํ๋ค.
- ๊ฐ ์์ปค ๋
ธ๋๋ ๋ง์คํฐ ๋
ธ๋/์ปจํธ๋กค ํ๋ ์ธ๊ณผ ํต์ ํ๋
-
Container Runtime Interface (CRI) Daemon (Container Creation):
- ๋ฐฐํฌ๊ฐ ์ฌ๋ฌ ๋ณต์ ๋ณธ์ ์ง์ ํ๋ ๊ฒฝ์ฐ, ๊ฐ ์์
์ etcd์์
scheduled์ผ๋ก ํ์๋๋ค. -
kubelet์ pod ํ ํ๋ฆฟ์ ๊ฒ์ํ๊ณ ์ปจํ ์ด๋ ๋ฐํ์ ์ธํฐํ์ด์ค(CRI) ๋ฐ๋ชฌ์๊ฒ ์ปจํ ์ด๋ ์์ฑ์ ์ง์ํ๋ค. -
kubelet์ ์ํด ํธ์ถ๋์ด Pod ๋ด์ ์ปจํ ์ด๋๋ฅผ ์์ฑ ํ๋ค.
- ๋ฐฐํฌ๊ฐ ์ฌ๋ฌ ๋ณต์ ๋ณธ์ ์ง์ ํ๋ ๊ฒฝ์ฐ, ๊ฐ ์์
์ etcd์์
-
kubelet (Status Update):
- CRI ๋ฐ๋ชฌ ์์
์ด ์๋ฃ๋๋ฉด
kubelet์readiness๋ฐlivenessํ๋ก๋ธ ๊ฒ์ฌ๋ฅผ ์ํํ๋ค. - ์ด ๊ฒ์ฌ๋ฅผ ํต๊ณผํ๋ฉด pod์ ์ํ๊ฐ
running์ผ๋ก ์ ๋ฐ์ดํธ๋๋ค.
- CRI ๋ฐ๋ชฌ ์์
์ด ์๋ฃ๋๋ฉด
์ฟ ๋ฒ๋คํฐ์ค API ๊ทธ๋ฃน(API Group)์ ์ฟ ๋ฒ๋คํฐ์ค API ๋ฆฌ์์ค๋ค์ ๊ด๋ฆฌํ๊ธฐ ์ํด ๊ทธ๋ฃนํํ ๊ฒ์ด๋ค. API ๊ทธ๋ฃน์ ํตํด ๊ด๋ จ๋ ๋ฆฌ์์ค๋ฅผ ๋ถ๋ฅํ๊ณ , ๋ฒ์ ๊ด๋ฆฌ๋ฅผ ํจ์จ์ ์ผ๋ก ์ํํ ์ ์๋ค.
์ฟ ๋ฒ๋คํฐ์ค API๋ ํฌ๊ฒ Core Group๊ณผ Named Group์ผ๋ก ๋๋๋ค.

- Image Reference : https://cloud.redhat.com/blog/kubernetes-deep-dive-api-server-part-1
Core Group์ ๊ธฐ๋ณธ์ ์ธ ์ฟ ๋ฒ๋คํฐ์ค ๋ฆฌ์์ค๋ฅผ ํฌํจํ๋ ๊ทธ๋ฃน์ผ๋ก, API ๊ทธ๋ฃน ์ด๋ฆ์ด ๊ณต๋ฐฑ ๋ฌธ์์ด("")๋ก ์ง์ ๋๋ค.
์ด ๊ทธ๋ฃน์๋ ํ๋(Pods), ์๋น์ค(Services), ๋ ํ๋ฆฌ์ผ์ด์ ์ปจํธ๋กค๋ฌ(ReplicationControllers), ๋ ธ๋(Nodes), ๋ค์์คํ์ด์ค(Namespaces) ๋ฑ ์ฟ ๋ฒ๋คํฐ์ค์ ํต์ฌ ๊ธฐ๋ฅ์ ์ ๊ณตํ๋ ๋ฆฌ์์ค๊ฐ ํฌํจ๋๋ค.
์๋ฅผ๋ค์ด Core Group์ pods ๋ฆฌ์์ค์ ๋ํ ๊ถํ์ ์ค์ ํ ๋ ๋ค์๊ณผ ๊ฐ์ด ์์ฑํ๋ค.
apiGroups: [""]
resources: ["pods"]Named Group์ Core Group ์ธ์ ํน์ ํ ์ด๋ฆ์ ๊ฐ์ง API ๊ทธ๋ฃน์ด๋ค.
์ด ๊ทธ๋ฃน์๋ ์ ํ๋ฆฌ์ผ์ด์
๊ด๋ จ ๋ฆฌ์์ค, ๋ณด์ ๊ด๋ จ ๋ฆฌ์์ค, ๊ตฌ์ฑ ๊ด๋ จ ๋ฆฌ์์ค, ๊ทธ ์ธ ๋ค์ํ ํ์ฅ ๋ฆฌ์์ค ๋ฑ์ด ํฌํจ๋ ์ ์๋ค. ๋ํ์ ์ธ Named Group์ผ๋ก๋ extensions, apps, networking.k8s.io, rbac.authorization.k8s.io ๋ฑ์ด ์๋ค.
์๋ฅผ ๋ค์ด, apps API ๊ทธ๋ฃน์ deployments ๋ฆฌ์์ค์ ๋ํ ๊ถํ์ ์ค์ ํ ๋ ๋ค์๊ณผ ๊ฐ์ด ์์ฑํ๋ค.
apiGroups: ["apps"]
resources: ["deployments"]์ฟ ๋ฒ๋คํฐ์ค์ RBAC (Role-Based Access Control)์ ์ฟ ๋ฒ๋คํฐ์ค ํด๋ฌ์คํฐ ๋ด์์ ๋ฆฌ์์ค์ ๋ํ ์ ๊ทผ ๊ถํ์ ์ฌ์ฉ์๋ ๊ทธ๋ฃน์๊ฒ ๋ถ์ฌํ๋ ๋ณด์ ๋ฉ์ปค๋์ฆ(Authorization)์ด๋ค. RBAC์ ํตํด ํน์ ์ฌ์ฉ์์๊ฒ ํ์ํ ์ต์ํ์ ๊ถํ๋ง ๋ถ์ฌํจ์ผ๋ก์จ ํด๋ฌ์คํฐ์ ๋ฆฌ์์ค์ ์ ๋ณด๋ฅผ ์์ ํ๊ฒ ๋ณดํธํ ์ ์๋ค.
์ฟ ๋ฒ๋คํฐ์ค์์๋ Role, ClusterRole, RoleBinding, ClusterRoleBinding ์ด๋ ๊ฒ ๋ค ๊ฐ์ง ์์๋ฅผ ์ฌ์ฉํ์ฌ RBAC์ ๊ตฌํํ๋ค.
Role์ ์ฟ ๋ฒ๋คํฐ์ค์ ํน์ ๋ค์์คํ์ด์ค(namespace) ๋ด์์ ๋ฆฌ์์ค์ ๋ํ ์ ๊ทผ ๊ถํ์ ์ ์ํ๋ ๊ฐ์ฒด์ด๋ค.
Role์ ์ด๋ค ์ข ๋ฅ์ ๋ฆฌ์์ค์ ๋ํ ๊ถํ์ ์ค์ ํ ์ง, ๊ทธ๋ฆฌ๊ณ ๊ทธ ๊ถํ์ด ์ด๋ค ๋์(์: get, list, create, update ๋ฑ)์ ํฌํจํ๋์ง ๋ช ์ํ๋ค.
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
name: gitlab-runner-role
# kubectl apply ํ ๋ ์ ์ฉํ namespace ์ง์
#namespace:
rules:
- apiGroups: ["extensions", "apps"]
resources: ["deployments"]
verbs: ["get", "list", "watch", "create", "update", "patch", "delete"]
- apiGroups: [""]
resources: ["pods", "services", "secrets", "pods/exec", "serviceaccounts"]
verbs: ["get", "list", "watch", "create", "update", "patch", "delete"]
์ถ์ฒ: https://somaz.tistory.com/199 [Somaz์ IT ๊ณต๋ถ ์ผ์ง:ํฐ์คํ ๋ฆฌ]extensions ๋ฐ apps API ๊ทธ๋ฃน์ ์ํ๋ deployments ๋ฆฌ์์ค์ ๋ํ ๊ถํ
- get: ๋ฆฌ์์ค ์กฐํ
- list: ๋ฆฌ์์ค ๋ชฉ๋ก ์กฐํ
- watch: ๋ฆฌ์์ค ๋ณ๊ฒฝ ์ฌํญ ๊ฐ์
- create: ๋ฆฌ์์ค ์์ฑ
- update: ๋ฆฌ์์ค ์์
- patch: ๋ฆฌ์์ค ์ผ๋ถ ์์
- delete: ๋ฆฌ์์ค ์ญ์
core API ๊ทธ๋ฃน (apiGroups ํ๋์ ๋น ๋ฌธ์์ด ""์ด ์ฌ์ฉ)์ ์ํ๋ ๋ฆฌ์์ค์ ๋ํ
- pods, services, secrets, serviceaccounts: ์์ ๋์ผํ ๋์ ๊ถํ
- pods/exec: ํ๋ ๋ด์์ ์คํ ์ค์ธ ์ปจํ ์ด๋์ ๋ช ๋ น์ ์คํํ ์ ์๋ ๊ถํ
RoleBinding์ Role์ ์ ์๋ ๊ถํ์ ์ฌ์ฉ์, ๊ทธ๋ฃน, ๋๋ ๋ค๋ฅธ ์๋น์ค ๊ณ์ ์ ์ฐ๊ฒฐํ๋ ๊ฐ์ฒด์ด๋ค.
์ฆ, RoleBinding์ ํตํด ํน์ ์ฌ์ฉ์๊ฐ Role์ ๋ช ์๋ ๊ถํ์ ๊ฐ์ง๊ฒ ๋๋ค. RoleBinding์ ํน์ ๋ค์์คํ์ด์ค์๋ง ๊ตญํ๋์ด ์๋ํ๋ค.
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
# kubectl apply ํ ๋ ์ ์ฉํ namespace ์ง์
#namespace:
name: gitlab-runner-role-binding
subjects:
- kind: ServiceAccount
name: default
# kubectl apply ํ ๋ ์ ์ฉํ namespace ์ง์
#namespace:
roleRef:
kind: Role
name: gitlab-runner-role
apiGroup: rbac.authorization.k8s.ioKubernetes ์ํฌ๋ฆฟ์ ๋น๋ฐ๋ฒํธ, API ํค, ํ ํฐ ๋๋ ์ธ์ฆ์์ ๊ฐ์ ๋ฏผ๊ฐํ ์ ๋ณด๋ฅผ Kubernetes ํด๋ฌ์คํฐ ๋ด์ ์์ ํ๊ฒ ์ ์ฅํ๋ ๋ฐ ์ฌ์ฉ๋๋ค. ๋ฏผ๊ฐํ ๋ฐ์ดํฐ๋ฅผ ์ ํ๋ฆฌ์ผ์ด์ ์ฝ๋ ๋ฐ ๊ตฌ์ฑ ํ์ผ๊ณผ ๋ถ๋ฆฌํ๋ ๋ฐ ๋์์ด ๋๋ค. ์ํฌ๋ฆฟ์ ํด๋ฌ์คํฐ์ ํ๋ ๋ฐ ์ปจํ ์ด๋์์ ์ฌ์ฉํ ํ์ผ ๋๋ ํ๊ฒฝ ๋ณ์๋ก ๋ง์ดํธํ ์ ์๋ค.
Kubernetes Secrets์ผ๋ก ์ ์ฅํ ์ ์๋ ๋ฆฌ์์ค๋ ์๋์ ๊ฐ๋ค.
- Opaque Secrets: ์์์ ์ฌ์ฉ์ ์ ์ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ๋ ์ผ๋ฐ์ ์ธ ๋ชฉ์ ์ ์ํฌ๋ฆฟ
- Service account token Secrets: ์๋น์ค ๊ณ์ ์ธ์ฆ์ ์ํ ํ ํฐ์ ์ ์ฅ
- Docker config Secrets: ํ๋ผ์ด๋น ๋ ์ง์คํธ๋ฆฌ ์ธ์ฆ ์ ๋ณด๋ฅผ ์ ์ฅ
- Basic authentication Secret: ๊ธฐ๋ณธ ์ธ์ฆ ์๊ฒฉ ์ฆ๋ช ์ ์ ์ฅ
- SSH authentication secrets: SSH ์ธ์ฆ ํค๋ฅผ ์ ์ฅ
- TLS secrets: TLS ์ธ์ฆ์์ ํค๋ฅผ ์ ์ฅ
- Bootstrap token Secrets: ๋ถํธ์คํธ๋ฉ ํ ํฐ์ ์ ์ฅ
- External Secrets: ์ธ๋ถ ์ํฌ๋ฆฟ ๊ด๋ฆฌ ์์คํ ๊ณผ ํตํฉํ๊ธฐ ์ํ ์ํฌ๋ฆฟ
์ํฌ๋ฆฟ ์ฌ์ฉ ์ ์ฃผ์์ฌํญ:
- ์ํฌ๋ฆฟ์ base64๋ก ์ธ์ฝ๋ฉ๋์ด ์ ์ฅ๋์ง๋ง, ์ด๋ ์ํธํ๊ฐ ์๋
- ETCD์ ์ ์ฅ๋ ๋ ์ํธํ๋ฅผ ํ์ฑํํ๋ ๊ฒ์ ๊ถ์ฅ
- RBAC๋ฅผ ํตํด ์ํฌ๋ฆฟ ์ ๊ทผ ๊ถํ์ ์ ํํด์ผ ํจ
- ํ์ํ ๊ฒฝ์ฐ์๋ง ์ํฌ๋ฆฟ์ Pod์ ๋ง์ดํธ
Kubernetes์์ ์๋น์ค๋ ๋ ผ๋ฆฌ์ Pod ์ธํธ์ ์ด์ ์ก์ธ์คํ๋ ์ ์ฑ ์ ์ ์ํ๋ค. ์๋น์ค ์ ํ์ ์๋น์ค๊ฐ ๋คํธ์ํฌ์ ๋ ธ์ถ๋๋ ๋ฐฉ์์ ์ง์ ํ๋ค.
์ฃผ์ ์๋น์ค ์ ํ์ ๋ค์๊ณผ ๊ฐ๋ค.
- ClusterIP: ํด๋ฌ์คํฐ ๋ด์์๋ง ์ ์ ๊ฐ๋ฅํ ์๋น์ค๋ฅผ ์ ๊ณตํ๋ ๊ธฐ๋ณธ ์๋น์ค ์ ํ์ด๋ค.
-
NodePort: ์ ์ ํฌํธ์์ ๊ฐ ๋
ธ๋์ IP์ ๋ํ ์๋น์ค๋ฅผ ๋
ธ์ถํ๋ค.
<NodeIP>:<NodePort>๋ฅผ ์์ฒญํ์ฌ ํด๋ฌ์คํฐ ์ธ๋ถ์์ NodePort ์๋น์ค์ ์ฐ๊ฒฐํ ์ ์๋ค. - LoadBalancer: ํ์ฌ ํด๋ผ์ฐ๋์ ์ธ๋ถ ๋ก๋ ๋ฐธ๋ฐ์๋ฅผ ์์ฑํ๊ณ (์ง์๋๋ ๊ฒฝ์ฐ) ๊ณ ์ ์ธ๋ถ IP๋ฅผ ์๋น์ค์ ํ ๋นํ๋ค.
-
ExternalName: ํด๋น ๊ฐ๊ณผ ํจ๊ป CNAME ๋ ์ฝ๋๋ฅผ ๋ฐํํ์ฌ
externalNameํ๋(์:foo.bar.example.com)์ ์ฝํ ์ธ ์ ์๋น์ค๋ฅผ ๋งคํํ๋ค.
externalTrafficPolicy๋ ์์ ํธ๋ํฝ์ด ๋ผ์ฐํ
๋๋ ๋ฐฉ์์ ์ ์ดํ๋ โโLoadBalancer ๋๋ NodePort ์ ํ์ ์๋น์ค ์ต์
์ด๋ค. Cluster ๋๋ Local์ด๋ผ๋ ๋ ๊ฐ์ง ๊ฐ์ ๊ฐ์ง ์ ์๋ค.
- Cluster: ํธ๋ํฝ์ ์์์ ๋ ธ๋๋ก ๋ผ์ฐํ ๋๋ฉฐ, ํด๋น ๋ ธ๋์ ์๋น์ค์ฉ Pod๊ฐ ์์ผ๋ฉด ํธ๋ํฝ์ ์๋ ๋ ธ๋๋ก ์ ๋ฌ๋๋ค. ์ด๋ก ์ธํด ์ถ๊ฐ ํ์ด ๋ฐ์ํ๊ณ ์์ค IP ์ฃผ์๊ฐ ๋ชจํธํด์ง ์ ์๋ค.
- Local: ํธ๋ํฝ์ ์๋น์ค์ฉ Pod๊ฐ ์๋ ๋ ธ๋๋ก๋ง ๋ผ์ฐํ ๋๋ค. ํธ๋ํฝ์ด ํ๋ ์์ด ๋ ธ๋์ ๋๋ฌํ๋ฉด ์ ๋ฌ๋์ง ์๊ณ ์ญ์ ๋๋ค. ์ด๋ ๊ฒ ํ๋ฉด ์๋ ์์ค IP ์ฃผ์๊ฐ ์ ์ง๋์ง๋ง ํ๋ ์ ์ฒด์ ํธ๋ํฝ์ด ๊ณ ๋ฅด์ง ์๊ฒ ๋ถ์ฐ๋ ์ ์๋ค.
7. Kubernetes Persistent Volumes (PV) and Persistent Volume Claims (PVC) and StorageClass and CSI(Constainer Storage Interface)
graph TD
PV("Persistent Volume (PV)")
PVC("Persistent Volume Claim (PVC)")
Pod("Pod")
Retain("Retain Policy")
Delete("Delete Policy")
Recycle("Recycle Policy")
Provisioning("Provisioning")
Binding("Binding")
Using("Using")
Releasing("Releasing")
Reclaiming("Reclaiming")
SC("Storage Class")
Dynamic("Dynamic Provisioning")
Static("Static Provisioning")
CSI("CSI-Driver")
Block("Block Storage")
File("File Storage")
Object("Object Storage")
PV -- "Bound by" --> PVC
PVC -- "Referenced by" --> Pod
PV -- "Retain" --> Retain
PV -- "Delete" --> Delete
PV -- "Recycle" --> Recycle
Provisioning -- "leads to" --> Binding
Binding -- "leads to" --> Using
Using -- "leads to" --> Releasing
Releasing -- "leads to" --> Reclaiming
SC -- "creates" --> PV
SC -- "Defines provisioning" --> Dynamic
SC -- "Defines provisioning" --> Static
CSI -- "Manages" --> Block
CSI -- "Manages" --> File
CSI -- "Manages" --> Object
PVC -- "Can specify" --> SC
PV -- "Managed by" --> CSI
-
Persistent Volumes(PV)์ ๊ด๋ฆฌ์์ ์ํด ํ๋ก๋น์ ๋๋๊ฑฐ๋ ์คํ ๋ฆฌ์ง ํด๋์ค๋ฅผ ์ฌ์ฉํ์ฌ ๋์ ์ผ๋ก ํ๋ก๋น์ ๋๋ ํด๋ฌ์คํฐ ๋ด์ ์ ์ฅ์์ด๋ค.
-
PV๋ ๋ ธ๋์ฒ๋ผ ํด๋ฌ์คํฐ์ ๋ฆฌ์์ค๋ก ์กด์ฌํ๋ฉฐ ์ฌ์ฉ์์ ์ํด ํด๋ ์๋ ์ ์๋ค.
-
์ฃผ์ ํน์ง:
- ํ๋์ ๋ ๋ฆฝ์ ์ธ ์๋ช ์ฃผ๊ธฐ: PV๋ ์ฌ์ฉํ๋ ๊ฐ๋ณ ํ๋์ ์๋ช ์ฃผ๊ธฐ์ ๋ ๋ฆฝ์ ์ด๋ค.
- ์ ์ฅ์ ์ถ์ํ: ์ ์ฅ์ ํ๋ก๋น์ ๋ ๋ฐ ์ฌ์ฉ์ ๋ํ ์ธ๋ถ ์ฌํญ์ ์ถ์ํํ๋ค.
-
๋ค์ํ ์ ๊ทผ ๋ชจ๋ ์ง์:
ReadWriteOnce, ReadOnlyMany, ReadWriteMany๋ฑ์ ๋ชจ๋๋ฅผ ์ง์ํ๋ค.-
ReadWriteOnce: ๋ณผ๋ฅจ์ด ๋จ์ผ ๋ ธ๋์ ์ํด ์ฝ๊ธฐ-์ฐ๊ธฐ๋ก ๋ง์ดํธ๋ ์ ์๋ค. -
ReadOnlyMany: ๋ณผ๋ฅจ์ด ์ฌ๋ฌ ๋ ธ๋์ ์ํด ์ฝ๊ธฐ ์ ์ฉ์ผ๋ก ๋ง์ดํธ๋ ์ ์๋ค. -
ReadWriteMany: ๋ณผ๋ฅจ์ด ์ฌ๋ฌ ๋ ธ๋์ ์ํด ์ฝ๊ธฐ-์ฐ๊ธฐ๋ก ๋ง์ดํธ๋ ์ ์๋ค.
-
-
Persistent Volume Claims(PVC)์ ์ฌ์ฉ์์ ์ ์ฅ์ ์์ฒญ์ด๋ค.
-
ํ๋๊ฐ ๋ ธ๋ ๋ฆฌ์์ค๋ฅผ ์ฌ์ฉํ๋ ๊ฒ๊ณผ ๋ง์ฐฌ๊ฐ์ง๋ก, PVC๋ PV ๋ฆฌ์์ค๋ฅผ ์ฌ์ฉํ๋ค.
-
์ฃผ์ ํน์ง:
- ์ ์ฅ์ ์์ฒญ: ์ฌ์ฉ์๋ ํน์ ํฌ๊ธฐ์ ์ ๊ทผ ๋ชจ๋๋ฅผ ์์ฒญํ๋ค.
- ๋ฐ์ธ๋ฉ: PVC๋ ํด๋ฌ์คํฐ ๋ด์ ์ ํฉํ PV์ ์๋์ผ๋ก ๋ฐ์ธ๋ฉ๋๋ค.
- ํ๋์์์ ์ฌ์ฉ: PVC๋ ํ๋ ๋ด์์ ๋ณผ๋ฅจ์ผ๋ก ์ฌ์ฉ๋๋ฉฐ ์ด๋ฆ์ผ๋ก ์ฐธ์กฐํ๋ค.
-
persistentVolumeReclaimPolicy
- PV์ ์ค์ ๋ ์ด ํ๋๋ ํด๋ ์์์ ํด์ ๋ ํ ๋ณผ๋ฅจ์ ๋ํด ์ํํ ์์ ์ ์ง์ ํ๋ค.
-
์ ์ฑ ์ ๋ค์๊ณผ ๊ฐ๋ค:
- Retain: ๊ธฐ๋ณธ ์ ์ฑ ์ผ๋ก ํด์ ํ ๋ณผ๋ฅจ์ ์ ์งํ๋ฉฐ ๋ฐ์ดํฐ๋ฅผ ๋ณด์กดํ๋ค.
- Delete: ๋์ ์ผ๋ก ํ๋ก๋น์ ๋๋ PV์ ๊ฒฝ์ฐ PVC๊ฐ ์ญ์ ๋ ๋ ๊ธฐ๋ณธ ์ ์ฅ์์์ ๋ณผ๋ฅจ์ ์ญ์ ํ๋ค.
- Recycle: ๋์ ํ๋ก๋น์ ๋์ ์ํด ๊ถ์ฅ๋์ง ์๋๋ค. ์ด ์ ์ฑ ์ ๋ณผ๋ฅจ์ ๋ฐ์ดํฐ๋ฅผ ์คํฌ๋ฌ๋นํ๊ณ ์ ํด๋ ์์ ์ฌ์ฉํ ์ ์๋๋ก ํ๋ ๋ฐ ์ฌ์ฉ๋์๋ค.
- Provisioning(ํ๋ก๋น์ ๋): ์๊ตฌ ๋ณผ๋ฅจ(PV)์ ์คํ ๋ฆฌ์ง ํด๋์ค๋ฅผ ํตํด ๋์ ์ผ๋ก ํ๋ก๋น์ ๋๋๊ฑฐ๋ ๊ด๋ฆฌ์์ ์ํด ์๋์ผ๋ก ์ฌ์ ํ๋ก๋น์ ๋๋ ์ ์๋ค.
- Binding(๋ฐ์ธ๋ฉ): ์ฌ์ฉ์๋ ํน์ ํฌ๊ธฐ ๋ฐ ์ ๊ทผ ๋ชจ๋๋ฅผ ์์ฒญํ๋ ์๊ตฌ ๋ณผ๋ฅจ ํด๋ ์(PVC)์ ์์ฑํ๋ค. PVC๋ ์ฌ์ฉ ๊ฐ๋ฅํ PV์ ๋ฐ์ธ๋ฉ๋๋ค.
- Using(์ฌ์ฉ): ๋ฐ์ธ๋ฉ๋๋ฉด PVC๋ ํ๋์ ์ํด ์ฌ์ฉ๋ ์ ์์ต๋๋ค. ํ๋๋ PVC๋ฅผ ์ฐธ์กฐํ๊ณ ๊ธฐ๋ณธ PV๋ฅผ ๋ณผ๋ฅจ์ผ๋ก ๋ง์ดํธ ํ๋ค.
- Releasing(๋ฆด๋ฆฌ์ค): ์ฌ์ฉ์๊ฐ ๋ณผ๋ฅจ์ ์๋ฃํ๋ฉด PVC๋ฅผ ์ญ์ ํ ์ ์์ต๋๋ค. ํ์ ์ ์ฑ ์ ๋ฐ๋ผ ๊ธฐ๋ณธ PV๊ฐ ๋ค์ ์ฌ์ฉ ๊ฐ๋ฅํด์ง๊ฑฐ๋ ์ญ์ ๋๋ค.
-
Reclaiming(ํ์): Reclaim ์ ์ฑ
์ด
Retain๋ก ์ค์ ๋ ๊ฒฝ์ฐ PVC ์ญ์ ํ PV๋ ํด๋ฌ์คํฐ์ ์ ์ง๋๋ฉฐ,Delete์ธ ๊ฒฝ์ฐ PV ๋ฐ ์ธ๋ถ ์ธํ๋ผ์ ๊ด๋ จ ์คํ ๋ฆฌ์ง ์์ฐ์ด ์ญ์ ๋๋ค.
StorageClass๋ ๊ด๋ฆฌ์๊ฐ ์ ๊ณตํ๋ ์คํ ๋ฆฌ์ง์ "ํด๋์ค"๋ฅผ ์ค๋ช ํ๋ ๋ฐฉ๋ฒ์ ์ ๊ณตํ๋ค.
๊ธฐ๋ณธ ์คํ ๋ฆฌ์ง ํ๋ซํผ์ ์ธ๋ถ์ ๋ณด๋ฅผ ์ถ์ํํ๊ณ PV๋ฅผ ๋์ ์ผ๋ก ํ๋ก๋น์ ๋ํ๋ ํ์คํ๋ ๋ฐฉ๋ฒ์ ์ ๊ณตํ๋ค.
์ฃผ์ ์ธก๋ฉด:
- ํ๋ก๋น์ ๋(Provisioning): ๋์ ๋๋ ์ ์ ์ผ ์ ์์ผ๋ฉฐ ์คํ ๋ฆฌ์ง ํ ๋น ๋ฐฉ๋ฒ์ ์ ์ํ๋ค.
- ๋งค๊ฐ๋ณ์(Parameters): ๊ธฐ๋ณธ ์คํ ๋ฆฌ์ง ์ ๊ณต์์ ๋ฐ๋ผ ๋ค์ํ StorageClass๊ฐ ์๋ก ๋ค๋ฅธ ๋งค๊ฐ๋ณ์๋ฅผ ๊ฐ์ง ์ ์๋ค.
- ๋ฐ์ธ๋ฉ(Binding): PVC๋ StorageClass๋ฅผ ์ง์ ํ ์ ์์ต๋๋ค. ๋์ผํ ํด๋์ค์ PV๋ง PVC์ ๋ฐ์ธ๋ฉ๋ ์ ์๋ค.
์ปจํ ์ด๋ ์คํ ๋ฆฌ์ง ์ธํฐํ์ด์ค(CSI)๋ ์ฟ ๋ฒ๋คํฐ์ค์ ๊ฐ์ ์ปจํ ์ด๋ ์ค์ผ์คํธ๋ ์ด์ ์์คํ (COS)์์ ๋ค์ํ ๋ธ๋ก ๋ฐ ํ์ผ ์คํ ๋ฆฌ์ง ์์คํ ์ ์ปจํ ์ด๋ํ๋ ์ํฌ๋ก๋์ ๋ ธ์ถ์ํค๊ธฐ ์ํ ํ์ค์ด๋ค. CSI์ ๋ชฉํ๋ ์คํ ๋ฆฌ์ง ์๋ฃจ์ ์ ์ํ ์ผ๊ด๋๊ณ ํ์คํ๋ API๋ฅผ ์ ๊ณตํ์ฌ ํด๋ผ์ฐ๋ ๋ค์ดํฐ๋ธ ์ํ๊ณ์์ ์คํ ๋ฆฌ์ง ์ ํ์ ์ฝ๊ฒ ํตํฉํ๊ณ ์ฌ์ฉํ ์ ์๊ฒ ํ๋ ๊ฒ์ด๋ค.
CSI๋ ๋ค์๊ณผ ๊ฐ์ ๋ค์ํ ์ ํ์ ๋ณผ๋ฅจ์ ์ง์ํ๋ค.
- ๋ธ๋ก ์คํ ๋ฆฌ์ง: ๊ธฐ๋ณธ ๋ธ๋ก ์์ค์ ์คํ ๋ฆฌ์ง๋ฅผ ์ ๊ณตํ๋ฉฐ, ์ฑ๋ฅ์ด ์ค์ํ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ฃผ๋ก ์ฌ์ฉ๋๋ค.
- ํ์ผ ์คํ ๋ฆฌ์ง: ๊ณต์ ๋๋ ์ ์ฉ ํ์ผ ์ก์ธ์ค๋ฅผ ์ ๊ณตํ๋ฉฐ, ๊ณต์ ์คํ ๋ฆฌ์ง ์์คํ ์ ์ฃผ๋ก ์ฌ์ฉ๋๋ค.
- ์ค๋ธ์ ํธ ์คํ ๋ฆฌ์ง: ํ๋ฉด ๋ฐ์ดํฐ ๊ตฌ์กฐ๋ฅผ ์ฌ์ฉํ์ฌ ๊ฐ ๊ฐ์ฒด๋ฅผ ๋ณ๋์ ๋ฐ์ดํฐ๋ก ์ ์ฅํ๋ฉฐ, ๋น์ ํ ๋ฐ์ดํฐ์ ์ฃผ๋ก ์ฌ์ฉ๋๋ค.
CSI ๋ณผ๋ฅจ ์ ํ ์ธ์๋ ์ฟ ๋ฒ๋คํฐ์ค ํ๋์์ ์ฌ์ฉํ ์ ์๋ ์ฌ๋ฌ ์ ํ์ ๋ณผ๋ฅจ์ด ์๋ค.
- hostPath: ํธ์คํธ ๋ ธ๋์ ํ์ผ ์์คํ ์์ ํ์ผ ๋๋ ๋๋ ํ ๋ฆฌ๋ฅผ ํ๋ ๋ด๋ถ๋ก ๋ง์ดํธํ๋ค. ํน์ ๋ ธ๋์ ์ข ์์ ์ธ ๋ฐ์ดํฐ ๋๋ ํ ์คํธ์ ์ ํฉํ๋ค.
- emptyDir: ํ๋์ ์๋ช ๊ณผ ๊ณต์ ๋๋ ์์ ๋๋ ํ ๋ฆฌ์ด๋ค. ์์ ์ ์ฅ์ ๋ฐ ๋์ผ ํ๋ ๋ด์ ์ปจํ ์ด๋ ๊ฐ ํ์ผ ๊ณต์ ์ ์ ์ฉํ๋ค.
Kubernetes Auto Scaling์ Kubernetes ํด๋ฌ์คํฐ๊ฐ ์ํฌ๋ก๋์ ๋ฐ๋ผ ์ฉ๋์ ์๋์ผ๋ก ์กฐ์ ํ๋ ๊ธฐ๋ฅ์ ๋งํ๋ค.
ํ๋(Pod)์ ํจ์จ์ ์ผ๋ก ์คํํ ์ ์๋ ์ถฉ๋ถํ ๋ฆฌ์์ค๊ฐ ์๋์ง ํ์ธํ๋ ๋์์ ๋ญ๋น๋ฅผ ๋ฐฉ์งํ๊ธฐ ์ํด ๋ฆฌ์์ค ์ฌ์ฉ์ ์ต์ ํํ๋ ๋ฐ ๋์์ด ๋๋ค.
์ผ๋ฐ์ ์ผ๋ก stateless ์๋ฒ๋ HPA๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ด ์ ํฉํ๋ค. VPA๋ ๋ฆฌ์์ค๋ฅผ ๋ณ๊ฒฝํ๋ ๊ณผ์ ์์ pod์ ์ฌ์์์ด ๋ถ๊ฐํผํ๊ณ , ํ๋์ node๊ฐ ๊ฐ์ง ์ ์๋ ๋ฆฌ์์ค(CPU, ๋ฉ๋ชจ๋ฆฌ)์๋ ํ๊ณ๊ฐ ์๊ธฐ ๋๋ฌธ์ด๋ค.
-
HPA(Horizontal Pod Autoscaler): CPU ์ฌ์ฉ๋ฅ ๋๋ ๋ฉํธ๋ฆญ์ ๊ธฐ๋ฐ์ผ๋ก
Replication Controller, Deployment, Replication set, Statefulset์ Pod ์๋ฅผ ์๋์ผ๋ก ์กฐ์ ํ๋ค. ๋ฉํธ๋ฆญ์ ์ฃผ๊ธฐ์ ์ผ๋ก ํ์ธํ๊ณ ๊ด์ฐฐ๋ ๋ฉํธ๋ฆญ ๊ฐ์ด ์ค์ ๋ ๋ชฉํ์์ ๋ฒ์ด๋๋ ๊ฒฝ์ฐ Replica ์๋ฅผ ์กฐ์ ํ๋ค. Scale out ํ๋ ์คํ ์ค์ผ์ผ๋ฌ ์ด๋ค. - VPA(Vertical Pod Autoscaler): Pod์ CPU ๋ฐ ๋ฉ๋ชจ๋ฆฌ ์์ฝ์ ์๋์ผ๋ก ์กฐ์ ํ์ฌ ๋ฆฌ์์ค ํจ์จ์ฑ์ ๋ณด์ฅํ๋ค. request ๋ฆฌ์์ค ์ฌ์ฉ ๊ธฐ๋ก์ ๊ธฐ๋ฐ์ผ๋ก ์ปจํ ์ด๋์ ๊ฐ์ ์ ๋ฐ์ดํธํ์ฌ ๊ฐ ํ๋๊ฐ ํจ๊ณผ์ ์ผ๋ก ์คํํ๊ธฐ์ ์ถฉ๋ถํ ๋ฆฌ์์ค๋ง ๊ฐ๋๋ก ํ๋ค. ๋ณ๊ฒฝ ์ฌํญ์ ๊ถ์ฅํ๊ฑฐ๋ ์ด๋ฌํ ๋ณ๊ฒฝ ์ฌํญ์ ์๋์ผ๋ก ์ ์ฉํ๋๋ก ๊ตฌ์ฑํ ์ ์๋ค. Scale up ํ๋ ์คํ ์ค์ผ์ผ๋ฌ ์ด๋ค.
- CA(Cluster Autoscaler): Kubernetes ํด๋ฌ์คํฐ ์์ฒด์ ํฌ๊ธฐ๋ฅผ ์๋์ผ๋ก ์กฐ์ ํ๋ค. ๋ฆฌ์์ค๊ฐ ๋ถ์กฑํ์ฌ ์คํ์ ์คํจํ ํด๋ฌ์คํฐ์ ํ๋๊ฐ ์๋ ๊ฒฝ์ฐ ๋ ๋ง์ ๋ ธ๋๋ฅผ ์ถ๊ฐํ ์ ์๋ค. ๋ ธ๋ ์ฌ์ฉ๋ฅ ์ด ๋ฎ๊ณ ํด๋น ํ๋๊ฐ ๋ค๋ฅธ ๋ ธ๋์์ ์์ฝ๋ ์ ์๋ ๊ฒฝ์ฐ ์ด๋ฌํ ๋ ธ๋๋ฅผ ์ ๊ฑฐํ ์ ์๋ค.
์ค์ผ์ผ์ (์์ง ์ค์ผ์ผ๋ง)๊ณผ ์ค์ผ์ผ์์(์ํ ์ค์ผ์ผ๋ง)์ ๋ ํฐ ๋ถํ๋ ์์๋ฅผ ์ฒ๋ฆฌํ๊ธฐ ์ํด ์์คํ ์ฉ๋์ ์ฆ๊ฐ์ํค๊ธฐ ์ํ ์ปดํจํ ์ ๋ต์ด๋ค.
์ค์ผ์ผ์ ์ ๊ธฐ์กด ์๋ฒ์ CPU๋ ๋ฉ๋ชจ๋ฆฌ์ ๊ฐ์ ๋ฆฌ์์ค๋ฅผ ๋ ๋ง์ด ์ถ๊ฐํจ์ผ๋ก์จ ๊ธฐ์กด ํ๋์จ์ด๋ ์ํํธ์จ์ด์ ์ฉ๋์ ์ฆ๊ฐ์ํค๋ ๊ฒ์ ํฌํจํ๋ค. ๋ฐ๋ฉด ์ค์ผ์ผ์์์ ์์คํ ์ ๋ ๋ง์ ๋ ธ๋๋ ์ธ์คํด์ค๋ฅผ ์ถ๊ฐํ์ฌ ์ฌ๋ฌ ์๋ฒ๋ ์ธ์คํด์ค์ ๊ฑธ์ณ ๋ถํ๋ฅผ ํจ๊ณผ์ ์ผ๋ก ๋ถ์ฐ์ํค๋ ๊ฒ์ ํฌํจํ๋ค.
์ค์ผ์ผ์
์ ๊ฐ๋ณ ๊ตฌ์ฑ ์์๋ฅผ ๋ ๊ฐ๋ ฅํ๊ฒ ๋ง๋๋ ๋ฐ ์ด์ ์ ๋ง์ถ์ง๋ง ์ค์ผ์ผ์์์ ๋ ํฐ ์ธํ๋ผ์ ์ํฌ๋ก๋๋ฅผ ๋ถ์ฐ์ํค๋ ๊ฒ์ ๊ฐ์กฐํ๋ค. ํด๋ผ์ฐ๋ ์ปดํจํ
๊ณผ ๋ฐ์ดํฐ ์ผํฐ ๊ด๋ฆฌ์์ ํนํ ์ค์ํ ๊ฐ๋
์ด๋ค.

- Image Reference : https://tecoble.techcourse.co.kr/post/2021-10-12-scale-up-scale-out/
Kubernetes ํ๋ก๋ธ๋ Kubernetes ํด๋ฌ์คํฐ ๋ด์ Pod ์ํ๋ฅผ ๊ด๋ฆฌํ๊ณ ๋ณด์ฅํ๋ ๋ฐ ์ค์ํ ๊ตฌ์ฑ ์์์ด๋ค. ์ด๋ฅผ ํตํด Kubernetes๋ ์คํ ์ค์ธ ์ปจํ ์ด๋์ ๋ํด ์ ๊ธฐ์ ์ธ ๊ฒ์ฌ๋ฅผ ์ํํ์ฌ ์ํ๋ฅผ ํ์ธํ๊ณ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ํ์ ๋ฐ๋ผ ์ ์ ํ ์กฐ์น๋ฅผ ์ทจํ ์ ์๋ค.
Kubernetes๊ฐ ์ฌ์ฉํ๋ ์ธ ๊ฐ์ง ์ฃผ์ ํ๋ก๋ธ ์ ํ์ด ์๋ค.
- Liveness Probes: Liveness Probe๋ ์ปจํ ์ด๋๊ฐ ์ ๋๋ก ์คํ๋๊ณ ์๋์ง ํ์ธํ๋ค. Liveness Probes๊ฐ ์คํจํ๋ฉด Kubernetes๋ ํ๋์ ๋ค์ ์์ ์ ์ฑ ์ ๋ฐ๋ผ ์ปจํ ์ด๋๋ฅผ ์ข ๋ฃํ๊ณ ์ ์ปจํ ์ด๋๋ฅผ ์์ํ๋ค. ์ ํ๋ฆฌ์ผ์ด์ ์ด ์คํ ์ค์ด์ง๋ง ์งํํ ์ ์๋ ์ํฉ(e.g., a deadlock)์ ํฌ์ฐฉํ๊ณ ์ฒ๋ฆฌํ๋ ๋ฐ ์ฌ์ฉ๋๋ค.
- Readiness Probes: Readiness Probe๋ ์ปจํ ์ด๋๊ฐ ํธ๋ํฝ ์์ ์ ์์ํ ์ค๋น๊ฐ ๋์๋์ง ํ์ธํ๋ค. Readiness Probes์ ์คํจํ ์ปจํ ์ด๋๋ Kubernetes Service๋ก๋ถํฐ ํธ๋ํฝ์ ์์ ํ์ง ์๋๋ค. ์ด๋ ํธ๋ํฝ์ ์ค์ ๋ก ์ฒ๋ฆฌํ ์ค๋น๊ฐ ๋ ํ๋์๋ง ํธ๋ํฝ์ด ์ ์ก๋๋๋ก ํ๋ ๋ฐ ์ค์ํ๋ฉฐ, ์ด๋ ์์ ์ค์ด๋ ๋ฒ์ ์ ๊ทธ๋ ์ด๋ ํ์ ํนํ ์ ์ฉํ๋ค.
- Startup Probes: Startup Probe๋ ์ปจํ ์ด๋ ์ ํ๋ฆฌ์ผ์ด์ ์ด ์์๋ ์๊ธฐ๋ฅผ ํ์ธํ๋ ๋ฐ ์ฌ์ฉ๋ฉ๋๋ค. ํ๋๋ฅผ ์์ํ๋ ๋ฐ ์ค๋ ์๊ฐ์ด ๊ฑธ๋ฆฌ๋ ๊ฒฝ์ฐ(์: ๊ธด ์ด๊ธฐํ ํ๋ก์ธ์ค๋ก ์ธํด) ์์ ํ๋ก๋ธ๋ฅผ ์ฌ์ฉํ์ฌ ํ๋๊ฐ ์์ ๋จ๊ณ์์ ํ์ฑ ํ๋ก๋ธ์ ์ํด ์ข ๋ฃ๋๋ ๊ฒ์ ๋ฐฉ์งํ ์ ์๋ค. Startup Probe๊ฐ ์ฒ์์ผ๋ก ์ฑ๊ณตํ๋ฉด ์์ฒด์ ์ผ๋ก ๋นํ์ฑํ๋๊ณ Liveness Probe๊ฐ ํ์ ๊ฒ์ฌ๋ฅผ ๋์ ํ๋ค.
Probe๋ ํ๋ ์ฌ์์์ ๊ตฌ์ฑ๋ ์ ์๋ค.
๊ฐ Probe ์ ํ์ ๊ฒ์ฌ๋ฅผ ์ํํ๋ ์ฌ๋ฌ ๊ฐ์ง ๋ฐฉ๋ฒ์ ์ง์ํ๋ค.
- HTTP GET: Kubernetes๋ ์ปจํ ์ด๋์ ๋ํด HTTP GET ์์ฒญ์ ์ํํ๋ค. 200~399 ๋ฒ์ ๋ด์ ์๋ต ์ฝ๋๋ ์ฑ๊ณต์ ๋ํ๋ธ๋ค. ๊ธฐํ ์๋ต ์ฝ๋ ๋๋ ์ ํ ์๊ฐ ๋ด์ ์ฐ๊ฒฐ์ ์คํจํ๋ฉด ์คํจ๋ก ์ฒ๋ฆฌ๋๋ค.
- TCP Socket: Kubernetes๋ ์ปจํ ์ด๋์ ๋ํ TCP ์์ผ์ ์ด๋ ค๊ณ ์๋ํ๋ค. ์ฑ๊ณต์ ์ฐ๊ฒฐ ์ค์ ๊ธฐ๋ฅ์ผ๋ก ํ์๋๊ณ , ์คํจ๋ ์ ํ ์๊ฐ ๋ด์ ์์ผ์ ์ด ์ ์๋ ๊ฒ์ผ๋ก ํ์๋๋ค.
- exec: Kubernetes๋ ์ปจํ ์ด๋ ๋ด๋ถ์์ ๋ช ๋ น์ ์คํํ๋ค. ์ฑ๊ณต์ ๋ฐํ ์ฝ๋ 0์ผ๋ก ํ์๋๊ณ ๋ค๋ฅธ ๋ฐํ ์ฝ๋๋ ์คํจ๋ฅผ ๋ํ๋ธ๋ค.
Kubernetes ํ๋ก๋ธ๋ ํ๋ ์ฌ์(์ผ๋ฐ์ ์ผ๋ก .spec.containers[] ํ๋ ์๋)์์ ๊ตฌ์ฑ๋๋ค. Pod์ YAML ํ์ผ ๋ด์์ ๊ฐ ํ๋ก๋ธ ์ ํ์ ๊ตฌ์ฑํ๋ ๋ฐฉ๋ฒ์ ์ดํด๋ณด๊ณ ์ด๋ฌํ ํ๋ก๋ธ๊ฐ ์๋ํ๋ ์์์ ๋ํด ์์๋ณธ๋ค.
apiVersion: v1
kind: Pod
metadata:
name: my-application
spec:
containers:
- name: my-container
image: my-image
ports:
- containerPort: 8080
livenessProbe:
httpGet:
path: /healthz
port: 8080
initialDelaySeconds: 15
timeoutSeconds: 2
periodSeconds: 5
failureThreshold: 3
readinessProbe:
httpGet:
path: /ready
port: 8080
initialDelaySeconds: 5
timeoutSeconds: 1
periodSeconds: 5
failureThreshold: 1
startupProbe:
exec:
command:
- cat
- /app/initialized
initialDelaySeconds: 5
periodSeconds: 5
failureThreshold: 30- 1. Startup Probe: Pod๊ฐ ์์๋๋ฉด Startup Probe๋ ์ ์๋ ์กฐ๊ฑด์ ํ์ธํ๊ธฐ ์์ํ๋ค. Startup Probe๊ฐ ์ฑ๊ณตํ ๋๊น์ง ํ์ฑ ๋ฐ ์ค๋น ํ๋ก๋ธ๋ ๋นํ์ฑํ๋๋ค. ๊ตฌ์ฑ๋ ์ ํ ์๊ฐ ๋ฐ ์คํจ ์๊ณ๊ฐ ๋ด์ Startup Probe๊ฐ ์ฑ๊ณตํ์ง ๋ชปํ๋ฉด ์ปจํ ์ด๋๊ฐ ์ข ๋ฃ๋๊ณ ํ๋์ ๋ค์ ์์ ์ ์ฑ ์ ๋ฐ๋ผ ๋ค์ ์์ฝ๋๋ค.
- 2. Readiness Probe: Startup Probe๊ฐ ์ฑ๊ณตํ๋ฉด Readiness Probe๊ฐ ์์๋๋ค. Readiness Probe๋ ์ปจํ ์ด๋๊ฐ ์์ฒญ์ ๋ฐ์ ์ค๋น๊ฐ ๋์๋์ง ํ์ธํ๋ค. ์คํจํ๋ฉด Readiness ํ์ธ์ ํต๊ณผํ ๋๊น์ง ์ปจํ ์ด๋๊ฐ ์๋น์ค์ ๋ก๋ ๋ฐธ๋ฐ์์์ ์ ๊ฑฐ๋๋ค.
- 3. Liveness Probe: Readiness Probe์ ํจ๊ป Liveness Probe๋ ์ปจํ ์ด๋๊ฐ ์์๋๋ก ๊ณ์ ์คํ๋๊ณ ์๋์ง ํ์ธํ๋ค. Liveness Probe๊ฐ ์คํจํ๋ฉด(์ด๊ธฐ ์ง์ฐ ์ดํ ๋ฐ ์คํจ ์๊ณ๊ฐ ๋ด์์) ์ปจํ ์ด๋๊ฐ ๋ค์ ์์๋๋ค.
์ฟ ๋ฒ๋คํฐ์ค์์๋ ๋ค์๊ณผ ๊ฐ์ ์ฌ๋ฌ ๋ฉ์ปค๋์ฆ์ ํตํด ํด๋ฌ์คํฐ ๋ด์์ ํ๋๊ฐ ๋ฐฐํฌ๋๋ ์์น๋ฅผ ์ ์ดํ ์ ์๋ค.
- ๋ ธ๋ ์ ๋ ํฐ(NodeSelector)
- ์ดํผ๋ํฐ(Affinity)
- ํ ์ธํธ & ํจ๋ฌ๋ ์ด์ (Taints & Toleration)
- ์ปค๋ (Cordon)
- ๋๋ ์ธ(Drain)
- ์ฟ ๋ฒ๋คํฐ์ค์์ ๊ฐ์ฅ ๊ฐ๋จํ ์ค์ผ์ค๋ง ์ ์ฝ ์กฐ๊ฑด์ด๋ค.
- ํค-๊ฐ ์์ ์ฌ์ฉํ์ฌ ๋ ธ๋๋ฅผ ์ ํํ๋ค.
- ์์ :
apiVersion: v1 kind: Pod metadata: name: nginx spec: containers: - name: nginx image: nginx nodeSelector: disktype: ssd
-
๋ ธ๋ ์ ๋ ํฐ๋ณด๋ค ๊ณ ๊ธ์ด๋ฉฐ, ํน์ ํ๋ ๋ฐฐ์น์ ๋ํ ๊ท์น์ ์ค์ ํ๋ค.
-
์ฃผ์ ์ ํ: ๋ ธ๋ ์ดํผ๋ํฐ(Node Affinity) ๋ฐ ํ๋ ์ดํผ๋ํฐ(Pod Affinity).
-
๋ ธ๋ ์ดํผ๋ํฐ:
-
requiredDuringSchedulingIgnoredDuringExecution๋๋preferredDuringSchedulingIgnoredDuringExecution์ผ๋ก ์ค์ ํ ์ ์๋ค. - ์์ :
apiVersion: v1 kind: Pod metadata: name: nginx spec: affinity: nodeAffinity: requiredDuringSchedulingIgnoredDuringExecution: nodeSelectorTerms: - matchExpressions: - key: disktype operator: In values: - ssd containers: - name: nginx image: nginx
-
requiredDuringSchedulingIgnoredDuringExecution
- ํ๋๊ฐ ์ค์ผ์ค๋ง๋ ๋ ๋ฐ๋์ ์ถฉ์กฑํด์ผ ํ๋ ์๊ตฌ์ฌํญ์ ์ ์ํ๋ค. ๊ท์น์ ๋ง์กฑํ๋ ๋ ธ๋์๋ง ํ๋๊ฐ ์ค์ผ์ค๋ ์ ์๋ค.
- ํน์ ๋ ธ๋์ ํ๋๋ฅผ ๋ฐฐ์นํด์ผ ํ ๋ ์ฌ์ฉํ๋ค. ์๋ฅผ ๋ค์ด, ํน์ ๋ผ๋ฒจ์ด ์๋ ๋ ธ๋์๋ง ํ๋๋ฅผ ๋ฐฐ์นํ๊ณ ์ถ์ ๊ฒฝ์ฐ ์ด ๊ท์น์ ์ฌ์ฉํ ์ ์๋ค.
- ๋ง์ฝ ์ด ๊ท์น์ ๋ง์กฑํ๋ ๋ ธ๋๊ฐ ์๋ค๋ฉด, ํ๋๋ ์ค์ผ์ค๋์ง ์๋๋ค.
-
preferredDuringSchedulingIgnoredDuringExecution
- ์ค์ผ์ค๋ฌ์๊ฒ ํ๋๊ฐ ์ค์ผ์ค๋ง๋ ๋ ์ ํธ๋๋(ํ์ง๋ง ํ์๋ ์๋) ์๊ตฌ์ฌํญ์ ์๋ฆฐ๋ค. ์ค์ผ์ค๋ฌ๋ ์ด ๊ท์น์ ๊ฐ๋ฅํ ํ ์ถฉ์กฑ์ํค๋ ค๊ณ ์๋ํ์ง๋ง, ๊ท์น์ ๋ง์กฑํ๋ ๋ ธ๋๊ฐ ์์ด๋ ํ๋๋ ๋ค๋ฅธ ๋ ธ๋์ ์ค์ผ์ค๋ ์ ์๋ค.
- ํ๋์ ๋ฐฐ์น์ ๋ ์ ์ฐ์ฑ์ ์ ๊ณตํ๊ณ ์ ํ ๋ ์ฌ์ฉํ๋ค. ์๋ฅผ ๋ค์ด, ํน์ ๋ ธ๋์ ํ๋๋ฅผ ์ ํธ์ ์ผ๋ก ๋ฐฐ์นํ๊ณ ์ถ์ง๋ง, ๊ทธ๋ฌํ ๋ ธ๋๊ฐ ์๊ฑฐ๋ ์ฌ์ฉํ ์ ์๋ ๊ฒฝ์ฐ ๋ค๋ฅธ ๋ ธ๋์๋ ๋ฐฐ์น๋ ์ ์๋๋ก ํ๊ณ ์ถ์ ๋ ์ฌ์ฉํ ์ ์๋ค.
- ์ด ๊ท์น์ ๋ง์กฑํ๋ ๋ ธ๋๊ฐ ์์ผ๋ฉด ๊ทธ ๋ ธ๋์ ํ๋๊ฐ ์ฐ์ ์ ์ผ๋ก ์ค์ผ์ค๋์ง๋ง, ๋ง์กฑํ๋ ๋ ธ๋๊ฐ ์์ด๋ ํ๋๋ ์ค์ผ์ค๋ ์ ์๋ค.
- ์์ฝํ์๋ฉด,
requiredDuringSchedulingIgnoredDuringExecution์ ํ๋์ ์ค์ผ์ค๋ง์ ์์ด์ ๋ฐ๋์ ์ถฉ์กฑํด์ผ ํ๋ ์๊ฒฉํ ์๊ตฌ์ฌํญ์ ์ ์ํ๋ ๋ฐ๋ฉด,preferredDuringSchedulingIgnoredDuringExecution์ ์ ํธ๋๋ ์กฐ๊ฑด์ ์ ์ํ์ง๋ง, ์ด ์กฐ๊ฑด์ด ์ถฉ์กฑ๋์ง ์๋๋ผ๋ ํ๋๊ฐ ์ค์ผ์ค๋ ์ ์๋๋ก ์ ์ฐ์ฑ์ ์ ๊ณตํ๋ค.
-
-
๋ ธ๋ ์ํฐ-์ดํผ๋ํฐ:
- ํน์ ๋ ธ๋์ ์์ฑ์ด๋ ๋ผ๋ฒจ์ ๊ธฐ๋ฐ์ผ๋ก ํ์ฌ ํ๋๋ฅผ ํด๋น ๋ ธ๋๋ก๋ถํฐ ๋ฉ๋ฆฌ ๋ฐฐ์นํ๊ณ ์ ํ ๋ ์ฌ์ฉํ๋ค.
- ๋ ธ๋ ์ํฐ-์ดํผ๋ํฐ๋ ๋ ธ๋ ์ดํผ๋ํฐ์ ์ ์ฌํ๊ฒ ์๋ํ์ง๋ง, ๋ฐ๋์ ๋ชฉ์ ์ ๊ฐ์ง๊ณ ์๋ค.
- ์์ : ์ด ์์ ์์
requiredDuringSchedulingIgnoredDuringExecution์ disktype์ด hdd๊ฐ ์๋ ๋ ธ๋์ ํ๋๋ฅผ ๋ฐฐ์นํ๋๋ก ์๊ตฌํ๋ค. ์ฆ, SSD ๋๋ ๋ค๋ฅธ ์ ํ์ ๋์คํฌ๋ฅผ ์ฌ์ฉํ๋ ๋ ธ๋์๋ง ํ๋๊ฐ ๋ฐฐ์น๋ ์ ์๋ค. ๋ํ,preferredDuringSchedulingIgnoredDuringExecution์ค์ ์ cpu๊ฐ high๊ฐ ์๋ ๋ ธ๋๋ฅผ ์ ํธํ์ง๋ง, ์ด๋ ํ์ ์กฐ๊ฑด์ด ์๋ค. weight๋ ์ด ์ ํธ๋์ ์ค์์ฑ์ ๋ํ๋ธ๋ค.
apiVersion: v1 kind: Pod metadata: name: mypod spec: affinity: nodeAffinity: requiredDuringSchedulingIgnoredDuringExecution: nodeSelectorTerms: - matchExpressions: - key: disktype operator: NotIn values: - hdd preferredDuringSchedulingIgnoredDuringExecution: - weight: 1 preference: matchExpressions: - key: cpu operator: NotIn values: - high containers: - name: mycontainer image: myimage
-
ํ๋ ์ดํผ๋ํฐ:
- ๋ค๋ฅธ ํ๋์ ๋ ์ด๋ธ์ ๊ธฐ์ค์ผ๋ก ๊ท์น์ ์ค์ ํ๋ ๋ฐ ์ฌ์ฉ๋๋ค.
- ์ญ์ ํ๋ ์ดํผ๋ํฐ์ ์ํํธ ์ดํผ๋ํฐ ๊ท์น์ ์ ์ํ ์ ์๋ค.
- ๋ค๋ฅธ ํ๋์ ๊ฐ๊น๊ฒ ๋ฐฐ์น๋๊ธฐ๋ฅผ ์ํ ๋ ์ฌ์ฉํ๋ค.
- ์์ :
requiredDuringSchedulingIgnoredDuringExecution์์ ์์, mypod๋app=database๋ ์ด๋ธ์ ๊ฐ์ง ๋ค๋ฅธ ํ๋์ ๊ฐ์ ํธ์คํธ(kubernetes.io/hostname)์ ๋ฐฐ์น๋์ด์ผ ํ๋ค.
apiVersion: v1 kind: Pod metadata: name: mypod spec: affinity: podAffinity: requiredDuringSchedulingIgnoredDuringExecution: - labelSelector: matchExpressions: - key: app operator: In values: - database topologyKey: "kubernetes.io/hostname" containers: - name: mycontainer image: myimage
-
ํ๋ ์ํฐ-์ดํผ๋ํฐ:
- ํ๋๋ฅผ ํน์ ๋ ์ด๋ธ์ ๊ฐ์ง ๋ค๋ฅธ ํ๋๋ก๋ถํฐ ๋ฉ๋ฆฌ ๋ฐฐ์นํ๊ณ ์ ํ ๋ ์ฌ์ฉํ๋ค.
- ์์ :
requiredDuringSchedulingIgnoredDuringExecution์์ ์์, mypod๋app=webserver๋ ์ด๋ธ์ ๊ฐ์ง ๋ค๋ฅธ ํ๋์๋ ๋ค๋ฅธ ํธ์คํธ(kubernetes.io/hostname)์ ๋ฐฐ์น๋์ด์ผ ํ๋ค.
apiVersion: v1 kind: Pod metadata: name: mypod spec: affinity: podAntiAffinity: requiredDuringSchedulingIgnoredDuringExecution: - labelSelector: matchExpressions: - key: app operator: In values: - webserver topologyKey: "kubernetes.io/hostname" containers: - name: mycontainer image: myimage
-
ํ ์ธํธ & ํจ๋ฌ๋ ์ด์ (Taints & Toleration):
- ํ ์ธํธ๋ ํน์ ๋ ธ๋์ ์ ์ฉ๋์ด ํจ๋ฌ๋ ์ด์ ์ ๊ฐ์ง ์๋ ํ๋๋ฅผ ๊ฑฐ๋ถํ๋ค.
- ํจ๋ฌ๋ ์ด์ ์ ํ ์ธํธ๊ฐ ์ ์ฉ๋ ๋ ธ๋์ ์ค์ผ์ค๋ง๋ ์ ์๋๋ก ํ๋์ ์ค์ ํ๋ค.
- ํ
์ธํธ ์ ์ฉ ์์ :
kubectl taint nodes ๋ ธ๋์ด๋ฆ ํค=๊ฐ:ํจ๊ณผ - ํจ๋ฌ๋ ์ด์
์ค์ ์์ :
tolerations: - key: "key" operator: "Equal" value: "value" effect: "NoSchedule"
-
์ปค๋ (Cordon):
- ํน์ ๋ ธ๋๋ฅผ ์ค์ผ์ค ๋ถ๊ฐ๋ฅ ์ํ๋ก ํ์ํ์ฌ ์๋ก์ด ํ๋๊ฐ ํด๋น ๋ ธ๋์ ์ค์ผ์ค๋์ง ์๋๋ก ํ๋ ๋ฐ ์ฌ์ฉ๋๋ค.
- ์์ ๋ช
๋ น์ด:
kubectl cordon ๋ ธ๋์ด๋ฆ
-
๋๋ ์ธ(Drain):
- ๋ ธ๋์์ ๋ชจ๋ ํ๋๋ฅผ ์ถ๋ฐฉํ์ฌ ์ ์ง๋ณด์ ๋๋ ๋ ธ๋ ํ๊ธฐ๋ฅผ ์ํด ์ฌ์ฉ๋๋ค.
- PodDisruptionBudgets๋ฅผ ์กด์คํ๋ฉฐ
--ignore-daemonsets=true์ต์ ์ด ์ฌ์ฉ๋์ง ์๋ ํ DaemonSet์ผ๋ก ๊ด๋ฆฌ๋๋ ํ๋๋ ์ ๊ฑฐํ์ง ์๋๋ค. - ์์ ๋ช
๋ น์ด:
kubectl drain ๋ ธ๋์ด๋ฆ
์ฟ ๋ฒ๋คํฐ์ค๋ ์ปจํ ์ด๋ ๊ธฐ๋ฐ์ ์ ํ๋ฆฌ์ผ์ด์ ๋ฐ ์๋น์ค๋ฅผ ๊ด๋ฆฌํ๊ธฐ ์ํ ์คํ ์์ค ํ๋ซํผ์ด๋ค.
- API ์๋ฒ ๋ณด์: API ์๋ฒ๋ ์ฟ ๋ฒ๋คํฐ์ค ํด๋ฌ์คํฐ์ ํต์ฌ์ด๋ฉฐ, ์ ์ ํ ์ธ์ฆ, ์น์ธ ๋ฐ ์ธ๊ฐ๋ฅผ ํตํด ๋ณดํธ๋์ด์ผ ํ๋ค.
- ๋ ธ๋ ๋ณด์: ๋ ธ๋๋ ํด๋ฌ์คํฐ์ ์ผ๋ถ์ด๋ฉฐ, ์ด๋ค์ ๋ํ ์ ๊ทผ์ ์๊ฒฉํ๊ฒ ํต์ ๋์ด์ผ ํ๋ค.
- ๋คํธ์ํฌ ์ ์ฑ : ํ๋ ๊ฐ์ ํต์ ์ ์ ์ดํ๊ธฐ ์ํ ๋คํธ์ํฌ ์ ์ฑ ์ ๊ตฌํํด์ผ ํ๋ค.
- ์ด๋ฏธ์ง ๋ณด์: ์์ ํ์ง ์์ ์ปจํ ์ด๋ ์ด๋ฏธ์ง๋ ์ทจ์ฝ์ ์ ํฌํจํ ์ ์์ผ๋ฏ๋ก, ์ด๋ฏธ์ง ์ค์บ๋ ๋ฐ ์๋ช ์ ํตํด ๋ณด์์ ์ ์งํด์ผ ํ๋ค.
- ์ปจํ ์ด๋ ๊ฒฉ๋ฆฌ: ๊ฐ ์ปจํ ์ด๋๋ ๊ฒฉ๋ฆฌ๋์ด์ผ ํ๋ฉฐ, ๋ฆฌ์์ค ์ ํ์ ํตํด ๋ค๋ฅธ ์ปจํ ์ด๋ ๋ฐ ์๋น์ค์ ์ํฅ์ ๋ฏธ์น์ง ์๋๋ก ํด์ผ ํ๋ค.
- ๋ณด์ ์ปจํ ์คํธ: ์ปจํ ์ด๋์ ๊ถํ๊ณผ ๋ฅ๋ ฅ์ ์ ์ดํ๊ธฐ ์ํด ๋ณด์ ์ปจํ ์คํธ๋ฅผ ์ฌ์ฉํ ์ ์๋ค.
์ ๊ทผ์ ์ด๋ K8S(API ์ ๊ทผ) ์ธ์ฆ/์ธ๊ฐ๋ก ๊ตฌ๋ถ๋๋ค.
- X.509 Client Certs: kubeconfig ์ CA crt(๋ฐ๊ธ ๊ธฐ๊ด ์ธ์ฆ์) , Client crt(ํด๋ผ์ด์ธํธ ์ธ์ฆ์) , Client key(ํด๋ผ์ด์ธํธ ๊ฐ์ธํค) ๋ฅผ ํตํด ์ธ์ฆ
- kubectl: ์ฌ๋ฌ ํด๋ฌ์คํฐ(kubeconfig)๋ฅผ ๊ด๋ฆฌ ๊ฐ๋ฅ - contexts ์ ํด๋ฌ์คํฐ์ ์ ์ ๋ฐ ์ธ์ฆ์/ํค ์ฐธ๊ณ
- Service Account: ๊ธฐ๋ณธ ์๋น์ค ์ด์นด์ดํธ(default) - ์ํฌ๋ฆฟ(CA crt ์ token)
- ์ธ๊ฐ ๋ฐฉ์ : RBAC(Role, RoleBinding), ABAC, Webhook, Node Authorization
-
RBAC : ์ญํ ๊ธฐ๋ฐ์ ๊ถํ ๊ด๋ฆฌ, ์ฌ์ฉ์์ ์ญํ ์ ๋ณ๊ฐ๋ก ์ ์ธ ํ ๋๊ฐ์ง๋ฅผ ์กฐํฉ(binding)ํด์ ์ฌ์ฉ์์๊ฒ ๊ถํ์ ๋ถ์ฌํ์ฌ kubectl or API๋ก ๊ด๋ฆฌ ๊ฐ๋ฅ
- Namespace/Cluster - Role/ClusterRole, RoleBinding/ClusterRoleBinding, Service Account
- Role(๋กค) - (RoleBinding ๋กค ๋ฐ์ธ๋ฉ) - Service Account(์๋น์ค ์ด์นด์ดํธ) : ๋กค ๋ฐ์ธ๋ฉ์ ๋กค๊ณผ ์๋น์ค ์ด์นด์ดํธ๋ฅผ ์ฐ๊ฒฐ
- Role(๋ค์์คํ์ด์ค๋ด ์์์ ๊ถํ) vs ClusterRole(ํด๋ฌ์คํฐ ์์ค์ ์์์ ๊ถํ)
- ๊ฐ์ฌ ๋ก๊ทธ: ๋ณด์ ์ฌ๊ณ ์กฐ์ฌ๋ฅผ ์ํด ์ค์ํ ํ๋์ ๊ฐ์ฌ ๋ก๊ทธ์ ๊ธฐ๋กํด์ผ ํ๋ค.
- ๋ก๊น : ์์คํ ๋ฐ ์ ํ๋ฆฌ์ผ์ด์ ๋ก๊ทธ๋ ๋ณด์ ์ฌ๊ณ ๋์ ๋ฐ ๋ฌธ์ ํด๊ฒฐ์ ํ์์ ์ธ ์ ๋ณด๋ฅผ ์ ๊ณตํ๋ค.
์ด ์์์๋ Network Policy ์ ์ฉํ๋ ๋ฐฉ๋ฒ์ ๋ณด์ฌ์ค๋ค.
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: example-network-policy
namespace: default
spec:
podSelector:
matchLabels:
role: db
policyTypes:
- Ingress
ingress:
- from:
- podSelector:
matchLabels:
role: frontend
ports:
- protocol: TCP
port: 3306- ํด๋น ์ ์ฑ ์ ํ๋ฐํธ์๋ ํ๋(role: frontend)๋ง TCP ํฌํธ 3306์์ ์ก์ธ์คํ ์ ์๋๋ก ๋ฐ์ดํฐ๋ฒ ์ด์ค ํ๋(role: db)๋ก ๋ค์ด์ค๋ ํธ๋ํฝ์ ์ ํํ๋ค.
์ด ์์์๋ ํน์ ๋ค์์คํ์ด์ค์ Pod์ ์ฝ๊ธฐ ์ ์ฉ ์ก์ธ์ค ๊ถํ์ ๋ถ์ฌํ๋ ์ญํ ์ ์์ฑํ๋ ๋ฐฉ๋ฒ์ ๋ณด์ฌ์ค๋ค.
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
namespace: default
name: pod-reader
rules:
- apiGroups: [""]
resources: ["pods"]
verbs: ["get", "watch", "list"]
---
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
name: read-pods
namespace: default
subjects:
- kind: User
name: "example-user"
apiGroup: rbac.authorization.k8s.io
roleRef:
kind: Role
name: pod-reader
apiGroup: rbac.authorization.k8s.io์ด ์์์๋ ์ปจํ ์ด๋๊ฐ ๋ฃจํธ๋ก ์คํ๋์ง ์๋๋ก ๊ฐ์ ํ๋ ํ๋ ๋ณด์ ์ ์ฑ ์ ๋ณด์ฌ์ค๋ค.
apiVersion: policy/v1beta1
kind: PodSecurityPolicy
metadata:
name: non-root-psp
spec:
privileged: false
allowPrivilegeEscalation: false
requiredDropCapabilities:
- ALL
runAsUser:
rule: MustRunAsNonRoot
seLinux:
rule: RunAsAny
supplementalGroups:
rule: RunAsAny
fsGroup:
rule: RunAsAny
volumes:
- "*"Kubernetes ์ํ๊ณ์์ Operator๋ Kubernetes ์ ํ๋ฆฌ์ผ์ด์
์ ํจํค์ง, ๋ฐฐํฌ, ๊ด๋ฆฌํ๋ ๋ฐฉ๋ฒ์ด๋ค. Kubernetes ์ ํ๋ฆฌ์ผ์ด์
์ Kubernetes์ ๋ฐฐํฌ๋๊ณ Kubernetes API ๋ฐ kubectl ๋๊ตฌ๋ฅผ ์ฌ์ฉํ์ฌ ๊ด๋ฆฌ๋๋ค. Operator๋ ํด๋ฌ์คํฐ ์ํ๋ฅผ ๊ฐ์ํ ๋ค์ ํ์ํ ๊ฒฝ์ฐ ๋ณ๊ฒฝ์ ์ํํ๊ฑฐ๋ ์์ฒญํ๋ ๋ฃจํ์ธ ์ปจํธ๋กค๋ฌ์ Kubernetes ์์น์ ๋ฐ๋ฅธ๋ค. Operator๋ Kubernetes๋ฅผ ํ์ฅํ์ฌ ํน์ ์ ํ๋ฆฌ์ผ์ด์
์ ์ ์ฒด ์๋ช
์ฃผ๊ธฐ ๊ด๋ฆฌ๋ฅผ ์๋ํํ๋ค.
Operator๋ ๋ณธ์ง์ ์ผ๋ก ๋๋ฉ์ธ๋ณ ์ง์์ด ๋ด์ฅ๋ ๋ง์ถคํ ์ปจํธ๋กค๋ฌ์ด๋ค. ํน์ ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ฐฐํฌ, ์ ๊ทธ๋ ์ด๋, ๊ตฌ์ฑ, ๋ณต๊ตฌ ๋ฐ ํ์ฅํ๋ ๋ฐฉ๋ฒ์ ์๊ณ ์๋ค. Operator ํจํด์ ์ํํธ์จ์ด์์ ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ด๋ฆฌํ๊ณ , ์ผ๋ฐ์ ์ธ ์์ ์ ์๋ํํ๊ณ , Kubernetes ๊ธฐ๋ฐ ์ ํ๋ฆฌ์ผ์ด์ ๊ด๋ฆฌ ๋ฐฉ๋ฒ์ ์ ๊ณตํ๋ ๋ฐฉ๋ฒ์ ๋ํ ์ด์ ์ง์์ ํฌ์ฐฉํ๋ ๊ฒ์ ๋ชฉํ๋ก ํ๋ค.
Operator๋ ์ฌ์ฉ์ ์ ์ ๋ฆฌ์์ค ์ธํธ(Custom Resource)์ ํด๋น ๋ฆฌ์์ค์ ๋ํ ์ฌ์ฉ์ ์ ์ ์ปจํธ๋กค๋ฌ(Custom Controllers)๋ก ๊ตฌํ๋๋ค. ์ฌ์ฉ์ ์ ์ ๋ฆฌ์์ค๋ ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ตฌ์ฑ ์คํค๋ง ์ญํ ์ ํ๋ฉฐ ์ปจํธ๋กค๋ฌ๋ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ํ๊ฐ ์ฌ์ฉ์ ์ ์ ๋ฆฌ์์ค์ ์ค๋ช ๋ ์ํ๋ ์ํ์ ์ผ์นํ๋๋ก ์๋ํ๋ค.
- ์ฌ์ฉ์ ์ ์ ๋ฆฌ์์ค(Custom Resource): ์๋ก์ด ๋ฆฌ์์ค ์ ํ ์์ฑ์ ํ์ฉํ๋๋ก Kubernetes API๋ฅผ ํ์ฅํ๋ค. ์ฌ์ฉ์ ์ ์ ๋ฆฌ์์ค๋ ์ํ๋ ์ ํ๋ฆฌ์ผ์ด์ ์ํ๋ฅผ ์ ์ํ๋ค.
- ์ฌ์ฉ์ ์ ์ ์ปจํธ๋กค๋ฌ(Custom Controllers): ์ฌ์ฉ์ ์ ์ ๋ฆฌ์์ค๋ฅผ ๊ด์ฐฐํ๊ณ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ค์ ์ํ๊ฐ ์ฌ์ฉ์ ์ ์ ๋ฆฌ์์ค์ ์ ์๋ ์ํ๋ ์ํ์ ๋ค๋ฅด๋ค๋ ๊ฒ์ ๊ฐ์งํ๋ฉด ์ฐจ์ด์ ์ ์กฐ์ ํ๊ธฐ ์ํ ์กฐ์น๋ฅผ ์ทจํ๋ค.
Operator๋ ์ ํ๋ฆฌ์ผ์ด์
์ ๊ด๋ฆฌํ๊ธฐ ์ํด Kubernetes์ control loop ๊ฐ๋
์ ์ฌ์ฉํ๋ค. ์ ํ๋ฆฌ์ผ์ด์
์ ์ํ๋ฅผ ์ง์์ ์ผ๋ก ๋ชจ๋ํฐ๋งํ๊ณ ์ํ๋ ์ํ์์ ๋ถ์ผ์น๋ฅผ ์์ ํ๊ธฐ ์ํด ์ ํ๋ฆฌ์ผ์ด์
๋ณ ์กฐ์น๋ฅผ ์ทจํ๋ค.
- ์ ํ๋ฆฌ์ผ์ด์ ๋ฐฐํฌ ๋ฐ ์ ์ฌ์ ์ธ ์ง์ ์๋น์ค ์๋ ๋ฐฐํฌ
- ๋ณต์กํ ์ํ ์ ์ฅ ์ ํ๋ฆฌ์ผ์ด์ ์ ํฌํจํ์ฌ ์ ๊ทธ๋ ์ด๋ ๋ฐ ๋ค์ด๊ทธ๋ ์ด๋๋ฅผ ์ํํ๊ฒ ์ฒ๋ฆฌ
- ์ ํ๋ฆฌ์ผ์ด์ ๊ตฌ์ฑ ๋ฐ ๋น๋ฐ ๊ด๋ฆฌ
- ๋ก๋ ๋๋ ๊ธฐํ ์งํ๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ์๋ ํ์ฅ
- ์ค๋ฅ ๋ณต๊ตฌ, ๋น์ ์ ์ธ์คํด์ค ์๋ ๊ต์ฒด ๋๋ ์ฌ๊ตฌ์ฑ
- ๋ฐฑ์ ๋ฐ ๋ณต์
์คํผ๋ ์ดํฐ๋ฅผ ๊ฐ๋ฐํ๊ธฐ ์ํ ํ๋ ์์ํฌ ๋ฐ ๋๊ตฌ๋ค์ด ์๋ค.
- ์คํผ๋ ์ดํฐ SDK(Operator SDK): ์คํผ๋ ์ดํฐ์ ๊ฐ๋ฐ, ํ ์คํธ, ํจํค์ง์ ๋์์ค๋ค.
- ์คํผ๋ ์ดํฐ ์๋ช ์ฃผ๊ธฐ ๊ด๋ฆฌ์(Operator Lifecycle Manager) (OLM): ์ฟ ๋ฒ๋คํฐ์ค ํด๋ฌ์คํฐ ์์ ์คํผ๋ ์ดํฐ๋ค์ ๊ด๋ฆฌํ๋ฉฐ, ์คํผ๋ ์ดํฐ์ ์ค์น, ์ ๋ฐ์ดํธ ๋ฐ ์๋ช ์ฃผ๊ธฐ ๊ด๋ฆฌ๋ฅผ ๋ด๋นํ๋ค.
- ์คํผ๋ ์ดํฐ ๋ฏธํฐ๋ง(Operator Metering): ์คํผ๋ ์ดํฐ๊ฐ ์ฌ์ฉํ๋ ์์์ ๋ํ ๋ณด๊ณ ๋ฅผ ์ํ ๊ฒ์ด๋ค.
๋จผ์ ๊ฐ๋จํ๊ฒ User Account์ Service Account์ ๋ํด ์ค๋ช ํด๋ณด์๋ฉด, ์ฌ์ฉ์ ์ด์นด์ดํธ๋ ์ฌ๋์ ์ํ ๊ฒ์ด๋ค. ์๋น์ค ์ด์นด์ดํธ๋ ํ๋์์ ์คํ๋๋ ํ๋ก์ธ์ค๋ฅผ ์ํ ๊ฒ์ด๋ค.
Kubernetes Service Account๋ ์ฟ ๋ฒ๋คํฐ์ค ํด๋ฌ์คํฐ ๋ด์์ ์คํ๋๋ ํ(Pod)์ด API ์๋ฒ์ ์ํธ ์์ฉํ ์ ์๋๋ก ๊ถํ์ ๋ถ์ฌํ๋ ๋ฐ ์ฌ์ฉ๋๋ ์๊ฒฉ์ฆ๋ช ์ด๋ค. ์๋น์ค ์ด์นด์ดํธ๋ ํน์ ๋ค์์คํ์ด์ค(namespace)์ ์ํ๋ฉฐ, ์๋์ผ๋ก ์์ฑ๋๊ฑฐ๋ ์ฌ์ฉ์๊ฐ ์ง์ ์์ฑํ ์ ์๋ค. ๊ทธ๋ฆฌ๊ณ ๋ค์์คํ์ด์ค ์์ฑ์ ๋ํดํธ ์๋น์ค ์ด์นด์ดํธ๊ฐ ์์ฑ๋๋ค.
์ฃผ์
- ์ฟ ๋ฒ๋คํฐ์ค 1.24 ๋ฒ์ ์ด์ ์๋ ์๋น์ค ๊ณ์ ์ด ์ต์ด ์์ฑ๋ ๋ ์๋์ผ๋ก ์๋น์ค ๊ณ์ ํ ํฐ์ด ์์ฑ๋์์ต๋๋ค.
- ์ฟ ๋ฒ๋คํฐ์ค 1.24 ๋ฒ์ ์ดํ, ๋ณด์ ๊ฐํ๋ฅผ ์ํด ์๋น์ค ๊ณ์ ์ด ์์ฑ๋์ด๋ ์๋น์ค ๊ณ์ ํ ํฐ์ด ์์ฑ๋์ง ์์ต๋๋ค.
-
ServiceAccount admission ์ปจํธ๋กค๋ฌ: ServiceAccount admission ์ปจํธ๋กค๋ฌ๋ default Service account๋ฅผ ์ง์ ํ์ง ์์ Pod์ ํ ๋นํ๋ ์ญํ ์ ํ๋ค.
api-server์ ํฌํจ๋๋ค. -
ServiceAccount Token ์ปจํธ๋กค๋ฌ: Token ์ปจํธ๋กค๋ฌ๋ ํด๋ฌ์คํฐ์ ๊ฐ ServiceAccount์ ๋ํ ํ ํฐ ์์ฑ ๋ฐ ๊ด๋ฆฌ๋ฅผ ๋ด๋นํ๋ค.
controller-manager์ ํฌํจ๋๋ค. -
ServiceAccount ์ปจํธ๋กค๋ฌ: ServiceAccount ์ปจํธ๋กค๋ฌ๋ ServiceAccount ๋ฐ ๊ด๋ จ Secret ์์ฑ ๋ฐ ์ญ์ ๋ฅผ ๊ด๋ฆฌํ๋ค.
controller-manager์ ํฌํจ๋๋ค.
- Token: ํ ํฐ์ ์๋น์ค ๊ณ์ ์ ๋์ ํ์ฌ Kubernetes API ์๋ฒ์ ๋ํ ์์ฒญ์ ์ธ์ฆํ๋ ๋ฐ ์ฌ์ฉํ ์ ์๋ JWT(JSON ์น ํ ํฐ)์ด๋ค. ์ด ํ ํฐ์ Kubernetes API ์๋ฒ์ ๊ฐ์ธ ํค๋ก ์๋ช ๋๋ฉฐ ํด๋น ๊ณต๊ฐ ํค(ca.crt์ ์๋)๋ฅผ ์ฌ์ฉํ์ฌ ํ์ธํ ์ ์๋ค. ํ ํฐ์๋ ํด๋น ์ด๋ฆ ๋ฐ ์ํ ๋ค์์คํ์ด์ค์ ๊ฐ์ ์๋น์ค ๊ณ์ ์ ๋ํ ์ ๋ณด๊ฐ ํฌํจ๋๋ค.
- ca.crt: ca.crt ํ์ผ์๋ Kubernetes ํด๋ฌ์คํฐ์ ๋ํ ์ธ์ฆ ๊ธฐ๊ด(CA) ์ธ์ฆ์๊ฐ ํฌํจ๋์ด ์๋ค. ์์ฒญ์ ํ ๋ ํด๋ผ์ด์ธํธ์ API ์๋ฒ ๊ฐ์ ์ ๋ขฐ๋ฅผ ์ค์ ํ๋ ๋ฐ ์ฌ์ฉ๋๋ค.ํด๋ผ์ด์ธํธ๋ ์ด CA ์ธ์ฆ์๋ฅผ ์ฌ์ฉํ์ฌ API ์๋ฒ์ ์ธ์ฆ์๊ฐ ์ ํจํ๊ณ ๋์ผํ CA์์ ์๋ช ํ๋์ง ํ์ธํ ์ ์๋ค. ์ด๋ ๊ฒ ํ๋ฉด ํด๋ผ์ด์ธํธ๊ฐ ์ ์์ ์ธ ํ์์๊ฐ ์๋ ์ธ์ฆ๋ API ์๋ฒ์ ํต์ ํ๊ณ ์๋์ง ํ์ธํ ์ ์๋ค.
- Namespace: ๋ค์์คํ์ด์ค๋ Kubernetes์ ๋ค์ค ํ ๋ํธ ์ํคํ ์ฒ์ ํต์ฌ ๊ตฌ์ฑ ์์์ด๋ค. ๋ค์์คํ์ด์ค๋ ํด๋ฌ์คํฐ ๋ด์ ๋ฆฌ์์ค๋ฅผ ๋ ผ๋ฆฌ์ ์ผ๋ก ๋ถ๋ฆฌํ๋ ๋ฐ ์ฌ์ฉ๋๋ฏ๋ก ์ฌ๋ฌ ํ์ด๋ ํ๋ก์ ํธ๊ฐ ์๋ก ๊ฐ์ญํ์ง ์๊ณ ๋์ผํ ํด๋ฌ์คํฐ๋ฅผ ๊ณต์ ํ ์ ์๋ค.
Kubernetes ์ฌ์ฉ์ ์ ์ ๋ฆฌ์์ค ์ ์(CRD)๋ ์ฌ์ฉ์ ์ ์ ๋ฆฌ์์ค๋ก Kubernetes ๊ธฐ๋ฅ์ ํ์ฅํ ์ ์๋ ๊ฐ๋ ฅํ ๊ธฐ๋ฅ์ด๋ค. CRD๋ฅผ ์ฌ์ฉํ๋ฉด ํ๋, ๋ฐฐํฌ ๋๋ ์๋น์ค์ ๊ฐ์ ํ์ค Kubernetes ๋ฆฌ์์ค๊ฐ ์ฒ๋ฆฌ๋๋ ๋ฐฉ์๊ณผ ์ ์ฌํ ๋ฐฉ์์ผ๋ก Kubernetes ํด๋ฌ์คํฐ ๋ด์ ๊ณ ์ ํ ํน์ ๋ฆฌ์์ค๋ฅผ ์์ฑํ ์ ์๋ค. ์ด๋ Kubernetes ํ๋ซํผ์ ๊ธฐ๋ฐ์ผ๋ก ๋ง์ถคํ ์ ํ๋ฆฌ์ผ์ด์ ์ด๋ ํตํฉ์ ๊ฐ๋ฐํ๋ ๋ฐ ๋งค์ฐ ์ ์ฉํ ์ ์๋ค.
์ฌ์ฉ์ ์ ์ ๋ฆฌ์์ค๋ ๊ธฐ๋ณธ Kubernetes ์ค์น์์ ๋ฐ๋์ ์ฌ์ฉํ ์ ์๋ ๊ฒ์ ์๋ Kubernetes API์ ํ์ฅ์ด๋ค. ์ด๋ ๊ธฐ๋ณธ์ ์ผ๋ก ์ ๊ณต๋๋ ๋ฆฌ์์ค ์ธ์ ์๋ก์ด ๋ฆฌ์์ค๋ฅผ ์ถ๊ฐํ์ฌ ์๊ตฌ ์ฌํญ์ ๋ง๊ฒ Kubernetes๋ฅผ ์ฌ์ฉ์ ์ ์ํ๋ ๋ฐฉ๋ฒ์ด๋ค.
- ํ์ฅ์ฑ(Extensibility): kubectl ๋ฐ ๊ธฐํ Kubernetes API ํด๋ผ์ด์ธํธ์ ํจ๊ป ์ฌ์ฉํ ์ ์๋ ์์ฒด API๋ก Kubernetes๋ฅผ ํ์ฅํ ์ ์๋ค.
- ์ ์ฐ์ฑ(Flexibility): ๊ธฐ๋ณธ Kubernetes ๋ฆฌ์์ค์ฒ๋ผ ์๋ํ๋ ์ ๋ฆฌ์์ค๋ฅผ ์ ์ํ ์ ์๋ค.
- ํตํฉ(Integration): CRD๋ ์ฌ์ฉ์ ์ง์ ๋ฆฌ์์ค๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ์ ํ๋ฆฌ์ผ์ด์ ๊ณผ ํด๋น ๊ตฌ์ฑ ์์๋ฅผ ๊ด๋ฆฌํ๋ ์ฌ์ฉ์ ์ง์ ์ปจํธ๋กค๋ฌ์ธ ์ฐ์ฐ์๋ฅผ ๊ตฌ์ถํ๋ ๋ฐ ์ ์ฉํ๋ค.
CRD๋ฅผ ๊ตฌํํ๋ ค๋ฉด ๋ค๋ฅธ Kubernetes ๋ฆฌ์์ค์ ๋ง์ฐฌ๊ฐ์ง๋ก YAML์ ์ฌ์ฉํ์ฌ ์ ์ํ๋ค. ์ด ์ ์๋ ์๋ก์ด ์ข ๋ฅ์ ๋ฆฌ์์ค, ํด๋น ์ด๋ฆ ๋ฐ ์คํค๋ง๋ฅผ ์ง์ ํฉ๋๋ค. ์คํค๋ง๋ CRD(์ฌ์ฉ์ ์ง์ ๋ฆฌ์์ค๋ผ๊ณ ๋ ํจ) ์ธ์คํด์ค ๊ตฌ์ฑ์ ์ ํจ์ฑ์ ๊ฒ์ฌํ๋ ๋ฐ ์ฌ์ฉ๋๋ค.
CRD ์ ์์ ๊ธฐ๋ณธ ๊ตฌ์กฐ๋ ๋ค์๊ณผ ๊ฐ๋ค.
apiVersion: apiextensions.k8s.io/v1
kind: CustomResourceDefinition
metadata:
# Name of the CRD
name: crdtype.mycompany.com
spec:
# Group name to which the CRD belongs
group: mycompany.com
# List of versions
versions:
- name: v1
served: true
storage: true
schema:
openAPIV3Schema:
type: object
properties:
spec:
type: object
properties:
myField:
type: string
# Scope of the CRD (Namespaced or Cluster)
scope: Namespaced
names:
# Plural name used in the URL
plural: crdtypes
# Singular name used as an alias
singular: crdtype
# Kind is the serialized kind of the resource
kind: CrdType
# ShortNames allow shorter string to match your resource on kubectl
shortNames:
- ctํด๋ฌ์คํฐ์์ CRD๋ฅผ ์ ์ํ๊ณ ์ ์ฉํ ํ์๋ Kubernetes์ ๋ค๋ฅธ ๋ฆฌ์์ค์ ๋ง์ฐฌ๊ฐ์ง๋ก ํด๋น ์ธ์คํด์ค๋ฅผ ์์ฑํ๊ณ ๊ด๋ฆฌํ ์ ์๋ค.
๋ค์์ ์ฌ์ฉ์ ์ ์ ๋ฆฌ์์ค์ ๊ธฐ๋ณธ ์์ด๋ค.
apiVersion: mycompany.com/v1
kind: CrdType
metadata:
name: example-crdtype
spec:
myField: "Hello, world!"- ์ผ๋ฐ์ ์ผ๋ก CRD๋ CRD ์์ฒด์ ์ฌ์ฉ์ ์ ์ ์ปจํธ๋กค๋ฌ๋ก ๊ตฌ์ฑ๋ ์ฐ์ฐ์์ ์ผ๋ถ์ด๋ค. ์ปจํธ๋กค๋ฌ๋ ์ฌ์ฉ์ ์ง์ ๋ฆฌ์์ค์ ๊ด๋ จ๋ ์ด๋ฒคํธ๋ฅผ ๊ฐ์ํ๊ณ ์ด์ ๋ฐ๋ผ ๋ฆฌ์์ค๋ฅผ ์์ฑ, ์ ๋ฐ์ดํธ, ์ญ์ ๋๋ ์กฐ์ ํ์ฌ ๋ฐ์ํ๋ค.
- ๋ฒ์ ๊ด๋ฆฌ(Versioning): ๊ธฐ์กด ๋ฆฌ์์ค์ ์ง์ฅ์ ์ฃผ์ง ์๋๋ก CRD์ ๋ฒ์ ์ ์ ์คํ๊ฒ ๊ด๋ฆฌํ๊ณ ์ ๊ทธ๋ ์ด๋ ๋ฐ ์ง์ ์ค๋จ์ ์ ์คํ๊ฒ ์ฒ๋ฆฌํ๋ ๊ฒ์ด ์ค์ํ๋ค.
- ๊ฒ์ฆ(Validation): CRD ์ ์์ OpenAPI ์คํค๋ง ์ฌ์์ ์ฌ์ฉํ์ฌ ์ฌ์ฉ์ ์ง์ ๋ฆฌ์์ค๋ฅผ ๊ฒ์ฆํ๊ณ Kubernetes API์ ์ ์ฅ๋๊ธฐ ์ ์ ๊ธฐ๋์น๋ฅผ ์ถฉ์กฑํ๋์ง ํ์ธํ๋ค.
- ์ฑ๋ฅ(Performance): ํนํ ๋๊ท๋ชจ ํด๋ฌ์คํฐ์์ ์ฌ์ฉ์ ์ง์ ์ปจํธ๋กค๋ฌ๊ฐ ์ฑ๋ฅ์ ๋ฏธ์น๋ ์ํฅ์ ์ฃผ์ํ๋ค.
Kubernetes GC(Garbage Collection)๋ ์ฃผ๋ก ํ๋, ์ปจํ ์ด๋, ์ด๋ฏธ์ง ๋ฐ ๊ธฐํ Kubernetes ๋ฆฌ์์ค์ ๊ฐ์ด ์ฌ์ฉ๋์ง ์๋ ๊ฐ์ฒด๋ฅผ ์ ๊ฑฐํ๋ ๋ฐ ์ค์ ์ ๋๊ณ ๋ฆฌ์์ค ์ ๋ฆฌ๋ฅผ ์๋์ผ๋ก ๊ด๋ฆฌํ๋ ์์คํ ์ด๋ค. Kubernetes์๋ 3๊ฐ์ง ์ฃผ์ ์ ํ์ Garbage Collection์ด ์๋ค.
- Garbage Collection of Pods and Controllers
- Container Image Garbage Collection
- Resource Finalizers
flowchart TB
api["API Server"] -- "Receives Updates and Watches" --> ct["Controller"]
ct -- "Manages Resources" --> rs["ReplicaSet, Deployments, etc."]
rs -- "Owns" --> pods["Pods"]
ct -- "Detects Deletions & Updates" --> gc["Garbage Collector"]
gc -- "Removes Orphans" --> pods
kubelet["Kubelet"] -- "Manages Pod Lifecycle" --> node["Node"]
kubelet -- "Performs Image GC" --> img["Container Images"]
Kubernetes์์ Graceful Shutdown(์์ ํ ์ข ๋ฃ)์ ์ค์ ํ๋ ์ต์ ๊ณผ SIGTERM, SIGKILL ์ ํธ๋ ์ปจํ ์ด๋๊ฐ ์ข ๋ฃ๋ ํ ์์ ๊ด๋ฆฌ ๋ฐ ๋ฐ์ดํฐ ์์ค์ ๋ฐฉ์งํ๋ ๋ฐ ์ค์ํ ์ญํ ์ ํ๋ค. ๊ฐ๊ฐ์ ๊ฐ๋ ์ ์ค๋ช ํ๋ฉด ๋ค์๊ณผ ๊ฐ๋ค.
- terminationGracePeriodSeconds
- Prestop
- SIGTERM
- SIGKILL
Pod๊ฐ ์ข ๋ฃ๋ ๋ Kubernetes๊ฐ ํด๋น Pod์ SIGTERM ์ ํธ๋ฅผ ๋ณด๋ด๊ณ , ์ค์ ๋ก Pod๋ฅผ ๊ฐ์ ๋ก ์ข ๋ฃ(SIGKILL)ํ๊ธฐ๊น์ง ๊ธฐ๋ค๋ฆฌ๋ ์ ์ ์๊ฐ(Grace Period) ์ ์ค์ ํ๋ ์ต์ ์ด๋ค. ์ฆ, SIGTERM์ ๋ฐ์ ์ปจํ ์ด๋๊ฐ ์ ์์ ์ผ๋ก ์ข ๋ฃ๋๋๋ก ์ ์ ์๊ฐ์ ์ฃผ๋ ๊ฒ์ด๋ค.
- ๊ธฐ๋ณธ๊ฐ์ 30์ด ์ด๋ฉฐ, ์ด ์๊ฐ ๋์ ์ปจํ ์ด๋๊ฐ ์ข ๋ฃ๋์ง ์์ผ๋ฉด Kubernetes๋ ๊ฐ์ ๋ก SIGKILL์ ๋ณด๋ด ์ปจํ ์ด๋๋ฅผ ์ข ๋ฃํ๋ค.
- ์ด ์ค์ ์ ํตํด ์๋น์ค๊ฐ ์์ฒญ ์ค๋จ ์์ด ์์ ํ๊ฒ ์ ๋ฆฌ ์์ (์: ์ฐ๊ฒฐ ๋ซ๊ธฐ, ์ํ ์ ์ฅ)์ ํ ์ ์๋ค.
spec:
terminationGracePeriodSeconds: 60 # Pod๊ฐ SIGKILL์ ๋ฐ๊ธฐ ์ ์ 60์ด์ ์ ์ ์๊ฐ์ ์คpreStop์ Pod๊ฐ ์ข ๋ฃ๋ ๋ ์คํํ ๋ช ๋ น์ด ๋๋ ์คํฌ๋ฆฝํธ๋ฅผ ์ง์ ํ ์ ์๋ Kubernetes์ Lifecycle Hook์ด๋ค. Pod๊ฐ SIGTERM ์ ํธ๋ฅผ ๋ฐ์ ๋ ์ด preStop ํ ์ด ๋จผ์ ์คํ๋๊ณ , ์ค์ ๋ ๋์์ด ๋๋ ํ ์ปจํ ์ด๋๊ฐ ์ข ๋ฃ๋๊ธฐ ์์ํ๋ค.
- ์ด ํ ์ ์ฌ์ฉํด ์ข ๋ฃ ์ ์ ํน์ ์์ ์ ์คํํ ์ ์๋ค. ์๋ฅผ ๋ค์ด, ์ธ๋ถ ์๋น์ค์ ์ฐ๊ฒฐ ์ข ๋ฃ๋ฅผ ์๋ฆฌ๊ฑฐ๋ ๋ก๊ทธ๋ฅผ ์ ๋ฆฌํ ์ ์๋ค.
- preStop์ SIGTERM ์ ํธ๊ฐ ์ ๋ฌ๋๊ธฐ ์ ์ ์คํ๋๋ฉฐ, ์คํ์ด ์๋ฃ๋ ํ ์ปจํ ์ด๋๊ฐ Graceful Shutdown์ ์งํํ๋ค.
lifecycle:
preStop:
exec:
command: ["/bin/sh", "-c", "sleep 10"] # ์ปจํ
์ด๋ ์ข
๋ฃ ์ 10์ด ๋๊ธฐ- preStop ํ ์ ์ฌ์ฉํด ์ปจํ ์ด๋ ์ข ๋ฃ ์ ์ 10์ด ๋๊ธฐํ๋๋ก ํ๊ณ , ์ดํ์ SIGTERM์ด ๋ฐ์ํ ํ terminationGracePeriodSeconds ๋์ ์ ๋ฆฌ ์์ ์ ํ ์ ์๋ค.
- SIGTERM์ ์ปจํ ์ด๋ ๋๋ ํ๋ก์ธ์ค์ ์ ์์ ์ธ ์ข ๋ฃ ์์ฒญ์ ๋ณด๋ด๋ ์ ํธ์ด๋ค.
- Graceful Shutdown์ ์ง์ํ๋ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ด ์ ํธ๋ฅผ ๋ฐ์ ์ฒ๋ฆฌํด์ผ ํ๋ฉฐ, ์ด๋ฅผ ํตํด ์ด๋ ค ์๋ ์ฐ๊ฒฐ์ ์ ๋ฆฌํ๊ฑฐ๋ ํ์ฌ ์์ ์ ์๋ฃํ๋ ๋ฑ์ ์์ ์ ํ ์ ์๋ค.
- Kubernetes์์๋ Pod๊ฐ ์ข ๋ฃ๋ ๋ ๊ธฐ๋ณธ์ ์ผ๋ก SIGTERM์ ๋จผ์ ๋ณด๋ธ๋ค. ์ด ์ ํธ๋ฅผ ๋ฐ์ผ๋ฉด ์ ํ๋ฆฌ์ผ์ด์ ์ ์ข ๋ฃ๋ฅผ ์ํ ์ ๋ฆฌ ์์ ์ ์งํํ ์ ์๋ค.
- SIGKILL์ ๊ฐ์ ์ข ๋ฃ ์ ํธ๋ก, ํ๋ก์ธ์ค๋ ์ปจํ ์ด๋๋ฅผ ์ฆ์ ์ข ๋ฃ์ํจ๋ค.
- ์ด ์ ํธ๋ ๊ฐ์ ์ ์ผ๋ก ํ๋ก์ธ์ค๋ฅผ ์ค๋จ์ํค๋ฏ๋ก ์ ๋ฆฌ ์์ ์ ํ ์ ์๋ค. ์ด๋ ๋ฐ์ดํฐ ์์ค์ด๋ ์ฐ๊ฒฐ ๋๊น์ ์ ๋ฐํ ์ ์๋ค.
- Kubernetes์์๋ ์ปจํ ์ด๋๊ฐ terminationGracePeriodSeconds ๋์ ์ข ๋ฃ๋์ง ์์ผ๋ฉด SIGKILL์ ๋ณด๋ด ๊ฐ์ ๋ก ์ข ๋ฃ์ํจ๋ค.
- Pod ์ข ๋ฃ ์์ฒญ์ด ๋ฐ์ํ๋ฉด Kubernetes๋ ๋จผ์ ํด๋น Pod์ SIGTERM ์ ํธ๋ฅผ ๋ณด๋ธ๋ค.
- preStop ํ ์ด ์๋ ๊ฒฝ์ฐ, ํ ์ด ์คํ๋๋ฉฐ ์ ํ๋ฆฌ์ผ์ด์ ์ SIGTERM ์ ํธ๊ฐ ์ฒ๋ธ๋ ์ค๋น๋ฅผ ํ๋ค.
- ์ ํ๋ฆฌ์ผ์ด์ ์ terminationGracePeriodSeconds ๋ด์ SIGTERM ์ ํธ๋ฅผ ์ฒ๋ฆฌํ๊ณ , ์ ๋ฆฌ ์์ ์ ์ํํ๋ค.
- terminationGracePeriodSeconds ๋ด์ ์ปจํ ์ด๋๊ฐ ์ข ๋ฃ๋์ง ์์ผ๋ฉด Kubernetes๋ SIGKILL์ ๋ณด๋ด ์ปจํ ์ด๋๋ฅผ ๊ฐ์ ๋ก ์ข ๋ฃํ๋ค.
graph LR
A[Pod termination request] --> B[SIGTERM sent to Pod]
B --> C{preStop hook defined?}
C -- Yes --> D[Execute preStop hook]
D --> E[SIGTERM signal handled by application]
C -- No --> E
E --> F[Graceful shutdown within terminationGracePeriodSeconds]
F -->|Success| G[Pod terminates cleanly]
F -->|Timeout| H[SIGKILL sent to force termination]
Kubernetes์์ imagePullPolicy ๋ ์ปจํ
์ด๋ ๋ ์ง์คํธ๋ฆฌ์์ ์ปจํ
์ด๋ ์ด๋ฏธ์ง๋ฅผ ๊ฐ์ ธ์ค๋ ๋ฐฉ๋ฒ๊ณผ ์๊ธฐ๋ฅผ ์ ์ดํ๋ โโ์ค์ ์ด๋ค. ์ด๋ Pod ์ฌ์์ ๊ฐ ์ปจํ
์ด๋์ ๋ํด ๊ตฌ์ฑ๋๋ฉฐ Kubernetes๊ฐ ๋ ์ง์คํธ๋ฆฌ์์ ์ด๋ฏธ์ง๋ฅผ ๊ฐ์ ธ์์ผ ํ๋์ง ์๋๋ฉด ๋ก์ปฌ๋ก ์บ์๋ ๋ฒ์ ์ ์ฌ์ฉํด์ผ ํ๋์ง ๊ฒฐ์ ํ๋ค. ์ธ ๊ฐ์ง ์ฃผ์ imagePullPolicy ๊ฐ์ด ์๋ค.
- Always
- IfNotPresent
- Never
- Kubernetes๋ Pod๊ฐ ์์ฑ๋ ๋๋ง๋ค ์ด๋ฏธ์ง๊ฐ ์ด๋ฏธ ๋ ธ๋์ ์๋ ๊ฒฝ์ฐ์๋ ํญ์ ๋ ์ง์คํธ๋ฆฌ์์ ์ด๋ฏธ์ง๋ฅผ ๊ฐ์ ธ์จ๋ค.
- ์ด๋ ์ด๋ฏธ์ง ํ๊ทธ๋ฅผ ๋ณ๊ฒฝํ์ง ์๊ณ ์ปจํ ์ด๋ ๋ ์ง์คํธ๋ฆฌ์์ ์ด๋ฏธ์ง๋ฅผ ์์ฃผ ์ ๋ฐ์ดํธํ๋ ๊ฒฝ์ฐ์ ์ ์ฉํ๋ค(์: ์ง์์ ์ธ ๋ฐฐํฌ๋ฅผ ์ํด 'latest' ํ๊ทธ ๋๋ 'fixed tag'๋ฅผ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ).
- Kubernetes๋ ์ด๋ฏธ์ง๊ฐ ๋ ธ๋์ ์์ง ์๋ ๊ฒฝ์ฐ์๋ง ๋ ์ง์คํธ๋ฆฌ์์ ์ด๋ฏธ์ง๋ฅผ ๊ฐ์ ธ์จ๋ค. ์ด๋ฏธ์ง๊ฐ ๋ก์ปฌ ์บ์์ ์์ผ๋ฉด ์ด๋ฏธ์ง๋ฅผ ๋ค์ ๊ฐ์ ธ์ค์ง ์๋๋ค์จ
- ํน์ ์ด๋ฏธ์ง ํ๊ทธ(latest ์ ์ธ)๊ฐ ์ฌ์ฉ๋๋ ๊ฒฝ์ฐ ๊ธฐ๋ณธ ์ ์ฑ ์ด๋ค. ๋์ผํ ์ด๋ฏธ์ง๊ฐ ๋ ธ๋์์ ์ด๋ฏธ ์ฌ์ฉ ๊ฐ๋ฅํ ๊ฒฝ์ฐ ์ด๋ฏธ์ง๋ฅผ ๊ฐ์ ธ์ค๋ ๋ฐ ํ์ํ ์๊ฐ๊ณผ ๋์ญํญ์ ์ค์ด๋ ๋ฐ ๋์์ด ๋๋ค.
- Kubernetes๋ ๋ ์ง์คํธ๋ฆฌ์์ ์ด๋ฏธ์ง๋ฅผ ๊ฐ์ ธ์ค์ง ์์ผ๋ฉฐ ์ด๋ฏธ์ง๊ฐ ๋ ธ๋์ ์ด๋ฏธ ์กด์ฌํ ๊ฒ์ผ๋ก ์์ํ๋ค.
- ์ด๋ ๋ ธ๋์ ์ปจํ ์ด๋ ์ด๋ฏธ์ง๋ฅผ ์๋์ผ๋ก ๋ฏธ๋ฆฌ ๋ก๋ํ๋ ํ๊ฒฝ์ด๋ ์ธ๋ถ ์์ค์์ ์ด๋ฏธ์ง๋ฅผ ๊ฐ์ ธ์ค๋ ๊ฒ์ ๋ฐฉ์งํ๋ ค๋ ๊ฒฝ์ฐ์ ์ ์ฉํ๋ค.
- ์ต์ ํ๊ทธ ์ฌ์ฉ: ์ต์ ํ๊ทธ๋ฅผ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ Kubernetes๋ ๊ธฐ๋ณธ์ ์ผ๋ก ์ด๋ฏธ์ง ํ์ ์ฑ
์
Always์ผ๋ก ์ค์ ํ๋ค. - ๋ค๋ฅธ ํ๊ทธ ํฌํจ: ์ต์ ํ๊ทธ๊ฐ ์๋ ํ๊ทธ๋ฅผ ์ง์ ํ๋ฉด Kubernetes๋ ๊ธฐ๋ณธ์ ์ผ๋ก
IfNotPresent๋ก ์ค์ ๋๋ค.
Kubernetes์์ ๋ฐฐํฌ ์ ๋ต(deployment strategies) ์ ์๋ก์ด ์ ํ๋ฆฌ์ผ์ด์ ๋ฒ์ ๋๋ ์ปจํ ์ด๋ ์ด๋ฏธ์ง๋ฅผ ๋ฐฐํฌํ ๋, Pod(๋๋ Pod ์งํฉ)๋ฅผ ์ด๋ป๊ฒ ์ ๋ฐ์ดํธํ ์ง ์ ์ํฉ๋๋ค. ์ฃผ์ ๋ฐฐํฌ ์ ๋ต์ ๋ ๊ฐ์ง์ด๋ค.
- RollingUpdate (๊ธฐ๋ณธ ์ ๋ต)
- Recreate
- RollingUpdate๋ Kubernetes์ ๊ธฐ๋ณธ๊ฐ์ด์ ๊ฐ์ฅ ๋๋ฆฌ ์ฌ์ฉ๋๋ ์ ๋ต์ด๋ค. ๋ฐฐํฌ ๋ด์ Pod์ ์ ์ง์ ์ผ๋ก ์ ๋ฐ์ดํธ
- ๋กค๋ง ์ ๋ฐ์ดํธ ๋์ Kubernetes๋ ์๋ก์ด ๋ฒ์ ์ Pod์ ์์ฑํ๊ณ , ๋์์ ์ค๋๋ Pod์ ์๊ท๋ชจ ๋ฐฐ์น๋ก ์ข ๋ฃํ๋ค. ์ด ๊ณผ์ ์์ ์ผ๋ถ Pod์ด ๊ณ์ ์คํ๋๋ฏ๋ก ๋ค์ดํ์์ด ์ต์ํ
- ์ด ์ ๋ต์ ๊ณ ๊ฐ์ฉ์ฑ ์ ์ ์งํด์ผ ํ๋ ๊ฒฝ์ฐ ์ด์์
-
maxUnavailable: ์ ๋ฐ์ดํธ ์ค ์ฌ์ฉํ ์ ์๋ Pod์ ์ต๋ ์(๋๋ ๋น์จ)๋ฅผ ์ง์ ํ๋ค. ์๋ฅผ ๋ค์ด,maxUnavailable: 25%๋ ์ ๋ฐ์ดํธ ์ค ์ต๋ 25%์ Pod์ด ๋ค์ด๋ ์ ์์์ ์๋ฏธ -
maxSurge: ์ํ๋ ๋ณต์ ๋ณธ ์๋ฅผ ์ด๊ณผํ์ฌ ์์๋ก ์์ฑํ ์ ์๋ ์ถ๊ฐ Pod์ ์ต๋ ์(๋๋ ๋น์จ)๋ฅผ ์ง์ ํฉํ. ์๋ฅผ ๋ค์ด,maxSurge: 1์ ์ ๋ฐ์ดํธ ์ค ์์๋ก ํ๋์ ์ถ๊ฐ Pod์ ์์ฑํ ์ ์์์ ์๋ฏธ - ์ฅ์ : ์๋ก์ด Pod์ ์ ์ง์ ์ผ๋ก ์ ๋ฐ์ดํธํ๊ณ ๋ฐฐํฌํ์ฌ ์๋น์ค ๋ค์ดํ์์ด ์๋ค.
- ์ฌ์ฉ ์ฌ๋ก: ์ ๋ฐ์ดํธ ์ค ์ฐ์์ ์ธ ๊ฐ์ฉ์ฑ์ด ํ์ํ ํ๋ก๋์ ํ๊ฒฝ์ ์ด์์
spec:
strategy:
type: RollingUpdate
rollingUpdate:
maxUnavailable: 1 # ์
๋ฐ์ดํธ ์ค ์ต๋ 1๊ฐ์ Pod๊ฐ ๋ค์ด๋ ์ ์๋ค.
maxSurge: 1 # ์
๋ฐ์ดํธ ์ค ์์๋ก 1๊ฐ์ ์ถ๊ฐ Pod์ด ์์ฑ๋ ์ ์๋ค.- Recreate ์ ๋ต์์๋ Kubernetes๊ฐ ๊ธฐ์กด Pod์ ๋ชจ๋ ์ญ์ ํ ํ ์๋ก์ด Pod์ ์์ฑ
- ์ด ์ ๋ต์ ์๋ก์ด ๋ฒ์ ์ด ๋ฐฐํฌ๋ ๋ ์ค๋๋ ์ ํ๋ฆฌ์ผ์ด์ ์ด ์คํ๋์ง ์๋๋ก ๋ณด์ฅ
- ์ฅ์ : ๋จ์ํ๊ณ ๊ธฐ์กด ์ธ์คํด์ค๋ฅผ ๋ชจ๋ ์ข ๋ฃํ ํ ์๋ก์ด ๋ฒ์ ์ ๊นจ๋ํ๊ฒ ๋ฐฐํฌ
- ๋จ์ : ์๋ก์ด Pod์ด ์์ฑ๋ ๋๊น์ง ๋ชจ๋ Pod์ด ์ข ๋ฃ๋๋ฏ๋ก ๋ค์ดํ์์ด ๋ฐ์
- ์ฌ์ฉ ์ฌ๋ก: ์งง์ ๋ค์ดํ์์ด ํ์ฉ๋๊ฑฐ๋ ์ด์ ๋ฒ์ ์ ์์ ํ ์ค์งํด์ผ ํ๋ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ ํฉ
spec:
strategy:
type: RecreateKubernetes ํด๋ฌ์คํฐ๋ก ์ธ๋ถ ํธ๋ํฝ์ด ์ ๋ฌ๋๋ ๊ณผ์ ์ ์ดํดํ๋ฉด ๋คํธ์ํน ๋ฌธ์ ๋ฅผ ํจ๊ณผ์ ์ผ๋ก ๋๋ฒ๊น ํ ์ ์๋ค. ํจํท์ด ์ธ๋ถ์์ Pod๊น์ง ์ ๋ฌ๋๋ ์ ์ฒด ํ๋ฆ์ ๋จ๊ณ๋ณ๋ก ์ดํด๋ณด์.
graph LR
A[External Traffic] --> B[Ingress Controller / LoadBalancer]
B --> C[Service ClusterIP]
C --> D[kube-proxy iptables/IPVS]
D --> E[CNI Network]
E --> F[Pod Container Port]
D -.DNAT.-> E
E -.Overlay Network.-> F
์ธ๋ถ ํธ๋ํฝ์ ๋จผ์ Ingress Controller ๋๋ LoadBalancer๋ฅผ ํตํด ํด๋ฌ์คํฐ๋ก ์ง์ ํ๋ค.
-
Ingress Controller: HTTP/HTTPS ํธ๋ํฝ์ ์ฒ๋ฆฌํ๋ฉฐ, ๋๋ฉ์ธ ๊ธฐ๋ฐ ๋ผ์ฐํ
์ ์ ๊ณตํ๋ค.
- ์: NGINX Ingress, Traefik, HAProxy
-
LoadBalancer: ํด๋ผ์ฐ๋ ํ๊ฒฝ์์ ์ ๊ณตํ๋ ์ธ๋ถ ๋ก๋ ๋ฐธ๋ฐ์
- ์: AWS ELB, GCP Load Balancer, Azure Load Balancer
apiVersion: v1
kind: Service
metadata:
name: my-service
spec:
type: LoadBalancer
ports:
- port: 80
targetPort: 8080
selector:
app: my-appํธ๋ํฝ์ Service ๊ฐ์ฒด์ ClusterIP๋ก ์ ๋ฌ๋๋ค.
- ClusterIP๋ ์ค์ ๋ฌผ๋ฆฌ์ IP๊ฐ ์๋ **๊ฐ์ IP(Virtual IP)**์ด๋ค.
- ์ด ๊ฐ์ IP๋ ํด๋ฌ์คํฐ ๋ด๋ถ์์๋ง ์ ํจํ๋ฉฐ, ์ค์ ๋คํธ์ํฌ ์ธํฐํ์ด์ค์ ํ ๋น๋์ง ์๋๋ค.
- Service๋ Selector๋ฅผ ํตํด ๋งค์นญ๋๋ Pod๋ค์ ์ฐพ๊ณ , ์ด๋ค์ IP๋ฅผ Endpoints ๊ฐ์ฒด๋ก ๊ด๋ฆฌํ๋ค.
apiVersion: v1
kind: Service
metadata:
name: my-service
spec:
selector:
app: my-app
ports:
- protocol: TCP
port: 80
targetPort: 8080
type: ClusterIPkube-proxy๊ฐ ๊ฐ ๋ ธ๋์์ iptables ๋๋ IPVS ๊ท์น์ ๊ด๋ฆฌํ๋ฉฐ, Service IP๋ก ์ค๋ ํจํท์ ์ค์ Pod IP๋ก ๋ณํํ๋ค.
-
iptables ๋ชจ๋ (๊ธฐ๋ณธ๊ฐ):
- Service IP๋ฅผ Pod IP๋ก DNAT(Destination NAT) ๋ณํ
- ๋๋ค ๋ฐฉ์์ผ๋ก Pod ์ ํ
- ๋๊ท๋ชจ ํด๋ฌ์คํฐ์์๋ ์ฑ๋ฅ ์ ํ ๊ฐ๋ฅ์ฑ
-
IPVS ๋ชจ๋:
- Linux ์ปค๋์ IPVS(IP Virtual Server) ํ์ฉ
- ๋ ํจ์จ์ ์ธ ๋ก๋ ๋ฐธ๋ฐ์ฑ ์๊ณ ๋ฆฌ์ฆ ์ ๊ณต
- ๋๊ท๋ชจ ํด๋ฌ์คํฐ์ ์ ํฉ
# kube-proxy ๋ชจ๋ ํ์ธ
kubectl get configmap kube-proxy -n kube-system -o yaml | grep mode
# iptables ๊ท์น ํ์ธ (๋
ธ๋์์ ์คํ)
sudo iptables -t nat -L -n | grep my-serviceCNI(Container Network Interface) ๊ฐ ๊ตฌ์ฑํ ๋คํธ์ํฌ๋ฅผ ํตํด ํด๋น Pod์ Container ํฌํธ๋ก ํจํท์ด ์ ๋ฌ๋๋ค.
- Pod์ IP ์ฃผ์ ํ ๋น
- Pod ๊ฐ ๋คํธ์ํฌ ์ฐ๊ฒฐ ๊ตฌ์ฑ
- ๋คํธ์ํฌ ์ ์ฑ (NetworkPolicy) ์ ์ฉ
- Calico: NetworkPolicy ์ง์, ํ์ฅ์ฑ ์ฐ์
- Flannel: ๊ฐ๋จํ ์ค๋ฒ๋ ์ด ๋คํธ์ํฌ
- Weave Net: ์ํธํ ์ง์
- Cilium: eBPF ๊ธฐ๋ฐ, ๊ณ ์ฑ๋ฅ
# NetworkPolicy ์์
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: allow-from-frontend
spec:
podSelector:
matchLabels:
app: backend
policyTypes:
- Ingress
ingress:
- from:
- podSelector:
matchLabels:
app: frontend
ports:
- protocol: TCP
port: 8080Pod๊ฐ ๋ค๋ฅธ ๋ ธ๋์ ์๋ ๊ฒฝ์ฐ, Overlay ๋คํธ์ํฌ๋ฅผ ํตํด ๋ ธ๋ ๊ฐ ํต์ ์ด ์ด๋ฃจ์ด์ง๋ค.
- VXLAN: ๊ฐ์ฅ ์ผ๋ฐ์ ์ผ๋ก ์ฌ์ฉ๋๋ ์ค๋ฒ๋ ์ด ํ๋กํ ์ฝ
- IPIP: IP-in-IP ํฐ๋๋ง
- WireGuard: ์ํธํ๋ ํฐ๋๋ง
# VXLAN ์ธํฐํ์ด์ค ํ์ธ
ip -d link show type vxlan
# CNI ์ค์ ํ์ธ
cat /etc/cni/net.d/10-calico.conflistService๊ฐ Selector์ ๋งค์นญ๋๋ Pod๊ฐ ์์ผ๋ฉด Endpoints๊ฐ ์์ฑ๋์ง ์์ 503 ์๋ฌ ๋ฐ์
# Endpoints ํ์ธ
kubectl get endpoints my-service
# Service์ Pod Selector ๋งค์นญ ํ์ธ
kubectl get pods -l app=my-appNetworkPolicy ์ค์ ์ผ๋ก Pod ๊ฐ ํธ๋ํฝ์ด ์ฐจ๋จ๋ ์ ์๋ค.
# NetworkPolicy ํ์ธ
kubectl get networkpolicies
# NetworkPolicy ์์ธ ํ์ธ
kubectl describe networkpolicy allow-from-frontendCNI ์ฅ์ ์ ๋ ธ๋ ๊ฐ ํต์ ์ด ๋ถ๊ฐ๋ฅํ๋ค.
# CNI Pod ์ํ ํ์ธ (Calico ์์)
kubectl get pods -n kube-system | grep calico
# CNI ๋ก๊ทธ ํ์ธ
kubectl logs -n kube-system calico-node-xxxxxkube-proxy ์ฅ์ ์ Service ๋ผ์ฐํ ์ด ๋ถ๊ฐ๋ฅํ๋ค.
# kube-proxy Pod ์ํ ํ์ธ
kubectl get pods -n kube-system | grep kube-proxy
# kube-proxy ๋ก๊ทธ ํ์ธ
kubectl logs -n kube-system kube-proxy-xxxxx# 1. Pod ์ฐ๊ฒฐ ํ
์คํธ
kubectl exec -it my-pod -- curl http://my-service:80
# 2. DNS ํ์ธ
kubectl exec -it my-pod -- nslookup my-service
# 3. ๋คํธ์ํฌ ์ถ์ (tcpdump)
kubectl exec -it my-pod -- tcpdump -i any -n port 8080
# 4. Service ์์ธ ์ ๋ณด
kubectl describe service my-service
# 5. Pod ๋คํธ์ํฌ ์ธํฐํ์ด์ค ํ์ธ
kubectl exec -it my-pod -- ip addr show- External Traffic โ Ingress/LoadBalancer๋ก ์ง์
- Ingress/LoadBalancer โ Service ClusterIP๋ก ๋ผ์ฐํ
- Service (Virtual IP) โ kube-proxy๊ฐ ์ธ์
- kube-proxy โ iptables/IPVS ๊ท์น์ผ๋ก Pod IP๋ก DNAT ๋ณํ
- CNI Network โ Pod๊ฐ ์๋ ๋ ธ๋๋ก ํจํท ์ ๋ฌ (ํ์์ Overlay Network)
- Pod Container Port โ ์ต์ข ๋ชฉ์ ์ง ๋์ฐฉ
์ด ํ๋ฆ์ ์ดํดํ๋ฉด Kubernetes ๋คํธ์ํน ๋ฌธ์ ๋ฅผ ์ฒด๊ณ์ ์ผ๋ก ๋๋ฒ๊น ํ ์ ์์ผ๋ฉฐ, ๊ฐ ๋จ๊ณ์์ ๋ฐ์ํ ์ ์๋ ๋ฌธ์ ๋ฅผ ๋น ๋ฅด๊ฒ ํ์ ํ ์ ์๋ค.
Q22. Pod ์ฅ์ ์ํ(ImagePullBackOff, ErrImagePull, CrashLoopBackOff)์ ์์ธ๊ณผ ํด๊ฒฐ ๋ฐฉ๋ฒ์ ์ค๋ช ํ์ธ์.
์ง๋ฌธ: Kubernetes์์ Pod๊ฐ ์คํ๋์ง ์๋ ์ฃผ์ ์ฅ์ ์ํ์ธ ImagePullBackOff, ErrImagePull, CrashLoopBackOff, CreateContainerConfigError์ ์์ธ๊ณผ ๋์ ๋ฐฉ์, ๊ทธ๋ฆฌ๊ณ ํธ๋ฌ๋ธ์ํ ๋ฐฉ๋ฒ์ ์ค๋ช ํ์ธ์.
๋ต๋ณ:
Pod๋ ์์ฑ ํ ๋ค์๊ณผ ๊ฐ์ ๋จ๊ณ๋ฅผ ๊ฑฐ์น๋ค:
Pending โ ContainerCreating โ Running โ Succeeded/Failed
โ โ โ
์๋ฌ ์ํ๋ค ๋ฐ์ ๊ฐ๋ฅ
์ฃผ์ ์ฅ์ ์ํ๋ kubelet์ด ์ปจํ ์ด๋๋ฅผ ์์ํ๋ ๊ณผ์ ์์ ๋ฐ์ํ๋ค.
์์ธ: ์ปจํ ์ด๋ ์ด๋ฏธ์ง๋ฅผ ๋ ์ง์คํธ๋ฆฌ์์ ๋ค์ด๋ก๋ํ์ง ๋ชปํ ๋ ๋ฐ์
๋ฐ์ ์๋๋ฆฌ์ค:
- ์ด๋ฏธ์ง๊ฐ ์กด์ฌํ์ง ์์ (์๋ชป๋ ์ด๋ฏธ์ง ์ด๋ฆ/ํ๊ทธ)
- Private Registry ์ธ์ฆ ์คํจ
- ๋คํธ์ํฌ ๋ฌธ์ ๋ก ๋ ์ง์คํธ๋ฆฌ ์ ๊ทผ ๋ถ๊ฐ
- ๋ ์ง์คํธ๋ฆฌ Rate Limit ์ด๊ณผ (DockerHub ๋ฌด๋ฃ ๊ณ์ )
๋์ ๋ฐฉ์:
1. kubelet์ด CRI์ ์ด๋ฏธ์ง Pull ์์ฒญ
2. CRI๊ฐ ๋ ์ง์คํธ๋ฆฌ์ ์ด๋ฏธ์ง ์์ฒญ
3. ์คํจ ์ ErrImagePull ์ํ
4. kubelet์ด ์ฌ์๋ (exponential backoff)
5. ๊ณ์ ์คํจ ์ ImagePullBackOff ์ํ๋ก ์ ํ
6. ์ฌ์๋ ๊ฐ๊ฒฉ: 10s โ 20s โ 40s โ 80s โ 160s (์ต๋ 5๋ถ)
ํธ๋ฌ๋ธ์ํ :
# 1. Pod ์ํ ํ์ธ
kubectl describe pod my-pod
# Events ์น์
์์ ์๋ฌ ๋ฉ์์ง ํ์ธ:
# "Failed to pull image "nginx:invalidtag": rpc error: code = NotFound"
# 2. ์ด๋ฏธ์ง ์ด๋ฆ/ํ๊ทธ ํ์ธ
kubectl get pod my-pod -o jsonpath='{.spec.containers[*].image}'
# 3. ImagePullSecrets ํ์ธ (Private Registry)
kubectl get pod my-pod -o jsonpath='{.spec.imagePullSecrets}'
# 4. Secret ํ์ธ
kubectl get secret my-registry-secret -o yaml
# 5. ์ง์ ์ด๋ฏธ์ง Pull ํ
์คํธ (๋
ธ๋์์)
# ํด๋น ๋
ธ๋์ SSH ์ ์ ํ
sudo crictl pull docker.io/library/nginx:latestํด๊ฒฐ ๋ฐฉ๋ฒ:
# ๋ฐฉ๋ฒ 1: ์ฌ๋ฐ๋ฅธ ์ด๋ฏธ์ง ํ๊ทธ ์ง์
spec:
containers:
- name: app
image: nginx:1.21 # ์กด์ฌํ๋ ํ๊ทธ ์ฌ์ฉ
---
# ๋ฐฉ๋ฒ 2: Private Registry ์ธ์ฆ (Secret ์์ฑ)
kubectl create secret docker-registry my-registry-secret \
--docker-server=gcr.io \
--docker-username=_json_key \
--docker-password="$(cat key.json)" \
[email protected]
# Pod์ Secret ์ฐ๊ฒฐ
spec:
imagePullSecrets:
- name: my-registry-secret
containers:
- name: app
image: gcr.io/my-project/my-app:v1.0
---
# ๋ฐฉ๋ฒ 3: imagePullPolicy ์กฐ์
spec:
containers:
- name: app
image: nginx:latest
imagePullPolicy: IfNotPresent # ๋ก์ปฌ์ ์์ผ๋ฉด Pull ์ํจ
# Always (๊ธฐ๋ณธ๊ฐ for :latest)
# Never (ํญ์ ๋ก์ปฌ ์ด๋ฏธ์ง ์ฌ์ฉ)์์ธ: ์ปจํ ์ด๋๊ฐ ์์ ํ ์ฆ์ ์ข ๋ฃ๋์ด ๊ณ์ ์ฌ์์๋๋ ์ํ
๋ฐ์ ์๋๋ฆฌ์ค:
- ์ ํ๋ฆฌ์ผ์ด์ ์ฝ๋ ์๋ฌ (Panic, Segmentation Fault)
- ์ค์ ํ์ผ ์ค๋ฅ
- ํ์ํ ํ๊ฒฝ ๋ณ์ ๋๋ฝ
- Liveness Probe ์คํจ
- ๊ถํ ๋ฌธ์ (non-root ์ฌ์ฉ์๋ก ์คํ ์)
- ๋ฆฌ์์ค ๋ถ์กฑ (OOMKilled)
๋์ ๋ฐฉ์:
1. kubelet์ด ์ปจํ
์ด๋ ์์
2. ์ปจํ
์ด๋ ํ๋ก์ธ์ค๊ฐ Exit Code์ ํจ๊ป ์ข
๋ฃ
3. kubelet์ด ์ฌ์์ ์๋ (restartPolicy: Always ๊ธฐ๋ณธ๊ฐ)
4. ์คํจ ์ ์ฌ์์ ๋๊ธฐ ์๊ฐ ์ฆ๊ฐ (exponential backoff)
5. ๋๊ธฐ ์๊ฐ: 10s โ 20s โ 40s โ 80s โ 160s (์ต๋ 5๋ถ)
6. CrashLoopBackOff ์ํ ํ์
ํธ๋ฌ๋ธ์ํ :
# 1. Pod ์ํ ๋ฐ ์ฌ์์ ํ์ ํ์ธ
kubectl get pod my-pod
# NAME READY STATUS RESTARTS AGE
# my-pod 0/1 CrashLoopBackOff 5 3m
# 2. Pod ์ด๋ฒคํธ ํ์ธ
kubectl describe pod my-pod
# Events:
# Back-off restarting failed container
# 3. ๋ก๊ทธ ํ์ธ (ํ์ฌ ์ปจํ
์ด๋)
kubectl logs my-pod
# 4. ์ด์ ์ปจํ
์ด๋ ๋ก๊ทธ ํ์ธ (์ฌ์์ ์ )
kubectl logs my-pod --previous
# 5. ๋ชจ๋ ์ปจํ
์ด๋ ๋ก๊ทธ (Multi-container Pod)
kubectl logs my-pod --all-containers=true
# 6. Exit Code ํ์ธ
kubectl get pod my-pod -o jsonpath='{.status.containerStatuses[0].lastState.terminated.exitCode}'
# Exit Code ์๋ฏธ:
# 0: ์ ์ ์ข
๋ฃ
# 1: ์ผ๋ฐ ์๋ฌ
# 137: SIGKILL (OOMKilled)
# 139: Segmentation Fault
# 143: SIGTERM
# 7. ๋ฆฌ์์ค ์ฌ์ฉ๋ ํ์ธ
kubectl top pod my-pod
# 8. OOMKilled ํ์ธ
kubectl describe pod my-pod | grep -i oomํด๊ฒฐ ๋ฐฉ๋ฒ:
# ๋ฐฉ๋ฒ 1: ํ๊ฒฝ ๋ณ์ ์ค์
spec:
containers:
- name: app
image: myapp:v1.0
env:
- name: DATABASE_URL
value: "postgresql://db:5432"
- name: LOG_LEVEL
value: "debug"
---
# ๋ฐฉ๋ฒ 2: ๋ฆฌ์์ค ์ ํ ์กฐ์ (OOMKilled ๋ฐฉ์ง)
spec:
containers:
- name: app
image: myapp:v1.0
resources:
requests:
memory: "256Mi"
cpu: "100m"
limits:
memory: "512Mi"
cpu: "500m"
---
# ๋ฐฉ๋ฒ 3: Liveness Probe ์กฐ์
spec:
containers:
- name: app
image: myapp:v1.0
livenessProbe:
httpGet:
path: /healthz
port: 8080
initialDelaySeconds: 30 # ์์ ์๊ฐ ์ฌ์
periodSeconds: 10
failureThreshold: 3
---
# ๋ฐฉ๋ฒ 4: ๋๋ฒ๊น
๋ชจ๋๋ก ์คํ (Command Override)
spec:
containers:
- name: app
image: myapp:v1.0
command: ["/bin/sh"]
args: ["-c", "sleep 3600"] # 1์๊ฐ ๋๊ธฐ (๋๋ฒ๊น
์ฉ)์์ธ: ์ปจํ ์ด๋ ์ค์ ์์ฑ ์ค ์ค๋ฅ ๋ฐ์
๋ฐ์ ์๋๋ฆฌ์ค:
- ConfigMap์ด๋ Secret์ด ์กด์ฌํ์ง ์์
- Volume Mount ๊ฒฝ๋ก ์ค๋ฅ
- ์๋ชป๋ ํ๊ฒฝ ๋ณ์ ์ฐธ์กฐ
๋์ ๋ฐฉ์:
1. kubelet์ด Pod Spec์ ์ฝ์
2. ConfigMap/Secret ์ฐธ์กฐ ํ์ธ
3. ๋ฆฌ์์ค๊ฐ ์์ผ๋ฉด CreateContainerConfigError
4. kubelet์ด ์ฃผ๊ธฐ์ ์ผ๋ก ์ฌ์๋ (๋ฆฌ์์ค ์์ฑ ๋๊ธฐ)
ํธ๋ฌ๋ธ์ํ :
# 1. Pod ์ํ ํ์ธ
kubectl describe pod my-pod
# Events:
# Error: configmap "app-config" not found
# 2. ConfigMap ์กด์ฌ ํ์ธ
kubectl get configmap app-config
# 3. Secret ์กด์ฌ ํ์ธ
kubectl get secret app-secret
# 4. Volume ์ค์ ํ์ธ
kubectl get pod my-pod -o yaml | grep -A 10 volumesํด๊ฒฐ ๋ฐฉ๋ฒ:
# ๋ฐฉ๋ฒ 1: ConfigMap ๋จผ์ ์์ฑ
apiVersion: v1
kind: ConfigMap
metadata:
name: app-config
data:
app.conf: |
server {
listen 80;
}
---
# ๋ฐฉ๋ฒ 2: optional ํ๋๊ทธ ์ฌ์ฉ (์์ด๋ Pod ์คํ)
spec:
containers:
- name: app
image: nginx
envFrom:
- configMapRef:
name: app-config
optional: true # ConfigMap ์์ด๋ ์์
---
# ๋ฐฉ๋ฒ 3: ์ฌ๋ฐ๋ฅธ Volume Mount
spec:
containers:
- name: app
image: nginx
volumeMounts:
- name: config-volume
mountPath: /etc/nginx/nginx.conf
subPath: nginx.conf # ConfigMap์ ํน์ ํค๋ง ๋ง์ดํธ
volumes:
- name: config-volume
configMap:
name: nginx-config์์ธ: Pod๊ฐ ์ค์ผ์ค๋ง๋์ง ๋ชปํ๋ ์ํ
๋ฐ์ ์๋๋ฆฌ์ค:
- ๋ฆฌ์์ค ๋ถ์กฑ (๋ ธ๋์ CPU/Memory ๋ถ์กฑ)
- PVC๊ฐ Bound๋์ง ์์
- Node Selector/Affinity ์กฐ๊ฑด ๋ถ๋ง์กฑ
- Taints/Tolerations ๋ถ์ผ์น
ํธ๋ฌ๋ธ์ํ :
# 1. ์ค์ผ์ค๋ง ์คํจ ์์ธ ํ์ธ
kubectl describe pod my-pod
# Events:
# 0/3 nodes are available: insufficient cpu.
# 2. ๋
ธ๋ ๋ฆฌ์์ค ํ์ธ
kubectl top nodes
kubectl describe nodes
# 3. PVC ์ํ ํ์ธ
kubectl get pvc
# STATUS๊ฐ Pending์ด๋ฉด PV ๋ถ์กฑ
# 4. Node Selector ํ์ธ
kubectl get pod my-pod -o jsonpath='{.spec.nodeSelector}'ํด๊ฒฐ ๋ฐฉ๋ฒ:
# ๋ฐฉ๋ฒ 1: ๋ฆฌ์์ค ์์ฒญ ๊ฐ์
spec:
containers:
- name: app
resources:
requests:
cpu: "100m" # 1000m โ 100m ๊ฐ์
memory: "128Mi"
---
# ๋ฐฉ๋ฒ 2: ๋
ธ๋ ์ถ๊ฐ (ํด๋ฌ์คํฐ ํ์ฅ)
# EKS Autoscaling ํ์ฑํ ๋๋ ์๋ ๋
ธ๋ ์ถ๊ฐ
---
# ๋ฐฉ๋ฒ 3: PV ํ๋ก๋น์ ๋
# StorageClass์ provisioner ํ์ธ ํ PV ์๋ ์์ฑ ๋๊ธฐ
kubectl get storageclassPod ์์ฑ ์์ฒญ
โ
[Pending] โ ์ค์ผ์ค๋ง ์คํจ (๋ฆฌ์์ค ๋ถ์กฑ, Node Selector)
โ
[ContainerCreating]
โ
์ด๋ฏธ์ง Pull โ [ErrImagePull] โ [ImagePullBackOff]
โ
Config ์์ฑ โ [CreateContainerConfigError]
โ
์ปจํ
์ด๋ ์์ โ [CrashLoopBackOff] (Exit Code != 0)
โ
[Running]
โ
Liveness Probe ์คํจ โ ์ฌ์์ โ [CrashLoopBackOff]
# 1๋จ๊ณ: Pod ์ํ ํ์ธ
kubectl get pod my-pod
# 2๋จ๊ณ: ์์ธ ์ด๋ฒคํธ ํ์ธ
kubectl describe pod my-pod
# 3๋จ๊ณ: ๋ก๊ทธ ํ์ธ
kubectl logs my-pod --previous
# 4๋จ๊ณ: Pod YAML ํ์ธ
kubectl get pod my-pod -o yaml
# 5๋จ๊ณ: ๋
ธ๋ ์ํ ํ์ธ (Pending ์)
kubectl describe node <node-name>
# 6๋จ๊ณ: ๋ฆฌ์์ค ์ฌ์ฉ๋ ํ์ธ
kubectl top pod my-pod
kubectl top node
# 7๋จ๊ณ: ์์ ๋๋ฒ๊น
Pod ์คํ
kubectl run debug --image=busybox -it --rm -- /bin/sh| ์ํ | ์์ธ | ์ฃผ์ ํด๊ฒฐ ๋ฐฉ๋ฒ |
|---|---|---|
| ImagePullBackOff | ์ด๋ฏธ์ง ๋ค์ด๋ก๋ ์คํจ | ์ด๋ฏธ์ง ํ๊ทธ ํ์ธ, imagePullSecrets ์ถ๊ฐ |
| CrashLoopBackOff | ์ปจํ ์ด๋ ์ฆ์ ์ข ๋ฃ | ๋ก๊ทธ ํ์ธ, ํ๊ฒฝ ๋ณ์/๋ฆฌ์์ค ์กฐ์ |
| CreateContainerConfigError | ConfigMap/Secret ์์ | ๋ฆฌ์์ค ๋จผ์ ์์ฑ, optional ํ๋๊ทธ |
| Pending | ์ค์ผ์ค๋ง ์คํจ | ๋ ธ๋ ๋ฆฌ์์ค ํ์ธ, Node Selector ์กฐ์ |
์ด๋ฌํ ์ฅ์ ์ํ๋ค์ ์ดํดํ๋ฉด Kubernetes์์ Pod๊ฐ ์คํ๋์ง ์๋ ๋ฌธ์ ๋ฅผ ๋น ๋ฅด๊ฒ ์ง๋จํ๊ณ ํด๊ฒฐํ ์ ์๋ค.