2B DevOps | HA K3s cluster EP.1 — Preparation for HA K3s cluster

JaynMfs
7 min readDec 9, 2023

--

หากผู้อ่านผ่านมาเจอบทความนี้ แต่ยังไม่รู้จักว่า K3s คืออะไร หรืออยากทำความรู้จัก K3s ก่อนที่จะมาลองใช้งานกัน สามารถทำความรู้จักได้ที่

2B DevOps | HA K3s Cluster EP.0 — What’s K3s

สำหรับซีรีย์นี้เราจะมีการจำลองสภาพแวดล้อมแบบ on-premise ขึ้นมาโดยการสร้าง VM instance ขึ้นมาจำลองกลุ่มเครื่องเซิร์ฟเวอร์ เพื่อใช้เป็นโครงสร้างพื้นฐานในการรัน K3s cluster โดยก่อนที่เราจะทำการสร้าง K3s cluster ขึ้นมา เราจะต้องมีการเตรียมโครงสร้างพื้นฐานอื่นๆ ก่อนที่จะทำการติดตั้งและตั้งค่า K3s cluster กัน

ในตอนนี้ของซีรีย์ เราก็จะพาทุกท่านมาทำความรู้จักกับซอฟต์แวร์ และเครื่องมืออื่นๆ ที่เราจะนำมาใช้จำลองโครงสร้างพื้นฐานและขั้นตอนการ setup แต่ละเครื่องมือแบบเป็นขั้นเป็นตอน โดยเครื่องมือที่จะนำมาใช้มีดังนี้

  1. Hyper-V
  2. Ubuntu Server 22.04.3
  3. HAProxy
  4. Keepalived
  5. kube-vip

What’s…

ก่อนอื่นเราจะพาผู้อ่านทุกท่านมาทำความรู้จักกับซอฟต์แวร์และเครื่องมือต่างๆ ที่จำเป็นต้องใช้กันครับ

Hyper-V

Hyper-v เป็นเครื่องมือที่ใช้ในการสร้าง VM intance บน Windows ที่มีมาให้พร้อมกับระบบปฏิบัติการอยู่แล้ว ซึ่งเราสามารถเข้าไปเปิดการตั้งค่าเพื่อใช้งานได้เลย

Ubuntu Server

Ubuntu server เป็นระบบปฏิบัติการแบบลินุกซ์ ซึ่งถูกออกมาเพื่อการใช้งานในระบบ Cloud และ Datacenter ซึ่ง ณ ขณะที่เขียนบทความนี้เวอร์ชัน LTS ของระบบปฏิบัติการนี้จะเป็นเวอร์ชัน 22.04.3

HAProxy

HAProxy เป็นเครื่องมือที่ใช้ในการทำ Load balancer

HAProxy as Load Balancer

Keepalived

Keepalived ในที่นี้จะทำหน้าที่เป็นตัวจัดการว่าในขณะหนึ่ง เซิร์ฟเวอร์ตัวไหนจะรับ traffic จาก Virtual IP ที่ตั้งค่าไว้กับมัน กล่าวคือ ถ้ามีเซิร์ฟเวอร์ 2 เครื่อง ได้แก่เครื่อง master และ master backup ตั้งค่า VIP เป็น 10.1.1.3 เหมือนกัน สภาวะปกติ (เครื่อง master ทำงานอยู่) traffic ที่วิ่งมาที่ VIP 10.1.1.3 ก็ถูกส่งต่อไปที่ master แต่ถ้าเมื่อไหร่ก็ตาม master หยุดทำงาน traffic เหล่านั้นก็จะวิ่งไปที่ master backup แทน

สั้น ๆ ก็คือ keepalived ให้ฟังก์ชัน High Availability นั้นหละครับ

Keepalived works

kube-vip

kube-vip เป็นเครื่องมือตัวนึงที่สามารถนำมาใช้แทน HAProxy และ keepalived ได้ เนื่องจากสามารถทำหน้าที่เป็นได้ทั้ง load balancer และ HA function โดยที่ไม่ต้องสร้าง vm เพิ่มขึ้นมาอีก 2 ตัว เพื่อทำหน้าที่เป็น External load balancer

