Why run Kubernetes on Raspberry Pi
การรัน Kubernetes ด้วย Raspberry Pi น่าจะให้ความรู้ผมมากกว่าการไปรันบน Katacoda หรือ GCP เพราะจะได้เจอปัญหาจริงๆ ในการ setup ลงบน machine จริงๆ ไม่ว่าจะเป็นเรื่องของ version หรือ dependency ต่างๆ
การรันโปรแกรมบน Raspberry Pi (ต่อไปจะใช้คำว่า Pi เพื่อลดจำนวนการกดคีบอร์ด) ทำให้เราคิดถึงเรื่องปริมาณที่จำกัดของ resource และ dependency เยอะมากๆ เพราะของหลายๆอย่างที่รันได้บน cloud ทั่วๆไป มันรันไม่ได้บน Pi เช่น kubectl (ใน Pi4 เจอ error ว่าไม่รองรับ armhf ซึ่งเข้าใจว่าเป็น CPU ของ Pi4)
ในระยะยาว เอา development environment มาลง Pi Cluster น่าจะประหยัดเงินช่วยได้เยอะ
มีโปรแกรมหลายๆตัวที่รันบน Cloud แล้วเปลืองมากๆ เช่น Open Faas หรือจะลอง Database ใหม่ๆบางตัว เช่น CockroachDB ถ้ามี Pi Cluster แล้ว ก็ลองเล่นได้แบบไม่เสียเงินเยอะ
Preparation
แน่นอนว่าต้องซื้อ Pi ก่อนรุ่นที่แนะนำคือ Pi 4 ซึ่งจะมี Ram ให้เลือก 4GB และ 8GB เลือกเอาที่สบายใจ
power adapter
SD card สำหรับลง Raspbian OS (สามารถซื้อมาพร้อมกับ Pi ได้เลย)
SD card reader สำหรับ install Raspbian OS ผ่าน Notebook (สามารถซื้อมาพร้อมกับ Pi ได้เลย)คนที่มี Mac Pro รุ่นใหม่ก็น่าจะลำบากหน่อย ต้องไปหา adapter มาเพิ่ม สำหรับผมโชคดีที่ยังมี Mac Air ปี 2013 ซึ่งมีช่องให้เสีย SD card reader อยู่แล้ว
Argon case (optional)เคสสำหรับใส่ Pi เป็นเคสที่ดูดีและแพงพอๆกับ Pi 4 4GB เลย
SSD card (optional)ถ้าซื้อ Argon case มาด้วย มันจะมีช่องให้เสียบ SSD card ก็จะได้ storage เพิ่ม ซึ่งดีกว่าการใช้ SD card แน่นอนอยู่แล้ว
Setup Raspberry Pi
การติดตั้ง Pi มี 2 วิธีคือ
- install ผ่าน monitor
- headless install คือเปิดมาใช้งานผ่าน ssh เลยซึ่งผมใช้วิธีนี้
ทั้ง 2 วิธีนี้ต้องเตรียม Raspbian OS ผ่าน SD card เหมือนกันหมด
ขั้นตอน
1) ไปเอา Raspbian image มาจาก https://www.raspberrypi.org/software/operating-systems/
2) ใช้โปรแกรม etcher ในการ flash SD card (เหมือนๆกับตอนที่เราจะ write CD … รู้สึกแก่)
https://www.balena.io/etcher/ คือพอเสียบ SD card ไปแล้วมันจะขึ้นมาให้เลือก image เพื่อทำ flash เลย
จบขั้นตอนการเตรียม Raspbian OS
ตอนนี้ผมได้ SD card ที่มี Raspbian OS แล้ว
3) สำหรับขั้นตอนถัดไปคือเข้าไป edit config ใน SD เพื่อบอกให้ Pi ต่อ wifi ตัวไหนในบ้านเรา
4) สร้างไฟล์ ssh
ที่ root ของ SD (ไฟล์นี้น่าจะมีอยู่แล้วนะ)
5) สร้างไฟล์ wpa_supplicant.conf
ที่ root ของ SD ข้อมูลในไฟล์จะเป็นดังนี้
country=US
ctrl_interface=DIR=/var/run/wpa_supplicant GROUP=netdev
update_config=1
network={
ssid="NETWORK-NAME"
psk="NETWORK-PASSWORD"
}
ซึ่ง NETWORK-NAME
คือ ชื่อของ wifi ที่เราต้องการใช้ Pi ต่อ และ NETWORK-PASSWORD
คือ password ที่ใช้ connect wifi นั่นเอง
6) เอา SD เสียบเข้า Pi แล้วต่อ power adapter เลยเจ้า Pi จะ connect กับ wifi ที่เรากำหนดไว้ใน wpa_supplicant.conf
7) ทีนี้เราต้อง ssh เข้าไปใน Pi ซึ่งเราจำเป้นจะต้องรู้จัก IP ของ Pi ก่อนสำหรับ OSX เราใช้โปรแกรม IP Scanner https://apps.apple.com/th/app/ip-scanner/id404167149?mt=12
ซึ่งพอเปิดโปรแกรม มันจะลิสรายการ device ภายใน network ของเราทั้งหมด เราจะเจอ ip ของ Pi ภายใต้ชื่อ Raspberry Pi
8) พอได้ ip มาแล้ว เพื่อไม่ให้ Pi ของเราได้ ip ชุดใหม่ เราควรจะต้องทำ static ip ซึ่งเราสามารถไปค้นหาวิธีทำได้ใน google เลย เช่นผมที่ใช้ True ก็จะหาว่า "True wifi add static ip"
9) เมื่อทำ static ip แล้วก็สร้าง domain mapping ใน /etc/hosts
127.0.0.1 localhost
192.168.1.41 pi-master.local
อันนี้สมมุติว่าผมมี Pi ip = 192.168.1.41
และจะใช้ domain เป็น pi-master.local
10) ssh เข้า Pi ซึ่งมันจะถามหา password โดย default password คือ raspberry
ssh pi@pi-master.local
Update and Upgrade
เป็นประเพณี เมื่อเราได้ server ใหม่ เราควรจะต้อง update repo
sudo apt update && sudo apt upgrade -qy --no-install-recommends
sudo apt install rpi-eeprom -y
sudo reboot
และ reboot เพื่อความมั่นใจ 1 ที
Install Docker
curl -sSL https://get.docker.com | sh
sudo reboot
เป็นประเพณีของ Docker เช่นกันที่ลงแล้วต้อง reboot
เสร็จแล้วเราควรจะเพิ่ม user เราลง docker group เพราะตามปกติเมื่อ install เสร็จ มันจะสร้าง user group สำหรับ docker runner
sudo usermod -aG docker $USER
install Kubernetes (k3s)
ตอนแรกพยายามจะ install official kubectl แต่ว่าได้ error ว่ามันรองรับ armhf
(เข้าใจว่าเป็นสถาปัตยกรรม CPU ของ Pi4) จึงต้องใช้ k3s แทน
curl -sfL https://get.k3s.io | sh -s - --write-kubeconfig-mode 644
k3s --version
ซึ่งการรัน Kubernetes บน Pi นั้นจะต้องเพิ่ม config ใน /boot/cmdline.txt
โดยเพิ่ม cgroup_enable=cpuset cgroup_enable=memory cgroup_memory=1
ลงท้ายไฟล์
ลองตรวจสอบ
k3s kubectl get node
ซึ่งมันควรจะคืนค่า node ของ Pi มาให้เรา
NAME STATUS ROLES AGE VERSION
raspberrypi Ready control-plane,master 5h40m v1.21.5+k3s2
ตอนนี้ผมจะได้ Pi รองรับการทำ Kubernetes Cluster ได้แล้ว
ในโพสถัดไปผมจะลองสร้าง app บน cluster ตัวนี้ และอยากจะลองใช้เครื่อง Mac เป็น work node สำหรับ cluster นี้ เพื่อจำลองการมีหลายๆ node ก่อนที่จะซื้อเคสและ Pi มาเพิ่ม :D
สิ่งที่ผมคิดว่าควรจะต้องไปดูเพิ่มอีก
- security setup on Raspberry Pi ~ เพราะตอนนี้ access ด้วย default account
Top comments (0)