👤
Novice Handbook
  • Novice Handbook
  • Guide
  • Internet และ Web
    • HTML
  • Computer Language
    • Basic Computer Language (LV.1)
    • C Language (LV.1)
    • Python3 (LV.1)
  • Operating System
    • Linux
      • Basic Linux (LV.1)
  • TOOLS
    • Text Editor
      • Vim Editor
    • Source Control
      • GitLab
        • GitLab for small site (LV.1)
    • Container
      • Docker
        • Docker (LV.1)
        • Docker (LV.2)
      • Kubernetes
        • Kubernetes Intro (LV.0)
        • Kubernetes Basic (LV.1)
        • Kubernetes Intermediate (LV.2)
        • Helm (LV.2)
        • RKE2 (LV.3)
        • K3S (LV.3)
        • K3D (LV.3)
    • Repository
      • Harbor
        • Harbor for small site (LV.1)
        • Harbor for enterprise (LV.2)
    • Database
      • Redis
        • Redis on Docker Compose (LV.1)
        • Redis on Kubernetes (LV.2)
      • Elastic Stack
        • Elasticsearch & Kibana for small site (LV.1)
    • Observability
      • Prometheus
        • Prometheus for small site (LV.1)
        • Prometheus Operator (LV.2)
    • Security
      • Certbot (LV.1)
      • Falco
      • Hashicorp Vault
    • Collaboration
      • Nextcloud
Powered by GitBook
On this page
  • Kubernetes คืออะไร
  • Feature ของ Kubernetes
  • Kubectl
  • Basic Kubernetes Resource
  • Kubernetes Pods
  • Kubernetes Deployments
  • Kubernetes Services
  • Other Tips
  • Scaling Application
  • Update Application Image
  • Rollback

Was this helpful?

  1. TOOLS
  2. Container
  3. Kubernetes

Kubernetes Intro (LV.0)

Kubernetes คืออะไร

  • Kubernetes หรือที่เรียกย่อๆว่า k8s (เค-เอท-เอส) เป็น open source ซึ่งช่วย automate deploy, scale และจัดการ container application

  • Kubernetes มีรากศัพท์มาจากภาษากรีก คำว่า κυβερνήτης ซึ่งหมายถึงคนถือหางเสือเรือ (Helmsman) ซึ่งบอกเป็นนัยว่า Kubernetes เป็นผู้ควบคุมทิศทางของเรือซึ่งบรรทุก container

  • ที่มาของชื่อย่อ k8s คือ ลดรูป 8 ตัวอักษรระหว่าง k และ s

  • Kubernetes ได้รับการพัฒนาโดยได้รับแนวคิดมาจาก Borg ซึ่งเป็น software ของ Google ในการจัดการ container และ workload application ซึ่งให้บริการในระดับ global มาเป็นเวลาหลายสิบปี

  • Kubernetes เริ่มต้นมาโดย Google และถูกส่งมอบต่อให้องค์กร Cloud Native Computing Foundation (CNCF) ดูแล ในฐานะ version 1.0 ตั้งแต่ปี ค.ศ. 2015

Feature ของ Kubernetes

Automatic bin packing

Kubernetes มีการจัด schedule ในการ deploy container อย่างอัตโนมัติ ทั้งนี้ในการเลือกว่าจะ deploy ลงเครื่องใด จะพิจารณาจากทรัพยากรที่ container ต้องใช้ และเงื่อนไขข้อกำหนดต่างๆที่ระบุไว้กับตัว container อีกด้วย จึงใช้ทรัพยากรได้อย่างมีประสิทธิภาพโดยไม่สูญเสีย Availbility ของระบบ

Self-healing

Kubernetes จะแทนที่ container ซึ่งไม่สามารถใช้งานได้ และ reschedule เพื่อ deploy container ใหม่ โดยพิจารณาจากการตั้งค่า healthcheck ทั้งนี้ Kubernetes ยังช่วยป้องกันการไหล traffic ไปยัง container ซึ่งไม่ตอบสนองแล้ว อีกด้วย