Understanding HA Cluster Structure

ก่อนจะไปลงมือปฏิบัติกัน ก่อนอื่นเราจะพาผู้อ่านมาทำความเข้าใจโครงสร้างของ Cluster และคำว่า HA กันก่อน

Cluster

ง่ายๆ เลยก็คือมากกว่า 1 เครื่อง ในการใช้งานจริงๆ ควรจะเป็นหลายเครื่องที่เป็น Physical สำหรับการใช้งานแบบ On-Premise หรือเป็น VM ที่อยู่แยกโซนกัน สำหรับการใช้งานแบบ On-Cloud แต่สำหรับซีรี่ย์นี้เนื่องจากเป็นเพียง Workshop จำลอง จึงเป็นลักษณะของการแยกเครื่องโดยใช้ VM บนเครื่อง Physical เดียวกันแทน

High Availability: HA

ถ้าแปลตรงตัวเลยก็คือ มีความพร้อมใช้งานสูง ให้เข้าใจง่ายๆ ก็คือการทำยังไงก็ได้ให้ cluster ตัวนี้ยังคงทำงานต่อไปได้ แม้จะมีสมาชิกบางตัวของ cluster ลมหายตายจากไป อีกทั้ง service ต่างๆ ที่รันอยู่ใน cluster ก็ต้องใช้ต่อไปได้ด้วยเช่นกัน

โอเค เมื่อเราเข้าใจ 2 คำนี้แล้ว ต่อมาก็จะเป็นองค์ประกอบที่ต้องมีใน cluster เพื่อที่จะทำให้ cluster นั้นพร้อมใช้งานอยู่เสมอ ซึ่งจะประกอบด้วยองค์ประกอบดังต่อไปนี้

  1. K3s Server
    เสมือนเป็นคนคุมงานของกลุ่มเครื่องคอมพิวเตอร์ที่อยู่ใน cluster
  2. K3s Agent
    เสมือนเป็นคนทำงานต่างๆ ใน cluster
  3. Load Balancer
    ตัวชี้เป้าว่า request ที่วิ่งเข้ามาใน cluster ต้องไปที่ service ตัวไหนบนเครื่อง VM หรือ Physical ตัวไหน
  4. External DB (Recommended)
    จริงๆ แล้วการตั้งค่า cluster สามารถเลือกให้เก็บข้อมูลการตั้งค่าต่างๆ ไว้ที่เครื่องของ Server เองได้ แต่เพื่อให้ง่ายต่อการสำรองข้อมูล การที่นำข้อมูลมาเก็บไว้ในฐานข้อมูลส่วนกลางจะทำได้สะดวกกว่า
  5. Virtual IP (VIP)
    ถ้าผู้อ่านเห็นคำว่า VIP ในบทความนี้ให้หมายถึง Virtual IP นะครับ ไม่ใช่ Very important person ส่วน VIP ในที่นี้คืออะไร ตามความเข้าใจแบบง่ายๆ ของผู้เขียนก็คือ เป็น IP Address ที่ชี้ไปที่เครื่องเซิร์ฟเวอร์เครื่องใดเครื่องนึงชั่วคราว โดยจะไม่ได้สัมพันธ์กับอินเทอเฟสจริงของเครื่อง

ถ้าอ่านข้อความแล้วเข้าใจยาก ภาพประกอบอาจช่วยคุณได้

How it works
K3s cluster with Embedded and External etcd Database

ต่อมาก็คือโซลูชันแบบไหนบ้างหละที่จะทำให้เราบรรลุเป้าหมายของคำเหล่านั้นได้ ในซีรีย์นี้เราก็จะลองยกตัวอย่างขึ้นมา 2 โซลูชันด้วยกัน ได้แก่

  1. HA K3s cluster with HAProxy and Keepalived as Load Balancer
  2. HA K3s cluster with kupe-vip as Load Balancer

HA K3s cluster with HAProxy and Keepalive as Load Balancer

