More Related Content
Similar to Kubernetes on GCP (20)
Kubernetes on GCP
- 1. Kubernetes on GCP
Daegeun Kim (gnkr8@outlook.com)
Lezhin Entertainment
1
1ํธ์ผ๋ก ์๊ฐํด์ฃผ์ธ์. 40๋ถ์์ ํ๊ธฐ์๋ ์ฃผ์ ๊ฐ ๋๋ฌด์ปธ์ต๋๋ค.
- 2. ๋ฐํ์
โ ๋ ์ง์ํฐํ
์ธ๋จผํธ ๋ฐ์ดํฐ ์์ง๋์ด
โ Links
โ https://geekdani.wordpress.com/
โ dgkim84 @ twitter / fb
2
๋ฐ์ดํฐ ์์ง๋์ด, ๋ถ์๊ฐ
์๋๋ก์ด๋, iOS ์ฑ ๊ฐ๋ฐ์
๋ฐฑ์๋, ์น ํ๋ก ํธ์๋ ๊ฐ๋ฐ์
์ถฉ์ ์ค ์
๋๋ค.
https://github.com/lezhin/apply/
blob/master/README.md
- 3. Google Cloud Platform
GCP์ ๋ ๋ง์ ์ ํ์ด ์์ง๋ง, ๋ฐ์ดํฐํ์์ ์ฌ์ฉํ๊ณ ์๋ ์ฃผ์ ์ ํ๊ตฐ
3
https://cloud.google.com/icons/
์ฐ๋ฆฌ ํ์ ์ ๋ฟ์ธ ํ์ด๊ณ ๋ค ์ธ์ฃผ ์ง์๋ค๋ก ๊ตฌ์ฑ ์ผ๊ตด ๋ณธ ์ ์ ์์ง๋ง ๊ทธ ๋ถ๋ค
์ด ์ ํ์ ๋ง๋ค์ด์ค๋๋ค.
๋ก๊ทธ ์์ง, ๊ฐ๊ณต, ์ ์ฌ, ๋ชจ๋ธ๋ง, ๋ถ์ ๋ฑ์ ํ ์ ์๋๋ก ์ง์ํด์ฃผ๊ณ ์์ต๋๋ค.
BigData ์ ํ๊ตฐ, Compute ์ ํ๊ตฐ, ๋ก๊น
, ๋คํธ์ํฌ, ์คํ ๋ฆฌ์ง ๋ฑ ์ ํ๊ตฐ์ ํ์ฉ
์ค ์
๋๋ค.
BigTable ๊ณผ ๊ฐ์ ์ ํ๋ค๋ ์์ง๋ง ์ฌ์ฉ ์ค์ ์์ต๋๋ค.
- 5. ์์ ์ ์ด๊ณ ๋
๋ฆฝ๋
Data Infrastructure
- 2016๋
4์ ํ์ถ
5
๋ณธ์
์ ๋ฐฑ์๋ํ ์ด์๊ณ ์
๋ฌด ์ธ์ ์์
์ด ์งํ๋ ๊ฒ ์ด๊ธฐ๋๋ฌธ์
์์ด ๋ ๊ฐ๊ณ ์์ ์ ์ผ๋ก ์ด์๋๋๋ก ํ๋๊ฒ ์ฃผ ๋ชฉํ์
๋๋ค.
๊ทธ๋ ๊ธฐ๋๋ฌธ์ ์คํ์์ค์ ๊ฐ์ ์ ํ์ ์ง์ ์ด์ํ๋ ๊ฒ๋ณด๋ค fully managed ๋
๊ณ ์๋ GCP ์ ํ๊ตฐ์ ๋ ์ดํด๋ณด๊ฒ ๋ฉ๋๋ค.
- 6. Google Cloud Platform
๋ ๋ง์ ์ ํ์ด ์์ง๋ง, ๋ฐ์ดํฐํ์์ ์ฌ์ฉํ๊ณ ์๋ ์ฃผ์ ์ ํ๊ตฐ.
6
์์ง -> ๊ฐ๊ณต -> ์ ์ฌ -> ๋ชจ๋ธ๋ง -> ๋ถ์
์์ง -> ๊ฐ๊ณต -> ์ ์ฌ -> ๋ชจ๋ธ๋ง -> ๋ถ์ ๋ฑ์ ๊ณผ์ ์ ๊ฑฐ์น๋ฉด์
๋ง์ผํ
, ๋น๋ง, ๊ธฐํํ ๋ฑ์์ SQL ๋ฑ์ ํ์ฉํ ์ ์๋๋ก DWH ๊ตฌ์ถ๋ถํฐ
BI ํด ์ฐ๊ณ๋ฅผ ํตํด SQL์ ๋ค๋ฃจ์ง ๋ชปํ๋ ๋ถ๋ค๋ ์๊ฐํ ํ ์ ์๋ ํด์ ์ ๊ณตํฉ
๋๋ค.
์ด ์ธํ๋ผ๋ก ํ๋ฌ์ ๋๋ต 10์ต๊ฑด ์ด์์ ์ ์๋ฏธํ ๋ก๊ทธ๊ฐ ์์
๋๋ค.
๋ฐฐ์น ๋ถ์์ ์ํด ์คํ ๋ฆฌ์ง๋ก, ์ค์๊ฐ ๋ถ์์ ์ํด Pub/Sub ๋ฑ์ผ๋ก ๋ณด๋ด์ง๋๋ค.
๋๋ถ๋ถ์ ETL๊ณผ ์ถ์ฒ์ฒ๋ฆฌ๋ Spark ๋ก ์ด๋ฃจ์ด์ง๋ฉฐ ์ค์๊ฐ ์ฒ๋ฆฌ๋ DataFlow
Streaming ์ฐ๊ณ ๋ฐฐ์น๋ ์๋๋ค.
- 7. GCP ๊ธฐ๋ฅ ์ธ์
ํ์ํ ๊ฒ
- ์ํฌํ๋ก์ฐ & ์ค์ผ์ฅด๋ฌ
- ์ถ์ฒ(๊ฒ์) ๋ฐ์ดํฐ ์๋น์ฉ ์ดํ๋ฆฌ์ผ์ด์
์๋ฒ
- ์๋น์ค ํนํ๋ ์งํ์ฉ ๋ฐฑ์คํผ์ค
- ๊ธฐํ ์ ๋ง์ ์ดํ๋ฆฌ์ผ์ด์
์๋ฒ
7
์ํฌํ๋ก์ฐ & ์ค์ผ์ฅด๋ฌ : Airflow (Oozie, Azkaban, Luigi ์ ๊ฐ์) ์ ํ์ผ๋ก
ETL ์ก์ด๋ ์ด๋ฐ ๋ฐ๋ณต๋๋ ์์
์ DAG ํํ๋ก ๊ด๋ฆฌํ๊ณ ์ค์ผ์ฅด๋งํ๋ ์ญํ
์ด์ ๊ฐ์ ์ญํ ์ ํด์ฃผ๋ ์๋ฒ๋ค์ด ์๋๋ฐ ๊ด๋ฆฌ๋ฅผ ํจ์จ์ ์ผ๋ก ํ๋ ค๊ณ ํ ๋
๊ณ ๋ฏผํ๋ ์ฌํญ๋ค์ด ์์ต๋๋ค.
- 8. Checklist
โ Deployment
โ Provisioning
โ Automation
โ Stateless, Stateful
โ Scalability
โ Monitoring
โ Discovering Service
8
๋ฐฐํฌ, ํ๋ก๋น์ ๋, ์๋ํ ๋ฑ์ด ๊ทธ๊ฒ์ด๊ณ
ํ์ฅ์ฑ์ด๋ผ๋์ง ๋ชจ๋ํฐ๋ง ๊ทธ๋ฆฌ๊ณ Discovering Service ์ ๊ฐ์ ๋ฌธ์ ๋ค์ด ์์ต๋
๋ค.
์ด๊ฑธ ๊ฐ๋ณ๋ก ๊ตฌ์ถํ๊ณ ๊ด๋ฆฌํ๋ ๋น์ฉ์ ์ด์ฐ๋ณด๋ฉด ๊ต์ฅํ ํฝ๋๋ค.
์ด๋ฒ ๋ฐํ์์๋ ์๋ํ, Stateful ์ดํ๋ฆฌ์ผ์ด์
์๋ํ ๋ฌธ์ , ๋ชจ๋ํฐ๋ง,
Discovering Service์๋ํ ์์ธํ ๋ด์ฉ์ ์๊ฐ๊ด๊ณ์ ๋ค๋ฃจ์ง ๋ชปํฉ๋๋ค.
- 10. Deployment
โ Provisioning
โ OS, Network, โฆ
โ Resource (CPU, Memory, Storage, โฆ)
โ Application Code
โ Dependencies
โ Configurations
โ Update
โ Rolling Update
โ Blue-Green Deployment
โ Rollback
10
ํ๋์ฉ ๊ฐ๊ฐ๊ฒฉํ ํด๋ณด์์.
- 12. Pod
โ ๋ฐฐํฌ ์ต์ ๋จ์
โ ํ๋ ์ด์์ container (docker / rkt) ํฌํจ
โ ํจ๊ป ํฌํจ์์ผ์ผ ํ ๊ฒ์ด ์๋ค๋ฉด ํจ๊ป ์ ์ธ
โ Resources
โ Volumes, Port, โฆ
โ CPU, Memory
โ Request, Limit
โ livenessProbe
โ โฆ
โ Unique IP address
12
rkt (rock-it) ์ experimental
ํจ๊ป ํฌํจ์์ผ์ผํ ๊ฒ์ด ์์ ๋ ํจ๊ป ์ ์ธํฉ๋๋ค.
๊ธฐ๋ณธ์ ์ผ๋ก container ๊ธฐ๋ฐ์ด๊ธฐ๋๋ฌธ์ OS๋ dependency ๋ฌธ์ ๋ ์ฝ๊ฒ ํด๊ฒฐ์ด ๋ฉ๋๋ค.
์ฌ๊ธฐ์ ๊ฐ์ฅ ์ค์ํ ๊ฒ์ hello world ์์ค์ guide์์ ์ธ๊ธ์ด ์๋์ง๋ง
resource ๊ด๋ฆฌ๊ฐ ์ค์ํ๋ฉฐ, Pod์ Kubernetes์์ ๊ฐ์ฅ ์์ ๊ฐ๋
์ผ๋ก ์๋ ค์ ธ์์ง๋ง
๊ฐ์ฅ ๋ค๋ฃจ๊ธฐ ์ด๋ ต๊ณ ์ค์ํ ๋์์
๋๋ค. ์ฝ์งํด๋ณด์๋ฉด ์๊ฒ๋ฉ๋๋ค.
์ง์ง! ๊ทธ๋ ๊ธฐ๋๋ฌธ์ Kubernetes๋ ํ์ตํด์ผํ ๊ฒ์ด ์ ์ง ์์ต๋๋ค.
- 13. Creating a Pod
$ kubectl create -f airflow-web.yaml
1 kind: Pod
2 apiVersion: v1
3 metadata:
4 namespace: dev
5 name: airflow-web
6 labels:
7 app: airflow-web
8 spec:
9 containers:
10 - image: "gcr.io/<PROJECT_ID>/airflow:v1b35"
11 args: ["webserver"]
12 name: airflow-web
13 imagePullPolicy: IfNotPresent
14 ports:
15 - containerPort: 8080
16 protocol: TCP
17 resources:
18 requests: {cpu: "250m", memory: "128Mi"}
19 limits: {cpu: "500m", memory: "512Mi"}
- 14. QoS
โ Guaranteed
โ Limits OR Limits = Requests
โ Burstable
โ Limits not set OR Requests != Limits
โ Guaranteed and Best-Effort = Burstable
โ Burstable and Best-Effort = Burstable
โ Best-Effort
โ Requests, Limits ๋ชจ๋ ์ค์ ์๋ ๊ฒฝ์ฐ
โ ์ด๋ฅผ ๋ฐํ์ผ๋ก oom_score_adjust ๊ฒฐ์
โ ์ค์ํ ๊ฒ์ด ๋จผ์ kill ๋ ์ ์์ผ๋ Resources ์ค์ ์ค์.
14
Pod์ 2๊ฐ ์ด์์ container๋ฅผ ๊ฐ์ง ์ ์๊ธฐ๋๋ฌธ์
Guaranteed ๊ฐ ์๋๋ผ๋ Burstable ๋ก ๋ถ๋ฅ๋ ์ ์์ต๋
๋ค.
- 15. Expose
โ $ kubectl expose
โ pod/airflow-web
โ โnamespace dev
โ โport=8080
โ โtarget-port=8080
โ โtype=LoadBalancer
โ $ kubectl get service โnamespace dev
โ $ open http://EXTERNAL_IP:8080/
15
์ธ๋ถ๋ก ๋
ธ์ถํ๊ธฐ์ํด์ expose๊ฐ ํ์ํฉ๋๋ค.
โtype ์ ๋ณ๋๋ก ๊ธฐ๋กํ์ง ์์ผ๋ฉด ClusterIP๊ฐ ์์ฑ๋ฉ๋
๋ค.
HTTP LoadBalancer๋ Ingress Object Model ํตํด์ ํ
๋ฉฐ ์ด ๋ฐํ์์๋ ์์ธํ ์ธ๊ธ๋์ง ์์ต๋๋ค.
- 16. Deployment
โ Provisioning
โ OS, Network, โฆ
โ Resource (CPU, Memory, Storage, โฆ)
โ Application Code
โ Dependencies
โ Configurations
โ Update
โ Rolling Update
โ Blue-Green Deployment
โ Rollback
16
- 18. ConfigMap
$ kubectl create -f config.yaml
kind: ConfigMap
apiVersion: v1
metadata:
name: airflow-conf
namespace: dev
data:
airflow.cfg.file: |-
[core]
airflow_home = /opt/airflow
dags_folder = /opt/airflow/dags
base_log_folder = /opt/airflow/logs
ํ๋์ ๋จ์ผ ์ฝ๋๋ฒ ์ด์ค๋ก
์ธ์ ๋ผ๋ ์ค์ ์ ๊ฐ์ ์๋ ๋ฐฉ๋ฒ์ ์๊ฐํฉ๋๋ค.
- 19. Mounting ConfigMap
as Volume
โฆ
spec:
volumes:
- name: airflow-conf
configMap:
name: airflow-conf
items:
- key: airflow.cfg.file
path: airflow.cfg
containers:
- image: "gcr.io/<PROJECT_ID>/airflow:v1b35"
โฆ
volumeMounts:
- name: airflow-conf
mountPath: /etc/config
โฆ
๋ณผ๋ฅจ ๋ง์ดํธ!
ํท๊ฐ๋ฆฌ๋ฉด ์ด์ ์ฅ์ ๋ค์ ๋ณด์๋ฉด ๋ฉ๋๋ค.
- 20. Deployment
โ Provisioning
โ OS, Network, โฆ
โ Resource (CPU, Memory, Storage, โฆ)
โ Application Code
โ Dependencies
โ Configurations
โ Update
โ Rolling Update
โ Blue-Green Deployment
โ Rollback
20
- 22. Kubernetes Deployment
โ Newer and Higher level concept (since 1.2)
โ ReplicaSet, ReplicationController
โ Pods, ReplicaSet ๋ฑ ๋ฆฌ์์ค๋ฅผ ์์ฑํ๊ณ ๊ธฐ์กด์ ๊ฒ์
๋ฐ๊พธ๋ ๋ฑ ์ผ๋ จ์ ์์
์ ๋ช
์ํฉ๋๋ค.
โ Replica, Autoscaling
โ Rolling Update, Rolling Back
โ PodTemplate
22
Deployment ๊ฐ ์์์ ํด์ฃผ๊ธฐ๋๋ฌธ์ Pod์ด๋ ReplicaSet ๋ฑ์ ๋ฆฌ์
์ค ์์ฑ์๋ํด ํฌ๊ฒ ๊ณ ๋ฏผํ์ค ํ์๋ ์์ต๋๋ค.
๊ธฐ๋ณธ์ ์ผ๋ก ๋ช
์ํ๋ ๊ฒ๋ค์ replica ๋ update strategy ์ ๋์ด๊ตฌ์.
์์ฑํ deployment ๋ก autoscale, rolling update, rollout ๋ฑ์ ์ํ
ํ ์ ์์ต๋๋ค.
Deployment์๋ ์์ฑํ Pod์๋ํ ๊ธฐ๋ณธ Template์ ๋ช
์ธํฉ๋๋ค.
- 24. Expose
โ $ kubectl expose
โ deploy/airflow-web
โ โnamespace dev
โ โport=8080
โ โtarget-port=8080
โ โtype=LoadBalancer
โ $ kubectl get service โnamespace dev
โ $ open http://EXTERNAL_IP:8080/
24
- 25. Rolling Update
โ $ kubectl set image
โ โnamespace dev
โ deploy/af-web
โ af-web=gcr.io/PROJECT_ID/REPO:VERSION
โ $ kubectl apply -f airflow-web-deployment.yaml
โ $ kubectl edit โnamespace dev deploy/af-web
25
- 26. Deployment
โ Provisioning
โ OS, Network, โฆ
โ Resource (CPU, Memory, Storage, โฆ)
โ Application Code
โ Dependencies
โ Configurations
โ Update
โ Rolling Update
โ Blue-Green Deployment
โ Rollback
26
- 27. Rollback /1
โ $ kubectl set image
โ โnamespace dev
โ deploy/af-web
โ af-web=gcr.io/PROJECT_ID/REPO:VERSION
โ $ kubectl apply OR kubectl edit
27
- 28. Rollback /2
โ $ kubectl rollout history
โ โnamespace dev deploy/af-web
โ $ kubectl rollout undo
โ โnamespace dev โdry-run=true
โ โto-revision=<RevNo> deploy/af-web
28
- 29. Deployment
โ Provisioning
โ OS, Network, โฆ
โ Resource (CPU, Memory, Storage, โฆ)
โ Application Code
โ Dependencies
โ Configurations
โ Update
โ Rolling Update
โ Blue-Green Deployment
โ Rollback
29
Blue-Green Deployment ๋ ๊ฐ์ฅ ๋์ค์ ๋ค๋ฃน๋๋ค.
- 31. Scale
โ $ kubectl scale โnamespace dev
โ โreplicas=3 deploy/af-worker
โ ํ์ฌ replica๊ฐ 2๊ฐ์ผ ๋๋ง ์ ์ฉํ๊ณ ์ถ์ ๋,
โ $ kubectl scale โnamespace dev
โ โreplicas=3 โcurrent-replicas=2 deploy/af-worker
31
- 32. Horizontal Pod Autoscaling
since 1.2
โ stable ๋ฒ์ ์์ cpu๋ง ์ง์
โ $ kubectl autoscale
โ deploy/af-worker
โ โcpu-percent=60 โmin=1 โmax=4
โ $ kubectl get hpa
โ autoscaling/v2alpha1 ์์ ๋ ๋ค์ํ๊ฒ ์ ์ด ๊ฐ๋ฅํด์ง๋๋ค.
โ memory, multiple custom metrics
32
- 35. Node Pool
โ $ gcloud container node-pools create NAME
โ โzone ZONE --cluster CLUSTER
โ โmachine-type n1-standard-4
โ โnum-nodes 3
35
- 36. Preemptible Node Pool
โ $ gcloud beta container node-pools create NAME
โ โzone ZONE --cluster CLUSTER
โ โmachine-type n1-standard-4
โ โnum-nodes 3
โ โpreemptible
โ $ kubectl get nodes
โ โselector='cloud.google.com/gke-preemptible'
โ $ kubectl get nodes
โ โselector='!cloud.google.com/gke-preemptible'
36
์ ๋ ดํ ๊ฐ๊ฒฉ์ผ๋ก ํด๋ฌ์คํฐ๋ฅผ ์ด์ํด๋ด
์๋ค.
๊ทผ๋ฐ ์ค์ํ POD์ด preemptible์ ์ฌ๋ผ๊ฐ๋ฉด ์ด๋ป๊ฒ
๋ ๊น์โฆ
Pod์ ํน์ ๋
ธ๋์ ํ ๋น๋๋๋ก ์์๋ด
์๋ค.
- 37. Label
โ ๋ชจ๋ resource์ label ์ถ๊ฐ/์ญ์ ๊ฐ๋ฅ
โ $ kubectl label node NODE_NAME
โ โoverwrite key=value
โ Removing a label
โ $ kubectl label node NODE_NAME key-
37
NodeSelector ๋ฅผ ์ธ๊ธํ๊ธฐ ์ ์ ๊ฐ ๋ฆฌ์์ค (node, pod, โฆ)์ Label์ ๋ฌ ์ ์์ต๋๋ค.
- 39. Blue-Green Deployment /1
39
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
labels:
color: green || blue
app: af-web
name: af-web-green || af-web-blue
spec:
replicas: 1
template:
metadata:
labels:
color: green || blue
app: af-web
Deployment ๋ฅผ ๋๊ฐ๋ฅผ ๋ฐฐํฌํฉ๋๋ค.
ํ๋๋ blue ๋ ๋ค๋ฅธ ํ๋๋ green ์ผ๋ก ํฉ๋๋ค.
์ ์ฒด๋ฅผ ํ๋ฒ์ ๋ค๋ฅธ ๋ฒ์ ์ผ๋ก route
์์ผ๋ณด๋๋ก ํ๊ฒ ์ต๋๋ค.
- 40. Blue-Green Deployment /2
40
spec:
ports:
- nodePort: 32354
port: 8080
protocol: TCP
targetPort: 8080
selector:
color: green
app: af-web
type: LoadBalancer
apiVersion: v1
kind: Service
metadata:
labels:
run: af-web
name: af-web
Expose ํ๋ฉด ๊ธฐ๋ณธ์ ์ผ๋ก Service ํ๋ ๋ง๋ค์ด์ง๋๋ค.
$ kubectl get services
$ kubectl edit service/<SERVICE_NAME>
ํ ๋ค์ ์ค์ ์ฒ๋ผ selector ๊ฐ์ ์กฐ์ ํด์ ์๋กญ๊ฒ ๋ฐฐํฌํ ๊ณณ์ผ๋ก ๊ฐ๋๋ก
ํ ์ ์์ต๋๋ค.
- 41. Deployment
โ Provisioning
โ OS, Network, โฆ
โ Resource (CPU, Memory, Storage, โฆ)
โ Application Code
โ Dependencies
โ Configurations
โ Update
โ Rolling Update
โ Blue-Green Deployment
โ Rollback
41
- 44. Resource Quota
โ Namespace ๋ณ๋ก resource Quota
44
apiVersion: v1
kind: ResourceQuota
metadata:
name: compute-resources
spec:
hard:
pods: "4"
requests.cpu: "1"
requests.memory: 1Gi
limits.cpu: "2"
limits.memory: 2Gi
configmaps
persistentvolumeclaims
replicationcontrollers
secrets
services
services.loadbalancers
์ด๋ฒ ๋ฐํ์์ โnamespace ์ต์
์ด
๋ค์ด์๋ quota ๊ธฐ๋ฅ๋๋ฌธ์ ๊ทธ๋ ์ต๋๋ค.
ํ๊ฒฝ๋ณ๋ก quota๋ฅผ ์ง์ ํ ์๋ ์๊ณ
์กฐ์ง๋ณ๋ก ๋ถ๋ฆฌ์ํฌ ์๋ ์์ต๋๋ค. ์๋ก์ ๊ฐ์ญ์ ์ค์ผ ์ ์๊ฒ ์ฃ .