Horizontal scaling

Kubernetes สามารถ scale container แบบ manual หรือโดยอัตโนมัติได้ ทั้งนี้การ scale แบบอัตโนมัติ จะพิจารณาจาก metrics ที่ตั้งค่าไว้

Service discovery and Load balancing

แต่ละ container ใน Kubernetes จะมี IP address เป็นของตนเอง และยังมี DNS name สำหรับแต่ละกลุ่ม container เพื่อช่วยในการกระจาย request traffic เข้าไปยังแต่ละ container ในกลุ่มนั้น

Automated rollouts and rollbacks

Kubernetes สามารถ update และถอยกลับการอัพเดต application หรือการเปลี่ยน configuration ได้อย่างราบรื่น เพราะมีการ monitor healthcheck อยู่ตลอดเวลา เพื่อป้องกัน downtime ของ application

Secret and configuration management

Kubernetes มีการแยกเก็บ sensitive data และ configuration ต่างๆจากตัว container ดังนั้นจึงไม่ต้อง build container image ซึ่งมี configuration และ/หรือ sensitive data ติดมาด้วย นอกจากนี้ตัว sensitive data และ configuration ก็ยังสามารถอ้างถึงได้โดยที่ไม่แสดง content ใน configuration ของ stack

Storage orchestration

Kubernetes รองรับการ mount software-defined storage (SDS) หลายๆชนิด เข้ากับ container

Batch execution

Kubernetes รองรับการทำงานแบบ batch และ job ที่ทำงานนานๆ และยังสามารถแทนที่ container ที่ทำงานไม่สำเร็จได้อีกด้วย

Kubectl

kubectl (อ่านว่า คูป-คอนโทรล) เป็นเครื่องมือ command line ของ Kubernetes เพื่อให้ผู้ใช้สามารถติดต่อกับ Kubernetes Cluster ได้

ผู้ใช้สามารถใช้ในการ deploy application ตรวจสอบและจัดการ cluster และดู log application ได้

kubectl get xxx - อ่าน information ของ resource นั้นๆ kubectl create xxx - สร้าง resource นั้นๆ kubectl delete xxx - ลบ resource นั้นๆ kubectl describe xxx - ดู detail ของ resource นั้นๆ kubectl edit xxx - แก้ไข configuration ของ resource นั้นๆ kubectl logs xxx - ดู log ของ container

Basic Kubernetes Resource

Kubernetes Pods

Pods เป็นหน่วยเล็กที่สุดของ Kubernetes มันแสดงถึงกรุ๊ปของ container application หนึ่งตัวหรือมากกว่านั้น ซึ่งมี resource network และ storage ใช้ร่วมกัน

แต่ละ Pod จะมี IP Address ของมันเอง ดังนั้นหากมีหลาย container ภายใน Pod ทุก container ก็จะมี IP ร่วมกัน Pod อาจจะมีการ mount volume ดังนั้นหากมีหลาย container ภายใน Pod ทุก container ก็จะเห็น volume นั้นร่วมกัน

โดยปกติแล้วเรามักจะสร้าง Pod โดยมี container เดียว

Create a Pod

ในการสร้าง Pod หนึ่งๆ เราสามารถคำสั่งใช้ kubectl run และระบุ image ที่ต้องการนำมาสร้าง Pod ได้ เช่น

kubectl run nginx --image=nginx

คำสั่งข้างต้นจะสร้าง Pod ชื่อ nginx ขึ้นมาด้วย image nginx:latest

ในการ list Pod ที่ถูกสร้าง ใช้คำสั่งดังนี้

kubectl get pods

Get Pod detail

ในการเรียกข้อมูลรายละเอียด Pod มาแสดง ใช้คำสั่งดังนี้

kubectl describe pod nginx

จะนำข้อมูลรายละเอียดของ Pod ซึ่งมีชื่อ nginx ขึ้นมาแสดง

Get container log

การดู log ของ container ใช้คำสั่งดังนี้

kubectl logs nginx

Remove Pod

ในการ terminate Pod ที่สร้างขึ้นมา ใช้คำสั่งดังนี้