โซลูชันนี้เป็นแบบที่เป็นตัวอย่างในเว็บไซต์หลักของ K3s ซึ่งจะให้ HAProxy ซึ่งเป็น Layer 7 ของ OSI ทำหน้าที่เป็น Load Balancer และจะทำงานคู่กับ Keepalived ที่จะคอยจัดการเรื่อง VIP ที่ชี้ไปยัง API Server ของ cluster

HA K3s cluster using HAProxy and keepalived

HA K3s cluster with kube-vip as Load Balancer

โซลูชันนี้เป็นอีกตัวอย่างที่ผู้เขียนศึกษาเพิ่มมา ประกอบกับเคยใช้ตอนทดลองทำ HA K8s cluster โดยข้อแตกต่างก็คือ kube-vip จะมาทำหน้าที่แทน ซึ่ง load balancer ของ kube-vip จะทำงานอยู่ที่ Layer 2 หรือ 3 ของ OSI ขึ้นอยู่กับการตั้งค่าว่าจะใช้ ARP หรือ BGP และ kube-vip จะเป็น service หนึ่งที่รันอยู่ใน cluster

HA K3s cluster using kube-vip

เอาเข้าจริงๆ ตอนแรกก็ว่าจะทำแบบทางสายกลางนะ แต่ดูไปดูมาก็บานปลายใหญ่โตเหมือนกันแฮะ

Prerequisites

  1. เครื่องคอมพิวเตอร์พร้อมระบบปฏิบัติการ Windows 10/11 Pro/Education
    สามารถใช้เวอร์ชันก่อนหน้าได้ ขั้นตอนไม่ได้ต่างกันมาก แต่เครื่องต้องรองรับ Virtualization (VT) และควรจะมีคุณสมบัติขั้นต่ำดังต่อไปนี้
    CPU: 4 Core
    RAM: 16 GB
    Disk (SSD): 20 x 8 = 160 GB
  2. Ubuntu Server 22.04.3 ISO file
    คลิกที่ลิงค์ download เพื่อโหลดไฟล์ image สำหรับใช้ติดตั้งระบบปฏิบัติการบน Ubuntu Server บน VM อาจจะบันทึกไว้ที่ “C:/Users/_username_/Desktop/ISO” เพื่อสะดวกต่อการทำตามตัวอย่าง
  3. Understanding network diagram
    ภาพด้านล่างจะเป็น network diagram ที่แสดงโครงสร้างการเชื่อมต่อกับระหว่างอุปกรณ์ต่างๆ ในเครือข่าย ทั้งที่เป็นฮาร์แวร์และซอฟต์แวร์
Network diagram for HA K3s cluster

จากแผนภาพด้านบนจะเป็น network diagram ที่โฟกัสไปที่โซลูชันที่ 2 ซึ่งใช้ kub-vip จะมีรายละเอียดดังนี้

  1. มี Router ที่เชื่อมต่อออกอินเทอร์เน็ต ซึ่งเครื่องคอมพิวเตอร์ที่เราใช้ทดลอง (Host) เชื่อมต่ออยู่ และได้รับ IP Address เป็น 192.168.x.10 (เป็นการทำ static ip address ที่เครื่อง host)
  2. ภายในเครื่อง host มีการสร้าง virtual switch (v-switch) ขึ้นมาตัวนึงชื่อว่า K3s โดยมีการตั้งค่า NAT วงเครือข่าย 192.168.x.0/24 กับ 10.1.1.0/24 ซึ่งเป็นเครือข่ายภายใน เพื่อที่จะทำให้เครื่อง vm ที่อยู่ภายใน สามารถติดต่อไปยังอินเทอร์เน็ตได้
  3. สำหรับ vm ที่อยู่ภายในจะมีการตั้งค่า static ip address โดยชี้ไปที่เกตเวย์คือ 10.1.1.1 เป็น ip address ของ v-switch
  4. 10.1.1.2 เป็น virtual IP ที่มีการตั้งค่าขึ้นมาภายหลัง ขึ้นอยู่กับโซลูชันที่เลือกใช้ เพื่อทำให้ K3s server หรือ Control plane มีสถานะเป็น HA

