อ่านบทความ k8s มาเยอะมากๆแล้ว คราวนี้มาลองเล่น k8s จริงๆไม่อ่านอย่างเดียวกันครับ 🙂

โดยบทความนี้จะมี GitHub repository ให้ทําตาม เพียงแค่สั่ง command line ตามกันไปเพื่อทําความเข้าใจตามกันไปเท่านั้นพอ จะได้เห็นภาพเวลาทํางานจริงๆ K8S ทํางานยังไง ไม่อ่านแค่ทฤษฎีอีกต่อไป

GitHub Repository https://github.com/howtoautomateinth/docker-k8s-class

แนะนําให้กด STAR ไว้ที่ repository ด้วย จะได้ไม่พลาดทุกการ update เพราะว่าเวลามีอะไรใหม่มาจะคอยอัพเดตผ่าน repository นี้

โดยบทความเนื้อหาต่างๆๆเราสามารถอ่านจากที่นี้ก่อนได้เลย

  1. Docker Basic
  2. Docker Compose & Swarm.
  3. Kubernetes

แต่ที่แนะนําให้เข้าไปอ่านสรุปจริงๆเลยจะคือ awesome-k8s เพราะว่าเจ้าตัวนี้จะรวบรวมเนื้อหาแบบสั้นๆๆและเข้าใจง่ายไว้หมดแล้ว แต่ข้อเสียคือมันยาวมากไปหน่อย  😀


มาดูตัว Workshop ที่จะเล่นกัน

hta-docker-k8s-tutorial

ภายใน repository จะแบ่งเป็นหลายๆ chapter และ tools ต่างๆๆเพื่อให้เข้าใจง่ายๆเมื่อมาใช้งานดังนี้

  • ch1-core-component
    • Basic component ที่เราควรจะรู้ว่า k8s object มีอะไรบ้าง
  • ch2-volume
    • หลังจากรู้พวก Basic component k8s แล้วก็มาดูวิธีการ store data persistent ลงใน cluster (เพราะว่า Pod life cycle มันมี เกิด-แก่-เจ็บ-ตาย แล้วมันจะทําให้ข้อมูลที่อยู่ในนั้นเป็น ephemeral )
  • ch3-service
    • เรียนรู้การใช้งาน service แบบ headless และ ไม่ headless แตกต่างกันยังไง
    • โดยเราสามารถใช้ busybox image ที่อยู่ใน tools folder เพื่อลองให้เข้าใจมากขึ้นด้วยก็ได้
  • ch4-secret
    • ทุก apps จะต้องมีพวก credential files อยู่แล้ว ทีนี้เราจะจัดการกับพวก credential files เหล่านั้นยังไงบน k8s cluster
  • ch5-kustomization
    • วิธีจัดการ k8s object หรือพวกไฟล์ต่างๆทํายังไงให้ reusable มากที่สุดและง่ายต่อการบริหารจัดการ
  • ch6-logging
    • ทุก apps ก็ต้องการ log file เหมือนกันที่ช่วยให้ investigate หรือ เอาไปวิเคราะห์ระบบเพิ่มเติม โดยเราจะใช้ daemonset มาใช้งาน
  • dashboard
    • k8s dashboard ใช้งานยังไง
  • tools
    • image สําหรับช่วยทําความเข้าใจ k8s ให้ง่ายขึ้น
  • workshop
    • ของเล่นที่ควรจะฝึกเล่นมากๆกับ AWS,GCP และอื่นๆๆ ที่จะช่วยให้ใช้งานบน cloud provider ต่างๆเป็น และนําไปใช้บน Prod. ได้ ไม่ใช่แค่บน minikube หรือ local machine อย่างเดียว
    • Skaffold development tools ที่จะช่วยให้เรา develop บน local machine ได้ง่ายขึ้น
  • README.md
    • prerequisite ต่างๆสําหรับการใช้งาน repository นี้
    • รวมไปถึง investigate command น่าสนใจ ที่จะช่วยให้ศึกษา k8s ได้อย่างละเอียดมากขึ้น

