Kubernetes 101 — 03 Creating Kubernetes Deployments & Services + Ingress
About Kubernetes 101
บทความ Series นี้จะเป็นการบันทึกของ “ เส้นทางการเริ่มต้นการใช้ Kubernetes บน Google Kubernetes Engine ” ของเราเอง โดยมี List ดังนี้!!
What is Deployments?
Deployments คืออะไร?
Deployments controller ใน Kubernetes จะเป็นคนที่จะมาอัพเดท Pods และ ReplicaSets
ว่าง่ายๆ ก็คือ เมื่อเราใส่ state ต่างๆที่เราจะต้องการให้เกิดการเปลี่ยนแปลงใน Deployment object แล้ว ตัว Deployment controller จะทำการเปลี่ยนแปลง actual state ณ ตอนนี้ให้เป็น state ที่เราต้องการ เราเลยสามารถบอกได้ว่าจะสร้าง ReplicaSets ใหม่ หรือ ลบ Deployments เดิมแล้วแทนที่ด้วย Deployments ใหม่ที่เราต้องการ
Create a Deployment
มาดูกันว่า รูปแบบการจะสร้าง Deployment ทำได้อย่างไร
ตาม yaml ไฟล์ด้านล่าง เราก็จะเห็นว่า จะมี kind เป็น Deployment และรายละเอียดที่เหลือ ก็จะเป็นในส่วนของ spec ต่างๆ ที่เราต้องการให้ Deployment นี้มี
# deployment.yamlapiVersion: apps/v1
kind: Deployment
metadata:
name: react-ssr
spec:
replicas: 1
selector:
matchLabels:
name: react-ssr
template:
metadata:
labels:
name: react-ssr
spec:
containers:
- name: react-ssr
image: praekiko/react-ssr:0.0.1
ports:
- containerPort: 8080
NOTE: ตัว Docker image นี้เราจะไปฝากไว้ที่ Docker Hub นะจ๊ะ
จากนั้นทำ apply ตัว deployment ที่เราสร้างมาดูกัน !!
kubectl apply -f deployment.yamlkubectl get deployments
NAME DESIRED CURRENT UP-TO-DATE AVAILABLE AGE
react-ssr 1 1 1 0 6skubectl get pods
NAME READY STATUS RESTARTS AGE
react-ssr-5845889cb5-swz8t 1/1 Running 0 7s
ก็จะเห็นว่า เมื่อเราลอง get deployments และ pods ออกมาดู ก็จะเห็น deployment ชื่อที่เราสร้างมากำลังรันอยู่แล้ว
Create a Service
Service เป็นส่วนที่เราจะสามารถปล่อย application ที่รันอยู่ใน Pods สู่สาธารณะชนได้ ในที่นี้ก็คือ ผ่าน network นั่นเอง
เริ่มต้น ก็เช่นเดิม จะสร้าง file เป็น pattern ของ Service ขึ้นมา จะเห็นว่า มี kind เป็น Service
# service.yamlapiVersion: v1
kind: Service
metadata:
labels:
name: react-ssr
name: react-ssr
spec:
selector:
name: react-ssr
ports:
- port: 8080
protocol: TCP
targetPort: 8080
ลอง apply ดูกัน !
kubectl apply -f service.yamlkubectl get services
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
react-ssr ClusterIP 10.7.242.224 <none> 8080/TCP 36s
เย้ Service เรากำลัง รันอยู่แล้ว
แล้ว….เราจะ access Service นี้ยังไง ?
ทำได้หลายแบบ โดยจะตั้ง Service ให้เป็น type LoadBalancer หรือ NodePort ก็ได้ แต่วันนี้เราจะเลือก ใช้ Ingress นะ
[BONUS] เชื่อม Ingress กับ Service
ก่อนอื่นเลย ต้องลง Ingress ก่อน สำหรับคนที่ยังไม่เคยมี
โดย install ingress controller ผ่าน helm ตาม command ด้านล่างเลย โยเราจะใส่ namespace เป็น kube-system ไว้นะ
helm install stable/nginx-ingress --namespace kube-systemkubectl get service --namespace kube-system
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
eager-maltese-nginx-ingress-controller LoadBalancer 10.55.252.248 35.240.XXX.XXX 80:32350/TCP,443:32711/TCP 1m
eager-maltese-nginx-ingress-default-backend ClusterIP 10.55.254.43 <none> 80/TCP 1m
ลอง get service namespace = kube-system ดู จะเห็นว่าตรง External IP เราจะได้ IP มาให้ใช้งานแล้ว
แต่ตัวนี้จะเป็นตัว controller ถ้าเราจะบอกว่าจาก IP หรือ Host นี้ให้ไปที่ Service ไหนของเรา เราจะต้องสร้าง Ingress เพื่อมา link มันเข้าด้วยกัน
โดยจะสร้าง Ingress ขึ้นมาด้วย kind ingress พร้อมบอกว่าจาก hostname นี้เราจะให้ point ไปที่ service react-ssr ที่เราสร้างมา ตาม code ด้านล่าง
# ingress.yamlapiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: test-ingress
annotations:
kubernetes.io/ingress.class: nginx
spec:
rules:
- host: www.example.com
http:
paths:
- path: /
backend:
serviceName: react-ssr
servicePort: 8080
จากนั้น apply ingress
kubectl apply -f ingress.yamlkubectl get ingress
NAME HOSTS ADDRESS PORTS AGE
test-ingress www.example.com 35.240.XXX.XXX 80 11s
เราก็สามารถ access Service ที่เราสร้างมาเมื่อสักครู่ ได้ ผ่านทาง HOSTS: www.example.com ได้แล้ว!!
ปล. ถ้าไม่มี domain แล้วอยากลอง test ก็ลองใช้ xip.io ดูได้ เป็น EXTERNAL_IP.xip.io แทนได้นะจ๊ะ
DONE !