Pre-Installation Setup: Step by step

ขั้นตอนในการการ setup จะมีดังต่อไปนี้

  1. เปิดใช้งาน Hyper-V บนเครื่องโฮสต์ที่เป็น Windows 10/11
  2. สร้าง Virtual Switch สำหรับ K3s cluster โดยเฉพาะ
  3. ตั้งค่า NAT ให้กับ Virtual Switch
  4. สร้าง VM instance บน Hyper-V จำนวน 3 ตัว สำหรับเป็น K3s server โดยใช้ command ผ่าน Terminal (เนื่องจากต้องการทำ High Availability: HA)
  5. สร้าง VM instance บน Hyper-V จำนวน 2 ตัว สำหรับเป็น K3s agent โดยใช้ command ผ่าน Terminal
  6. สร้าง VM instance บน Hyper-V จำนวน 2 ตัว สำหรับเป็น Load balancer โดยใช้ command ผ่าน Terminal
  7. รัน VM instance ทั้ง 3 ตัวสำหรับ Server และติดตั้งระบบปฏิบัติการ Ubuntu Server
  8. รัน VM instance ทั้ง 3 ตัวสำหรับ Agent และติดตั้งระบบปฏิบัติการ Ubuntu Server
  9. รัน VM instance ทั้ง 2 ตัวสำหรับ Load Balancer และติดตั้งระบบปฏิบัติการ Ubuntu Server
  10. ตั้งค่า Static IP Address ให้กับแต่ละเครื่องในเครือข่ายตาม Network Diagram

Enable Hyper-V on Windows 10/11

  1. กดปุ่ม Start หรือ กดช่อง Search บน Task bar
  2. พิมพ์ “Turn Windows features on or off” และคลิกเลือก
  3. มองหาตัวเลือก “Hyper-V” และกดเครื่องหมาย “+”
  4. ทำเครื่องหมายถูกในช่อง “Hyper-V Management tools” และ “Hyper-V Platform” หรือทำเครื่องหมายถูกที่ช่อง “Hyper-V” ก็ได้เช่นกัน
  5. รีสตาร์ทระบบเพื่อเปิดใช้งาน
Enable Hyper-V

Create a Virtual Switch for a K3s Cluster (using UI)

  1. กดปุ่ม Start หรือ กดช่อง Search บน Task bar
  2. พิมพ์ “Hyper-V” และคลิกเลือก
  3. มองหาชื่อเครื่องของเราในช่องทางซ้ายมือและคลิกเลือก
  4. ทางช่อง “Actions” ทางขวามือ มองหาเมนู “Virtual Switch Manager…” และคลิกเลือก
  5. ในหน้าต่าง Virtual Switch Manager ที่ปรากฎขึ้นมา ในช่อง Virtual Switch ให้เลือก “New virtual network switch” และกดปุ่ม Create Virtual Switch ในช่อง Create virtual switch ทางขวา
  6. กรอกข้อมูลตามภาพตัวอย่างแล้วกดปุ่ม Apply เพื่อเป็นการสร้าง
Create a Virtual Switch using Hyper-V UI

Create a Virtual Switch for a K3s Cluster (using command-line)

  1. กดปุ่ม Start หรือ กดช่อง Search บน Task bar
  2. พิมพ์ “Terminal” และคลิกขวาแล้วเลือก “Run as administrator”
  3. พิมพ์คำสั่งด้านล่างแล้วกดปุ่ม Enter
New-VMSwitch -SwitchName K3s -SwitchType Internal

Config NAT for the Virtual Switch

  1. กดปุ่ม Start หรือ กดช่อง Search บน Task bar
  2. พิมพ์ “Terminal” และคลิกขวาแล้วเลือก “Run as administrator”
  3. พิมพ์คำสั่งด้านล่างแล้วกดปุ่ม Enter