โปรแกรมที่ควรลงเวลาทํางานกับ K8S

  • Kubectl Alias
    • คือการเขียน kubectl get, describe, secret บลาๆๆต่างๆๆมันเหนื่อยมากเลยนะ ใช้ alias ตัวย่อดีกว่า ว่าจะเรียกใช้อะไร เช่น kgpo = kubectl get pod งี้ ช่วยลดเวลาได้มากๆๆๆๆเลย

วิธีลองเล่น

  1. minikube start
  2. ไปที่ directory ของ chapter นั้นๆ
  3. ถ้าลง alias ไว้ก็ k apply -f <<ชื่อไฟล์>> ถ้าไม่ได้ใช้ alias ก็ kubectl apply -f <<ชื่อไฟล์>>

Chapter 1 – Core Component

เริ่มจากเรียน K8S object ต่างๆ

โดย Chapter แรกเราจะแบ่งหัวข้อเล็กๆที่น่าสนใจคือ

  • Pod ที่เล็กที่สุดของ K8s
  • Services NodePort ที่ไว้เปิดให้คนเข้าถึง pod ได้
  • Deployment ที่ทําหน้าทีควบคุมการ Replica Pod
  • Configure ว่าเวลาเรา manage configuration cluster จะแบ่ง environment ยังไง โดยทําตัวอย่างสองไฟล์
    • development
    • production
    • เวลาเรียกใช้ก็แค่ทํา configMapRefก็จะได้ค่า environment จากไฟล์ละ แล้วเวลา deploy ขึ้น production เราก็เลือกไฟล์ ConfigMap deploy เอา

Chapter 2 – Volume

เราสร้าง K8S object ต่างๆเป็นละ ทีนี้มาเรียนรู้วิธีสร้าง Volume แบบ Persistent เพื่อให้ Container ของเรานําไปใช้กัน

โดยง่ายมากๆๆเลยแค่ Persistent ใน K8S จะมี คําศัพท์เฉพาะ 2 คําคือ Persistent Volume (PV) และ Persistent Volume Claim (PVC) โดยมันมีการสร้าง persistent 2 แบบคือ static และ dynamic

  • Static คือเราต้องสร้าง PV ก่อนแล้วค่อยสร้าง PVC ให้มันเรียกใช้
  • Dynamic ถ้าเราไม่สร้าง PV ก่อน เจ้า PVC ของเรามันจะสร้าง PV ให้เราเองเลย

นี้คือหน้าตาของ PVC

K8S object ที่มี name = myclaim แล้วเวลา deployment หรือ pod นําไปใช้ก็จะเรียกผ่านชื่อนี้ตามตัวอย่างด้านล่าง

จุดสังเกตุคือ บรรทัด 18,21,24 ที่เรา claim volume เพื่อให้ container ของเรานําไปใช้นั้นเอง 🙂

หลักๆของการ claim จะมี 3 แบบ

  • Retain = ลบ PV ออก Persistent ยังอยู่
  • Recycle = ลบ PV ออก Persistent ยังอยู่ แต่ต้อง manual recovery เอง
  • Delete = ลบ PV ออก Persistent ลบด้วย

Chapter 3 – Service