kubectl delete pod nginx

Kubernetes Deployments

การใช้งาน Pod เดี่ยวๆ ไม่สามารถ scale application เพื่อรองรับ workload ได้ อีกทั้งหาก Pod ถูก terminate ไป ก็จะไม่มีการสร้างกลับมา หาก Pod อยู่บน server ที่ down ไป ก็จะไม่มีการถูกสร้างขึ้นมาใหม่บนเครื่อง server ที่เหลือ ดังนั้นจึงต้องใช้ deployment เข้ามาแก้ปัญหานี้

ในความเป็นจริงแล้ว Deployment ไม่ได้เข้าไปควบคุมจำนวนของ Pod โดยตรง แต่จะมี resource ชนิดอื่นเป็นตัวควบคุมแทน แต่เบื้องต้น เพื่อความง่ายต่อความเข้าใจ ให้คิดว่า Deployment เป็นตัว maintain จำนวน Pod ไปก่อน

Create a Kubernetes Deployment

เราสามารถสร้าง Deployment ขึ้นมาได้ง่ายๆ ด้วยคำสั่งดังนี้

kubectl create deployment nginx --image=nginx

คำสั่งข้างต้นจะเป็นการสร้าง Deployment ชื่อ nginx โดยใช้ container image nginx:latest

เราสามารถ list Deployment ทั้งหมดในขณะนั้นได้จากคำสั่งดังนี้

kubectl get deployment

หากลอง list Pod ดู ก็จะพบว่า Pod ถูกสร้าง โดยมีชื่อ Deployment เป็น prefix และตามด้วยอักขระ alphanumeric อื่นๆ

Test the Deployment's replica

เมื่อลองลบ Pod และ list ขึ้นมาใหม่ ด้วยคำสั่งดังนี้

kubectl delete pod <pod name>
kubectl get pods

จะพบว่า Pod ชื่อใหม่ถูกสร้างขึ้นมาแทนตัวที่ถูกลบทิ้งไป

Get the Deployment Details

เราสามารถดูรายละเอียดของ Deployment ได้ด้วยคำสั่งดังนี้

kubectl describe deployment nginx

Update the Deployment

ลองทดสอบเปลี่ยน version ของ container image ดังนี้

kubectl edit deployment nginx

แก้ไขท่อน image: nginx เป็น image: nginx:1.18 แล้วเซฟ เพื่อเปลี่ยนไปใช้ image version 1.18 แทน

หากลอง list Pod ดูอีกรอบ จะพบว่ามีการลบ container เก่าทิ้ง และสร้าง container ใหม่ขึ้นมาแทน

Delete Deployment

เราสามารถ terminate Deployment ทิ้งได้ด้วยคำสั่งดังนี้

kubectl delete deployment nginx

การ terminate Deployment นั้น จะทำการลบ Pod ให้เราไปด้วย โดยอัตโนมัติ

Kubernetes Services

จากการใช้ Deployment จะพบว่า container application ถูก maintain จำนวน replica ไวแล้ว ดังนั้นเมื่อ Pod ตายไปหรือถูกลบทิ้ง ก็จะมีการสร้างขึ้นมาใหม่ ซึ่ง Pod แต่ละ Pod ก็จะมี IP Address เป็นของตัวเอง การสร้างใหม่ก็จะไม่ได้ IP Address เดิม หรือแม้แต่การที่มีการ scale จำนวน replica เพิ่มขึ้น แต่ละ Pod ก็จะมี IP Address ที่แตกต่างกันออกไป ดังนั้นจึงไม่ใช่ความคิดที่ดีเลย ที่เราจะอ้างอิง application นั้นๆ ด้วย IP Address ของ Pod ซึ่ง Kubernetes Service ก็จะเข้ามาตอบโจทย์ในส่วนนี้

Kubernetes Service จะทำหน้าที่เหมือนเป็น Load Balancer ในการแจก traffic ไปยังแต่ละ Pod ซึ่งเป็นกลุ่มเดียวกัน การแยกว่าจะส่ง traffic ไปยัง Pod ใด จะใช้ concept ที่เรียกว่า Label & Selector