Get-NetAdapter
New-NetIPAddress -IPAddress 10.1.1.1 -PrefixLength 24 -InterfaceIndex [index]
New-NetNat -Name K3sNAT -InternalIPInterfaceAddressPrefix 10.1.1.0/24

** [index] ในคำสั่งให้เปลี่ยนเป็น index ของ interface ที่ได้จากคำสั่ง Get-NetAdapter มองหา Adapter ชื่อ K3s

Create 3 VMs for Server on Hyper-V using Terminal

  1. กดปุ่ม Start หรือ กดช่อง Search บน Task bar
  2. พิมพ์ “Terminal” และคลิกขวาแล้วเลือก “Run as administrator”
  3. พิมพ์คำสั่งด้านล่างแล้วกดปุ่ม Enter
  4. เข้าไปที่ Hyper-V Manager ก็จะเห็น VM ที่เราเพิ่งสร้างปรากฎขึ้นในช่อง Virtual Machines

** อย่าลืมเปลี่ยน “_username_” ในคำสั่งเป็นชื่อผู้ใช้ที่เราใช้งานอยู่

New-VM -Name Server1 `
-NewVHDPath C:\ProgramData\Microsoft\Windows\"Virtual Hard Disks"\Server1.vhdx `
-NewVHDSizeBytes 20GB `
-MemoryStartupBytes 2GB `
-SwitchName K3s `

Add-VMDvdDrive -VMName Server1 -Path "C:\Users\_username_\Desktop\ISO\ubuntu-22.04.3-live-server-amd64.iso"
New-VM -Name Server2 `
-NewVHDPath C:\ProgramData\Microsoft\Windows\"Virtual Hard Disks"\Server2.vhdx `
-NewVHDSizeBytes 20GB `
-MemoryStartupBytes 2GB `
-SwitchName K3s `

Add-VMDvdDrive -VMName Server2 -Path "C:\Users\_username_\Desktop\ISO\ubuntu-22.04.3-live-server-amd64.iso"
New-VM -Name Server3 `
-NewVHDPath C:\ProgramData\Microsoft\Windows\"Virtual Hard Disks"\Server3.vhdx `
-NewVHDSizeBytes 20GB `
-MemoryStartupBytes 2GB `
-SwitchName K3s `

Add-VMDvdDrive -VMName Server3 -Path "C:\Users\_username_\Desktop\ISO\ubuntu-22.04.3-live-server-amd64.iso"
Create VM using Terminal

Create 3 VMs for Agent on Hyper-V using Terminal

  1. กดปุ่ม Start หรือ กดช่อง Search บน Task bar
  2. พิมพ์ “Terminal” และคลิกขวาแล้วเลือก “Run as administrator”
  3. พิมพ์คำสั่งด้านล่างแล้วกดปุ่ม Enter
  4. เข้าไปที่ Hyper-V Manager ก็จะเห็น VM ที่เราเพิ่งสร้างปรากฎขึ้นในช่อง Virtual Machines

** อย่าลืมเปลี่ยน “_username_” ในคำสั่งเป็นชื่อผู้ใช้ที่เราใช้งานอยู่

New-VM -Name Agent1 `
-NewVHDPath C:\ProgramData\Microsoft\Windows\"Virtual Hard Disks"\Agent1.vhdx `
-NewVHDSizeBytes 20GB `
-MemoryStartupBytes 2GB `
-SwitchName K3s `

Add-VMDvdDrive -VMName Agent1 -Path "C:\Users\_username_\Desktop\ISO\ubuntu-22.04.3-live-server-amd64.iso"
New-VM -Name Agent2 `
-NewVHDPath C:\ProgramData\Microsoft\Windows\"Virtual Hard Disks"\Agent2.vhdx `
-NewVHDSizeBytes 20GB `
-MemoryStartupBytes 2GB `
-SwitchName K3s `

Add-VMDvdDrive -VMName Agent2 -Path "C:\Users\_username_\Desktop\ISO\ubuntu-22.04.3-live-server-amd64.iso"
New-VM -Name Agent3 `
-NewVHDPath C:\ProgramData\Microsoft\Windows\"Virtual Hard Disks"\Agent3.vhdx `
-NewVHDSizeBytes 20GB `
-MemoryStartupBytes 2GB `
-SwitchName K3s `