แบ่งเป็น 4 ส่วนของ services k8s object คือ

  • configuration/endpoint
    • ทําหน้าที่ในการ specific endpoint ไปข้างนอกเอง
    • หลักๆของ endpoint คือสร้าง service แล้วไม่ใส่ selector เพื่อให้มันไม่รู้ว่ามันต้องไป select อะไร แล้วก็เอา endpoint มาแปะ เพื่อให้ service ส่งไป endpoint ไปที่ๆต้องการนั้นเอง
  • headless
    • โดยปกติแล้วเวลาสร้าง service เราจะ specific Type ของ clusterIP เพื่อให้รู้ว่าเราจะใช้ service แบบไหนแต่การใช้ headless เราจะไม่ระบุ และตั้งเป็น None แทน
    • ด้วยวิธีนี้เจ้า underlying Pod/Deployment ที่เราไป select ไว้ มันจะไม่ทําการ load-balancing ให้ แต่มันจะ return IP ของ Pods ออกมาตรงๆๆเลย ทําให้มันจะช่วยให้เรา specific address ที่เราจะวิ่งไปหาได้นั้นเอง
    • วิธีเช็คว่ามันออกมาหน้าตาเป็นยังไง
      • จากรูปข้างบนนะ
        • จะเห็นว่าเมื่อเรา deploy ch3-services/headless ไปแล้ว ด้วย ka headless (kubectl alias)
        • เราจะได้ app มาเพียบเลย แต่ไม่ต้องสนใจ เราจะเทคนิคเช็คจาก busybox ด้วยการ deploy busyboxplus image เข้าไปใน cluster เพื่อ ping/nslookup โดยการ ka tools
        • หลังจากนั้นเรา exec command บน container image busybox เพื่อ nslookup service ทั้ง headless และ normal
        • ด้วยวิธีนี้จะทําให้เราเห็นว่า headless มันจะ return direct ip ของ Pod นั้นๆออกมา แต่ถ้า normal มันจะ group แล้ว load balancing ให้นั้นเอง
    • stateful
      • เป็น object ที่ไว้ใช้งานกับพวก stateful application ต่างๆ เช่นพวก Database
      • โดยมันจะได้ stable unique network identifier ที่ไม่เปลี่ยน
      • ไปลองรัน ka stateful แล้วจะเห็นชัดขึ้น
        • สิ่งที่จะได้คือ pod เนี่ยถูกสร้างแบบ running number เลย web-0,web-1 (web คือ metadata name ของ container นั้น)
        • ส่วน services ก็ได้ชื่อแบบ unique เป๊ะๆมาก
          • เมื่อลองเทียบกับระหว่าง headless,normal,stateful จะเห็นว่า service ของ stateful จะได้ unique name มาก
    • nginx
      • อันนี้ไม่ต้องพูดมาก ข้อมูลเยอะแยะมากบน internet ถ้าจะให้นิยามสั้นๆๆๆ มันคือ Path Router ของ K8s
      • Thanks Ahmet Alp Balkan for diagram
        • หน้าตา route path จะเป็นยังงี้ … โดยจะชี้ไปที่ service metadata name ที่ selector deployment/pod ไว้

Chapter 4 – Secret

การใช้งาน Secret เพื่อเก็บ Credential ของ Application บน K8S เราจะใช้ Secret โดยมีการนําไปใช้ได้สองแบบคือ

  • Mount = mount password file ลงไปใน contaienr
  • secretRef = refer secret object

โดยหลักๆๆคือเราต้องนํา credential เข้าไป encode base64 แล้วสร้าง Secret object ขึ้นมาตามรูป

  • K8S Secret Object
  • Mount
  • Ref
    • เลือกมา key เดียวคือ example จาก k8s secret object
  • โดยเทคนิคนึงที่น่าสนใจเมื่อเราหา credential ง่ายๆเลยคือเข้าไปใน Container แล้วสั่ง printenv จะทําให้เห็นลิสทั้งหมดของ env เลยละ ไม่ก็ไปตาม path ของ Container นั้นๆที่ mount ไว้
    • แบบเดิมเลยเข้าไป kg ch4-secret
    • Mount
    • Ref (มีตัวเดียวเพราะเราเลือก key เดียวตอน Ref)

Chapter 5 – Kustomization

ของเล่นที่เราเอาควรไปใช้งานกับ project จริงๆคือเจ้า kustomize เนี่ยแหละ เพราะมันเป็น configuration management ที่ช่วยให้เรา reuse configuration ของเราได้

ลองจิตนการ configuration ระบบที่ใหญ่มากๆๆ แล้ว config files มีเป็น 100 รับรองได้เลยว่ามันต้องมีบางส่วนที่เขียนซํ้ากันไปซํ้ากันมา แล้วเวลา update ที่นึงทีต้องไปอัพเดตอีกร้อยจุด เจ้า kustomize มันเลยเข้ามาช่วยเหลือเรา โดยการสร้าง feature 4 อย่างนี้ออกมา โดยอ่านจาก kustomization.yaml

  • resources
  • generators
  • transformers
  • meta