Label & Selector

Label จะถูกแปะติดอยู่กับแต่ละ Pod

Selector ถูกกำหนดอยู่ภายใน Service เพื่อบอกว่า จะเลือกส่ง traffic ไปยัง Label ใด

ถ้า Service มีการกำหนด Selector เป็น app: foo เอาไว้ ก็จะส่งต่อ traffic ที่เข้ามายัง service ไปยัง Pod ซึ่งมี Label app: foo

Kubernetes Service Type

Kubernetes Service มีหลายชนิด แต่เบื้องต้นที่ใช้หลักๆ ดังนี้

ClusterIP

เป็นค่า default ของ Service หากไม่มีการระบุชนิดเอาไว้เมื่อตอนสร้าง Service ชนิดนี้จะเรียกถึงได้จากภายใน Kubernetes Cluster เท่านั้น

NodePort

จะมีการ เปิด High Port บนแต่ละ Host โดยเป็น Port ระหว่าง 30000-32768 ใช้เพื่อให้ Service เข้าถึงได้จากภายนอก Kubernetes Cluster

LoadBalancer

เป็น Superset ของ NodePort กล่าวคือ มีการติดต่อไปยัง API ภายนอก เช่น API ของ Cloud Provider เพื่อให้สร้าง LoadBalancer ขึ้นมาคั่นหน้า NodePort เอาไว้ ทำให้ไม่ต้องสนใจว่า IP ของ Host เป็น IP อะไร อีกทั้งยังสามารถ Map LowPort เข้ากับหมายเลข HighPort ที่ NodePort เปิดมาอีกด้วย

Create a Service

เตรียม Deployment ด้วยคำสั่งดังนี้

kubectl create deployment nginx --image=nginx --replicas=3

คำสั่งข้างต้นจะสร้าง Deployment ชื่อ nginx ขึ้นมา โดยมี 3 replica (Pod)

หลังจากนั้นทำการสร้าง Service ชนิด ClusterIP ซึ่งรับ traffic เข้ามา Port 8080 และส่งต่อไปยัง container nginx ซึ่งรับ traffic port 80 ด้วยคำสั่งดังนี้

kubectl expose deployment nginx --port=8080 --target-port=80

Test connection to the service

ทดสอบ connection ไปยัง Service โดยการสร้าง Pod โดยใช้ image Debian ขึ้นมา

kubectl run --rm -it debian --image=debian:buster-slim

เมื่อรันคำสั่งข้างต้น จะเข้ามาภายใน container image debian และได้ bash shell ทำการติดตั้ง curl และทดสอบ Service nginx ด้วยคำสั่งดังนี้

apt update -y
apt install -y curl
curl http://nginx:8080

เราจะสามารถเรียกใช้งาน Service ที่ชื่อ nginx ได้

Remove a service

ใช้คำสั่งดังนี้ เพื่อลบ Service ทิ้ง

kubectl delete service nginx

Other Tips

Scaling Application

ในการปรับจำนวน Replica ของ Deployment เราสามารถทำได้โดยใช้คำสั่งดังนี้

kubectl scale deployment/nginx --replicas=2

จะทำการปรับจำนวน Replica ของ Deployment ที่ชื่อ nginx ให้เหลือเพียง 2 Pod

Update Application Image

ในการเปลี่ยน version image ของ container ทำได้โดยใช้คำสั่งดังนี้

kubectl set image deployment/nginx nginx=nginx:1.18

คำสั่งข้างต้นจะทำการเปลี่ยน container image ของ Deployment nginx จากเดิม nginx:latest ให้เป็น nginx:1.18 แทน

Rollback

หากต้องการยกเลิกการเปลี่ยนแปลง Deployment กลับไปให้เป็นดังเดิม ใช้คำสั่งดังนี้

kubectl rollout undo deployment/nginx
PreviousKubernetesNextKubernetes Basic (LV.1)

Last updated 10 months ago

Was this helpful?