Add-VMDvdDrive -VMName Agent3 -Path "C:\Users\_username_\Desktop\ISO\ubuntu-22.04.3-live-server-amd64.iso"
Create VM using Terminal

Create 2 VMs for Load Balancer on Hyper-V using Terminal

  1. กดปุ่ม Start หรือ กดช่อง Search บน Task bar
  2. พิมพ์ “Terminal” และคลิกขวาแล้วเลือก “Run as administrator”
  3. พิมพ์คำสั่งด้านล่างแล้วกดปุ่ม Enter
  4. เข้าไปที่ Hyper-V Manager ก็จะเห็น VM ที่เราเพิ่งสร้างปรากฎขึ้นในช่อง Virtual Machines

** อย่าลืมเปลี่ยน “_username_” ในคำสั่งเป็นชื่อผู้ใช้ที่เราใช้งานอยู่

New-VM -Name LB1 `
-NewVHDPath C:\ProgramData\Microsoft\Windows\"Virtual Hard Disks"\LB1.vhdx `
-NewVHDSizeBytes 20GB `
-MemoryStartupBytes 2GB `
-SwitchName K3s `

Add-VMDvdDrive -VMName LB1 -Path "C:\Users\_username_\Desktop\ISO\ubuntu-22.04.3-live-server-amd64.iso"
New-VM -Name LB2 `
-NewVHDPath C:\ProgramData\Microsoft\Windows\"Virtual Hard Disks"\LB2.vhdx `
-NewVHDSizeBytes 20GB `
-MemoryStartupBytes 2GB `
-SwitchName K3s `

Add-VMDvdDrive -VMName LB2 -Path "C:\Users\_username_\Desktop\ISO\ubuntu-22.04.3-live-server-amd64.iso"
Create VM using Terminal

Ubuntu Server installation on VMs

  1. บนหน้าต่าง Hyper-V Manager ในช่อง Virtual Machines คลิกเลือก VM ที่เราต้องการและคลิกขวาเลือกเมนู Connect ตามด้วย Start
  2. รอให้ image ของระบบปฏิบัติการบูทจนกระทั่งขึ้นขั้นตอนการติดตั้ง ให้ดำเนินการตามตัวอย่างในวิดีโอด้านล่าง
Ubuntu Server 22.04.2 Installation on Hyper-V VM

Static IP Address on Ubuntu Server

  1. บนหน้าต่าง Hyper-V Manager ในช่อง Virtual Machines คลิกเลือก VM ที่เราต้องการและคลิกขวาเลือกเมนู Connect ตามด้วย Start
  2. รอจนกว่าระบบจะบูทเสร็จและปรากฏ prompt ให้ login (หากมีข้อความยาวๆ ปรากฏขึ้นตามหลัง ให้กดปุ่ม Enter หนึ่งครึ่งก่อน กรอกข้อมูลเข้าสู่ระบบ)
  3. เมื่อเข้าสู่ระบบแล้วสามารถดูวิธีการต่อตามวิดีโอด้านล่างได้เลยครับ
How to config static IP address on Ubuntu Server

Tips

  1. หากมีปัญหาหรือมีการแจ้งเตือนข้อผิดพลาดเกี่ยวกับ Virtualization (VT) ลองตรวจสอบดูว่าได้ทำการเปิดใช้งาน VT แล้วหรือยัง ได้สามารถทำตามรูปภาพที่แนบมาได้ครับ ถ้ายังไม่ได้เปิดการใช้งาน สามารถเข้าไปเปิดการใช้งานผ่านทาง BIOS ของเครื่องครับ
How to check Virtualization enable status

สำหรับตอนต่อไปเราจะพาทุกท่านไปลงรายละเอียดเกี่ยวกับการติดตั้งและการตั้งค่า K3s cluster กันนะครับ รอติดต่อชมได้เลยครับ

--

--

JaynMfs
JaynMfs

No responses yet