document เพิ่มเติมของ kustomization

เช่น ถ้าเราจะสร้าง configMap ด้วย generator ของ kustomization

  1. kubectl kustomize เพื่อดูหลังที่จะ apply มันจะสร้างอะไรออกมาให้เรา alias ก็คือ kk .
  2. kubectl apply -k kustomization.yaml หรือถ้า alias ก็คือ kak .

มันจะขึ้นแค่ว่า file created ละ แล้วก็จะเห็นใน cluster เลย 🙂

Chapter 6 – Logging

เวลาเรา deploy application ขึ้น cluster แล้วสิ่งนึงที่เราต้องการแน่นอนเลยคือ Logging นั้นเอง เพราะเราต้องการข้อมูลว่า application ของเราทํางานเป็นยังไงบ้าง ซึ่งสิ่งที่จะใช้กันบน cluster ก็คือ DaemonSets ซึ่งเป็น object ที่จะทํา ensure ว่าทุก Nodes ที่รันบน cluster จะมี copy Pod นึงเอาไว้เพื่อทําอะไรบางอย่าง

เช่น Use cases ที่ใช้กันบ่อยๆก็คือ logs collection, node monitoring เป็นต้น

tree level คือ cluster -> node (cluster นึงจะมีหลาย node ก็ได้ เพียงแต่ node บน local machine เรามีได้แค่อันเดียวก็คือ minikube นั้นเอง) -> pod

ตัวอย่าง DaemonSet

เนื่องจากบน local machine เราไม่สามารถมีมากกว่า 1 Node ได้ ดังนั้นจึงแนะนําใช้ AWS เพื่อทดสอบด้วย eksctl ก็ได้ คู่มืออยู่ในนี้ copy แล้วไปลองรันได้เลย แต่อาจจะต้อง setup เครื่องไว้รองรับใช้ AWS ก่อน

Dashboard

นอกจากเราใช้ cli ในการดูข้อมูลของ cluster เราแล้ว เรายังสามารถดูผ่าน dashboard ได้ ซึ่งจะมีหน้าตาดังนี้

อ่าน คู่มือการใช้ ได้ที่นี้เลย

Tools

techniques ในการเข้าไป interact กับ cluster ผ่าน busybox เนื่องจากเราไม่ต้องการ expose อะไรออกมา เราก็เลยใช้ busybox ที่มี tools เต็มไปหมด deploy เข้า cluster แล้วก็ ping หรือ nslookup ในวง network เดียวกันได้

แต่ตอนนี้ที่ version 1.16 มันมี Ephemeral Containers มาช่วยละ เพื่อไว้ทํา troubleshooting แต่ยังอยู่ใน alpha อยู่นะ

Workshop

เจ้าตัวนี้คือจะรวม workshop ที่ใช้งานจริงได้ เช่น การ deploy wordpress บน AWS EKS หรือ Google GKE ซึ่งจะสรุปเป็น README.md ไว้ เพื่อให้ลองทําตามได้เลย หรือ วิธีการใช้ Skaffold (เครื่องมือช่วยเรา development k8s บนเครื่องเราเอง)

ซึ่งจะไม่รวมเนื้อหาไว้ในบทความนี้ที่เดียวเพราะจะยาวเกินไป ซึ่งแค่นี้ก็ยาวมากละ 🙂 แต่ถ้าใครอยากลองเล่นก็เข้าไปที่ github repository แล้ว clone มาเล่นได้เลย

แนะนําให้กด STAR ไว้ที่ repository ด้วย จะได้ไม่พลาดทุกการ update เพราะว่าเวลามีอะไรใหม่มาจะคอยอัพเดตผ่าน repository นี้

 

Leave a Reply

avatar

This site uses Akismet to reduce spam. Learn how your comment data is processed.