- 0. k9s
- 1. ์ค์น ๋ช ๋ น์ด
- 2. ๊ธฐ๋ณธ ๊ฐ๋
- ์ฟ ๋ฒ๋คํฐ์ค๊ฐ ์ ํ์ํ๊ฐ
- ์ฟ ๋ฒ๋คํฐ์ค์ ๊ธฐ๋ฅ
- Borg
- Omega
- Kubernetes
- ์ฟ ๋ฒ๋คํฐ์ค๋
- ์ฟ ๋ฒ๋คํฐ์ค ํด๋ฌ์คํฐ๋
- Master ๋ ธ๋์ ์ญํ
- ๋ง์คํฐ๋ ธ๋ - etcd
- ๋ง์คํฐ๋ ธ๋ - API server
- ๋ง์คํฐ๋ ธ๋ - Scheduler
- ๋ง์คํฐ๋ ธ๋ - Controller
- Worker ๋ ธ๋
- "์ฟ ๋ฒ๋คํฐ์ค์ ์ ํ๋ฆฌ์ผ์ด์ ์ปจํ ์ด๋๋ฅผ ๋ฐฐํฌํ๋ค"๋
- Manifest ํ์ผ์ด๋
- API Server๋ฅผ ํตํ ํ๋ ฅ
- kube-proxy์ iptables๋ฅผ ์ด์ฉํ ํต์ ๋ฐฉ๋ฒ
- ์ฟ ๋ฒ๋คํฐ์ค ์ค๋ธ์ ํธ๋ ๋ฌด์์ธ๊ฐ
- ์ฟ ๋ฒ๋คํฐ์ค ์ค๋ธ์ ํธ๊ฐ ๋ ์ ์๋ ๊ฒ (ํด๋ฌ์คํฐ์ ์ํ๋ฅผ ํํํ๋ ๊ฐ์ฒด๋ค)
- ์ฟ ๋ฒ๋คํฐ์ค ์ค๋ธ์ ํธ ํํ ๋ฐฉ๋ฒ
- spec vs status ํ๋
- 3. ๊ธฐ๋ณธ ๋ช
๋ น์ด
- minikube ํด๋ฌ์คํฐ ์ค์ (docker)
- ์ฟ ๋ฒ๋คํฐ์ค ํด๋ฌ์คํฐ์์ ์ฌ์ฉํ ์ ์๋ ์ค๋ธ์ ํธ ๋ชฉ๋ก ์กฐํ
- ์ฟ ๋ฒ๋คํฐ์ค ์ค๋ธ์ ํธ์ ์ค๋ช ๊ณผ 1๋ ๋ฒจ ์์ฑ๋ค์ ์ค๋ช
- ์ฟ ๋ฒ๋คํฐ์ค ์ค๋ธ์ ํธ์ ์์ฑ๋ค์ ๊ตฌ์ฒด์ ์ธ ์ค๋ช
- ์ฟ ๋ฒ๋คํฐ์ค ํด๋ฌ์คํฐ์์ ์ํ ๋ ธ๋ ๋ชฉ๋ก ์กฐํ
- ์ฟ ๋ฒ๋คํฐ์ค ์ค๋ธ์ ํธ ์์ฑ/๋ณ๊ฒฝ
- ์คํ ์ค์ธ Pod(์ปจํ ์ด๋) ๋ชฉ๋ก ์กฐํ
- ์ ํ๋ฆฌ์ผ์ด์ ๋ฐฐํฌ ๊ฐ์ ์กฐ์
- ์คํ ์ค์ธ ์ค๋ธ์ ํธ ์ค์ ๊ณผ ์ ๋ ฅํ ํ์ผ์ ์ฐจ์ด์ ๋ถ์
- ์ฟ ๋ฒ๋คํฐ์ค ์ค๋ธ์ ํธ์ spec์ editor๋ก ํธ์ง
- ๋ก์ปฌ์์ ํฌํธํฌ์๋ฉ
- ์คํ์ค์ธ ์ปจํ ์ด๋ ํ๋ก์ธ์ค์ ์ ์ํด์ ๋ก๊ทธ ํ์ธ
- ์คํ์ค์ธ ์ปจํ ์ด๋ ํ๋ก์ธ์ค์ ๋ชจ๋ ๋ก๊ทธ ์ถ๋ ฅ
- 4. ๋ก์ปฌ ๊ฐ๋ฐ ํ๊ฒฝ ์ธํ
- 5. pod ์ดํด๋ณด๊ธฐ
- Pod ๊ฐ๋
- Pod ํน์ง
- Pod ํน์ง - PodIP๋ ํด๋ฌ์คํฐ ์์์๋ง ์ ๊ทผํ ์ ์๋ค.
- Pod ํน์ง - Replica
- Pod์ ์ปจํ ์ด๋ ์ค๊ณ์ ๊ณ ๋ ค ํ ์
- pod๊ฐ ๋ ธ๋์ ๋ฐฐํฌ๋๋ ๊ณผ์
- Pod ์ค๋ธ์ ํธ ํํ ๋ฐฉ๋ฒ
- Pod ์ค๋ธ์ ํธ ํํ ๋ฐฉ๋ฒ - nodeSelector
- Pod ์ค๋ธ์ ํธ ํํ ๋ฐฉ๋ฒ - containers
- Pod ์ค๋ธ์ ํธ ํํ ๋ฐฉ๋ฒ - containers ํ๊ฒฝ ๋ณ์ env
- Pod ์ค๋ธ์ ํธ ํํ ๋ฐฉ๋ฒ - containers valumeMounts
- Pod ์ค๋ธ์ ํธ ํํ ๋ฐฉ๋ฒ - spec volumes
- Pod์ ํ๊ณ์
- Pod ํต์ฌ ์ ๋ฆฌ
- Pod ๋ฐฐํฌ ๋ฐ ํ์ธ ์ค์ต ๋ฐฉ๋ฒ
- Pod ์ด๋ฆ, ์ปจํ ์ด๋ ์ด๋ฆ๊ณผ ์ด๋ฏธ์ง, ํฌํธ ์ค์
- ์ปจํ ์ด๋ ํ๊ฒฝ๋ณ์ ํค์ ๊ฐ ์ค์
- Pod ์ค๋ธ์ ํธ ๊ฐ์ ํ๊ฒฝ๋ณ์ ๊ฐ์ผ๋ก ์ค์
- Pod์ด๋ฆ, ์ปจํ ์ด๋ ์ด๋ฆ๊ณผ ์ด๋ฏธ์ง, ํฌํธ, ํ๊ฒฝ๋ณ์ ๋ฑ ์ค์
- ์ปจํ ์ด๋ ๊ฐ localhost ํต์ , ๋ค๋ฅธ Pod์ Pod IP ํต์ ์์
- Label๊ณผ Selector ๋
- Label๊ณผ Selector๊ฐ ํ์ํ ์ํฉ
- Label ์์
- Label ์กฐํ ๋ช ๋ น์ด
- Label ์ถ๊ฐ ๋ช ๋ น์ด
- Label ๋ณ๊ฒฝ ๋ช ๋ น์ด
- Label ์ ํ ์กฐํ ๋ช ๋ น์ด
- Label ์ญ์ ๋ช ๋ น์ด
- selector ๋ฌธ๋ฒ
- label query ์ฐ์ฐ์ =, !=
- label query ์ฐ์ฐ์ in, notin
- label query ์ฐ์ฐ์ ํค๊ฐ ์กฐํ
- label query (selector) ์์
- nodeSelector๋ฅผ ํ์ฉํ์ฌ ๋ฐฐํฌํ๊ธฐ
- 6. replica set
- replica set ์ด๋
- replica set์ ํ์์ฑ
- replica set ํน์ง
- replica set ์ญํ
- replica set ์ค๋ธ์ ํธ ํํ ๋ฐฉ๋ฒ
- replica set์ผ๋ก pod ๋ ํ๋ฆฌ์ผ์ด์
- ๊ฐ๋จํ replica set ์์
- ๊ธฐ์กด์ ์์ฑํ Pod๋ฅผ ReplicaSet์ผ๋ก ๊ด๋ฆฌ
- replicaset์ Pod ์์ฑ/๋ณต๊ตฌ ์๋ํ ๊ธฐ๋ฅ
- pod๋ ๋ฉ๋๊ณ , replicaset๋ง ์ญ์ ํ๊ธฐ
- gracefullyํ๊ฒ replicaSet&pod ์ญ์ ํ๊ธฐ
- pod watch ๋ชจ๋๋ก ๋ชจ๋ํฐ๋ง ๋ฐฉ๋ฒ
- pod์ owner ํ์ธ ๋ช ๋ น์ด
- ๋ฐฐํฌํ ReplicaSet์ Pod Template์ ๋ณ๊ฒฝ
- replicas ์ ๋ณ๊ฒฝ ๋ช ๋ น์ด
- replicaset ๋กค๋ฐฑ
- ReplicaSet ์ด๋ฏธ์ง ๋ณ๊ฒฝ
- 7. deployment
- ์ง๊ธ๊น์ง์ ReplicaSet์ผ๋ก Pod๋ฅผ ๋ฐฐํฌํ๋ ์ด์
- Deployment์ ํ์์ฑ
- Deployment ์ค๋ธ์ ํธ๋
- Deployment ์ค๋ธ์ ํธ ํํ ๋ฐฉ๋ฒ
- Deployment์ Pod Template 1.0 -> 2.0 ๋ณ๊ฒฝ ์์ฒญ
- Deployment ๋กค์์ ์ ๋ต1 - Recreate ๋ฐฐํฌ
- Deployment ๋กค์์ ์ ๋ต2 - RollingUpdate ๋ฐฐํฌ
- Recreate vs Rollingupdate
- RollingUpdate ์๋ ์ ์ด ์ต์ - maxUnavailable
- RollingUpdate ์๋ ์ ์ด ์ต์ - maxSurge
- maxUnavailable, maxSurge ์์
- maxUnavailable, maxSurge ๊ฐ ํ์ํ ์ด์
- Deployment ๋กค๋ฐฑ ์ ๋ต - Revision
- Deployment์ replicas ๋ณ๊ฒฝ
- Deployment ์ด๋ฒคํธ ํ์ธ ๋ช ๋ น์ด
- Deployment๋ฅผ ํตํด ์์ฑํ Pod ์ํ ๋ณํ ํ์ธ
- Deployment ๋ฐฐํฌ ์งํ์ค/์๋ฃ ์ํ ํ์ธ
- Deployment์ Pod replicas ๋ณ๊ฒฝ
- ReplicaSet ์ด๋ฒคํธ ํ์ธ
- ReplicaSet์ด ์์ฑํ Pod ์ํ ๋ณํ ํ์ธ
- label selector๋ก ๋ฆฌ์์ค ์ญ์
- Deployment ๋ฐฐํฌ ๋ฐ replicas ๋ณ๊ฒฝ ์์
- Deployment์ Pod Template ์ด๋ฏธ์ง ๋ณ๊ฒฝ & ๋ ์ด๋ธ ๋ณ๊ฒฝ ๊ณผ์
- Deployment Pod Template ์์
- Deployment Recreate ์ ๋ต ์์
- Deployment RollingUpdate ์ ๋ต ์์
- Deployment Revision ๋ชฉ๋ก ๊ฐ๋จ ์กฐํ
- Deployment Revision ์์ธ ์กฐํ
- Deployment ๋กค๋ฐฑ
- Deployment ๋กค๋ฐฑ ์ฌ์ ๋จ๊ธฐ๊ธฐ
- Deployment ๋กค๋ฐฑ ์์
- 8. service
- Pod ํ๊ณ์ - ํด๋ผ์ด์ธํธ Pod IP ๋ชฉ๋ก์ ์ต์ ์ํ๋ก ๊ด๋ฆฌ ํ์
- Pod ํ๊ณ์ - Pod๋ฅผ ์ธ๋ถ๋ก ๋ ธ์ถํ ์ ์๋ค.
- Service ๊ฐ๋ - Pod ์งํฉ์ ๋ํ ๋จ์ผ ์๋ ํฌ์ธํธ ์์ฑ
- Service ์ค๋ธ์ ํธ ์ ์ธ
- Service์ Endpoints - ์ต์ Pod IP ๋ชฉ๋ก ๊ด๋ฆฌ
- Service์ ํต์ ํ๋ 2๊ฐ์ง ๋ฐฉ๋ฒ
- Service์์ ํต์ - ํ๊ฒฝ๋ณ์
- Service์์ ํต์ - DNS
- Service์ ์ข ๋ฅ
- Service - ClusterIP
- Service - NodePort
- Service - LoadBalancer
- Service๋ฅผ ์ด์ฉํ Pod ๋ ธ์ถ
- ๋ค์์คํ์ด์ค์ ๋ชจ๋ ๋ฆฌ์์ค ์กฐํ
- Endpoints์ ๋ฆฌ์์ค ์กฐํ
- ๋ค์์คํ์ด์ค ์์ฑ ๋ช ๋ น์ด
- ๋ค์์คํ์ด์ค์ Service ์์ธ ์กฐํ
- Service ClusterIP ์กฐํ
- ClusterIP Service ๋ฐฐํฌ ์์
- Pod ์ปจํ ์ด๋๋ก ๋ช ๋ น์ด ์ ๋ฌ
- Pod ์ปจํ ์ด๋ ํ๊ฒฝ๋ณ์ ํ์ธ
- ClusterIP Service ๋ผ๋ฆฌ ํต์ ์์ - ํ๊ฒฝ๋ณ์ ํ์ฉ
- ClusterIP Service ๋ผ๋ฆฌ ํต์ ์์ - DNS ์๋ฒ ํ์ฉ
- project=snackbar ๋ ์ด๋ธ์ ๊ฐ์ง ๋ชจ๋ ๋ค์์คํ์ด์ค์ ๋ฆฌ์์ค ์กฐํ
- proejct=snackbar ๋ ์ด๋ธ์ ๊ฐ์ง Service Endpoints ์กฐํ
- ๋ชจ๋ ๋ค์์คํ์ด์ค์์ project=snackbar ๋ ์ด๋ธ์ ๊ฐ์ง ๋ชจ๋ ๋ฆฌ์์ค ์ ๊ฑฐ
- ClusterIP Service - ์๋น์ค ์ด๋ฆ์ผ๋ก ๋ค๋ฅธ ๋ค์์คํ์ด์ค์ ์๋ ์๋น์ค ํธ์ถ
- Service ClusterIP์ ํน์ง
- Service ClusterIP๋ฅผ ์ด์ฉํด์ ๋ค๋ฅธ Pod์๊ฒ ์์ฒญ์ ๋ณด๋ด๋ ๋ฐฉ๋ฒ
- ์ธ๋ถ์์ NodePort๋ก ๋ฐฉํ๋ฒฝ ํด์ ์ค์
- Service NodePort ํ์ ๋ฐฐํฌ ์์
- Service NodePort ํน์ง
- Service NodePort๋ฅผ ์ด์ฉํด์ ๋ค๋ฅธ Pod์๊ฒ ์์ฒญ์ ๋ณด๋ด๋ ๋ฐฉ๋ฒ
- LoadBalancer ํ์ ์ Service๋ฅผ ์์ฑํ์ฌ ์ธ๋ถ ํธ๋ํฝ์ ์์ ํ ์ ์๋ค.
- Service LoadBalancer ํ์ ๋ฐฐํฌ ์์
- Service LoadBalancer ํน์ง
- Service LoadBalancer๋ฅผ ์ด์ฉํด์ ๋ค๋ฅธ Pod์๊ฒ ์์ฒญ์ ๋ณด๋ด๋ ๋ฐฉ๋ฒ
- 9. ingress์ ingress controller
- ingress์ ํ์์ฑ
- ingress๋
- ingress controller๋
- Ingress ์ค๋ธ์ ํธ ์ ์ธ - ๊ธฐ๋ณธ
- Ingress ์ค๋ธ์ ํธ ์ ์ธ - ์ฌ๋ฌ Host๋ก ์๋น์ค๋ฅผ ๋ถ๋ฆฌ
- Ingress ์ค๋ธ์ ํธ ์ ์ธ - URL patfh ์๋น์ค๋ฅผ ๋ถ๋ฆฌ
- Ingress ์ค๋ธ์ ํธ ์ ์ธ - ๋งค์น๋์ง ์์ ํธ๋ํฝ ์ฒ๋ฆฌ
- Ingress Controller๋ก ํธ๋ํฝ์ ์์ ํ๋ ๊ณผ์
- Ingress ํน์ง
- Ingress IP์ Port ํ์ธ
- ์ธ๊ทธ๋ ์ค ์กฐํ
- ์ธ๊ทธ๋ ์ด์ค์ ๋ก๋๋ฐธ๋ฐ์ IP ์กฐํ
- Multiple Host ๋ฐฉ์์ผ๋ก Ingress๋ฅผ ํตํด ์ฌ๋ฌ ์๋น์ค ๋ฐฐํฌ
- Single Host ๋ฐฉ์์ผ๋ก Ingress๋ฅผ ํตํด ์ฌ๋ฌ ์๋น์ค ๋ฐฐํฌ
- 10. liveness probe
- 11. readiness probe
- 12. config map
- config map ์ด๋
- Pod์์ ConfigMap์ ์ ๊ทผํ๋ ๋ฐฉ๋ฒ
- ConfigMap ์ฅ์
- ConfigMap ๋ฆฌํฐ๋ด๋ก ์์ฑ
- Config ์์ฑ ํ์ธ
- ConfigMap์ ์ฐธ์กฐํด์ ํ๋ ์ปจํ ์ด๋ ํ๊ฒฝ๋ณ์ ์ค์ ํ๊ธฐ
- ConfigMap ๋ฆฌํฐ๋ด + env ์์
- ConfigMap ๋ฆฌํฐ๋ด + envFrom ์์
- ์ค์ ํ์ผ๋ก ConfigMap์ ์์ฑ
- Pod ๋ณผ๋ฅจ์ผ๋ก ConfigMap ์ฌ์ฉ
- Pod ๋ณผ๋ฅจ์ผ๋ก ConfigMap ์ฌ์ฉ ์์
- 13. secret
- 14. infrastructure as code
- 15. eks
- 16. ์ค์
:context
shift + f
brew install kubectl
brew install kustomize
brew install minikube
- ๋ฐฐํฌํด์ผ ํ ๋ง์ดํฌ๋ก์๋น์ค๊ฐ ์๋ฐฑ ๊ฐ์ธ ๊ฒฝ์ฐ ์ฌ๋์ด ์ฒ๋ฆฌํ๊ธฐ ์ด๋ ต๋ค.
- ์๋ง์ ๋ง์ดํฌ๋ก์๋น์ค๋ฅผ ์ฌ๋ฌ ์๋ฒ์ ํจ์จ์ ์ผ๋ก ๋ฐฐ์นํ๋๊ฒ์ด ์ด๋ ต๋ค.
- ์ฌ๋ฌ ์๋ฒ์ ๋ง์ดํฌ๋ก์๋น์ค ๋ฐฐํฌ ์กฐํฉ ์๋ฅผ ์ฌ๋์ด ๊ณ์ฐํ ์ ์๋ค
- ์ถฉ๋ถํ ๋ฆฌ์์ค๋ฅผ ํ ๋นํ๋ค๋ฉด? ๋ฆฌ์์ค ๋ญ๋น, ๋น์ฉ ๋ฐ์
- ๊ฐ๋จํ ์ฌ์์๋ง์ผ๋ก ํด๊ฒฐ๋๋ ๊ฒฝ์ฐ์๋ ๋ณต๊ตฌ ์๊ฐ์ด ์ค๋ ๊ฑธ๋ฆฐ๋ค
- ์ด๋ค ์๋ฒ์ ์ด๋ค ์๋น์ค๊ฐ ์คํ๋๊ณ ์์๋์ง๋ฅผ ์ฐพ๊ธฐ๊ฐ ์ฝ์ง ์๋ค.
- ์๋ํ๋ ๋น ํจํน(bin packing)
- ์ปจํ ์ด๋ํ๋ ์์ ์ ์คํํ๋๋ฐ ์ฌ์ฉํ ์ ์๋ ์ฟ ๋ฒ๋คํฐ์ค ํด๋ฌ์คํฐ ๋ ธ๋๋ฅผ ์ ๊ณตํ๋ค.
- ๊ฐ ์ปจํ ์ด๋๊ฐ ํ์๋ก ํ๋ CPU์ ๋ฉ๋ชจ๋ฆฌ(RAN)์ ์ฟ ๋ฒ๋คํฐ์ค์๊ฒ ์ง์ํ๋ค.
- ์ฟ ๋ฒ๋คํฐ์ค๋ ์ปจํ ์ด๋๋ฅผ ๋ ธ๋์ ๋ง์ถ์ด์ ๋ฆฌ์์ค๋ฅผ ๊ฐ์ฅ ์ ์ฌ์ฉํ ์ ์๋๋ก ํด์ค๋ค.
- ์๋ํ๋ ๋ณต๊ตฌ
- ์ฟ ๋ฒ๋คํฐ์ค๋ ์คํจํ ์ปจํ ์ด๋๋ฅผ ๋ค์ ์์ํ๊ณ , ์ปจํ ์ด๋๋ฅผ ๊ต์ฒดํ๋ค.
- '์ฌ์ฉ์ ์ ์ ์ํ ๊ฒ์ฌ'์ ์๋ตํ์ง ์๋ ์ปจํ ์ด๋๋ฅผ ์ฃฝ์ด๊ณ , ์๋น์ค ์ค๋น๊ฐ ๋๋ ๋ ๊น์ง ๊ทธ๋ฌํ ๊ณผ์ ์ ํด๋ผ์ด์ธํธ์ ๋ณด์ฌ์ฃผ์ง ์๋๋ค.
- ์๋ํ๋ ๋กค์์๊ณผ ๋กค๋ฐฑ
- ์ฟ ๋ฒ๋คํฐ์ค๋ฅผ ์ฌ์ฉํ์ฌ ๋ฐฐํฌ๋ ์ปจํ ์ด๋์ ์ํ๋ ์ํ๋ฅผ ์์ ํ ์ ์๋ค.
- ํ์ฌ ์ํ๋ฅผ ์ํ๋ ์ํ๋ก ์ค์ ํ ์๋์ ๋ฐ๋ผ ๋ณ๊ฒฝํ ์ ์๋ค.
- ์) ์ฟ ๋ฒ๋คํฐ์ค๋ฅผ ์๋ํํด์ ๋ฐฐํฌ์ฉ ์ ์ปจํ ์ด๋๋ฅผ ๋ง๋ค๊ณ , ๊ธฐ์กด ์ปจํ ์ด๋๋ฅผ ์ ๊ฑฐํ๊ณ , ๋ชจ๋ ๋ฆฌ์์ค๋ฅผ ์ ์ปจํ ์ด๋์ ์ ์ฉํ ์ ์๋ค.
- Google์์ ๊ฐ๋ฐํ ์ต์ด์ ํตํฉ ์ปจํ ์ด๋ ๊ด๋ฆฌ ์์คํ
- ์์ ์๊ตฌ์ฌํญ์ ์์ธกํ์ฌ ๋ฆฌ์์ค ํ์ฉ๋๋ฅผ ๋์ด๊ณ ๋น์ฉ์ ์ค์ด๋ ๋ฐฉ๋ฒ์ ์ ๊ณตํ๋ค.
- Configuration ํ์ผ์ ์คํ ์ค์ธ ์๋น์ค์ ๋์ ์ผ๋ก ๋ฐ์
- ์๋น์ค ๋์ค์ปค๋ฒ๋ฆฌ, ๋ก๋ ๋ฐธ๋ฐ์ฑ, ์๋ ํฌ๊ธฐ ์กฐ์ ๋ฑ์ ๊ธฐ๋ฅ์ ์ ๊ณต
- Borg์์ ๋ช๊ฐ์ง ๊ธฐ๋ฅ ๊ฐ์ ์ ํด์ ๋ง๋ฌ
- ํด๋ฌ์คํฐ ์ํ์ ์ผ๊ด์ฑ์ ๋ถ์ฌํ๊ธฐ ์ํด ํด๋ฌ์คํฐ ์ํ๋ฅผ ์ ์ฅ ๊ธฐ๋ฅ์ ์ถ๊ฐ - ์๊ตฌ ์ ์ฅ์
- ๋๊ด์ ๋์์ฑ ์ ์ด ๋ฐฉ๋ฒ์ ์ด์ฉํ์ฌ ๋ฆฌ์์ค ์ถฉ๋์ ํด๊ฒฐํ๋ค.
- Borg, Omega์ ๋ฌ๋ฆฌ ์คํ ์์ค์ด๋ค.
- ๊ตฌ๊ธ ํผ๋ธ๋ฆญ ํด๋ผ์ฐ๋ ์ธํ๋ผ ์ฌ์ ์ ์ฑ์ฅ์ํค๊ธฐ ์ํด ์ค๊ณํ๊ณ ๊ฐ๋ฐ
- Omega์ฒ๋ผ ๋ฆฌ์์ค ๋ณ๊ฒฝ ์ฌํญ์ ์ ์ฅํ๊ธฐ ์ํ ๊ณต์ ์๊ตฌ ์ ์ฅ์๊ฐ ์๋ค
- Omega๋ ์๊ตฌ ์ ์ฅ์๋ฅผ ์ ๋ขฐํ ์ ์๋ ๊ตฌ์ฑ์์๋ค์ด ์ง์ ์ ๊ทผํ ์ ์๋๋ก ๊ฐ๋ฐฉ ํ์ง๋ง, ์ฟ ๋ฒ๋คํฐ์ค๋ ๋ ๋์ ์์ค์ ์ถ์ํ๋ฅผ ์ํด REST API๋ฅผ ํตํด์๋ง ์ ๊ทผํ ์ ์๋๋ก ๋ณ๊ฒฝํ์๋ค.
- ํด๋ฌ์คํฐ์์ ์คํ๋๋ ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ฐ๋ฐํ๋ ๊ฐ๋ฐ์์ ๊ฒฝํ์ ๋ ์ค์ ์ ๋๊ณ ๊ฐ๋ฐํ๋ค.
- ์ฃผ์ ์ค๊ณ ๋ชฉํ -> ์ปจํ ์ด๋๋ก ํฅ์๋ ๋ฆฌ์์ค ํ์ฉ์ ์ด์ ์ ๋๋ฆฌ๋ฉด์๋ ๋ณต์กํ ๋ถ์ฐ ์์คํ ์ ์ฝ๊ฒ ๋ฐฐํฌํ๊ณ ๊ด๋ฆฌํ ์ ์๋๋ก ํ๋๊ฒ
- ์ฌ๋ฌ๊ฐ์ ์ปจํ ์ด๋ํ๋ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ฌ๋ฌ ์๋ฒ(์ฟ ๋ฒ๋คํฐ์ค ํด๋ฌ์คํฐ)์ ์๋์ผ๋ก ๋ฐฐํฌ, ์ค์ผ์ผ๋ง ๋ฐ ๊ด๋ฆฌํด์ฃผ๋ ์คํ์์ค ์์คํ
- ํด๋ฌ์คํฐ: ์ฌ๋ฌ ๊ฐ์ ์๋ฒ๋ฅผ ํ๋๋ก ๋ฌถ์ ์งํฉ, ํ๋์ ์๋ฒ์ฒ๋ผ ๋์
- ์ฟ ๋ฒ๋คํฐ์ค ํด๋ฌ์คํฐ: ์ ํ๋ฆฌ์ผ์ด์ ์ปจํ ์ด๋๋ฅผ ๋ฐฐํฌํ๊ธฐ ์ํ ์๋ฒ ์งํฉ
- ์ฟ ๋ฒ๋คํฐ์ค ํด๋ฌ์คํฐ ์์๋ Master node์ Worker node๊ฐ ์๋ค.
- Master node: worker node๋ค์ ๋์ฅ ์ญํ
- Worker node: ์ปจํ ์ด๋๋ฅผ ์คํ์ํค๋ ๋ ธ๋
- ํด๋ฌ์คํฐ์ ์ํ๋ฅผ ์ ์ฅํ๊ณ ๊ด๋ฆฌ
- 4๊ฐ์ง ๊ตฌ์ฑ ์์
- etcd(key-value data store): ํด๋ฌ์คํฐ์ ๋ฐฐํฌ๋ ์ ํ๋ฆฌ์ผ์ด์ ์คํ ์ ๋ณด๋ฅผ ์ ์ฅ
- API Server: ํด๋ฌ์คํฐ ์ํ ์กฐํ, ๋ณ๊ฒฝ์ ์ํ API ์ธํฐํ์ด์ค ์ ๊ณต
- Scheduler: ๋ ธ๋๋ฅผ ์ ํํ๊ธฐ ์ํ ์ค์ผ์ฅด๋ง์ ๋ด๋น
- Controller Managers: ์ค์ ๋ก ์ฌ์ฉ์๊ฐ ์์ฒญํ ์ปจํ ์ด๋์ ๊ฐ์๋ ์ํ๋ค์ด ์ ์ด์๋๊ณ ์๋ ์ง๋ฅผ ๊ฐ์ํ๊ณ , ์ผ์นํ์ง ์์ผ๋ฉด API Server์ ์ถ๊ฐ์ ์ธ ๋ฆฌ์์ค๋ฅผ ์์ฒญํ๋ ์ญํ ์ ํจ
- ๋ชจ๋ ์ํ์ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅ
- ๋ถ์ฐ ์์คํ ์ผ๋ก ๊ตฌ์ฑํ์ฌ ์์ ์ฑ์ ๋์ (๊ณ ๊ฐ์ฉ์ฑ)
- ๊ฐ๋ณ๊ณ ๋น ๋ฅด๋ฉด์ ์ ํํ๊ฒ ์ค๊ณ (์ผ๊ด์ฑ)
- Key(directory)-Value ํํ๋ก ๋ฐ์ดํฐ ์ ์ฅ
- TTL(time to live), watch๊ฐ์ ๋ถ๊ฐ ๊ธฐ๋ฅ ์ ๊ณต
- ๋ฐฑ์ ์ ํ์!
- ์ํ๋ฅผ ๋ฐ๊พธ๊ฑฐ๋ ์กฐํ
- etcd์ ์ ์ผํ๊ฒ ํต์ ํ๋ ๋ชจ๋
- REST API ํํ๋ก ์ ๊ณต
- ๊ถํ์ ์ฒดํฌํ์ฌ ์ ์ ํ ๊ถํ์ด ์์ ๊ฒฝ์ฐ ์์ฒญ์ ์ฐจ๋จ
- ๊ด๋ฆฌ์ ์์ฒญ ๋ฟ ์๋๋ผ ๋ค์ํ ๋ด๋ถ ๋ชจ๋๊ณผ ํต์
- ์ํ์ผ๋ก ํ์ฅ๋๋๋ก ๋์์ธ
- ์๋ก ์์ฑ๋ Pod์ ๊ฐ์งํ๊ณ ์คํํ ๋ ธ๋๋ฅผ ์ ํ
- ๋
ธ๋์ ํ์ฌ ์ํ์ Pod์ ์๊ตฌ์ฌํญ์ ์ฒดํฌ
- ๋ ธ๋์ ๋ผ๋ฒจ์ ๋ถ์ฌ
- ex) a-zone, b-zone ๋๋ gpu-enabled, ...
- ๋
ผ๋ฆฌ์ ์ผ๋ก ๋ค์ํ ์ปจํธ๋กค๋ฌ๊ฐ ์กด์ฌ
- ๋ณต์ ์ปจํธ๋กค๋ฌ
- ๋ ธ๋ ์ปจํธ๋กค๋ฌ
- ์๋ํฌ์ธํธ ์ปจํธ๋กค๋ฌ...
- ๋์ ์์ด ์ํ๋ฅผ ์ฒดํฌํ๊ณ ์ํ๋ ์ํ๋ฅผ ์ ์ง
- ๋ณต์ก์ฑ์ ๋ฎ์ถ๊ธฐ ์ํด ํ๋์ ํ๋ก์ธ์ค๋ก ์คํ
- ์ปจํ ์ด๋ ์คํ์ ๋ด๋น
- Kubelet, Container Runtime (Docker, ...) ๋ฑ์ด ๋ด๊ฒจ์ ธ ์๋ค.
- kube-proxy: ์์ปค ๋ ธ๋๋ค๋ก ๋ค์ด์ค๋ ํธ๋ํฝ์ pod๋ก ์ ๋ฌํ๊ธฐ ์ํด์ kube-proxy ํ๋ก์ธ์ค๋ ์คํ๋๊ณ ์๋ค.
- ์ฟ ๋ฒ๋คํฐ์ค ์ค๋ธ์ ํธ Manifest ํ์ผ์ ์์ฑํด์, ๋ง์คํฐ ๋ ธ๋์ ์๋ API Server์๊ฒ ์์ฒญ์ ๋ณด๋ด๋ ํ์
- ์ฟ ๋ฒ๋คํฐ์ค ์ค๋ธ์ ํธ๋ฅผ ์์ฑํ๊ธฐ ์ํ ํ์ ์ ๋ณด
- "์ผ์ ์ํค๊ธฐ ์ํ ์ง์์"
- ์ฌ์ฉ์๊ฐ kubectl์ ํตํด์ API Server์ HTTP POST request๋ฅผ ์์ฒญํจ
- ์์ฒญ์ ๋ฐ์ API Server๋ etcd์ ์ํ๋ฅผ ์ ์ฅํ๋ค.
- Controller Managers๊ฐ ์ ๊ท ๋ฆฌ์์ค Event๋ฅผ ๋ฐ์, ์ถ๊ฐ ๋ฆฌ์์ค๋ฅผ ์์ฑํ๋ ์์ฒญ์ API Server๋ก ๋ณด๋ธ๋ค.
- API๊ฐ pod ์์ฑ ์์ฒญ์ ๋ฐ๊ฒ ๋๊ณ , pod์ ๋ํ ์ค์ ์ ๋ณด๋ฅผ etcd์ ์ ์ฅํ๋ค.
- Scheduler๊ฐ ๋ ธ๋์ ๋ฐฐํฌ ๋์ง ์์ pod๋ฅผ ์ฝ์ด์ค๊ณ , ๋ ธ๋์ ์ํ๋ฅผ ๋ณด๊ณ pod๊ฐ ๋ฐฐํฌ๋ ๋ ํ์ํ ๋ฆฌ์์ค๋ฅผ ๋ณด๊ณ ๊ทธ ๋ฆฌ์์ค์ ์ ํฉํ ์ต์ ์ ๋ ธ๋๋ฅผ ํ๋ ์ ํํ์ฌ ๋ ธ๋ ์ ๋ณด๋ฅผ pod์ ๋ณด์ ์ถ๊ฐํด์ API Server๋ก ์ ์กํ๋ค.
- API Server๋ ๊ทธ ์ ๋ณด๋ฅผ etcd์ ๊ธฐ๋กํ๋ค.
- Kubelet ํ๋ก์ธ์ค๊ฐ ๋ด๊ฐ ์คํ ์ค์ธ A๋ ธ๋์ ๋ฐฐํฌ ํด์ผ ํ pod๊ฐ ์๊ตฌ๋์ ๋ํ event๋ฅผ ๋ฐ์, docker์๊ฒ ์ปจํ ์ด๋ ์คํ ๋ช ๋ น์ ๋ณด๋ด๊ณ docker๊ฐ ์ปจํ ์ด๋ ์์ฑ ๋ฐ ์คํํ๋ค.
- Kubelet์ ์ง์์ ์ผ๋ก ๋์ปค ์ปจํ ์ด๋์ ํฌ์ค์ฒดํฌ๋ฅผ ํ๊ณ , ์ปจํ ์ด๋๊ฐ ์ ์์ ์ด์ง ์๋ค๋ฉด API์๋ฒ์ ๋ณด๊ณ ๋ฅผํ๊ณ API Server๋ etcd์ ์ ์ฅํ๋ค.
- Kubelet์ ๋ง์ฝ ๋์ปค ์ปจํ ์ด๋์ ์ํ๊ฐ ์ข์ง ์์ผ๋ฉด ์ฌ์์ํ๊ธฐ๋ ํ๋ค.
์๋ํฌ์ธํธ ์ถ๊ฐ ์๋๋ฆฌ์ค
- API Server๋ฅผ ํตํด์ ์๋ํฌ์ธํธ๊ฐ ์ถ๊ฐ๊ฐ ๋จ
- ์ด๋ค pod์ ip๋ค์ด ํ ๋น์ด ๋๊ธฐ ์ํด์ kube-proxy๊ฐ ๊ฐ์๋ฅผ ํด์ ์์ ์ worker node์ ์๋ iptable์ ์ ๋ฐ์ดํธ ํ๋ค.
ํด๋ผ์ด์ธํธ ์์ฒญ ์๋๋ฆฌ์ค
- kube-proxy๊ฐ ์์ปค๋ ธ๋๋ก ์๋ก์ด ํธ๋ํฝ์ด ๋ค์ด ์์ ๋ iptables๋ฅผ ๋ณด๊ณ ํด๋ผ์ด์ธํธ ์์ฒญ์ ๋ชฉ์ ์ง๋ก ์ฐ๊ฒฐ์ ์ง์ํ๋ค.
- ์ฟ ๋ฒ๋คํฐ์ค ํด๋ฌ์คํฐ๋ฅผ ์ด์ฉํด ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ฐฐํฌํ๊ณ ์ด์ํ๊ธฐ ์ํด ํ์ํ ๋ชจ๋ ์ฟ ๋ฒ๋คํฐ์ค ๋ฆฌ์์ค
- ์ฌ์ฉ์ ์๋๋ฅผ ์ ์ํ๋ ๋ฐฉ๋ฒ
- ํํ ๋ฐฉ์: YAML
- ์ ๋ฌ ๋ฐฉ์: REST API
- ์ค๋ธ์ ํธ ์ข ๋ฅ์ ๋ฐ๋ผ ์ ์ํ ์ ์๋ ์์ฑ์ด ๋ฌ๋ผ์ง๋ค.
- ์ฟ ๋ฒ๋คํฐ์ค ์ค๋ธ์ ํธ๋ ํด๋ฌ์คํฐ ์ํ๋ฅผ ๊ฒฐ์ ํ๋ค.
- ์ฌ์ฉ์๊ฐ ์ด๋ป๊ฒ ์ฟ ๋ฒ๋คํฐ์ค ์ค๋ธ์ ํธ๋ฅผ ์ ์ํ๋๋์ ๋ฐ๋ผ ์ฟ ๋ฒ๋คํฐ์ค ์ํ๊ฐ ๊ฒฐ์ ๋๋ค.
- ์ฟ ๋ฒ๋คํฐ์ค ์ค๋ธ์ ํธ๋ฅผ ์ด์ฉํด์ ๊ฐ๋ฐํ์ ๊ตฌ์กฐ, ๋ฐฐํฌ ์ ์ฑ , ํ๋ก์ธ์ค๋ฅผ ํํํ ์ ์๋ค.
์ฟ ๋ฒ๋คํฐ์ค ์ค๋ธ์ ํธ๊ฐ ๋ ์ ์๋ ๊ฒ (ํด๋ฌ์คํฐ์ ์ํ๋ฅผ ํํํ๋ ๊ฐ์ฒด๋ค)
- Pod: ์ด๋ค ์ ํ๋ฆฌ์ผ์ด์ ์
- ReplicaSet: ์ผ๋ง๋
- Node, Namespace: ์ด๋์
- Deployment: ์ด๋ค ๋ฐฉ์์ผ๋ก ๋ฐฐํฌํ ๊ฒ์ธ๊ฐ
- Service, Endpoints: ํธ๋ํฝ์ ์ด๋ป๊ฒ ๋ก๋๋ฐธ๋ฐ์ฑ ํ ๊ฒ์ธ๊ฐ
- ์ค๋ธ์ ํธ ๊ธฐ๋ณธ ์ ๋ณด (ํ์ ๊ฐ)
- apiVersion: ์ค๋ธ์ ํธ๋ฅผ ์์ฑํ ๋ ์ฌ์ฉํ๋ API ๋ฒ์
- kind: ์์ฑํ๊ณ ์ ํ๋ ์ค๋ธ์ ํธ ์ข ๋ฅ
- metadata: ์ค๋ธ์ ํธ๋ฅผ ๊ตฌ๋ถ ์ง์ ์ ์๋ ์ ๋ณด (name, resourceVersion, labels, namespace, ...)
- spec: ์ฌ์ฉ์๊ฐ ์ํ๋ ์ค๋ธ์ ํธ ์ํ (์ ์ธํ ์ ์๋ ์์ฑ์ ์ค๋ธ์ ํธ ์ข ๋ฅ๋ง๋ค ๋ค๋ฅด๋ค.)
- status
- ์ค๋ธ์ ํธ๊ฐ ์ฟ ๋ฒ๋คํฐ์ค ํด๋ฌ์คํฐ์ ์์ฑ๋๋ฉด, ์ฟ ๋ฒ๋คํฐ์ค๋ ์ค๋ธ์ ํธ ์ ๋ณด์ status ํ๋๋ฅผ ์ถ๊ฐํ๋ค.
- ํ์ฌ ์คํ ์ค์ธ ์ค๋ธ์ ํธ์ ์ํ ์ ๋ณด๋ฅผ ๋ํ๋ธ๋ค.
- ์ฌ์ฉ์๊ฐ ์ฟ ๋ฒ๋คํฐ์ค ์ค๋ธ์ ํธ YAML ํ์ผ์ ์์ฑ (spec ์์ฑ)
- ์ฟ ๋ฒ๋คํฐ์ค API๋ฅผ ์ด์ฉํด์ ์ฟ ๋ฒ๋คํฐ์ค ์์ฑ์ ์์ฒญ
- ์ฟ ๋ฒ๋คํฐ์ค API Server๊ฐ ์ค๋ธ์ ํธ ํ์ผ์ spec ํ์ผ์ ์ฝ๊ณ ์ค๋ธ์ ํธ๋ฅผ ์์ฑ
- ์ฟ ๋ฒ๋คํฐ์ค ControllerManager๊ฐ spec๊ณผ status๋ฅผ ๋น๊ตํ๋ฉด์ ๊ณ์ ์กฐ์ ํ๊ณ ์ํ๋ฅผ ์ ๋ฐ์ดํธ ํ๋ค.
minikube start --driver docker
kubectl api-resources
kubectl explain <type>
kubectl explain deployment
(apiVersion, kind, metadata, spec, status)
kubectl explain <type>.<fieldName>[.<fieldName>]
kubectl explain pods.spec.containers
kubectl get nodes
kubectl apply -f <object-file-name>
kubectl apply -f deployment.yaml
kubectl get pods
kubectl scale -f <object-file-name> --replicas=#
kubectl scale -f deployment.yaml --replicas=3
kubectl diff -f <object-file-name>
kubectl diff -f deployment.yaml
kubectl edit <type>/<name>
kubectl edit deployment/nginx-deployment -> replicas๋ฅผ 4๋ก ๋ณ๊ฒฝ
kubectl port-forward <type>/<name> <local-port>:<container-port>
kubectl port-forward pod/nginx-deployment-74bfc88f4d-fkfjc 8080:80
kubectl attach <type>/<name> -c <container-name>
kubectl attach deployment/nginx-deployment -c nginx
kubectl logs <type>/<name> -c <container-name> -f
kubectl logs deployment/nginx-deployment -c nginx -f
brew install google-cloud-sdk
gcloud init
gcloud container clusters get-credentials <ํ๋ก์ ํธ ๋ช
> --zone us-central1-c --project <..>
vscode ํจํค์ง -> Kubernetes ์ค์น
- Pod์ ์ฌ๋ฌ ์ปจํ ์ด๋๋ฅผ ๊ฐ์ธ๊ณ ์๋ ์ฝฉ๊ป์ง๊ณผ ์ ์ฌํ๋ค.
- ๋ ธ๋์์ ์ปจํ ์ด๋๋ฅผ ์คํํ๊ธฐ ์ํ ๊ฐ์ฅ ๊ธฐ๋ณธ์ ์ธ ๋ฐฐํฌ ๋จ์
- ์ฌ๋ฌ ๋ ธ๋์ 1๊ฐ ์ด์์ Pod๋ฅผ ๋ถ์ฐ ๋ฐฐํฌ/์คํ ๊ฐ๋ฅ (Pod Replicas)
- Pod๋ฅผ ์์ฑํ ๋ ๋ ธ๋์์ ์ ์ผํ IP๋ฅผ ํ ๋น (์๋ฒ ๋ถ๋ฆฌ ํจ๊ณผ)
- Pod ๋ด๋ถ ์ปจํ ์ด๋ ๊ฐ์ localhost๋ก ํต์ ๊ฐ๋ฅ (ํฌํธ ์ถฉ๋์ ์ฃผ์ ํด์ผ ํ๋ค)
- Pod ์์์ ๋คํธ์ํฌ์ ๋ณผ๋ฅจ ๋ฑ ์์์ ๊ณต์
- ํด๋ฌ์คํฐ ์ธ๋ถ ํธ๋ํฝ์ ๋ฐ๊ธฐ ์ํด์๋ Service ํน์ Ingress ์ค๋ธ์ ํธ๊ฐ ํ์ํ๋ค.
- ๋จ ํ๋์ ๋ช ๋ น์ด๋ก ์ํ๋ ์๋งํผ Pod ์์ฑ
kubectl scal deployment orderapp --replicas=3
- Pod:Container = 1:1 or 1:N ๊ฒฐ์ => pod์ ์์ฑ๊ณผ ์ข ๋ฃ๊ฐ ๋น๋ฒํ๊ฒ ์ผ์ด๋์, ์๋ก ๋ค๋ฅธ ์ปจํ ์ด๋๋ฅผ ํ๋์ pod๋ก ๊ตฌ์ฑํ๊ธฐ๋ณด๋ค๋ 1:1๋ก ๊ตฌ์ฑํ๋๊ฒ ์ข๋ค.
- ์ปจํ
์ด๋๋ค์ ๋ผ์ดํ์ฌ์ดํด์ด ๊ฐ์๊ฐ?
- Pod ๋ผ์ดํ ์ฌ์ดํด = ์ปจํ ์ด๋๋ค์ ๋ผ์ดํ ์ฌ์ดํด
- ์ปจํ ์ด๋ A๊ฐ ์ข ๋ฃ ๋์์ ๋ ์ปจํ ์ด๋ B ์คํ์ด ์๋ฏธ๊ฐ ์๋๊ฐ
- ์ค์ผ์ผ๋ง ์๊ตฌ์ฌํญ์ด ๊ฐ์๊ฐ?
- ์น ์๋ฒ vs ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ๊ฐ์ด "ํธ๋ํฝ์ด ๋ง์ vs ๊ทธ๋ ์ง ์์" ๊ณผ ๊ฐ์ด ์๊ตฌ์ฌํญ์ด ๋ค๋ฅด๋ฉด ์ข์ง ์๋ค.
- ์ธํ๋ผ ํ์ฉ๋๊ฐ ๋ ๋์์ง๋ ๋ฐฉํฅ์ผ๋ก
- ์ฟ ๋ฒ๋คํฐ์ค๊ฐ ๋ ธ๋ ๋ฆฌ์์ค ๋ฑ ์ฌ๋ฌ ์ํ๋ฅผ ๊ณ ๋ คํ์ฌ Pod๋ฅผ ์ค์ผ์ฅด๋ง
Master Node: API Server, Replication Controller, Scheduler Worker Node: kubelet, docker
- API Server: ์ฌ์ฉ์๋ก๋ถํฐ pod ๋ฐฐํฌ ์์ฒญ์ ์๋ฝํ๋ค
- Replication Controller: Api Server๋ก ๋ถํฐ ์์ฒญ ๋ฐ์ ์ ๋งํผ Pod Replica๋ฅผ ์์ฑ ํ๋ค (pod desired state == current state)
- Scheduler: Api Server๋ก ๋ถํฐ ์ ๋ฌ ๋ฐ์ ์์ฒญ์ผ๋ก Pod๋ฅผ ๋ฐฐํฌํ ์ ์ ํ ๋ ธ๋๋ฅผ ์ ํํ๋ค (nodeselector)
- Kublet: Api Server๋ก ๋ถํฐ ์ ๋ฌ ๋ฐ์ ์์ฒญ์ผ๋ก docker์๊ฒ ์ด๋ฏธ์ง ๋ค์ด๋ก๋๋ฅผ ๋ช ๋ นํ๊ณ Pod ์คํ์ ์ค๋นํ๋ค. Pod ์ํ๋ฅผ ์ ๋ฐ์ดํธ ํ๋ค
- Docker: kublet๋ก ๋ถํฐ ์ ๋ฌ ๋ฐ์ ์์ฒญ์ผ๋ก ์ด๋ฏธ์ง๋ฅผ ๋ค์ด๋ก๋ํ๊ณ ์ปจํ ์ด๋๋ฅผ ์คํํ๋ค.
apiVersion: V1 # Kubernetes API ๋ฒ์
kind: Pod # ์ค๋ธ์ ํธ ํ์
metadata: # ์ค๋ธ์ ํธ๋ฅผ ์ ์ผํ๊ฒ ์๋ณํ๊ธฐ ์ํ ์ ๋ณด
name: kube-basic # ์ค๋ธ์ ํธ ์ด๋ฆ
labels: # ์ค๋ธ์ ํธ ์งํฉ์ ๊ตฌํ ๋ ์ฌ์ฉํ ์ด๋ฆํ
app: kube-basic
project: test-project
spec: # ์ฌ์ฉ์๊ฐ ์ํ๋ ์ค๋ธ์ ํธ์ ๋ฐ๋์งํ ์ํ
nodeSelector: # Pod๋ฅผ ๋ฐฐํฌํ ๋
ธ๋
containers: # Pod ์์์ ์คํํ ์ปจํ
์ด๋ ๋ชฉ๋ก
volumes: # ์ปจํ
์ด๋๊ฐ ์ฌ์ฉํ ์ ์๋ ๋ณผ๋ฅจ ๋ชฉ๋ก
spec:
nodeSelector: # Pod ๋ฐฐํฌ๋ฅผ ์ํ ๋
ธ๋ ์ ํ
gpu: "true" # ๋
ธ๋ ์งํฉ์ ๊ตฌํ๊ธฐ ์ํ ์๋ณ์ (key: value)
# ์ ๊ตฌ๋ฌธ์ ํด์: gpu ๊ฐ true์ธ ๋
ธ๋์๋ง ๋ฐฐํฌ๋ฅผ ํ๋ผ.
spec:
containers:
- name: kube-basic # ์ปจํ
์ด๋ ์ด๋ฆ
image: kube-basic: 1.0 # ๋์ปค ์ด๋ฏธ์ง ์ฃผ์
imagePullPolicy: "Always" # ๋์ปค ์ด๋ฏธ์ง ๋ค์ด๋ก๋ ์ ์ฑ
(Always/IfNotPresent/Never)
ports:
- containerPort: 80 # ํต์ ์ ์ฌ์ฉํ ์ปจํ
์ด๋ ํฌํธ
spec:
containers:
- name:kube-basic
image: kube-basic:1.0
env: # ์ปจํ
์ด๋์ ์ค์ ํ ํ๊ฒฝ๋ณ์ ๋ชฉ๋ก
- name: PROFILE # ํ๊ฒฝ ๋ณ์ ์ด๋ฆ
value: production # ํ๊ฒฝ ๋ณ์ ๊ฐ
- name: LOG_DIRECTORY
value: /logs
- name: MESSAGE
value: This application is running on $(PROFILE) # ๋ค๋ฅธ ํ๊ฒฝ๋ณ์ ์ฐธ์กฐ
spec:
containers:
- name: kube-basic
image: kube-basic:1.0
volumeMounts: # ์ปจํ
์ด๋์์ ์ฌ์ฉํ Pod ๋ณผ๋ฅจ ๋ชฉ๋ก
- name: html # Pod ๋ณผ๋ฅจ ์ด๋ฆ
mountPath: /var/html # ๋ง์ดํธํ ์ปจํ
์ด๋ ๊ฒฝ๋ก
- name: web-server
image: nginx
volumeMounts:
- name: html
mountPath: /usr/share/nginx/html # ๊ฐ์ Pod ๋ณผ๋ฅจ์ ๋ค๋ฅธ ๊ฒฝ๋ก๋ก ๋ง์ดํธ
readOnly: true
spec:
containers:
volumes: # ์ปจํ
์ด๋๊ฐ ์ฌ์ฉํ ์ ์๋ ๋ณผ๋ฅจ ๋ชฉ๋ก
name: host-volume # ๋ณผ๋ฅจ ์ด๋ฆ
hostPath: # ๋ณผ๋ฅจ ํ์
, ๋
ธ๋์ ์๋ ํ์ผ์ด๋ ๋๋ ํ ๋ฆฌ๋ฅผ ๋ง์ดํธํ๊ณ ์ ํ ๋
path: /data/mysql
- Pod ๋ณผ๋ฅจ ๋ผ์ดํ์ฌ์ดํด = Pod ๋ผ์ดํ์ฌ์ดํด
- Container์์ ๋ณผ๋ฅจ ๋ง์ดํธ ๋ฐฉ๋ฒ: volumeMounts ์์ฑ
- ๋ชฉ์ ์ ๋ง๋ ๋ณผ๋ฅจ ์ ํ (hostPath, gitRepo, ConfigMap, Secret, ...)
- Pod์ด ๋๋ ๋ชจ๋ฅด๋ ์ฌ์ด์ ์ข ๋ฃ๋๋ค๋ฉด?
- ์๊ฐ ์น์ ๋ฅ๋ ฅ(Self-Healing)์ด ์๋ค. Pod์ด๋ ๋ ธ๋ ์ด์์ผ๋ก ์ข ๋ฃ๋๋ฉด ๋
- "์ฌ์ฉ์๊ฐ ์ ์ธํ ์๋งํผ Pod์ ์ ์ง" ํด์ฃผ๋ Replicaset ์ค๋ธ์ ํธ ๋์ ํ์
- Pod IP๋ ์ธ๋ถ์์ ์ ๊ทผํ ์ ์๋ค. ๊ทธ๋ฆฌ๊ณ ์์ฑํ ๋ ๋ง๋ค IP๊ฐ ๋ณ๊ฒฝ๋๋ค.
- ํด๋ฌ์คํฐ "์ธ๋ถ์์ ์ ๊ทผ"ํ ์ ์๋ "๊ณ ์ ์ ์ธ ๋จ์ผ ์๋ํฌ์ธํธ"๊ฐ ํ์
- Pod์ ์งํฉ์ ํด๋ฌ์คํฐ ์ธ๋ถ๋ก ๋ ธ์ถํ๊ธฐ ์ํ Service ์ค๋ธ์ ํธ ๋์ ํ์
Pod ์์ฑ๊ณผ ๋ฐฐํฌ
- Pod๋ ์ฌ๋ฌ ๊ฐ์ ์ปจํ ์ด๋๋ฅผ ํฌํจํ ์ ์๊ณ ํ๋์ ๋ ธ๋์ ๋ฐฐํฌ ๋ ์ ์๋ค.
- Pod๋ฅผ YAML ํ์ผ๋ก ์ ์ ํด๋๋ฉด ํ์ ํ ๋ ์ํ๋ ์ ๋งํผ ๋ ธ๋์ ๋ฐฐํฌํ ์ ์๋ค.
- Pod์ ์ปจํ ์ด๋๋ฅผ 1:1๋ก ๊ธฐ๋ณธ ์ค๊ณํ๊ณ ํน๋ณํ ์ฌ์ ๊ฐ ์์ ๋ 1:N ๊ตฌ์กฐ๋ฅผ ๊ณ ๋ฏผํ์.
Pod IP
- ์ฟ ๋ฒ๋คํฐ์ค๋ Pod๋ฅผ ์์ฑํ ๋ ํด๋ฌ์คํฐ ๋ด๋ถ์์๋ง ์ ๊ทผํ ์ ์๋ IP๋ฅผ ํ ๋นํ๋ค.
- Pod IP๋ ์ปจํ ์ด๋์ ๊ณต์ ๋๊ธฐ ๋๋ฌธ์ ์ปจํ ์ด๋๊ฐ ํฌํธ ์ถฉ๋์ ์ฃผ์ํด์ผ ํ๋ค.
- ํ๋์ Pod์ ์ํ ์ปจํ ์ด๋๋ค์ localhost๋ก ํต์ ํ ์ ์๋ค.
- ๋ค๋ฅธ Pod(์ปจํ ์ด๋)์ ํต์ ์ Pod IP๋ฅผ ์ด์ฉํ๋ค.
apiVersion: v1
kind: Pod
metadata:
name: hello-app
spec:
containers:
- name: hello-app
image: devchloe/hello-app:1.0
ports:
- containerPort: 3000
- env:
spec:
containers:
- env: hello-app
- name: STUDENT_NAME # ํ๊ฒฝ๋ณ์ ํค ์ ์ธ
value: ์ ๊ฒฝ๋ # ํ๊ฒฝ๋ณ์ ๊ฐ ์ ์ธ
- name: GREETING
value: ํ์ด $(STUDENT_NAME)๋
spec:
containers:
- env: hello-app
- name: NODE_NAME
valueFrom: # k8s ์ค๋ธ์ ํธ๋ก๋ถํฐ ํ๊ฒฝ๋ณ์ ๊ฐ์ ์ป๋๋ค.
fieldRef: # Pod spec, status์ field๋ฅผ ํ๊ฒฝ๋ณ์ ๊ฐ์ผ๋ก ์ฐธ์กฐ
fieldPath: spec.nodeName # ์ฐธ์กฐํ field์ ๊ฒฝ๋ก ์ ํ
- name: NODE_IP
valueFrom:
fieldRef:
fieldPath: status.hostIP
# ์๊ตฌ์ฌํญ!
# Pod API ๋ฒ์ : v1
# Pod ์ด๋ฆ: hello-app
# Pod ๋ค์์คํ์ด์ค: default
# ์ปจํ
์ด๋ ์ด๋ฆ/ํฌํธ: hello-app(80)
# ๋์ปค ์ด๋ฏธ์ง: yoonjeong/hello-app:1.0
# ํ๊ฒฝ๋ณ์:
# -- POD_NAME(metadata.name), POD_IP(status.podIP)
# -- NAMESPACE_NAME(metadata.namespace)
# -- NODE_NAME(spec.nodeName), NODE_IP(status.hostIP)
# -- STUDENT_NAME(๋ณธ์ธ์ด๋ฆ), GREETING(STUDENT_NAME์ ์ฐธ์กฐํ ์ธ์ฟ๋ง)
apiVersion: v1
kind: Pod
metadata:
name: hello-app
spec:
containers:
- name: hello-app
image: nginx:latest
ports:
- containerPort: 80
env:
- name: POD_NAME
valueFrom:
fieldRef:
fieldPath: metadata.name
- name: POD_IP
valueFrom:
fieldRef:
fieldPath: status.podIP
- name: NAMESPACE_NAME
valueFrom:
fieldRef:
fieldPath: metadata.namespace
- name: NODE_NAME
valueFrom:
fieldRef:
fieldPath: spec.nodeName
- name: NODE_IP
valueFrom:
fieldRef:
fieldPath: status.hostIP
- name: STUDENT_NAME
value: ์ ๊ฒฝ๋
- name: GREETING
value: ์ฟ ๋ฒ๋คํฐ์ค ์
๋ฌธ ๊ฐ์์ ์ค์ ๊ฒ์ ํ์ํฉ๋๋ค. $(STUDENT_NAME)๋!
resources:
limits:
memory: "128Mi"
cpu: "100m"
๋ฐฐํฌ, ํ์ธ, ์ญ์ ๋ช ๋ น์ด
# ๋ฐฐํฌ
kubectl apply -f til-by-topic/kubernetes/3.Kubernetes์-Docker๋ก-ํ-๋ฒ์-๋๋ด๋-์ปจํ
์ด๋-๊ธฐ๋ฐ-MSA/ch2/hello-app.yaml
# Pod ์คํ ๋ฐ IP ํ์ธ
kubectl get pod -o wide
# ์ปจํ
์ด๋ ํ๊ฒฝ๋ณ์ ํ์ธ
kubectl exec hello-app -- env
# ์ปจํ
์ด๋ IP ํ์ธ
kubectl exec hello-app -- ifconfig eth0
# ์ปจํ
์ด๋ host ํ์ธ
kubectl exec hello-app -- cat /etc/hosts
# ์ปจํ
์ด๋ ๋ฆฌ์ค๋ ํฌํธ ํ์ธ
kubectl exec hello-app -- netstat -an
# ํฌํธ ํฌ์๋ฉ
kubectl port-forward hello-app 5000:80
# or kubectl delete pod <pod-name> -> Pod ์ข
๋ฃ
kubectl delete pod --all
# blue, green ๋ฐฐํฌ
kubectl apply -f til-by-topic/kubernetes/3.Kubernetes์-Docker๋ก-ํ-๋ฒ์-๋๋ด๋-์ปจํ
์ด๋-๊ธฐ๋ฐ-MSA/ch3/blue-green-app.yaml
# red ๋ฐฐํฌ
kubectl apply -f til-by-topic/kubernetes/3.Kubernetes์-Docker๋ก-ํ-๋ฒ์-๋๋ด๋-์ปจํ
์ด๋-๊ธฐ๋ฐ-MSA/ch3/red-app.yaml
# blue log ํ์ธ
kubectl logs blue-green-app -c blue-app
# ํ๊ฒฝ๋ณ์(POD_IP, NAMESPACE, NODE_NAME) ์กฐํ
kubectl exec blue-green-app -c blue-app -- printenv POD_IP NAMESPACE NODE_NAME
# blue-app ์ปจํ
์ด๋ -> green-app ์ปจํ
์ด๋ /tree, /hello ์์ฒญ ์คํ
kubectl exec blue-green-app -c blue-app -- curl -vs localhost:8081/tree
kubectl exec blue-green-app -c blue-app -- curl -vs localhost:8081/hello
# green-app ์ปจํ
์ด๋ -> blue-app ์ปจํ
์ด๋ /sky, /hello ์์ฒญ ์คํ
kubectl exec blue-green-app -c green-app -- curl -vs localhost:8080/sky
kubectl exec blue-green-app -c green-app -- curl -vs localhost:8080/hello
# red-app ip ์กฐํ
kubectl get pod/red-app -o jsonpath="{.status.podIP}"
# red_pod_ip ํ๊ฒฝ๋ณ์ ์ค์
export RED_POD_IP=$(kubectl get pod/red-app -o jsonpath="{.status.podIP}")
# blue-app ์ปจํ
์ด๋ -> red-app ์ปจํ
์ด๋ /rose, /hello ์์ฒญ ์คํ
kubectl exec blue-green-app -c blue-app -- curl -vs $RED_POD_IP:8080/rose
# ํฌํธํฌ์๋ฉ
kubectl port-forward blue-green-app 8080:8080
kubectl port-forward blue-green-app 8081:8081
kubectl port-forward red-app 8082:8080
# pod ์ข
๋ฃ
kubectl delete pod --all
- Label: ์ฟ ๋ฒ๋คํฐ์ค ์ค๋ธ์ ํธ๋ฅผ ์๋ณํ๊ธฐ ์ํ key/value ์์ ๋ฉํ์ ๋ณด
- ์ฟ ๋ฒ๋คํฐ์ค๋ฅผ ๋ ผ๋ฆฌ์ ์ธ ๊ทธ๋ฃน์ผ๋ก ๋๋๊ธฐ ์ํด ๋ถ์ด๋ ์ด๋ฆํ
- Selector: Label์ ์ด์ฉํด ์ฟ ๋ฒ๋คํฐ์ค ๋ฆฌ์์ค๋ฅผ ํํฐ๋งํ๊ณ ์ํ๋ ๋ฆฌ์์ค ์งํฉ์ ๊ตฌํ๊ธฐ ์ํ label query
- Label๋ฅผ ์ด์ฉํด ์ฟ ๋ฒ๋คํฐ์ค ๋ฆฌ์์ค๋ฅผ ์ ํํ๋ ๋ฐฉ๋ฒ
- ์) ํด๋ฌ์คํฐ์์ ์๋ก ๋ค๋ฅธ ํ์ ์๋ฐฑ๊ฐ Pod์ด ๋์์ ์คํ๋๊ณ ์๋ ์ํฉ์์ ์ฃผ๋ฌธ ํธ๋ํฝ์ ์ฃผ๋ฌธ Pod์ผ๋ก, ๋ฐฐ๋ฌ ํธ๋ํฝ์ ๋ฐฐ๋ฌ Pod์ผ๋ก ๋ผ์ฐํ ํด์ผ ํ ๋
- ์) ๋ฐฐ๋ฌ ํธ๋ํฝ์ด ์ฆ๊ฐ๋๋ ์ํฉ์์ ํด๋ฌ์คํฐ์์ ์คํ ์ค์ธ ๋ฐฐ๋ฌ ๊ด๋ จ Pod๋ค์ ์ํ ํ์ฅ ํด์ผ ํ ๋
- ์ฐ๋ฆฌ๊ฐ ์ด๋ค ๋ฆฌ์์ค๋ฅผ ์ ํํด์ ๋ช ๋ น์ ์คํํ๊ณ ์ ํ ๋
apiVersion: v1
kind: Pod
metadata:
name: my-pod
labels:
app: backend
version: v1
env: prod
kubectl get pod my-pod --show-labels
kubectl label pod my-pod app=backend
kubectl label pod my-pod version=v1 # ์์ฑ
kubectl label pod my-pod version=v2 --overwrite # ๋ณ๊ฒฝ
kubectl get pod/my-pod --label-columns app,env
kubectl get pod/my-pod -L app,env
kubectl label pod/my-pod app-
kubectl get <์ค๋ธ์ ํธ ํ์
> --selector <label query 1, ..., label query N>
kubectl get <์ค๋ธ์ ํธ ํ์
> -l <label query 1, ..., label query N>
label query: key=value
=
: ๊ฐ๋ค!=
: ๊ฐ์ง ์๋ค
kubectl get pod --selector env=prod
kubectl get pod --selector env!=prod
kubectl get pod --selector app=backend,env=prod
kubectl get pod --selector app!=backend,env=prod
in
: ์ํด ์๋ค, ํค๊ฐ ์กด์ฌํ๋คnotin
: ์ํด ์์ง ์๋ค, ํค๊ฐ ์กด์ฌํ์ง ์๋๋ค.
kubectl get pod --selector 'env in (dev,stage,prod)' # env์ dev,stage,prod ์
์ค ํ๋๋ผ๋ ํฌํจ๋๋ฉด ์ถ๋ ฅ
kubectl get pod --selector 'env notin (dev,stage,prod)' # env์ dev,stage,prod ์
๋ค ์๋๊ฒ์ ์ถ๋ ฅ
kubectl get pod --selector env # env ํค๊ฐ์ ๊ฐ์ง๊ณ ์๋ ๊ฒ์ ๋ชจ๋ ์ถ๋ ฅ
kubectl get pod --selector !env # env ํค๊ฐ์ ๊ฐ์ง๊ณ ์์ง ์๋ ๊ฒ์ ๋ชจ๋ ์ถ๋ ฅ
# -- group=nature ๋ ์ด๋ธ์ ๊ฐ์ง ๋ชจ๋ ํ๋ ์กฐํ
kubectl get pod --selector group=nature -L group,concept,element,position,version
# -- concept๊ฐ flower์ด๊ฑฐ๋ earth์ธ ๋ชจ๋ ํ๋ ์กฐํ
kubectl get pod --selector 'concept in (flower,earth)' -L group,concept,element,position,version
# -- concept ๋ ์ด๋ธ์ด ์๋ ๋ชจ๋ ํ๋ ์กฐํ (! ์ด์ฉ)
kubectl get pod --selector '!concept' -L group,concept,element,position,version
# -- concept ๋ ์ด๋ธ์ด ์๋ ๋ชจ๋ ํ๋ ์กฐํ (notin ์ด์ฉ)
kubectl get pod --selector 'concept notin (earth, flower)' -L group,concept,element,position,version
# -- ๋ฌผ์ ์ฃผ์ด์ผ ํ๋ group=nature ๋ ์ด๋ธ์ ๊ฐ์ง ๋ชจ๋ ํ๋ ์กฐํ (position=bottom)
kubectl get pod --selector group=nature,position=bottom -L group,concept,element,position,version
# -- ์์ด ๋ฟ์ง ์๋ group=nature ๋ ์ด๋ธ์ ๊ฐ์ง ํ๋์ IP ์กฐํ (position=top)
kubectl get pod --selector group=nature,position=top -L group,concept,element,position,version
kubectl get pod --selector group=nature,position!=bottom -L group,concept,element,position,version
kubectl get nodes --show-labels # ๋
ธ๋ ์กฐํ -> ๊ธฐ๋ณธ์ผ๋ก ์ค์ ๋ node 3๊ฐ๊ฐ ๋์ด.
kubectl get nodes # ๋ ์ด๋ธ ์์ด ์กฐํ
# ์ฒซ๋ฒ์งธ ์ธ๋ฒ์งธ ๋
ธ๋์ ๋ ์ด๋ธ ์ถ๊ฐ
kubectl label node gke-my-cluster-default-pool-3b91989a-56s9 gke-my-cluster-default-pool-3b91989a-xv16 soil=moist
# ๋๋ฒ์งธ ๋
ธ๋์ ๋ ์ด๋ธ ์ถ๊ฐ
kubectl label node gke-my-cluster-default-pool-3b91989a-bx9c soil=dry
# ๋ฐ์๋ label ์กฐํ
kubectl get node -L soil
# Pod ์์ฑ (kubectl run <pod-name> --labels="" --image= --port= --overrides='{"key": {"key": {"key": "value"}}}')
# apiVersion: v1
# kind: Pod
# metadata:
# name: tree-app-1
# labels:
# element: tree
# spec:
# nodeSelector:
# soil: moist
# containers:
# - name: tree-app
# image: yoonjeong/green-app:1.0
# ports:
# - containerPort: 8081
# pod 5๊ฐ ๋ฐฐํฌ
for i in {1..5};
do kubectl run tree-app-$i \
--labels="element=tree" \
--image=yoonjeong/green-app:1.0 \
--port=8081 \
--overrides='{ "spec": { "nodeSelector": {"soil": "moist"} } }';
done
# ๋ฐฐํฌ๋ pod ํ์ธ -> moist์๋ง ๋ฐฐํฌ๋๋์ง ํ์ธ.
kubectl get pod -o wide
# ์์ฑํ pod ์ ๊ฑฐ
kubectl delete pod -l element=tree
- replicaSet์ Pod ๋ณต์ ๋ณธ์ ์์ฑํ๊ณ ๊ด๋ฆฌํ๋ค.
- N๊ฐ์ Pod์ ์์ฑํ๊ธฐ ์ํด ์์ฑ ๋ช ๋ น์ N๋ฒ ์คํํ ํ์ ์๋ค.
- replicaSet ์ค๋ธ์ ํธ๋ฅผ ์ ์ํ๊ณ ์ํ๋ Pod์ ๊ฐ์๋ฅผ replicas ์์ฑ์ผ๋ก ์ ์ธํ๋ค.
- ํด๋ฌ์คํฐ ๊ด๋ฆฌ์ ๋์ Pod ์๊ฐ ๋ถ์กฑํ๊ฑฐ๋ ๋์น์ง ์๊ฒ Pod ์๋ฅผ ์กฐ์
- pod์ ๋ฌธ์ ๊ฐ ์๊ฒผ์ ๋, pod๋ ์ฆ์ ์ข ๋ฃ๋๊ณ ํด๋ผ์ด์ธํธ ์์ฒญ์ ์ฒ๋ฆฌํ ์ ์๋ค. (No Self-Healing)
- pod์ ๋ฌธ์ ๊ฐ ์๊ฒผ์ ๋, ํด๋ฌ์คํฐ ๊ด๋ฆฌ์๊ฐ 24/7 ๋์ Pod ์ํ๋ฅผ ๊ฐ์ํ๊ณ ์ ์ ๋ณต๊ตฌํด์ผ ํ๋ค
- N๊ฐ์ Pod์ ์คํํ๊ณ ์ํ ์ด์์ ๋๋นํ ํ์๊ฐ ์๋๋ฐ, ์ด๊ฒ์ replica set์ด ํด์ค๋ค.
- ์ํํธ์จ์ด๊ฐ ๋ด๊ฒฐํจ์ฑ์ ๊ฐ์ง๋ค. (fault tolerance)
- ์ํํธ์จ์ด๋ ํ๋์จ์ด ์คํจ๊ฐ ๋ฐ์ํ๋๋ผ๋ ์ํํธ์จ์ด๊ฐ ์ ์์ ์ธ ๊ธฐ๋ฅ์ ์ํํ ์ ์๊ฒ ํด์ค๋ค.
- ์ฌ๋์ ๊ฐ์ ์์ด ๋ด๊ฒฐํจ์ฑ์ ๊ฐ์ง ์ํํธ์จ์ด๋ฅผ ๊ตฌ์ฑํ๊ฒ ํด์ค๋ค.
- Pod/๋ ธ๋ ์ํ์ ๋ฐ๋ผ Pod์ ์๋ฅผ ์กฐ์ ํ ์ ์๋๋ก ReplicaSet์๊ฒ ์ญํ ์ ์์ํ๋ค.
- ReplicaSet์ ์ด์ฉํด์ Pod ๋ณต์ ๋ฐ ๋ณต๊ตฌ ์์ ์๋ํ
- ํด๋ฌ์คํฐ ๊ด๋ฆฌ์๋ ReplicaSet์ ๋ง๋ค์ด ํ์ํ Pod์ ๊ฐ์๋ฅผ k8s์๊ฒ ์ ์ธ
- ์ฟ ๋ฒ๋คํฐ์ค๊ฐ ReplicaSet ์์ฒญ์์ ์ ์ธ๋ replicas๋ฅผ ์ฝ๊ณ ๊ทธ ์๋งํผ Pod ์คํ์ ๋ณด์ฅ
apiVersion: apps/v1 # k8s api ๋ฒ์
kind: ReplicaSet # ์ค๋ธ์ ํธ ํ์
metadata: # ์ค๋ธ์ ํธ ์๋ณ ์ ๋ณด
name: blue-app-rs # ์ค๋ธ์ ํธ ์ด๋ฆ
labels: # ์ค๋ธ์ ํธ ์งํฉ์ ๊ตฌํ ๋ ์ฌ์ฉํ ์ด๋ฆํ
app: blue-app
spec: # ์ฌ์ฉ์๊ฐ ์ํ๋ Pod์ ๋ฐ๋์งํ ์ํ
selector: # ReplicaSet์ด ๊ด๋ฆฌํด์ผํ๋ Pod๋ฅผ ์ ํํ๊ธฐ ์ํ label query
matchLabels:
app: blue-app # Pod label query ์์ฑ
replicas: # ์คํํ๊ณ ์ ํ๋ Pod์ ๋ณต์ ๋ณธ ๊ฐ์ ์ ์ธ
template: # Pod ์คํ ์ ๋ณด - Pod Template๊ณผ ๋์ผ (metadata, spec, ...)
metadata:
labels:
app: blue-app # Replica Set selector์ ์ ์ํ label์ ํฌํจํด์ผ ํ๋ค
spec:
containers:
- name: blue-app
image: blue-app:1.0
- replicaSet์ ์ด์ฉํด์ Pod ๋ณต์ ๋ณธ(replicas)์ ์์ฑํ๊ณ ๊ด๋ฆฌํ๋ค
- ์ฌ๋ฌ ๋ ธ๋์ ๊ฑธ์ณ ๋ฐฐํฌ๋ Pod Up/Down ์ํ๋ฅผ ๊ฐ์ํ๊ณ replicas ์๋งํผ ์คํ์ ๋ณด์ฅํ๋ค
- replicaSet์ spec.selector.matchLabels๋ Pod Template ๋ถ๋ถ์ spec.template.metadata.labels์ ๊ฐ์์ผ ํ๋ค.
- spec.replicas๋ฅผ ์ค์ ํ์ง ์์ผ๋ฉด ๊ธฐ๋ณธ๊ฐ์ 1์ด๋ค.
spec:
selector:
matchLabels:
app: blue-app
replicas: 3
template:
metadata:
labels:
app: blue-app
spec:
containers:
- name: blue-app
image: 'yoonjeong/blue-app:1.0'
ports:
- containerPort: 8080
kubectl apply -f til-by-topic/kubernetes/3.Kubernetes์-Docker๋ก-ํ-๋ฒ์-๋๋ด๋-์ปจํ
์ด๋-๊ธฐ๋ฐ-MSA/ch4/replicaset.yaml # replicaSet ์์ฑ
kubectl get rs blue-replicaset -o wide # replicaset๊ณผ ๋ฐฐํฌ ์ด๋ฏธ์ง ํ์ธ
kubectl get pod -o wide # pod ๋ชฉ๋ก๊ณผ ๋ฐฐํฌ๋ ๋
ธ๋ ํ์ธ
kubectl describe rs blue-replicaset # replicaset์ pod ์์ฑ ๊ธฐ๋ก ํ์ธ
kubectl get events --sort-by=.metadata.creationTimestamp # replicaSet์ pod ์์ฑ ์ดํ ๊ณผ์ ํ์ธ
kubectl port-forward rs/blue-replicaset 8080:8080 # replicaSet ํ๋๋ก ํธ๋ํฝ ์ ๋ฌ
curl localhost:8080/sky
kubectl delete rs/blue-replicaset # ๋ ํ๋ฆฌ์นด์
์ญ์
kubectl apply -f blue-app.yaml # pod ์์ฑ
kubectl apply -f replicaset.yaml # ๋ ํ๋ฆฌ์นด์
์์ฑ, blue-app์ label๊ณผ ๋์ผํด์ผ๋จ.
kubectl describe rs blue-replicaset # 2๊ฐ๊ฐ ์์ฑ๋๊ฒ์ ํ์ธํ ์ ์์ -> 1๊ฐ pod๋ ์ด๋ฏธ ์์ฑํด์.
- pod ์ญ์ ํน์ ์ข
๋ฃ์
- pod ๊ฐ์๊ฐ ์ ์ธ๋ replicas์ ์ผ์นํ์ง ์์ผ๋ฉด ์๋ก์ด pod๋ฅผ ์์ฑํ์ฌ replicas๋ฅผ ๋ง์ถค
- ๋
ธ๋ ์คํจ ์
- up์ํ์ pod์ ๊ฐ์๊ฐ ๋ณ๊ฒฝ๋์์์ ์ธ์งํ๊ณ ์๋ก์ด pod๋ฅผ ๊ฑด๊ฐํ ๋ ธ๋์ ์์ฑํ์ฌ replicas๋ฅผ ๋ง์ถ๋ค.
kubectl delete rs blue-replicaset --cascade=orphan
kubectl scale rs/blue-replicaset --replicas 0
kubectl delete rs/blue-replicaset
kubectl get pod -w
kubectl get pod blue-replicaset-9k7zh -o jsonpath="{.metadata.ownerReferences[0].name}"
# ๊ฒฐ๊ณผ -> blue-replicaset
- ๋ณ๊ฒฝํด๋ ๊ธฐ์กด Pod์๋ ์ํฅ์ด ์๋ค.
- ReplicaSet์ ์ ์ธํ replicas ๊ฐ์ด ๋ณ๊ฒฝ ๋์์ ๊ฒฝ์ฐ์๋ง Pod์ ์๋ก ์์ฑํ๊ฑฐ๋ ์ ๊ฑฐํ๋ค.
- 3๊ฐ๋ฅผ ๋ฐฐํฌํ ์ํฉ์์, Pod Template์ ๋ณ๊ฒฝํ๊ณ Replicas๋ฅผ 4๊ฐ๋ก ๋ณ๊ฒฝํ๋ฉด, ๊ธฐ์กด Pod๋ค์ ๊ทธ๋๋ก ์๊ณ ์๋ก์ด Pod์๋ง ๋ณ๊ฒฝ๋ Template๊ฐ ์ ์ฉ๋์ด ๋ฐฐํฌ๋๋ค.
kubectl scle rs/<replicaset-name> --replicas <number of replicas>
- pod template ์ด๋ฏธ์ง ๋ณ๊ฒฝ์ ํตํด ๋กค๋ฐฑ์ ํ ์ ์๋ค.
- ์คํ ์ค์ธ Pod ์ฅ์ ์ ReplicaSet์ ์๋ก ์์ฑํ์ง ์๊ณ ์ด์ ๋ฒ์ ์ Pod๋ฅผ ๋ฐฐํฌํ ์ ์๋ค.
- Label์ ํตํ ๋กค๋ฐฑ
- ๊ธฐ์กด์ replicaSet์ผ๋ก image: my-app2.0 ์ผ๋ก 3๊ฐ๋ฅผ ๋ฐฐํฌํ ์ํฉ์ด๋ค.
- ๊ทธ 3๊ฐ๊ฐ ๋ชจ๋ ์ค๋ฅ๊ฐ ๋ฐ์ํด์ my-app1.0์ผ๋ก ๋กค๋ฐฑํด์ผ ํ๋ค.
-
- replicaSet์ Pod Template ์ด๋ฏธ์ง๋ฅผ 1.0์ผ๋ก ๋ณ๊ฒฝํ๋ค.
-
- ๊ธฐ์กด์ 2.0์ผ๋ก ๋ฐฐํฌ๋ Pod์ ๋ ์ด๋ธ์ ๋ณ๊ฒฝํ๋ค -> ReplicaSet selector๋ก๋ถํฐ ์ ์ธ
- ์ 1,2๋ฒ ๊ณผ์ ์ ๊ฑฐ์น๋ฉด replicaSet์ด ๊ด๋ฆฌํ๋ pod๊ฐ ์์ด์ก๋ค๋๊ฒ์ ์๊ณ ์๋กญ๊ฒ my-app1.0์ผ๋ก 3๊ฐ๋ฅผ ๋ฐฐํฌ ํ๊ฒ ๋๋ค.
- replicas ์ ์กฐ์ ์ ํตํ ๋กค๋ฐฑ
-
- kubectl scale rs myapp-replicaset --replicas 0
-
- replicaSet์ Pod Template ๋ณ๊ฒฝ (์ด๋ฏธ์ง๋ฅผ my-app2.0 -> my-app1.0์ผ๋ก ๋ณ๊ฒฝ)
-
- kubectl scale rs myapp-replicaset --replicas 3
-
kubectl set image rs/<replicaset-name> <container>=<image>
- replicaSet์ Pod ๋ณต์ ๊ธฐ๋ฅ์ ์ด์ฉํด ์ฌ๋ฌ ๊ฐ์ Pod๋ฅผ ํ ๋ฒ์ ์คํํ ์ ์๋ค.
- ์ ์ธํ replicas ์๋งํผ Pod ์คํ์ ๋ณด์ฅํ๋ค
- ReplicaSet์ด ์ด์์ ๋์ Pod ์ํ๋ฅผ 24/7 ๊ฐ์ํ๋ค
- Pod ์คํ ์ค์๋ replicas ์กฐ์ ์ด ์์ ๋กญ๋ค
- ๋กค๋ฐฑ์ ํ ๋ ์๋ก์ด ReplicaSet์ ๋ง๋ค์ด์ Pod ์ฌ๋ฐฐํฌ or Pod Template ๋ณ๊ฒฝ ํ ์ ์ฉํ ํ์์๋ ReplicaSet๊ณผ Pod๋ฅผ ์ ๊ฑฐํ๋ ๊ณผ์ ์ ๊ฑฐ์ณ์ผ ํ๋ค.
- ๋กค๋ฐฑ ํน์ ์๋ก์ด ๋ฒ์ ์ ๋ฐฐํฌํ ๋๋ง๋ค ์์ ๊ฐ์ ๊ณผ์ ์ ๋ฐ๋ณต์ ํด์ผํ๋ ๋ฒ๊ฑฐ๋ก์์ด ์๋ค.
- ๋ฐฐํฌํ ๋ ๋ฐ๋๋ ๋ถ๋ถ์ ๋ณดํต Pod Template ์ด๋ฏธ์ง์ด๋ค.
- Pod ๋ฐฐํฌ ์๋ํ๋ฅผ ์ํ ์ค๋ธ์ ํธ (ReplicaSet + ๋ฐฐํฌ์ ๋ต)
- ์๋ก์ด Pod์ ๋กค์์/๋กค๋ฐฑํ ๋ ReplicaSet ์์ฑ์ ๋์ ํด์ค๋ค. (Pod ๋ณต์ )
- ๋ค์ํ ๋ฐฐํฌ ์ ๋ต์ ์ ๊ณตํ๊ณ ์ด์ ํ๋์์ ์๋ก์ด ํ๋๋ก์ ์ ํ ์๋๋ฅผ ์ ์ดํ ์ ์๋ค.
- ์ด์ ๋ถํฐ๋ Pod๋ฅผ ๋ฐฐํฌํ ๋ ReplicaSet์ด ์๋ Deployment๋ฅผ ์ฌ์ฉํ๋ค.
apiVersion: apps/v1 # Kubernetes API ๋ฒ์
kind: Deployment # ์ค๋ธ์ ํธ ํ์
metadata: # ์ค๋ธ์ ํธ๋ฅผ ์ ์ผํ๊ฒ ์๋ณํ๊ธฐ ์ํ ์ ๋ณด
name: my-app # ์ค๋ธ์ ํธ ์ด๋ฆ
spec: # ์ฌ์ฉ์๊ฐ ์ํ๋ Pod์ ๋ฐ๋์งํ ์ํ
selector: # ReplicaSet์ ํตํด ๊ด๋ฆฌํ Pod๋ฅผ ์ ํํ๊ธฐ ์ํ label query
matchLabels:
app: my-app
replicas: 3 # ์คํํ๊ณ ์ ํ๋ Pod ๋ณต์ ๋ณธ ๊ฐ์ ์ ์ธ
template: # Pod ์คํ ์ ๋ณด - Pod Template๊ณผ ๋์ผ (metadata, spec, ...)
metadata:
labels:
app: my-app # selector์ ์ ์ํ label์ ํฌํจํด์ผ ํ๋ค
spec:
containers:
- name: my-app
image: my-app:1.0
- ๊ธฐ์กด์ Deployment๋ก 1.0์ด "ReplicaSetA"์์ 3๊ฐ์ pod๊ฐ ๋ฐฐํฌ๋ ์ํฉ
- 1.0->2.0 ์ ๋ฐ์ดํธ ์์ฒญ
- Deployment๊ฐ "ReplicaSetB"์์ 3๊ฐ์ 2.0๋ฒ์ ์ pod์ ํจ๊ป ๋ฐฐํฌ
- "ReplicaSetA"์ scale์ 0์ผ๋ก ์กฐ์
- "ReplicaSetA" ์ ๊ฑฐ
- ์ด์ Pod๋ฅผ ๋ชจ๋ ์ข ๋ฃํ๊ณ ์๋ก์ด Pod๋ฅผ replicas๋งํผ ์์ฑ
- pod๊ฐ ์๋ฌด๊ฒ๋ ์กด์ฌํ์ง ์๋ ๊ตฌ๊ฐ์ด ์๊ธธ ์ ๋ฐ์ ์๋ค.
- ์๋น์ค down time์ด ์์ ์ ๋ฐ์ ์๋ ๋ฐฉ๋ฒ
- ๊ฐ๋ฐ ๋จ๊ณ์์๋ ์ ์ฉํ์ง๋ง, ์๋น์ค ์ด์ ๋จ๊ณ์์๋ ์ ์ํ์ง ์๋ ๋ฐฉ๋ฒ
- ๋ชจ๋ ์ด์ Pod๊ฐ ์ข ๋ฃ๋ ๋ ๊น์ง, ์๋ก์ด Pod ์์ฑ๊ณผ ์ด์ Pod ์ข ๋ฃ๊ฐ ๋์์ ์ผ์ด๋๋ ๋ฐฉ์
- pod๊ฐ ์กด์ฌํ์ง ์๋ ๊ตฌ๊ฐ์ด ์์ผ๋ฏ๋ก service down time ์ด ๋ฐ์ํ์ง ์๋๋ค.
- ์๋ก ๋ค๋ฅธ ๋ฒ์ ์ด ์กด์ฌํ๊ธฐ ๋๋ฌธ์, ๊ธฐ์กด ๋ฒ์ ์ ์๋ต๊ณผ ์๋ก์ด ๋ฒ์ ์ ์๋ต์ด ํผํฉ๋ ์ ์๋ค.
- Recreate
- ์๋ก์ด ๋ฒ์ ์ ๋ฐฐํฌํ๊ธฐ ์ ์ ์ด์ ๋ฒ์ ์ด ์ฆ์ ์ข ๋ฃ
- ์ปจํ ์ด๋๊ฐ ์ ์์ ์ผ๋ก ์์๋๊ธฐ ์ ๊น์ง ์๋น์ค๋ฅผ ๋ชปํจ
- replicas ์๋งํผ์ ์ปดํจํ ๋ฆฌ์์ค ํ์
- ๊ฐ๋ฐ ๋จ๊ณ์์ ์ ์ฉ
- RollingUpdate
- ์๋ก์ด ๋ฒ์ ์ ๋ฐฐํฌํ๋ฉด์ ์ด์ ๋ฒ์ ์ ์ข ๋ฃ
- ์๋น์ค ๋ค์ด ํ์ ์ต์ํ
- ๋์์ ์คํ๋๋ Pod์ ๊ฐ์๊ฐ replicas๋ฅผ ๋๊ฒ ๋๋ฏ๋ก ์ปดํจํ ๋ฆฌ์์ค ๋ ๋ง์ด ํ์
- ๋กค๋ง ์ ๋ฐ์ดํธ๋ฅผ ์ํํ๋ ๋์ ์ ์งํ๊ณ ์ ํ๋ ์ต์ Pod์ ๋น์จ(์)๋ฅผ ์ง์ ํ ์ ์๋ค.
- ์ต์ Pod ์ ์ง ๋น์จ = 100 - maxUnavailable ๊ฐ
- ์) replicas: 10, maxUnavailable: 30%
- ์ด์ ๋ฒ์ ์ Pod๋ฅผ replicas ์์ ์ต๋ 30%๊น์ง ์ฆ์ Scale Down ํ ์ ์๋ค.
- replicas๋ฅผ 10์ผ๋ก ์ ์ธ ํ์ ๋, ์ด์ ๋ฒ์ ์ Pod๋ฅผ 3๊ฐ๊น์ง ์ฆ์ ์ข ๋ฃํ ์ ์๋ค.
- ์๋ก์ด ๋ฒ์ ์ Pod ์์ฑ๊ณผ ์ด์ ๋ฒ์ ์ Pod ์ข ๋ฃ๋ฅผ ์งํํ๋ฉด์ replicas ์์ 70% ์ด์์ Pod๋ฅผ ํญ์ Running ์ํ๋ก ์ ์งํด์ผ ํ๋ค.
- ๋กค๋ง ์ ๋ฐ์ดํธ๋ฅผ ์ํํ๋ ๋์ ํ์ฉํ ์ ์๋ ์ต๋ Pod์ ๋น์จ(์)๋ฅผ ์ง์ ํ ์ ์๋ค.
- ์ต๋ Pod ํ์ฉ ๋น์จ = maxSurge ๊ฐ
- ์) replicas: 10, maxSurge 30%
- ์๋ก์ด ๋ฒ์ ์ Pod๋ฅผ replicas ์์ ์ต๋ 30%๊น์ง ์ฆ์ Scale Up ํ ์ ์๋ค.
- ์๋ก์ด ๋ฒ์ ์ Pod๋ฅผ 3๊ฐ๊ฐ์ง ์ฆ์ ์์ฑํ ์ ์๋ค.
- ์๋ก์ด ๋ฒ์ ์ Pod ์์ฑ๊ณผ ์ด์ ๋ฒ์ ์ Pod ์ข ๋ฃ๋ฅผ ์งํํ๋ฉด์ ์ด Pod์ ์๊ฐ replicas์์ 130%๋ฅผ ๋์ง ์๋๋ก ์ ์งํด์ผ ํ๋ค.
- ์) replicas: 3, maxUnavailable: 1, maxSurge: 0
- ํ ์์ ์ ์์ ์ ์๋ ์ต์ Pod: 2
- ํ ์์ ์ ์์ ์ ์๋ ์ต๋ Pod: 3
- ์) replicas: 3, maxUnavailable: 1, maxSurge: 1
- ํ ์์ ์ ์์ ์ ์๋ ์ต์ Pod: 2
- ํ ์์ ์ ์์ ์ ์๋ ์ต๋ Pod: 4
- ์) replicas: 3, maxUnavailable: 1, maxSurge: 2
- ํ ์์ ์ ์์ ์ ์๋ ์ต์ Pod: 2 (replicas - maxUnavailable)
- ํ ์์ ์ ์์ ์ ์๋ ์ต๋ Pod: 5 (replicas + maxSurge)
- ๊ธฐ์กด์ ์คํ ์ค์ธ Pod๋ฅผ ์ผ์์ ์ ๊ฑฐํ๋ฉด ์๋ก์ด Pod๊ฐ ์์ฑ๋๊ธฐ๊น์ง ์๋น์ค ์ค๋จ์ด ๋ฐ์ํ ์ ์๋ค.
- ๋ชจ๋ Old Pod์ New Pod๋ก ์ ํํ๋๋ฐ ์๊ฐ์ ์ต์ํ ํ ์ ์๋ค.
- ์๋ก์ด Pod๋ฅผ replicas ์๋งํผ ๋ฏธ๋ฆฌ ๋ฐฐํฌํ๋ค๋ฉด ๋ฆฌ์์ค๊ฐ ๋ถ์กฑํ ์ ์๋ค. (์ฝ 2๋ฐฐ ๋ฆฌ์์ค ํ๋ณด ํ์)
- ๊ทธ๋์ maxUnavailable์ ์ด์ฉํด์ ์ต์ ์๋น์ค ์ด์์ ์ํฅ์ ์ฃผ์ง ์์ ๋งํผ ์ ์งํด์ผ ํ๋ Pod๋ฅผ ์ ์ธ ํด์ผ ํ๋ค.
- maxSurge๋ก ์ด๋ค ์์ ์ ๋์์ ์กด์ฌํ ์ ์๋ ์ต๋ Pod ์๋ฅผ ์ ์ธํ์ฌ ๋ฐฐํฌ ์๋๋ฅผ ์กฐ์ ํจ๊ณผ ๋์์ ๋ฆฌ์์ค๋ฅผ ์ ์ดํ ์ ์๋ค.
- ์ ์งํด์ผํ Pod ์์ ์ํ์ ๊ณผ ํํ์ ์ ์ฟ ๋ฒ๋คํฐ์ค์๊ฒ ์๋ฆฌ๊ธฐ ์ํ ์ต์ ์ด๋ค.
- Deployment๋ ๋กค์์ ํ์คํ ๋ฆฌ๋ฅผ Revision # ์ผ๋ก ๊ด๋ฆฌํ๋ค.
- Revision ํน์ ๋ฒํธ์ ๋ํด์ ๋ฐฐํฌ๋์๋ Pod Template ์ ๋ณด๋ฅผ ์กฐํ ํ ์ ์๋ค.
Pod Template:
Labels: app=my-app
version=v1
pod-template-hash=65464c57f5 # ๋ฒ์ ๋ง๋ค pod Template์ ํด์ ๊ฐ์ด ๊ฐ์ผ๋ฉด ๊ฐ์ pod Template์ผ๋ก ๋ฐฐํฌํ๋ค๋ ๊ฒ์ ์ ์ ์๋ค.
Annotations: kubernetes.io/change-cause: v1 ๋ฐฐํฌ
Containers:
my-app:
image: nginx: 1.16.1
Port: 80/TCP
- Revision #๋ฅผ ์ด์ฉํ ์์ฌ์ด ๋กค๋ฐฑ
kubectl rollout undo deployment <deployment-name> --to-revision=1 # ํ์ฌ๋ฒ์ ์ด 3์ธ ์ํฉ.
- ์๋ก์ด replicaSet์ ์์ฑํ์ง ์๋๋ค.
- ์ด๋ฏธ ์์ฑํ replicaSet์ด ์๋ก์ด Pod๋ฅผ 'desired - current' replicas๋งํผ ์ถ๊ฐ ์์ฑํ๋ค.
kubectl describe deployment <deployment-name>
kubectl get deployment -w
kubectl rollout status deployment <deployment-name>
kubectl scale deployment <deployment-name> --replicas=<number-of-pod>
kubectl descripbe rs <replicaset-name>
kubectl get rs -w
kubectl delete all -l <label-key>=<label-value>
apiVersion: apps/v1
kind: Deployment
metadata:
name: my-app
spec:
replicas: 2
selector:
matchLabels:
app: my-app
template:
metadata:
labels:
app: my-app
spec:
containers:
- name: my-app
image: yoonjeong/my-app:1.0
ports:
- containerPort: 8080
resources:
limits:
memory: "64Mi"
cpu: "50m"
kubectl apply -f til-by-topic/kubernetes/3.Kubernetes์-Docker๋ก-ํ-๋ฒ์-๋๋ด๋-์ปจํ
์ด๋-๊ธฐ๋ฐ-MSA/ch5/deployment.yaml # ๋ฐฐํฌ
kubectl describe deployment my-app # deployment ์ด๋ฒคํธ ํ์ธ
kubectl rollout status deployment/my-app # ๋ฐฐํฌ๊ฐ ์๋ฃ๋์๋์ง ํ์ธ
kubectl scale deployment my-app --replicas=5 # pod replicas ๋ณ๊ฒฝ
kubectl describe deployment my-app # deployment ์ด๋ฒคํธ ํ์ธ
kubectl port-forward deployment/my-app 8080:8080 # ํฌํธํฌ์๋ฉ
kubectl delete all -l app=my-app # pod, replicaSet ์ญ์ -> deployment๊ฐ ๋จ์์ ์๋กญ๊ฒ ๋ฐฐํฌ๋จ
kubectl delete deployment my-app # deployment ๊น์ง ๊ฐ์ด ์ ๊ฑฐ (pod, replicaSet ๋ชจ๋ ์ ๊ฑฐ )
- Deployment๊ฐ ์๋ก์ด ReplicaSet์ ์์ฑํ๋ค
- ์ด์ ReplicaSet์ ์์ ์ด ๊ด๋ฆฌํ๋ Pod๋ฅผ ๋ชจ๋ ์ ๊ฑฐ ํ๋ค.
- ์๋ก์ด ReplicaSet์ ์๋ก์ด Pod๋ฅผ replicas ์ ๋งํผ ์์ฑํ๋ค.
apiVersion: apps/v1
kind: Deployment
metadata:
name: my-app
labels:
app: my-app
spec:
replicas: 3
selector:
matchLabels:
app: my-app
template:
metadata:
labels:
app: my-app
project: fastcampus
env: production
spec:
containers:
- name: my-app
image: yoonjeong/my-app:1.0
ports:
- containerPort: 8080
resources:
limits:
memory: "64Mi"
cpu: "50m"
kubectl apply -f til-by-topic/kubernetes/3.Kubernetes์-Docker๋ก-ํ-๋ฒ์-๋๋ด๋-์ปจํ
์ด๋-๊ธฐ๋ฐ-MSA/ch6/deployment.yaml # ๋ฐฐํฌ
kubectl describe deployment my-app # deployment ์ด๋ฒคํธ ํ์ธ
kubectl rollout status deployment/my-app # ๋ฐฐํฌ๊ฐ ์๋ฃ๋์๋์ง ํ์ธ
kubectl set image deployment my-app my-app=yoonjeong/my-app:2.0 # ์ด๋ฏธ์ง ๋ณ๊ฒฝ / ํน์ label๋ณ๊ฒฝ ํน์ ์ถ๊ฐ ํ ์ฌ ๋ฐฐํฌ
kubectl describe rs/<old-replicaset-name> # old ReplicaSet์ Pod ์ด๋ฒคํธ
kubectl describe rs/<new-replicaset-name> # new ReplicaSet์ Pod ์ด๋ฒคํธ
kubectl port-forward deployment/my-app 8080:8080 # ํฌํธ ํฌ์๋ฉ
curl localhost:8080 # ์์ฒญ -> 2.0๋ฒ์ ์ผ๋ก ์ ํธ์ถ๋๋๊ฒ์ํ์ธ
kubectl delete all -l app=my-app # ๋ชจ๋ ๋ฆฌ์์ค ์ญ์
apiVersion: apps/v1
kind: Deployment
metadata:
name: my-app
labels:
app: my-app
spec:
replicas: 3
selector:
matchLabels:
app: my-app
strategy:
type: Recreate # Recreate ์ ๋ต
template:
metadata:
labels:
app: my-app
spec:
containers:
- name: my-app
image: yoonjeong/my-app:1.0
ports:
- containerPort: 8080
resources:
limits:
memory: "64Mi"
cpu: "50m"
kubectl get rs -w # ReplicaSet์ด ์์ฑํ Pod ์ํ ๋ณํ ํ์ธ
kubectl apply -f til-by-topic/kubernetes/3.Kubernetes์-Docker๋ก-ํ-๋ฒ์-๋๋ด๋-์ปจํ
์ด๋-๊ธฐ๋ฐ-MSA/ch7/recreate.yaml # ๋ฐฐํฌ
# recrea.yaml ํ์ผ์์ image: yoonjeong/my-app:2.0 ์ผ๋ก ๋ณ๊ฒฝ
kubectl apply -f til-by-topic/kubernetes/3.Kubernetes์-Docker๋ก-ํ-๋ฒ์-๋๋ด๋-์ปจํ
์ด๋-๊ธฐ๋ฐ-MSA/ch7/recreate.yaml # ์ฌ๋ฐฐํฌ
kubectl delete all -l app=my-app
apiVersion: apps/v1
kind: Deployment
metadata:
name: my-app
labels:
app: my-app
spec:
replicas: 5
selector:
matchLabels:
app: my-app
strategy:
type: RollingUpdate
rollingUpdate:
maxUnavailable: 2
maxSurge: 1
template:
metadata:
labels:
app: my-app
spec:
containers:
- name: my-app
image: yoonjeong/my-app:1.0
ports:
- containerPort: 8080
resources:
limits:
memory: "64Mi"
cpu: "50m"
kubectl get rs -w # ReplicaSet์ด ์์ฑํ Pod ์ํ ๋ณํ ํ์ธ
kubectl apply -f til-by-topic/kubernetes/3.Kubernetes์-Docker๋ก-ํ-๋ฒ์-๋๋ด๋-์ปจํ
์ด๋-๊ธฐ๋ฐ-MSA/ch8/rollingupdate.yaml # ๋ฐฐํฌ
# rollingupdate.yaml ํ์ผ์์ image: yoonjeong/my-app:2.0 ์ผ๋ก ๋ณ๊ฒฝ
kubectl apply -f til-by-topic/kubernetes/3.Kubernetes์-Docker๋ก-ํ-๋ฒ์-๋๋ด๋-์ปจํ
์ด๋-๊ธฐ๋ฐ-MSA/ch8/rollingupdate.yaml # ๋ณ๊ฒฝ์ฌํญ ๋ฐ์
kubectl delete all -l app=my-app
kubectl rollout history deployment/my-app
kubectl rollout history deployment/my-app --revision=2
kubectl rollout undo deployment/my-app # ์ง์ ๋ฒ์ ์ผ๋ก ๋กค๋ฐฑ
kubectl rollout undo deployment/my-app --to-revision=1 # 1 ๋ฒ์ ์ผ๋ก ๋กค๋ฐฑ
kubectl annotate deployment/my-app kubernetes.io/change-cause="image reverted to 1.0 for a few bugs"
apiVersion: apps/v1
kind: Deployment
metadata:
name: my-app
labels:
app: my-app
annotations:
"kubernetes.io/change-cause": "initial image 1.0"
spec:
replicas: 3
selector:
matchLabels:
app: my-app
strategy:
type: RollingUpdate
rollingUpdate:
maxUnavailable: 1
maxSurge: 1
template:
metadata:
labels:
app: my-app
project: fastcampus
env: production
spec:
containers:
- name: my-app
image: yoonjeong/my-app:1.0
ports:
- containerPort: 8080
resources:
limits:
memory: "64Mi"
cpu: "50m"
kubectl apply -f til-by-topic/kubernetes/3.Kubernetes์-Docker๋ก-ํ-๋ฒ์-๋๋ด๋-์ปจํ
์ด๋-๊ธฐ๋ฐ-MSA/ch9/rollback.yaml # ๋ฐฐํฌ
kubectl set image deployment/my-app my-app=yoonjeong/my-app:2.0 # ๋ฒ์ ๋ณ๊ฒฝ
kubectl get deployment my-app -o wide # ๋ฒ์ ํ์ธ
kubectl annotate deployment/my-app kubernetes.io/change-cause="image updated to 2.0" # ๋ฒ์ ๋ณ๊ฒฝ ์ฌ์ ๋จ๊ธฐ๊ธฐ
kubectl rollout history deployment/my-app # ๋ฒ์ ๋ฐ ์ฌ์ ํ์ธ
kubectl rollout undo deployment/my-app # ์ด์ ๋ฒ์ ์ผ๋ก ๋กค๋ฐฑ
kubectl annotate deployment/my-app kubernetes.io/change-cause="rollbacked to 1.0 for a few bugs" # ๋กค๋ฐฑ ์ฌ์ ๋จ๊ธฐ๊ธฐ
kubectl rollout history deployment/my-app # ๋ฒ์ ๋ฐ ์ฌ์ ํ์ธ
kubectl delete all -l app=my-app
- ๋ณ๊ฒฝ์ด ์ฆ์ Pod IP ๋ชฉ๋ก์ ์ํฅ์ ๋ฐ๋ ํ๋ ํด๋ผ์ด์ธํธ
- ํ๋ ํด๋ผ์ด์ธํธ๊ฐ ์ต์ ์ํ์ ๋ชจ๋ Pod IP๋ฅผ ์๊ณ ์์ด์ผ ํจ
- ํด๋ผ์ด์ธํธ๊ฐ ํน์ Pod IP๋ก ์คํ๋ผ์ธ ์ํ์ Pod์ ์ ๊ทผํ๋ค๋ฉด ์์ฒญ์ ์คํจํ๋ค.
- Pod IP๋ ํด๋ฌ์คํฐ ๋ด๋ถ์์๋ง ์ ๊ทผํ ์ ์๋ค.
- ํด๋ฌ์คํฐ ์ธ๋ถ์์ ์ ๊ทผํ ์ ์๋ ๋ฐฉ๋ฒ์ด ํ์ํ๋ค.
- kubectl port-forward ํ๋ก์ธ์ค๋ ๊ฐ๋ฐ ๋จ๊ณ์์๋ง ์ฌ์ฉํด์ผ ํ๋ค.
- ์์์ ์ค๋ช ํ Pod์ ํ๊ณ์ ๋ค์ ๊ทน๋ณตํ๊ธฐ ์ํด์ ํ์ํ ์ค๋ธ์ ํธ
- Service๋ ํ๋ ์ถ์ํ์ด๋ค == ํ๋๋ค์ ๋จ์ผ ์๋ํฌ์ธํธ + ๋ก๋๋ฐธ๋ฐ์ฑ
- ํ๋ ํด๋ผ์ด์ธํธ๋ Service IP:Port๋ฅผ ์ด์ฉํด์ ํ๋์ ํต์ ํ ์ ์๋ค.
- Service๋ Selector์ ์ํด ์ ํ๋ ํ๋ ์งํฉ ์ค ์์์ ํ๋๋ก ํธ๋ํฝ์ ์ ๋ฌํ๋ค.
apiVersion: v1
kind: Service
metadata:
name: order
namespace: snackbar
labels:
app: order
spec:
selector:
app: order # ์ ์
๋ ํธ๋ํฝ์ ์ ๋ฌํ ํ๋ ์งํฉ
ports:
- port: 80 # ๋
ธ์ถํ ์๋น์ค ํฌํธ
targetPort: 8080 # ์๋น์ค ํฌํธ์ ์ฐ๊ฒฐํ ์ปจํ
์ด๋ ํฌํธ, containerPort์ ์ผ์นํด์ผ ๋จ
- EndPoints: Service๊ฐ ๋ ธ์ถํ๋ Pod IP์ Port์ ์ต์ ๋ชฉ๋ก
- Service ๋ฆฌ์์ค๋ฅผ ์์ฑํ๋ฉด Service์ ๊ฐ์ ์ด๋ฆ์ผ๋ก Endpoints ๋ฆฌ์์ค๊ฐ ์์ฑ๋จ
- Service์ ์ ์ธํ Selector์ ํ๋ ์งํฉ์ด ๋ณ๊ฒฝ๋ ๋๋ง๋ค Endpoints ๋ชฉ๋ก๋ ์ ๋ฐ์ดํธ ๋๋ค
- Service๊ฐ ๋ฐ์ ํธ๋ํฝ์ Endpoints ์ค์ ํ๋๋ก ๋ฆฌ๋ค์ด๋ ํธ ํ๋ค.
- ์ปจํ ์ด๋ ํ๊ฒฝ๋ณ์์ ์ค์ ๋ Service IP์ Port๋ฅผ ์ด์ฉ
- Service ์ด๋ฆ์ผ๋ก DNS ์๋ฒ์ ์ง์ํ์ฌ Service IP๋ฅผ ์์๋ด๋ ๋ฐฉ๋ฒ
- ์ฟ ๋ฒ๋คํฐ์ค๊ฐ Pod๋ฅผ ์์ฑํ ๋ ์ปจํ ์ด๋ ํ๊ฒฝ๋ณ์์ ๋ชจ๋ Service IP์ Port๋ฅผ ์ถ๊ฐํ๋ค
- OOO_SERVICE_HOST, OOO_SERVICE_PORT
- ์ฃผ์1) Service๋ฅผ ํด๋ผ์ด์ธํธ Pod๋ณด๋ค ๋จผ์ ์์ฑํด์ผ ํ๋ค
- ์ฃผ์2) ๋ค๋ฅธ ๋ค์์คํ์ด์ค์ ์๋ Service ํ๊ฒฝ๋ณ์๋ ์ค์ ๋์ง ์๋๋ค.
- ์ฟ ๋ฒ๋คํฐ์ค๊ฐ DNS ์๋ฒ IP ์ฃผ์๋ฅผ ์ปจํ ์ด๋์ /etc/resolve.conf ํ์ผ์ ๋ฑ๋กํ๋ค
- Service ์ด๋ฆ์ผ๋ก ์์ฒญ์ ์คํํ๋ฉด DNS ์๋ฒ๋ก๋ถํฐ Service IP๋ฅผ ์กฐํํ ์ ์๋ค.
- ClusterIP, NodePort, LoadBalancer ํ์ ์ด ์๋ค.
- Service ํ์ ์ ๋ฐ๋ผ ํด๋ผ์ด์ธํธ๊ฐ Service์ ์ ๊ทผํ ์ ์๋ ๋ฐฉ์์ด ๋ฌ๋ผ์ง๋ค.
- LoadBalancer ํ์ ์ NodePort, ClusterIP ๊ธฐ๋ฅ์ ๋ชจ๋ ํฌํจํ๋ค.
- ๊ธฐ๋ณธ Service ํ์
- Pod IP ์ฒ๋ผ ์ธ๋ถ์์๋ ์ ๊ทผํ ์ ์๋ IP๋ฅผ ํ ๋น ๋ฐ๋๋ค
- Server IP๋ ํด๋ฌ์คํฐ ๋ด๋ถ ํต์ ์ฉ์ผ๋ก ์ฌ์ฉ๋๋ค.
- ๊ตณ์ด ์ธ๋ถ์ ๋ ธ์ถํ ํ์๊ฐ ์๋ ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ํด์ ์ฌ์ฉํ๋ฉด ์ข๋ค.
- ์ธ๋ถ์์ ์ ๊ทผํ ์ ์๋ External IP๊ฐ ์๋๋ผ NodePort๋ฅผ ํ ๋น ๋ฐ๋๋ค
- ํ ๋น๋ฐ์ ๋ ธ๋ Port๋ฅผ ํตํด ๋ค์ด์จ ํธ๋ํฝ์ ํ๋ ์งํฉ์ผ๋ก ํฌ์๋ฉํ๋ค (ํน์ ๋ ธ๋์ IP๋ก ํต์ ์ ํด์ผ๋จ)
- ํ๊ณ์
- ์ง์ ํ ๋ ธ๋๊ฐ ์ฌ์ฉํ ์ ์๋ ์ํ๋ผ๋ฉด -> ์๋จ์์ ๋ก๋๋ฐธ๋ฐ์๋ฅผ ์ด์ฉํด์ ๊ฑด๊ฐํ ์ํ์ ๋ ธ๋๋ก ํธ๋ํฝ์ ์ ๋ฌํ ์ ์๋๋ก ๋ง๋ค์ด์ผ๋จ.
- ํด๋ผ์ฐ๋ ์๋น์ค์ Load Balancer๋ฅผ ํ๋ก๋น์ ๋ํ๊ณ External IP๋ฅผ ํ ๋น ๋ฐ๋๋ค
- ํด๋ผ์ด์ธํธ๋ Load Balancer IP๋ฅผ ํตํด ํน์ ์๋น์ค๋ก ์ธ๋ถ ํธ๋ํฝ์ ํฌ์๋ฉํ ์ ์๋ค.
- ๋ด๋ถ์ ์ผ๋ก๋ Load Balancer์์ Node Port๋ฅผ ํตํด์ ์๋น์ค๋ก ์ฐ๊ฒฐ๋๋ ๊ตฌ์กฐ์ด๋ค.
- Service ๋ฆฌ์์ค๋ ํ๋ ์งํฉ์ ๋ํ ๋จ์ผ ์๋ํฌ์ธํธ๋ฅผ ์ ๊ณต
- ClusterIP Service๋ฅผ ์ด์ฉํด์ ํด๋ฌ์คํฐ ๋ด๋ถ Pod ๊ฐ ํต์ ์ ๋จ์ผ ์๋ํฌ์ธํธ๋ฅผ ๋ง๋ค ์ ์๋ค
- NodePort/LoadBalancer Service๋ฅผ ์ด์ฉํด์ ํด๋ฌ์คํฐ ์ธ๋ถ ํธ๋ํฝ์ Pod๋ก ์ ๋ฌํ ์ ์๋ค
- Pod ์์์๋ Service ์ด๋ฆ๊ณผ ๋ค์์คํ์ด์ค ์ด๋ฆ์ ์ด์ฉํด์ ๋ค๋ฅธ Pod์ ํต์ ํ ์ ์๋ค.
- ๊ฐ์ ๋ค์์คํ์ด์ค์ ์๋ Pod) :
- ๋ค๋ฅธ ๋ค์์คํ์ด์ค์ ์๋ Pod) :.
kubectl get all -n <namespace-name>
- ๋ง์ฝ Service IP๋ก ์์ฒญ์ ์คํจํ๋ค๋ฉด, Service EndPoints ๊ตฌ์ฑ์ ํ์ธํ๋ค.
kubectl get endpoints -n <namespace-name>
kubectl create namespace <namespace-name>
kubectl get svc <service-name> -o wide -n <namespace>
kubectl get svc <service-name> -o jsonpath="{.spec.clusterIP}" -n <namespace>
kubectl create namespace snackbar # ๋ค์์คํ์ด์ค ์์ฑ
kubectl apply -f til-by-topic/kubernetes/3.Kubernetes์-Docker๋ก-ํ-๋ฒ์-๋๋ด๋-์ปจํ
์ด๋-๊ธฐ๋ฐ-MSA/ch10/service.yaml # ๋ฐฐํฌ
kubectl get all -n snackbar # ๋ชจ๋ ๋ฆฌ์์ค ์กฐํ
kubectl get svc order -o wide -n snackbar # service ์์ธ ์กฐํ
kubectl get svc payment -o wide -n snackbar # service ์์ธ ์กฐํ
kubectl get endpoints -n snackbar # endpoints ์กฐํ
kubectl get pod -o wide -n snackbar # pod ์กฐํ
kubectl get svc order -o json -n snackbar # clusterIP ์กฐํ๋ฅผ ์ํ ์ ์ฒด ์กฐํ
kubectl get svc order -o jsonpath="{.spec.clusterIP}" -n snackbar # clusterIP ์กฐํ -> "10.80.9.122"
curl 10.80.9.122 # ์ฐ๊ฒฐ์๋จ -> clusterIP์ด๋ฏ๋ก ์ธ๋ถ์์ ์ ๊ทผ ๋ถ๊ฐ
kubectl port-forward service/order -n snackbar 8080:80 # ํฌํธํฌ์๋ฉ
kubectl exec <pod-name> -n <namespace> -- <cmd>
kubectl exec <pod-name> -n <namespace> -- env | grep <pattern>
kubectl create namespace snackbar # ๋ค์์คํ์ด์ค ์์ฑ
kubectl apply -f til-by-topic/kubernetes/3.Kubernetes์-Docker๋ก-ํ-๋ฒ์-๋๋ด๋-์ปจํ
์ด๋-๊ธฐ๋ฐ-MSA/ch10/service.yaml # ๋ฐฐํฌ
kubectl get all -n snackbar # ๋ชจ๋ ๋ฆฌ์์ค ์กฐํ
kubectl get pod -n snackbar # order pod ์กฐํ
# order ์ปจํ
์ด๋ ํ๊ฒฝ๋ณ์ ํ์ธ
kubectl exec order-5d45bf5796-8qr4n -n snackbar -- env | grep PAYMENT
# payment ์ปจํ
์ด๋ ํ๊ฒฝ๋ณ์ ํ์ธ
kubectl exec payment-646db46775-5fc9k -n snackbar -- env | grep ORDER
# snackbar ๋ค์์คํ์ด์ค์ ์๋ order ์ปจํ
์ด๋ ์ ์ ์
kubectl exec -it order-5d45bf5796-8qr4n -n snackbar -- sh
# payment Service ํ๊ฒฝ๋ณ์๋ฅผ ์ด์ฉํด order -> payment ํ๋ ์์ฒญ/์๋ต ํ์ธ
curl $PAYMENT_SERVICE_HOST:$PAYMENT_SERVICE_PORT
for i in `seq 1 10`; do curl -s $PAYMENT_SERVICE_HOST:$PAYMENT_SERVICE_PORT; done # payment ์๋น์ค์ ๋ก๋๋ฐธ๋ฐ์ฑ ํ์ธ
- order pod ์ปจํ ์ด๋ ์์ ์ค์ ๋์ด ์๋ nameserver๋ฅผ ์ด์ฉํด์ ์๋น์ค ์ด๋ฆ์ผ๋ก ์์ฒญ์ ์คํ ํ์ ๋, DNS ์๋ฒ๋ก๋ถํฐ ์๋น์ค IP๋ฅผ ์กฐํํด์ค๊ณ ์ค์ ๋ก payment pod๋ก ์์ฒญ์ด ๋๋ค.
- order pod ์์ payment pod๋ก ์์ฒญ์ ํ๊ฒ ๋๋ฉด ๋ค์ ์์๋ก ์งํ ๋๋ค.
- order ์ปจํ ์ด๋์ /etc/hosts, /etc/resolv.conf ํ์ผ ํ์ธ
- Service์ด๋ฆ 'payment'๋ก Payment ํธ์ถ, ์๋ต ํ์ธ
- ์ฟ ๋ฒ๋คํฐ์ค์์ ์ฌ์ฉํ๋ ๋๋ฉ์ธ ์ด๋ฆ ๊ท์น - FQDN(Fully Qualified Domain Name)
- FQDN == payment.snackbar.svc.cluster.local == ..svc.cluster.local
kubectl create namespace snackbar # ๋ค์์คํ์ด์ค ์์ฑ
kubectl apply -f til-by-topic/kubernetes/3.Kubernetes์-Docker๋ก-ํ-๋ฒ์-๋๋ด๋-์ปจํ
์ด๋-๊ธฐ๋ฐ-MSA/ch10/service.yaml # ๋ฐฐํฌ
kubectl get all -n snackbar # ๋ชจ๋ ๋ฆฌ์์ค ์กฐํ
kubectl exec order-5d45bf5796-8qr4n -n snackbar -- curl -s payment:80 # ์๋ต ์ฑ๊ณต ํ์ธ.
# ์ฌ๊ธฐ์๋ payment ๋๋ฉ์ธ์ด ๋ฑ๋ก๋์ง ์๋ค๋๊ฒ์ ํ์ธํ ์ ์๋ค. ๊ทธ๋์ dns๋ก ์กฐํํ๊ฒ ๋๋ค.
kubectl exec order-5d45bf5796-8qr4n -n snackbar -- cat /etc/hosts
# kubernetes์ dns ์๋ฒ ์กฐํ
kubectl get all -n kube-system | grep kube-dns # ClusterIP: 10.80.0.10
# nameserver ํ์ธ
kubectl exec order-5d45bf5796-8qr4n -n snackbar -- cat /etc/resolv.conf # nameserver 10.80.0.10 (์ฆ kubernetes dns๊ฐ ๋ฑ๋ก๋์ด์์)
kubectl exec -it order-5d45bf5796-8qr4n -n snackbar -- sh # order pod ์ ์
for i in `seq 1 10`; do curl -s payment:80; done # ๋ก๋ ๋ฐธ๋ฐ์ฑ ํ์ธ
curl payment.snackbar.svc.cluster.local # payment ์๋ต ํ์ธ
curl payment.snackbar # payment ์๋ต ํ์ธ
curl payment # payment ์๋ต ํ์ธ
kubectl get all -l project=snackbar --all-namespaces
kubectl get endpoints -l project=snackbar --all-namespaces
kubectl delete all -l project=snackbar --all-namespaces
- fancy-snackbar ๋ค์์คํ์ด์ค์ delivery Service์ Deployment ๋ฐฐํฌ
- order ์ปจํ ์ด๋์์ delivery ์๋น์ค์ ๋๋ฉ์ธ ์ด๋ฆ์ผ๋ก ์์ฒญ ์คํ
- order ์ปจํ ์ด๋์์ delivery ์๋น์ค ClusterIP๋ก ์์ฒญ ์คํ
- order ์ปจํ ์ด๋์์ ํ๊ฒฝ๋ณ์ ๋ชฉ๋ก ์กฐํ
kubectl create namespace snackbar # ๋ค์์คํ์ด์ค ์์ฑ
kubectl apply -f til-by-topic/kubernetes/3.Kubernetes์-Docker๋ก-ํ-๋ฒ์-๋๋ด๋-์ปจํ
์ด๋-๊ธฐ๋ฐ-MSA/ch10/service.yaml # ๋ฐฐํฌ
kubectl get all -n snackbar # ๋ชจ๋ ๋ฆฌ์์ค ์กฐํ
kubectl create namespace fancy-snackbar # ๋ค์์คํ์ด์ค ์์ฑ
kubectl apply -f til-by-topic/kubernetes/3.Kubernetes์-Docker๋ก-ํ-๋ฒ์-๋๋ด๋-์ปจํ
์ด๋-๊ธฐ๋ฐ-MSA/ch10/service2.yaml # ๋ฐฐํฌ
kubectl get all -l project=snackbar --all-namespaces # ๋ชจ๋ ๋ฆฌ์์ค ์กฐํ
kubectl get endpoints -l project=snackbar --all-namespaces # ์๋ํฌ์ธํธ ์กฐํ
kubectl get pod -n snackbar # ํ๋ ์กฐํ
kubectl get svc -n fancy-snackbar # cluster-ip ์กฐํ -> 10.80.0.32
kubectl exec order-5d45bf5796-8qr4n -n snackbar -- curl -s 10.80.0.32 # delivery pod ์์ฒญ ์ฑ๊ณต
kubectl exec order-5d45bf5796-8qr4n -n snackbar -- curl -s delivery.fancy-snackbar # delivery pod ์์ฒญ ์ฑ๊ณต
kubectl exec order-5d45bf5796-8qr4n -n snackbar -- curl -s delivery # delivery pod ์์ฒญ ์คํจ. (๊ฐ์ ๋ค์์คํ์ด์ค๊ฐ ์๋๋ผ์ ์คํจ)
kubectl exec order-5d45bf5796-8qr4n -n snackbar -- env | grep delivery # ์กฐํ์๋จ, delivery๋ ๋์ค์ ๋ฐฐํฌ๋์๊ธฐ ๋๋ฌธ์ ๋จผ์ ์์ฑ๋ order์๋ ์ฟ ๋ฒ๋คํฐ์ค๊ฐ ํ๊ฒฝ๋ณ์๋ฅผ ์ค์ ํ์ง ์๋๋ค.
kubectl delete all -l project=snackbar --all-namespaces # ๋ชจ๋ ๋ฆฌ์์ค ์ญ์
- Service๋ ํ๋ ์งํฉ์ ๋ํ ๋จ์ผ ์๋ํฌ์ธํธ๋ฅผ ์์ฑ
- Service๋ฅผ ์์ฑํ๋ฉด ClusterIP๊ฐ ํ ๋น๋๋ค
- ClusterIP๋ ํด๋ฌ์คํฐ ๋ด๋ถ์์๋ง ์ ์ ๊ฐ๋ฅ
- ํน์ ์ ํ๋ฆฌ์ผ์ด์ ํ๋๋ฅผ ์ํด ๋ฐฐํฌ๋ Service ์ด๋ฆ์ ์์๋ธ๋ค.
- ์ ํ๋ฆฌ์ผ์ด์ ์ปจํ ์ด๋์์ ~~~_SERVICE_HOST ํ๊ฒฝ๋ณ์๋ก Service IP๋ฅผ ์์๋ผ ์ ์๋ค.
- ๋จ, Pod ๋ณด๋ค ๋ฆ๊ฒ ์์ฑํ Service ํ๊ฒฝ๋ณ์๋ ์ฌ์ฉํ ์ ์๋ค
- ๋จ, ๋ค๋ฅธ ๋ค์์คํ์ด์ค์ Service๋ ํ๊ฒฝ๋ณ์๋ก ์ค์ ๋์ง ์๋๋ค.
- ์ ํ๋ฆฌ์ผ์ด์ ์ปจํ ์ด๋์์ ServiceIP ๋์ Service ์ด๋ฆ์ ๋๋ฉ์ธ์ผ๋ก ์์ฒญ์ ๋ณด๋ผ ์ ์๋ค.
- ์ ํ๋ฆฌ์ผ์ด์ ์ปจํ ์ด๋์์ Service Port๋ ~~~_SERVICE_PORT ํ๊ฒฝ๋ณ์๋ฅผ ์ด์ฉํ๋ค.
gcloud compute firewall-rules create <firewall-name> --allow tcp:31593 # ์ถ๊ฐ
gcloud compute firewall-rules delete <firewall-name> # ์ญ์
gcloud compute firewall-rules list # ์ ์ฑ
์กฐํ
kubectl apply -f til-by-topic/kubernetes/3.Kubernetes์-Docker๋ก-ํ-๋ฒ์-๋๋ด๋-์ปจํ
์ด๋-๊ธฐ๋ฐ-MSA/ch11/se
rvice.yaml # ๋ฐฐํฌ
kubectl get svc -l project=snackbar -n snackbar -o wide # service type ์กฐํ
curl 10.80.10.210:31433 # ์์ฒญ ์คํจ.
gcloud compute firewall-rules create order --allow tcp:31433 # ๋ฐฉํ๋ฒฝ ์ถ๊ฐ
kubectl get nodes -o wide # ๋
ธ๋ External IP ์กฐํ -> ์กฐํํ ๋
ธ๋์ค ์๋ฌด๊ฑฐ๋ IP๋ฅผ export
export ORDER=34.71.118.169:31433 # ํ๊ฒฝ๋ณ์ ์ถ๊ฐ
echo $ORDER # ํ๊ฒฝ๋ณ์ ํ์ธ
curl http://$ORDER/menus # ์์ฒญ ์ฑ๊ณต
# ์ฃผ๋ฌธ -> ์์์ฆ ์ถ๋ ฅ
curl --request POST http://$ORDER/checkout \
--header 'Content-Type: application/json' \
--data-raw '{
"Pizza": 1,
"Coke": 1,
"Burger": 0,
"Juice": 0
}'
gcloud compute firewall-rules delete order # ๋ฐฉํ๋ฒฝ ์ญ์
kubectl delete all -l project=snackbar -n snackbar # ๋ชจ๋ ๋ฆฌ์์ค ์ข
๋ฃ
- ํด๋ฌ์คํฐ ๋ด ๋ชจ๋ ๋ ธ๋์ ํฌํธ ํ ๋น์ Service๋ฅผ NodePort ํ์ ์ผ๋ก ์์ฑ ํ์ ๋ ์ผ์ด๋๋ค
- ๋ ธ๋์ External IP์ ์๋น์ค NodePort๋ฅผ ์ด์ฉํด์ ํ๋์ ์ ๊ทผํ ์ ์๋ค.
- ์๋น์ค ClusterIP๋ ์ฌ์ ํ ํด๋ฌ์คํฐ ๋ด๋ถ์์ ์ฌ์ฉํ ์ ์๋ค.
- ์๋น์ค๋ฅผ NodePort๋ก ์์ฑํ๋ค
- NodePort์ ๋ํ ์ธ๋ฐ์ด๋ ํธ๋ํฝ ํ์ฉ ์ ์ฑ ์ ํด๋ผ์ฐ๋ ์๋น์ค์ ์ค์ ํ๋ค
- ๋ ธ๋ IP์ NodePort๋ฅผ ์ด์ฉํด์ ์ํ๋ ํ๋ ์งํฉ์ ์์ฒญ์ ์คํํ๋ค
- ์์ฒญ์ ์ฒ๋ฆฌํ๋๋ฐ ๋ค๋ฅธ ํ๋์ ์๋ต์ด ํ์ํ๋ฉด ๊ทธ ํ๋์ ์๋น์ค ์ด๋ฆ๊ณผ ์๋น์ค ํฌํธ๋ฅผ ์ด์ฉํ๋ค
- ์๋น์ค ์ด๋ฆ์ ๋๋ฉ์ธ ๋ค์์ผ๋ก DNS ์๋ฒ์ IP๋ฅผ ์กฐํํ ์ ์๋ค.
- NodePort๋ฅผ ์ด์ฉํด์ ์ธ๋ถ ํธ๋ํฝ์ ๋ฐ์ ์ ์์์ง๋ง,
- ํน์ ๋ ธ๋๋ฅผ ์ ํํด์ ์ธ๋ถ ํธ๋ํฝ์ ์ง์์ ์ผ๋ก ์ ๋ฌํ๊ฒ ๋ ํ ๋ฐ,
- ๊ทธ ์ ํํ ๋ ธ๋๊ฐ ๋ฌธ์ ๊ฐ ์๊ฒผ์ ๋์๋ ํต์ ์ ๋ฐ์ ์ ์๋ค.
- ๊ทธ๋ฌ๋ฏ๋ก ์๋จ์์ LoadBalancer ํ์ ์ ์๋น์ค๊ฐ ํ์ํ๋ค.
- NodePort์์ ๋ค๋ฅธ์ ์ Order ์๋น์ค์ ํ์ ์ LoadBalancer๋ก๋ง ๋ฐ๊ฟ์ฃผ๋ฉด ๋๋ค.
kubectl apply -f til-by-topic/kubernetes/3.Kubernetes์-Docker๋ก-ํ-๋ฒ์-๋๋ด๋-์ปจํ
์ด๋-๊ธฐ๋ฐ-MSA/ch12/service.yaml # ๋ฐฐํฌ
kubectl get svc -l project=snackbar -n snackbar -
o wide # ๋ฆฌ์์ค ์กฐํ
export ORDER=35.225.59.229 # ํ๊ฒฝ๋ณ์ ์ค์
curl http://$ORDER/menus # ๋ฉ๋ด ์กฐํ
# ์ฃผ๋ฌธ ์์ฒญ
curl --request POST http://$ORDER/checkout \
--header 'Content-Type: application/json' \
--data-raw '{
"Pizza": 1,
"Burger": 2,
"Coke": 0,
"Juice": 0
}'
kubectl delete all -l project=snackbar -n snackbar # ๋ชจ๋ ๋ฆฌ์์ค ์ ๊ฑฐ
- LoadBalancer ํ์ ์ ์๋น์ค๋ฅผ ์์ฑํ๋ฉด ํด๋ผ์ฐ๋ ์๋น์ค์ ๋ก๋๋ฐธ๋ฐ์๊ฐ ์คํ ๋๋ค
- ๋ก๋๋ฐธ๋ฐ์์ IP๊ฐ Service์ External IP๋ก ํ ๋น ๋๋ค
- Service์ EXternal IP์ด์ ๋ก๋๋ฐธ๋ฐ์ IP๋ก ์ธ๋ถ์์ ํ๋์ ์ ๊ทผํ ์ ์๋ค
- ์๋น์ค ClusterIP, NodePort์ ๊ธฐ๋ฅ๋ ์ฌ์ ํ ์ฌ์ฉํ ์ ์๋ค.
- ์๋น์ค๋ฅผ LoadBalancer๋ก ์์ฑํ๋ค
- ์๋น์ค์ External IP๋ฅผ ์ด์ฉํด์ ์ํ๋ ํ๋ ์งํฉ์ ์์ฒญ์ ์คํํ๋ค
- ์์ฒญ์ ์ฒ๋ฆฌํ๋๋ฐ ๋ค๋ฅธ ํ๋์ ์๋ต์ด ํ์ํ๋ฉด ๊ทธ ํ๋์ ์๋น์ค ์ด๋ฆ๊ณผ ์๋น์ค ํฌํธ๋ฅผ ์ด์ฉํ๋ค
- ์๋น์ค ์ด๋ฆ์ ๋๋ฉ์ธ ๋ค์์ผ๋ก DNS ์๋ฒ์๊ฒ IP๋ฅผ ์กฐํํ ์ ์๋ค.
- ํด๋ผ์ด์ธํธ๋ ์๋ง์ LoadBalancer์ IP๋ฅผ ๊ธฐ์ตํด์ผํ๋ค.
- Service ์ถ์ํ
- ์๋ฏธ ์๋ ๋จ์ผ ์๋ํฌ์ธํธ๋ฅผ ์ ๊ณตํ๋ค
- ํธ๋ํฝ์ Service๋ก ๋ถ์ฐํ๊ธฐ ์ํ ๋ผ์ฐํ ๊ท์น ๋ชจ์
- ํด๋ผ์ด์ธํธ๊ฐ ํธ์ถํ Host ํค๋๋ path๋ฅผ ํตํด Service๋ฅผ ๊ตฌ๋ถํ๊ณ ํธ๋ํฝ์ ํฌ์๋ฉํ๋ค
- Ingress ๊ท์น์ ๋ฐ๋ผ ํธ๋ํฝ ๋ถ์ฐ์ ์คํํ๊ธฐ ์ํ ๋ฆฌ์์ค
- ์ฟ ๋ฒ๋คํฐ์ค ํด๋ฌ์คํฐ ์ ๊ณต์๊ฐ ๊ตฌํํ Ingress Controller๋ง๋ค ๊ธฐ๋ฅ์ด ๋ค๋ฅด๋ค
- ์ฟ ๋ฒ๋คํฐ์ค ์ง์ Ingress Controller: https://bit.ly/3GkpoZq
- Ingress ๋ฆฌ์์ค๋ฅผ ์์ฑํ๋ฉด GKE๊ฐ Google Cloud load balancer๋ฅผ Ingress Controller๋ก ์์ฑํ๋ค.
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: snackbar
namespace: snackbar
labels:
project: snackbar
# Host: order.fast-snackbar.com ์ Service์ ๋งคํ
spec:
rules:
- host: order.fast-snackbar.com # Host ํค๋๊ฐ ์ผ์นํ๋ ์์ฒญ๋ง ๋งค์นญ
http:
paths:
- pathType: Prefix # /๋ก ์์ํ๋ ๋ชจ๋ ๊ฒฝ๋ก์ ๋งค์นญ
path: /
backend: # order ์๋น์ค์ 80 ํฌํธ๋ก ํฌ์๋ฉ
service:
name: order
port:
number: 80
# Host: payment.fast-snackbar.com ์ Service์ ๋งคํ
spec:
rules:
- host: payment.fast-snackbar.com # Host ํค๋๊ฐ ์ผ์นํ๋ ์์ฒญ๋ง ๋งค์นญ
http:
paths:
- pathType: Prefix # /๋ก ์์ํ๋ ๋ชจ๋ ๊ฒฝ๋ก์ ๋งค์นญ
path: /
backend: # payment ์๋น์ค์ 80 ํฌํธ๋ก ํฌ์๋ฉ
service:
name: payment
port:
number: 80
# ํ๋์ host์ URL Path๋ณ๋ก ์๋น์ค ๋งคํ
rules:
- http:
path:
- pathType: Prefix
path: /order # /order๋ก ์์ํ๋ ๋ชจ๋ ๊ฒฝ๋ก์ ์์ฒญ์ ๋ํด์ ๋ค์์ ์คํ
backend: # order ์๋น์ค์ 80ํฌํธ๋ก ์ฐ๊ฒฐ
service:
name: order
port:
number: 80
- pathType: Prefix
path: /payment # /payment๋ก ์์ํ๋ ๋ชจ๋ ๊ฒฝ๋ก์ ์์ฒญ์ ๋ํด์ ๋ค์์ ์คํ
backend: # payment ์๋น์ค์ 80ํฌํธ๋ก ์ฐ๊ฒฐ
service:
name: payment
port:
number: 80
# defaultBackend ์ค์
spec:
defaultBackend: # defaultBackend๋ Ingress์ ์ ์๋์ง ์๋ ์์ฒญ์ ๋ฐ์ผ๋ฉด ์ฒ๋ฆฌํ๋ค.
service:
name: order
port:
number: 80
- Ingress์ ์ ์๋์ง ์์ ์์ฒญ์ด๋
- ์ ์ํ์ง ์์ host ํค๋ ์์ฒญ์ ๋ฐ์ ๊ฒฝ์ฐ
- path ํํ์๊ณผ ์ผ์นํ์ง ์๋ ๊ฒฝ์ฐ
- Ingress๋ฅผ ์์ฑํ๊ฒ ๋๋ฉด, ๊ตฌ๊ธ ํด๋ผ์ฐ๋๊ฐ ๋ก๋๋ฐธ๋ฐ์๋ฅผ ์์ฑํด์ Ingress Controller๋ก ๋ง๋ฌ
- Ingress Controller๊ฐ ๋ค์ด์จ ์์ฒญ์ host ํค๋ ์ ๋ณด๋ฅผ ์ด์ฉํด์ ํธ๋ํฝ์ ๋ด๋ถ์ ์๋ ์๋น์ค๋ก ์ ๋ฌํด์ค๋ค.
- ๋ผ์ฐํ ๊ท์น์ ์ฐ๋ฆฌ๊ฐ ์์ฑํ Ingress๋ฅผ ๋ณด๊ณ ํ๋จํ๋ค.
- ํด๋ผ์ด์ธํธ๋ ํด๋ฌ์คํฐ ์์ ์๋ ์ฌ๋ฌ Service๋ฅผ ํ๋์ IP๋ก ์ ๊ทผํ ์ ์๋ค
- ์ฟ ๋ฒ๋คํฐ์ค ํด๋ฌ์คํฐ์ ์กด์ฌํ๋ Service ๋ฆฌ์์ค์ ๋ํ ๋ผ์ฐํ ๊ท์น์ ์ ์ธํ๋ค
- Ingress Controller๊ฐ ๋ฐ์ HTTP Request์ Host ํค๋ ์ ๋ณด๋ URL Path์ ๋ฐ๋ผ ์ฌ๋ฌ ์๋น์ค๋ก ํธ๋ํฝ์ ๋ถ์ฐํ ์ ์๋ค.
kubectl get ingress snackbar -n snackbar
kubectl get ingress <ingress-name> -n <namespace>
kubectl get ingress <ingress-name> -n <namespace> \
-o jsonpath="{.status.loadBalancer.ingress[0].ip}"
# delivery, home ๋ฑ ์ ๋ถ ๋ฐฐํฌ
kubectl apply -f til-by-topic/kubernetes/3.Kubernetes์-Docker๋ก-ํ-๋ฒ์-๋๋ด๋-์ปจํ
์ด๋-๊ธฐ๋ฐ-MSA/ch13/backend
# ingress ๋ฐฐํฌ
kubectl apply -f til-by-topic/kubernetes/3.Kubernetes์-Docker๋ก-ํ-๋ฒ์-๋๋ด๋-์ปจํ
์ด๋-๊ธฐ๋ฐ-MSA/ch13/ingress-multiple-hosts.yaml
# endpoint ์กฐํ
kubectl get endpoints -n snackbar
# ingress ์กฐํ (IP ๋ฑ )
kubectl get ingress snackbar -n snackbar
# Ingress IP ํ๊ฒฝ๋ณ์ ์ค์
export INGRESS_IP=$(kubectl get ingress snackbar -n snackbar -o jsonpath="{.status.loadBalancer.ingress[0].ip}")
# ํ๊ฒฝ๋ณ์ ํ์ธ
echo $INGRESS_IP
# ์ฃผ๋ฌธ ํ ์์ฒญ
curl -H "Host: order.fast-snackbar.com" --request GET $INGRESS_IP
# ์ฃผ๋ฌธ ๋ฉ๋ด ์กฐํ
curl -H "Host: order.fast-snackbar.com" --request GET $INGRESS_IP/menus
# ์ฃผ๋ฌธ ์์ฒญ
curl -H "Host: order.fast-snackbar.com" --request POST $INGRESS_IP/checkout \
--header 'Content-Type: application/json' \
--data-raw '{
"Pizza": 1,
"Burger": 2,
"Coke": 0,
"Juice": 0
}'
# ๊ฒฐ์ ํ
curl -H "Host: payment.fast-snackbar.com" --request GET $INGRESS_IP
# ๊ฒฐ์ ์ ๋ณด ์กฐํ
curl -H "Host: payment.fast-snackbar.com" -s --request POST $INGRESS_IP/receipt \
--header 'Content-Type: application/json' \
--data-raw '{
"Pizza": 1,
"Burger": 2,
"Coke": 0,
"Juice": 0
}' | json_pp
# ๋ฐฐ๋ฌ ํ
curl -H "Host: delivery.fast-snackbar.com" $INGRESS_IP
# ๋ํดํธ ๋ฐฑ์๋ - ์ ์ธํ์ง ์์ Host ํค๋์ Path๋ก ์์ฒญ ์คํ
curl -H "Host: wrong.fast-snackbar.com" $INGRESS_IP
curl -H "Host: wrong.fast-snackbar.com" $INGRESS_IP/ab
# snackbar ๋ค์์คํ์ด์ค์ project=snackbar ๋ ์ด๋ธ์ ๊ฐ์ง ๋ชจ๋ ๋ฆฌ์์ค ์ ๊ฑฐ
kubectl delete all -l project=snackbar -n snackbar
# delivery, home ๋ฑ ์ ๋ถ ๋ฐฐํฌ
kubectl apply -f til-by-topic/kubernetes/3.Kubernetes์-Docker๋ก-ํ-๋ฒ์-๋๋ด๋-์ปจํ
์ด๋-๊ธฐ๋ฐ-MSA/ch13/backend
# ingress ๋ฐฐํฌ single-hosts๋ host๋ฅผ ์ง์ ํ์ง ์์.
kubectl apply -f til-by-topic/kubernetes/3.Kubernetes์-Docker๋ก-ํ-๋ฒ์-๋๋ด๋-์ปจํ
์ด๋-๊ธฐ๋ฐ-MSA/ch13/ingress-single-hosts.yaml
# ์ฃผ๋ฌธ ํ
curl --request GET $INGRESS_IP/order
# ์ฃผ๋ฌธ ๋ฉ๋ด ์กฐํ
curl --request GET $INGRESS_IP/order/menus
# ์ฃผ๋ฌธ ์์ฒญ
curl --request POST $INGRESS_IP/order/checkout \
--header 'Content-Type: application/json' \
--data-raw '{
"Pizza": 1,
"Burger": 2,
"Coke": 0,
"Juice": 0
}'
# ๊ฒฐ์ ํ
curl --request GET $INGRESS_IP/payment
# ๊ฒฐ์ ์ ๋ณด ์กฐํ
curl -s --request POST $INGRESS_IP/payment/receipt \
--header 'Content-Type: application/json' \
--data-raw '{
"Pizza": 1,
"Burger": 2,
"Coke": 0,
"Juice": 0
}' | json_pp
# ์ ์ธํ์ง ์์ Path๋ก ์์ฒญ ์คํ
curl $INGRESS_IP/not-found
# ๋ฉ๋ด์กฐํ ๋ก๋๋ฐธ๋ฐ์ฑ ํ์ธ
for i in {1..10};
do curl $INGRESS_IP/order/menus;
done
# snackbar ๋ค์์คํ์ด์ค์ project=snackbar ๋ ์ด๋ธ์ ๊ฐ์ง ๋ชจ๋ ๋ฆฌ์์ค ์ ๊ฑฐ
kubectl delete all -l project=snackbar -n snackbar
- ํ๋๋ ์์ฑํ์ง๋ง, ์ปจํ ์ด๋๊ฐ ์ด๋ ํ ์ด์ ๋ก ์คํจํ๊ณ ์คํ๋๊ณ ์์ง ์์ ๋
- ์ปจํ ์ด๋ ์ํ๋ฅผ ํ์ธํ๋ ๋ฐฉ๋ฒ(Probe)
- ์ธ์ ์ฌ์์ ํ ๊ฒ์ธ์ง ๊ธฐ์ค
- kubelet์ด pod๊ฐ ๋ฐฐํฌ๋๊ณ , ๋์ปค์ ์ํด ์ปจํ ์ด๋๊ฐ ์คํ์ด ๋๋ฉด, ์ฃผ๊ธฐ์ ์ผ๋ก endpoint๋ฅผ ํธ์ถํด์ ์์ฌ๋ฅผ ์ฒดํฌํ๋ค.
- ์ปจํ ์ด๋๊ฐ ์๋ต์ ์ฃผ๋๊ฒ์ ํ์ธํ๊ณ ์ฌ์ฉ์๊ฐ ์ ์ํ ์๊ณ์น๋ฅผ ๋์ด์ ์คํจ ์๋ต์ ๋ฐ์ผ๋ฉด ์ปจํ ์ด๋๊ฐ ํ๋ ๋ด์ ์๋ ์ปจํ ์ด๋๋ฅผ ์ข ๋ฃ ์ํจ๋ค.
- ์๋ก์ด ์ปจํ ์ด๋๋ฅผ ์์ํ๋ค.
- liveness: ์ด์์์
- probe: ์์ฌ
- ์ปจํ ์ด๋๊ฐ ์คํ์ค์ธ์ง ํ์ธํ๋ ๋ฐฉ๋ฒ
- ์ผ์ ์์ค ์ด์ ์ฐ์ํด์ ์คํจํ๋ฉด ์ปจํ ์ด๋๋ฅผ ์ฌ์์.
- HTTP status code๋ก ์ด์์๋์ง ํ์ธํ๋ ๋ฐฉ๋ฒ
spec:
containers:
- name: myapp
image: yoonjeong/my-app:1.0
ports:
- containerPort: 8080
livenessProbe:
httpGet: # probe ์๋ํฌ์ธํธ
path: /health
port: 8080
initialDelaySeconds: 3 # ์ปจํ
์ด๋ ์์ ํ ๋ช ์ดํ์ probe๋ฅผ ์์ ํ ๊ฒ์ธ๊ฐ
periodSeconds: 1 # probe ์คํ ์ฃผ๊ธฐ
successThreshold: 1 # ๋ช ๊ฐ ์ฑ๊ณต ์ ์คํจ ํ์๋ฅผ ์ด๊ธฐํํ ๊ฒ์ธ๊ฐ
failureThreshold: 1 # ์ฐ์์ผ๋ก ๋ช ๋ฒ ์คํจ ํ์ ๋ ์ปจํ
์ด๋๋ฅผ ์ฌ์์ ํ ๊ฒ์ธ๊ฐ
timeoutSeconds: 3 # ์๋ต์ ๋ช ์ด ๋ง์ ๋ฐ์์ผ ํ๋๊ฐ
# ๋ฐฐํฌ
kubectl apply -f til-by-topic/kubernetes/3.Kubernetes์-Docker๋ก-ํ-๋ฒ์-๋๋ด๋-์ปจํ
์ด๋-๊ธฐ๋ฐ-MSA/ch14/pod-liveness-probe.yaml
# ๋ชจ๋ํฐ๋ง -> RESTARTS ํ์๊ฐ ๊ณ์ ๋์ด๋จ
kubectl get pod -w
# Pod ์ด๋ฒคํธ๋ฅผ ํ์ธํ์ฌ ๋ฌธ์ ์์ธ ํ์ธ
kubectl describe pod/unhealthy
# ์ ๊ฑฐ
kubectl delete pod healthy
kubectl delete pod unhealthy
- ํ๋๋ ์์ฑํ์ง๋ง, ์ปจํ ์ด๋๊ฐ ์์ง ์ค๋น๋์ง ์์์ ๋ ์ฌ์ฉ
- Kubelet์ด ์ปจํ ์ด๋์ ์ํ๋ฅผ ๊ณ์ ์ฒดํฌํ๋ฉด์ readinessProbe๋ฅผ ํธ์ถํ๋ค.
- ์๋ต์ผ๋ก 500์ด๋ ํ์์์๊ณผ ๊ฐ์ ์๋ฌ์ฝ๋๋ฅผ ์ง์์ ์ผ๋ก ๋ฆฌํดํ๋ค.
- ์ด๋์ ๋ ์คํจ ์๊ณ์น๋ฅผ ๋์ด์๋ฉด pod ๋ชฉ๋ก์ผ๋ก๋ถํฐ ๋ฌธ์ ๊ฐ ์๋ pod๋ฅผ ์ ๊ฑฐํ๋ค.
- ์ค๋น๊ฐ ์๋ฃ๋์๋ค๊ณ ํ๋จ์ด ์๋ฉด, ๋ค์ ์๋น์ค ์๋ํฌ์ธํธ์ pod๋ฅผ ๋ค์ ์ถ๊ฐํ๋ค.
- readiness: ์ค๋น์ฑ
- probe: ์์ฌ
- ์ปจํ ์ด๋๊ฐ ์์ฒญ์ ๋ฐ์ ์ค๋น๊ฐ ๋์๋์ง ํ์ธํ๋ ๋ฐฉ๋ฒ
- ์ผ์ ์์ค ์ด์ ์ฐ์ํด์ ์คํจํ๋ฉด ์๋น์ค ์๋ํฌ์ธํธ์์ ํ๋๋ฅผ ์ ๊ฑฐ
- process exit status code๋ก ์ค๋น ์ํ๋ฅผ ํ์ธ ํ๋ ๋ฐฉ๋ฒ
spec:
containers:
- name: myapp
image: yoonjeong/my-app:1.0
ports:
- containerPort: 8080
readinessProbe:
exec: # ์ปจํ
์ด๋์์ ์คํํ ๋ช
๋ น์ด probe
command:
- ls
- /var/ready
initialDelaySeconds: 3 # ์ปจํ
์ด๋ ์์ ํ ๋ช ์ด ํ์ probe๋ฅผ ์์ํ ๊ฒ์ธ๊ฐ
periodSeconds: 1 # probe ์คํ ์ฃผ๊ธฐ
successThreshold: 1 # ๋ช ๊ฐ ์ฑ๊ณต ์ ์คํจ ํ์๋ฅผ ์ด๊ธฐํํ ๊ฒ์ธ๊ฐ
failureThreshold: 1 # ์ฐ์์ผ๋ก ๋ช ๋ฒ ์คํจ ํ์ ๋ ํ๋๊ฐ ์ค๋น๋์ง ์์๋ค๊ณ ํ์ํ ๊ฒ์ธ๊ฐ
timeoutSeconds: 3 # ์๋ต์ ๋ช ์ด ๋ง์ ๋ฐ์์ผ ํ๋๊ฐ
# ๋ก๋๋ฐธ๋ฐ์ ๋ฐฐํฌ
kubectl apply -f til-by-topic/kubernetes/3.Kubernetes์-Docker๋ก-ํ-๋ฒ์-๋๋ด๋-์ปจํ
์ด๋-๊ธฐ๋ฐ-MSA/ch15/service.yaml
# ์๋น์ค ExternalIP ํ์ธ
kubectl get svc -w
# ์๋น์ค ์๋ํฌ์ธํธ๋ฅผ ํ๊ฒฝ๋ณ์ SERVICE๋ก ์ ์ฅ
export SERVICE=$(kubectl get svc myapp -o jsonpath="{.status.loadBalancer.ingress[0].ip}")
# healthy, unhealthy ํ๋ ์์ฑ
kubectl apply -f til-by-topic/kubernetes/3.Kubernetes์-Docker๋ก-ํ-๋ฒ์-๋๋ด๋-์ปจํ
์ด๋-๊ธฐ๋ฐ-MSA/ch15/pod-readinessProbe-probe.yaml
# ์๋น์ค ์๋ํฌ์ธํธ๋ฅผ ๊ด์ฐฐ
kubectl get endpoints -w
# ํ๋ READY๋ฅผ ๊ด์ฐฐ, ๋ช ์ด๊ฐ ํ๋ฅธ ๋ค...
kubectl get pod -o wide -w
# Pod ์ด๋ฒคํธ๋ฅผ ํ์ธํ์ฌ ๋ฌธ์ ์์ธ ํ์ธ
kubectl describe pod/unhealthy
# ์๋น์ค ์๋ํฌ์ธํธ๋ก ์์ฒญ ์คํ
for i in {0..5};
do curl -v $SERVICE;
done
# unhealthy ํ๋์ ์ ์ํ์ฌ /var/ready ๋๋ ํ ๋ฆฌ ์์ฑ
kubectl exec -it unhealthy -- mkdir /var/ready
# ์๋น์ค ์๋ํฌ์ธํธ, ํ๋ READY ์ํ๋ฅผ ๊ด์ฐฐ
# ์๋น์ค, ํ๋ ์ญ์
kubectl delete all -l app=myapp
- startupProbe๋ ์์๋ ๋๋ง ์คํ๋จ
- readniessProbe๋ ๋งค๋ฒ ํ์ธ ํด์ ์ ์๋์์ธ์ง ํ์ธํ๋ ๊ฒ์.
- Probe๋ชจ๋ ํด๋น๋๋ ์ด์ผ๊ธฐ์ธ๋ฐ
- pod์์ container๊ฐ ์ฌ๋ฌ๊ฐ๊ฐ ์๋ค๊ณ ํ๋ฉด,
- container์์ Probe์ค์ ์ ๋ชจ๋ ํ๋ค๊ณ ์น๋ฉด
- ๊ทธ ์ค์ ํ๋๋ผ๋ Probe์ ํต๊ณผํ์ง ๋ชปํ๋ฉด pod๊ฐ ์ ์์ ์ผ๋ก ๋์์ง์ง ์๋๊ฒ์ผ๋ก ์ทจ๊ธ๋๋ค.
- ์ ํ๋ฆฌ์ผ์ด์ ๊ณผ ๋์ปค ์ด๋ฏธ์ง๋ก๋ถํฐ ์ค์ ํ์ผ์ ๋ถ๋ฆฌํ๋ ๋ฐฉ๋ฒ
- ์ฟ ๋ฒ๋คํฐ์ค๋ Pod๋ก๋ถํฐ ์ค์ ํ์ผ์ ๋ถ๋ฆฌํด์ ๊ด๋ฆฌํ ์ ์๋ ๋ฐฉ๋ฒ
- ConfigMap ์ค๋ธ์ ํธ๋ก ์ค์ ํ์ผ์ ๊ด๋ฆฌํ๊ณ Pod์ ๋ถ๋ฆฌํ ์ ์๋ค.
- Pod์ ์ปจํ ์ด๋ ํ๊ฒฝ๋ณ์๊ฐ configmap์ ๊ฐ์ ์ฐธ์กฐํ ์ ์๋ค.
- Pod ๋ณผ๋ฅจ์ผ๋ก ConfigMap์ ์ฌ์ฉํ ์ ์๋ค.
- pod๊ฐ ์ข ๋ฃ๋๊ณ ๋ค์ ์์ฑ๋๋๋ผ๋ ๋์ผํ Pod ๋ฉ๋ํ์คํธ์๋ ๋์ผํ ConfigMap์ด๋ฆ์ผ๋ก ์ฐธ์กฐํ๊ธฐ ๋๋ฌธ์ ์ค์ ํ์ผ์ ์ ๋ณด๋ฅผ ์ฌ์ฌ์ฉํ ์ ์๋ค.
- ConfigMap ์ด๋ฆ์ผ๋ก ์ค์ ๊ฐ๋ค์ ์ฐธ์กฐํ๊ธฐ ๋๋ฌธ์ ์ค์ ๊ฐ์ ๋ณ๊ฒฝ์ด ์์ ๋กญ๋ค
- key=value๋ฅผ ์ง์ ์ปค๋งจ๋๋ผ์ธ์ ์์ฑํ๋ ๋ฐฉ๋ฒ
kubectl create configmap <name> --from-literal=key=value
kubectl create configmap greeting-config \
--from-literal=STUDENT_NAME=๊ฒฝ๋ \
--from-literal=MESSAGE=HI
kubectl get configmap greetng-config -o yaml
spec:
containers:
env:
- name: STUDENT_NAME
valueFrom:
configMapKeyRef:
name: greeting-config
key: STUDENT_NAME
- name: MESSAGE
valueFrom:
configMapKeyRef:
name: greeting-config
key: MESSAGE
- name: GREETING
value: $(MESSAGE)! $(STUDENT_NAME)
์์๋ ๊ฐ์
spec:
containers:
envFrom:
- configMapRef:
name: greeting-config
env:
- name: GREETING
value: $(MESSAGE)! $(STUDENT_NAME)
# ConfigMap ์์ฑ
kubectl create configmap greeting-config --from-literal=STUDENT_NAME=๊ฒฝ๋ --from-literal=MESSAGE=์๋
# ์์ฑํ ConfigMap ํ์ธ
kubectl get configmap greeting-config -o yaml
# ํ๋ ๋ฐฐํฌ
kubectl apply -f til-by-topic/kubernetes/3.Kubernetes์-Docker๋ก-ํ-๋ฒ์-๋๋ด๋-์ปจํ
์ด๋-๊ธฐ๋ฐ-MSA/ch16/hello-app.yaml
# ํ๊ฒฝ๋ณ์ GREETING ์ถ๋ ฅ ํ์ธ - ํฌํธํฌ์๋ฉ 8080:8080
kubectl port-forward hello-app 8080:8080
# ์น๋ธ๋ผ์ฐ์ ์์ ์คํ
localhost:8080
# ํ๋ ์ญ์
kubectl delete pod hello-app
# hello-app ํ๋ ์์ฑ
kubectl apply -f til-by-topic/kubernetes/3.Kubernetes์-Docker๋ก-ํ-๋ฒ์-๋๋ด๋-์ปจํ
์ด๋-๊ธฐ๋ฐ-MSA/ch16/hello-app-envFrom.yaml
# Pod ํ์ธ
kubectl get pod
# ํ๊ฒฝ๋ณ์ GREETING ์ถ๋ ฅ ํ์ธ - ํฌํธํฌ์๋ฉ 8080:8080
kubectl port-forward hello-app 8080:8080
# ์น๋ธ๋ผ์ฐ์ ์์ ์คํ
localhost:8080
# ํ๋ ์ญ์
kubectl delete pod hello-app
kubectl delete configmap greeting-config
kubectl create configmap <name> --from-file=ํ์ผ์ด๋ ๋๋ ํ ๋ฆฌ ๊ฒฝ๋ก
์์
# configmap ์์ฑ
kubectl create configmap greeting-config-from-file --from-file=til-by-topic/kubernetes/3.Kubernetes์-Docker๋ก-ํ-๋ฒ์-๋๋ด๋-์ปจํ
์ด๋-๊ธฐ๋ฐ-MSA/ch16/configs
# ConfigMap ํ์ธ
kubectl get configmap greeting-config-from-file -o yaml
# hello-app ํ๋ ์์ฑ
kubectl apply -f til-by-topic/kubernetes/3.Kubernetes์-Docker๋ก-ํ-๋ฒ์-๋๋ด๋-์ปจํ
์ด๋-๊ธฐ๋ฐ-MSA/ch16/hello-app-file.yaml
# Pod ํ์ธ
kubectl get pod
# ํ๊ฒฝ๋ณ์ GREETING ์ถ๋ ฅ ํ์ธ - ํฌํธํฌ์๋ฉ 8080:8080
kubectl port-forward hello-app 8080:8080
# ์น๋ธ๋ผ์ฐ์ ์์ ์คํ
localhost:8080
# ํ๋ ์ญ์
kubectl delete pod hello-app
kubectl delete configmap greeting-config-from-file
- ConfigMap ํ์ ์ ๋ณผ๋ฅจ์ Pod์ ์ ์ธ
- ConfigMap ์ด๋ฆ์ผ๋ก ๋ณผ๋ฅจ์ ์ฐธ์กฐ
- Pod์ ์ ์ธํ ConfigMap ํ์
์ ๋ณผ๋ฅจ์ ์ปจํ
์ด๋์์ ๋ง์ดํธ ํ ์ ์๋ค.
spec:
volumes: # Pod์์ ์ฌ์ฉํ ๋ณผ๋ฅจ ๋ชฉ๋ก ์ ์ธ
- name: app-config # ์ปจํ
์ด๋์์ ์ฐธ์กฐํ ๋ณผ๋ฅจ ์ด๋ฆ
configMap:
name: nginx-config # ์ฐธ์กฐํ configmap ์ด๋ฆ
containers:
- name: nginx
image: nginx
ports:
- containerPort: 80
volumeMounts: # ์ปจํ
์ด๋์์ Pod ๋ณผ๋ฅจ ๋ง์ดํธ ์ ์ธ
- name: app-config # ๋ง์ดํ
ํ Pod ๋ณผ๋ฅจ ์ด๋ฆ
mountPath: /etc/nginx/conf.d # ์ปจํ
์ด๋ ์์์ ๋ง์ดํ
ํ ๊ฒฝ๋ก
# nginx-config๋ผ๋ ConfigMap์ configs ๋๋ ํ ๋ฆฌ๋ก๋ถํฐ ์์ฑ
kubectl create configmap nginx-config --from-file=til-by-topic/kubernetes/3.Kubernetes์-Docker๋ก-ํ-๋ฒ์-๋๋ด๋-์ปจํ
์ด๋-๊ธฐ๋ฐ-MSA/ch17/configs
# nginx-config๋ผ๋ ConfigMap ํ์ธ
kubectl get configmap nginx-config -o yaml
# hello-app ํ๋ ์์ฑ
kubectl apply -f til-by-topic/kubernetes/3.Kubernetes์-Docker๋ก-ํ-๋ฒ์-๋๋ด๋-์ปจํ
์ด๋-๊ธฐ๋ฐ-MSA/ch17/web-server.yaml
# server.conf์ ์ค์ ํ๋๋ก nginx ์น์๋ฒ๊ฐ /myapp ์์ฒญ์ my-app ์ปจํ
์ด๋๋ก ๋ผ์ฐํ
ํ๋์ง ํ์ธ - ํฌํธํฌ์๋ฉ 8080:80
kubectl port-forward web-server 8080:80
# ์น๋ธ๋ผ์ฐ์ ์์ ์คํ
localhost:8080/myapp
# nginx ์ ์ ๋ก๊ทธ ํ์ธ
kubectl exec web-server -- tail -10f /var/log/nginx/host.access.log
# ์ปจํ
์ด๋์ ๋ง์ดํ
๊ฒฝ๋ก /etc/nginx/conf.d์์ ConfigMap ํ์ผ ํ์ธ
kubectl exec web-server -c nginx -- ls /etc/nginx/conf.d
kubectl exec web-server -c nginx -- cat /etc/nginx/conf.d/server.conf
# ํ๋ ์ญ์
kubectl delete pod web-server
kubectl delete pod my-app
kubectl delete svc my-app
kubectl delete configmap nginx-config
- ์ ํ๋ฆฌ์ผ์ด์ ์ค์ ํ์ผ์๋ ์๋ฒ ์ ์์ ์ํ ๋น๋ฐ๋ฒํธ, ์ํธํ๋ฅผ ์ํ public/private key ๋ฑ ๋ ธ์ถ์ด ๋๋ฉด ์๋๋ ๋ฏผ๊ฐ ์ ๋ณด๋ ์๋ค.
- ๋ฏผ๊ฐ ์ ๋ณด๋ฅผ ๊ด๋ฆฌํ๊ธฐ ์ํ ์ฟ ๋ฒ๋คํฐ์ค ์ค๋ธ์ ํธ๋ Secret์ด๋ค.
- ConfigMap์ฒ๋ผ ๋ฏผ๊ฐํ ๋ฐ์ดํฐ๋ฅผ Key/Value ์์ผ๋ก ๊ด๋ฆฌํ๋ค.
- ์ฟ ๋ฒ๋คํฐ์ค๊ฐ Secret ๊ฐ์ Base64๋ก ์ธ์ฝ๋ฉํด์ ๊ด๋ฆฌํ๋ค.
- ์ปจํ ์ด๋์์ Secret ๊ฐ์ ์ฝ์ ๋์๋ ๋์ฝ๋ฉ๋์ด ์ ๋ฌ๋๋ค.
- Pod ์ ์ธ ์ Secret ๋ณผ๋ฅจ์ด๋ ํ๊ฒฝ๋ณ์๋ฅผ ํตํด์ Secret ๊ฐ์ ์ฌ์ฉํ ์ ์๋ค.
- ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ฏผ๊ฐ ๋ฐ์ดํฐ๋ฅผ ๊ด๋ฆฌํ๊ธฐ ์ํด ๋ณ๋์ ์๋ฒ๋ฅผ ์คํํ ํ์๊ฐ ์๋ค.
- ์ ํ๋ฆฌ์ผ์ด์ ์ปจํ ์ด๋์์ ๋์ฝ๋ฉํ ํ์ ์๋ค.
- Secret ๋ฐ์ดํฐ๋ ๋ฉ๋ชจ๋ฆฌ์ ์ ์ฅ๋๊ธฐ ๋๋ฌธ์ ์ ๊ทผ์ด ์ด๋ ต๋ค.
- Pod์ ์ปจํ ์ด๋ ํ๊ฒฝ๋ณ์๊ฐ Secret์ ๊ฐ์ ์ฐธ์กฐํ ์ ์๋ค.
- Pod ๋ณผ๋ฅจ์ผ๋ก Secret์ ์ฌ์ฉํ ์ ์๋ค.
์ฆ
- ์ปจํ ์ด๋ env.valueFrom.secretMapKeyRef ์ฌ์ฉ
- ์ปจํ ์ด๋ envFrom.secretRef ์ฌ์ฉ
- Secret์ Pod ๋ณผ๋ฅจ์ผ๋ก ์ฐ๊ฒฐํ๊ณ ์ปจํ ์ด๋์์ ๋ง์ดํธ
spec:
volumes: # Pod์์ ์ฌ์ฉํ ๋ณผ๋ฅจ ๋ชฉ๋ก ์ ์ธ
- name: tls # ์ปจํ
์ด๋์์ ์ฐธ์กฐํ ๋ณผ๋ฅจ ์ด๋ฆ
secret:
secretName: tls-config # ์ฐธ์กฐํ Secret ์ด๋ฆ
containers:
- name: nginx
image: nginx
ports:
- containerPort: 80
volumeMounts: # ์ปจํ
์ด๋์์ Pod ๋ณผ๋ฅจ ๋ง์ดํธ ์ ์ธ
- name: tls # ๋ง์ดํ
ํ Pod ๋ณผ๋ฅจ ์ด๋ฆ
mountPath: /etc/nginx/tls # ์ปจํ
์ด๋ ์์์ ๋ง์ดํ
ํ ๊ฒฝ๋ก
# tls-config๋ผ๋ ์ด๋ฆ์ผ๋ก genericํ์
์ secret ์์ฑ
ubectl create secret generic tls-config --from-file=til-by-topic/kubernetes/3.Kubernetes์-Docker๋ก-ํ-๋ฒ์-๋๋ด๋-์ปจํ
์ด๋-๊ธฐ๋ฐ-MSA/ch18/secrets
# tls-config ๋ผ๋ Secret ์กฐํ
kubectl get secret tls-config -o yaml
# nginx ์ปจํ
์ด๋๊ฐ https ํธ๋ํฝ์ ์ฒ๋ฆฌํ ์ ์๋๋ก TLS ์ธ์ฆ์์ private key์ ์์น๋ฅผ ์๋ ค์ฃผ์ด์ผ ํจ - server.conf ์ค์
kubectl create configmap nginx-config --from-file=til-by-topic/kubernetes/3.Kubernetes์-Docker๋ก-ํ-๋ฒ์-๋๋ด๋-์ปจํ
์ด๋-๊ธฐ๋ฐ-MSA/ch18/configs
# ๋ฐฐํฌ
kubectl apply -f til-by-topic/kubernetes/3.Kubernetes์-Docker๋ก-ํ-๋ฒ์-๋๋ด๋-์ปจํ
์ด๋-๊ธฐ๋ฐ-MSA/ch18/web-server.yaml
# ์์ฑํ ํ๋ ํ์ธ
kubectl get pod
# www.fastcampus-kubernetes.com ๋๋ฉ์ธ ์์ฒญ์ ์ํ /etc/hosts ํ์ผ ์์ -> ๋งจ๋ฐ์ ์ถ๊ฐ
sudo vi /etc/hosts
127.0.0.1 www.fastcampus-kubernetes.com
# nginx ์น์๋ฒ ์ปจํ
์ด๋ ํฌํธํฌ์๋ฉ 8443:443
kubectl port-forward web-server 8443:443
# https ์์ฒญ ์ ์ก - curl์ด ์๋ฒ ์ธ์ฆ์๋ฅผ ํ์ธํ๋ ๊ณผ์ ์ ์คํํ๋ค -> ๊ฒฐ๊ณผ: ์คํจ
curl -sv https://www.fastcampus-kubernetes.com:8443/myapp
# curl ํด๋ผ์ด์ธํธ๊ฐ nginx ์๋ฒ๋ก๋ถํฐ ๋ฐ์ ์ธ์ฆ์๋ฅผ ์ ๋ขฐํ ์ ์๋๋ก ์์ฒด ์๋ช
ํ ์ธ์ฆ์(secrets/https.cert)๋ฅผ ์๋ฒ ์ธ์ฆ์ ๊ฒ์ฆ์ ์ฌ์ฉํ๋๋ก ์ค์
curl --cacert til-by-topic/kubernetes/3.Kubernetes์-Docker๋ก-ํ-๋ฒ์-๋๋ด๋-์ปจ ํ
์ด๋-๊ธฐ๋ฐ-MSA/ch18/secrets/https.cert -sv https://www.fastcampus-kubernetes.com:8443/myapp
# ๊ฒฐ๊ณผ - ์ ์ ์๋ต
# ์ปจํ
์ด๋์ ๋ง์ดํ
๊ฒฝ๋ก /etc/nginx/conf.d, /etc/nginx/tls ํ์ธ
kubectl exec web-server -c nginx -- ls /etc/nginx/conf.d
kubectl exec web-server -c nginx -- ls /etc/nginx/tls
kubectl exec web-server -c nginx -- cat /etc/nginx/tls/https.cert # Base64 ๋์ฝ๋ฉ
# ํ๋ ์ญ์
kubectl delete pod web-server
kubectl delete pod my-app
kubectl delete svc my-app
kubectl delete configmap nginx-config
kubectl delete secret tls-config
- ์ฝ๋๋ฅผ ์์ฑํ ๊ทธ๋๋ก ์๋๊ฐ์ ์ ํผํจ์ผ๋ก์จ, ์ธํ๋ผ์ ๋ฐฐํฌ๊ฐ ๋น ๋ฅด๊ณ ์์ ํ๋ค.
- ๊นํ๊ณผ ๊ฐ์ ๋ฒ์ ์ ์ด ์์คํ ์ ํตํด iac ์ฝ๋๋ฅผ ํ์ธํ๊ณ ๋ฒ์ ์ ๊ด๋ฆฌํ ์ ์๋ค.
- ์ด๋ฌํ ์ฝ๋ ๊ธฐ๋ฐ์ผ๋ก ์ผ๊ด์ฑ์๊ฒ ๋์ผํ ์ธํ๋ผ์์ ๋ฐฐํฌํ ์ ์๋ค.
- ์ฌ์ฌ์ฉ ๊ฐ๋ฅํ ๋ชจ๋์ ์ฝ๊ฒ ๋ง๋ค ์ ์๋ค.
- iac ์ข ๋ฅ์ค ํ๋
- ์ ์ธ์ ๊ตฌ์ฑ ํ์ผ์์, ์ธํ๋ผ์ ๋ฆฌ์์ค๋ฅผ ์ ์ํ๊ณ ์ธํ๋ผ์ ์๋ช ์ฃผ๊ธฐ๋ฅผ ๊ด๋ฆฌํ ์ ์๋ค.
- ์ธํ๋ผ๋ฅผ ์๋์ผ๋ก ๊ด๋ฆฌํ๋ ๊ฒ๋ณด๋ค๋ ๋ ๋์ ๋ฐฉ์์ ์ ๊ณตํ๋ค.
- ์ฌ๋ฌ ํด๋ผ์ฐ๋ ํ๋ซํผ์์ ๊ด๋ฆฌํ ์ ์๋ค.
- ๊ฐ ํด๋ผ์ฐ๋๋ณ ํ๋ก๋ฐ์ด๋ ํ๋ฌ๊ทธ์ธ์ ์ฌ์ฉํ๋ฉด ํ ๋ผํผ์ API๋ฅผ ํตํด ํด๋ผ์ฐ๋ ํ๋ซํผ ๋ฐ ๊ธฐํ ์๋น์ค์ ์ํธ์์ฉ์ ํ ์ ์๋ค.
- ๋ฐฐํฌ ์ํฌํ๋ก์ฐ๋ฅผ ํ์คํํ์ฌ ๋ค์ํ ํ๋ก๋ฐ์ด๋์ ๋ฆฌ์์ค๋ฅผ ๋ชจ๋์ด๋ผ๋ ์ฌ์ฌ์ฉ ๊ฐ๋ฅํ ํ ๋ผํผ ๊ตฌ์ฑ์ผ๋ก ๊ตฌ์ฑํ ์ ์๊ณ , ์ผ๊ด๋ ์ธ์ด๋ ์ํฌํ๋ก์ฐ๋ก ๊ด๋ฆฌํ ์ ์๋ค.
- ์ฟ ๋ฒ๋คํฐ์ค๋ฅผ ์คํํ๋๋ฐ ์ฌ์ฉํ ์ ์๋ ๊ด๋ฆฌํ ์๋น์ค์ด๋ค.
- ์ฟ ๋ฒ๋คํฐ์ค์ ๋ง์คํฐ ๋ ธ๋๊ฐ ๋๋ control plane์ ์ค์น ๋ฐ ์๋ ๋ฑ ๋ณ๋์ ๊ด๋ฆฌ๋ฅผ ํ ํ์๊ฐ ์๋๋ก ํด์ค๋ค.
- ์ฌ๋ฌ AWS ๊ฐ์ฉ ์์ญ์ ์ฟ ๋ฒ๋คํฐ์ค๋ฅผ ๊ด๋ฆฌํ ์ ์์ด ๋์ ๊ฐ์ฉ์ฑ์ ์ ๊ณตํ๋ค.
- ๋ถํ์ ๋ฐ๋ผ ์ปจํธ๋กค ํ๋ ์ธ์ ์ธ์คํด์ค ํฌ๊ธฐ๋ฅผ ์๋์ผ๋ก ์กฐ์ ํ๊ณ , ๋ฐ์ดํฐ ํ๋ ์ธ์ด ๋ ์ ์๋ ์์ปค๋ ธ๋ ์์ญ์ ๊ฐ์งํ๊ณ ์คํ ์ค์ผ์ผ๋งํ ์ ์์ผ๋ฉฐ ์๋ํ๋ ๋ฒ์ ์ ๋ฐ์ดํธ ๋ฐ ํจ์น๋ฅผ ์ ๊ณตํ๋ค.
- ์ฌ๋ฌ AWS ์๋น์ค์ ํตํฉํด์, ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ํ ํ์ฅ์ฑ๊ณผ ๋ณด์์ ์ ๊ณตํ ์ ์๋ค.
- ์ฟ ๋ฒ๋คํฐ์ค ์ต์ ๋ฒ์ ์ ์ฌ์ฉํ๋ฏ๋ก, ์ฟ ๋ฒ๋คํฐ์ค์ ๋ชจ๋ ํ๋ฌ๊ทธ์ธ๊ณผ ๋๊ตฌ๋ฅผ ์ฌ์ฉํ ์ ์๋ค.
A,B ์๋ฒ๊ฐ ์ด๋ฏธ ๋ฐฐํฌ๋์ด ์๋ค๊ณ ๊ฐ์
- A ์๋ฒ canary ๋ฐฐํฌ
- B ์๋ฒ canary ๋ฐฐํฌ (์ ๊ท A์๋ฒ๋ฅผ ๋ฐ๋ผ๋ณด๋๋ก)
- ๊ธฐ์กด B ํธ๋ํฝ์ ์ ๊ท A๋ก ๋ณ๊ฒฝ
- A, B ์๋ฒ ์ ๋ฐ์ดํธ
- ํธ๋ํฝ์ ๋ค์ ์๋๋๋ก ๋ณต๊ตฌ
- canary ๋ฐฐํฌ๋ณธ ์ญ์
- ๋ฐฐํฌ ์์ ์ฑ
- ์ฟ ๋ฒ๋คํฐ์ค์ ์ปจํ ์ด๋ ์ค์ผ์คํธ๋ ์ด์ ์ ๋ฐฐํฌ ์๋ํ๋ฅผ ์ง์ํ๋ค.
- Pod๋ง ์ข ๋ฃ๋๋ค๊ฐ ๋ค์ ์คํ๋๊ธฐ ๋๋ฌธ์ ์ค๋๋ฅผ ์๋ก์ด ๋ ธ๋๋ก ์ด๋ํ์ง ์์๋ ๋๋ฏ๋ก ๋คํธ์ํฌ ๋น์ฉ๋ ์์จ ์ ์๋ค.
- ๊ทธ๋ฆฌ๊ณ ํน์ ๋ ธ๋๋ก ์ค๋๊ฐ ๋ชฐ๋ฆฌ๋ ์ํฉ์ ๋ฐฉ์งํ ์ ์์ผ๋ฉฐ ๋ฐฐํฌ ์๊ฐ๋ ํฌ๊ฒ ๋จ์ถํ ์ ์๋ค.
- ์์ฌ์ด ๋ฐฐํฌ
- ECK๋ฅผ ์ฌ์ฉํ๋ฉด ๋๊ตฌ๋ ESํด๋ฌ์คํฐ๋ฅผ ๋ฐฐํฌํ ์ ์๋ค.
- ํ ํฌ๋์ด์ ํ๋ฌ๊ทธ์ธ์ ์ค์นํ๊ธฐ ์ํด ํด๋ฌ์คํฐ ๋ฐฐํฌ๋ฅผ ํด์ผ ํ ๋ ๋๊ตฌ๋ ๊ฐ๋จํ๊ฒ ๋ฐฐํฌํ ์ ์๋ค.
- ์์ฌ์ด ๋ฒ์ ์
๊ทธ๋ ์ด๋
- minor ๋ฒ์ ์ ๊ทธ๋ ์ด๋๋ฅผ ์์ฝ๊ฒ ํ ์ ์๋ค.
- YAML manifest์์ sepc.version๋ง ๋ณ๊ฒฝํด์ฃผ๋ฉด ECK๊ฐ ์์์ ๋กค๋ง ๋ฐฐํฌ๋ฅผ ํตํ ๋ฒ์ ์ ๊ทธ๋ ์ด๋๋ฅผ ์ ์ฉํ๋ค.
- AutoScaling ์ ์ฉ
- ECK๋ฅผ ์ฌ์ฉํ๋ฉด HPA(HorizontalPodAutoscaler)๋ฅผ ์ ์ฉํ ์ ์์ด์ ๋ฆฌ์์ค๋ฅผ ๋์ฑ ํจ๊ณผ์ ์ผ๋ก ์ฌ์ฉํ ์ ์๊ณ ํด๋ฌ์คํฐ ์ด์ ๋น์ฉ๋ ์ต์ ํํ ์ ์๋ค.
- ๊ฒ์ ํด๋ฌ์คํฐ ๋ ธ๋์ ์ํ๋ ECK๊ฐ ์์์ ๋ชจ๋ํฐ๋ง ํ๊ธฐ ๋๋ฌธ์ ์ฐ๋ฆฌ๋ ์ ๊ฒฝ ์ธ ํ์๊ฐ ์์ด์ง๋ค.
- ์ญํ ๊ณผ ์ฑ
์ ๋ถ๋ฆฌ
- ECK๋ฅผ ์ฌ์ฉํ๋ฉด AWS๋ฐ ์ธํ๋ผ์ ๋ํ ์ด์์ DEVOPSํ์ ์์ํ๊ณ
- ๊ฒ์ํ์ ๊ฒ์ ํด๋ฌ์คํฐ ์ด์๊ณผ ๊ฒ์ ์๋น์ค์ ์ง์คํ ์ ์๋ค.
- kubernetes ๋ฟ๋ง์๋๋ผ ๋ชจ๋๋ค์ ํด๋นํ๋๋ฐ, ํ ๋น๋ ๋ธ๋ก์คํ ๋ฆฌ์ง๋ฅผ ์ฌ์ด์ฆ ์ค์ด๋๊ฑด ๋ถ๊ฐ๋ฅํ๋ค.
- block ์คํ ๋ฆฌ์ง๋ฅผ ํ ๋น ํด์ค ๋ ํด๋น block์ ์ด๋ค ์์ญ์ ์ฌ์ฉํ ์ง๋ฅผ ๊ฒฐ์ ํ๋๊ฑด os๋ ๋ฒจ์ด๋ผ์
- ์ธํ๋ผ ๋ ๋ฒจ์์๋ ๋ธ๋ก์ ์ถ๊ฐํด์ค ์๋ ์์ด๋
- ์ค์ผ ๋ ์ด๋ ์ค์ผ์ง๋ ๊ฒฐ์ ํ ์์๋ค.
- label์ debug๋ก override
- ํธ๋ํฝ์ด ์์ ํ๊ฒ ๋น ์ง๊ฑธ ํ์ธํ thread dump๋ฅผ ๋ฌ๋ค.
- ๋๋ฒ๊น ์งํ(๋ฉ๋ชจ๋ฆฌ ๋ฆญ ๋ฑ ํ์ธ)
- refresh ๋ฒํผ์ ๋๋ฅด๋ฉด ๋ฐ๋ก ๋ณ๊ฒฝ์ฌํญ์ ๋ถ๋ฌ์ฌ ์ ์๋ค.
- app detail์์ ์ฑ์ cluster ๋ฑ ๊ฐ์ข ์ ๋ณด๋ฅผ ํ์ธํ ์ ์๋ค.
- app detail์์ enable auto sync ์ค์ ์ ํตํด์ ์๋ ๋ฐฐํฌ ๋ฑ์ ์ค์ ํ ์ ์๋ค.