มาทำ Kubernetes แบบ Single Cluster เพื่อ Develop กันดีกว่า
บทความนี้จะเน้นปฏิบัติไม่เน้นทฤษฎีครับ ส่วนทฤษฎีมีพี่ๆ หลายๆ คนเขาเขียนเอาไว้และเข้าใจง่ายกว่าผมเขียนเยอะครับ งั้นเรามาปฏิบัติกันดีเลยกว่า
**บทความนี้ขอลงรูปน้อยเนาะ เจ็บคอ :)
เตรียมของกันก่อน
สำหรับบทความนี้ผมใช้งาน Ubuntu 18.04 บน VMware Workstation ครับ หรือถ้าบางคนไม่ถนัดหรือไม่มีจะใช้ Virtual Box ก็ได้ครับ
สำหรับสเปกของ vm ที่ใช้งานก็ตามนี้ครับ
- CPU 2 Cores 2 Threads
- RAM 4 GB for minimum (Recommended 8 GB)
- HDD 60 for minimum (Recommend 80–100 GB)
- Ubuntu OS 16.04 for minimum (but in this document use Ubuntu 18.04 LTS)
ส่วนวิธีลง Ubuntu ผมขอข้ามนะครับ เพราะว่าสามารถหาได้ใน Google เลยครับ
ก่อนอื่นก็ต้องอัพเดท OS ให้เป็นล่าสุดๆ กันก่อนก็ใช้คำสั่งตามนี้ได้เลยครับ
~$ sudo apt-get update \
&& sudo apt-get upgrade -y \
&& sudo apt-get dist-upgrade -y \
&& sudo apt-get clean \
&& sudo apt-get autoremove -y
ต่อไปก็ติดตั้งโปรแกรมที่จำเป็นต้องใช้งานกันครับ
~$ sudo apt-get install -y apt-transport-https ca-certificates curl software-properties-common docker.io
หลังจากที่ติดตั้งจนเสร็จแล้ว เราก็จะมาทำให้ service ของ docker ทำงานแบบอัตโนมัติตอนเปิด vm กันด้วยคำสั่ง
~$ sudo systemctl enable docker.service
จากนั้นเราก็จะเพิ่ม apt key ของ kubernete หรือ k8s กันต่อด้วยคำสั่ง
~$ curl -s https://packages.cloud.google.com/apt/doc/apt-key.gpg | sudo apt-key add -
สำหรับในตอนนี้ตัว ubuntu จะยังไม่รู้จัก package ของ k8s เลยทำให้ยังไม่สามารถใช้คำสั่งติดตั้งได้ครับ เราเลยต้องทำการเพิ่ม source list เข้าไปเพื่อให้ ubuntu รู้จักกันโดยทำตามนี้เลยครับ
ทำการสร้างไฟล์ชื่อ kubernetes.list ใน /etc/apt/sources.list.d/ ด้วยคำสั่ง
~$ sudo nano /etc/apt/sources.list.d/kubernetes.list
แล้วข้างในไฟล์ก็ใส่คำสั่งนี้ลงไปซะ เพื่อทำการชี้เป้าหมายของ package
deb http://apt.kubernetes.io/ kubernetes-xenial main
จากนั้นบันทึกไฟล์แล้วปิดไปซะ แต่… Ubuntu ยังไม่รู้จักรายชื่อ Package ที่เราพึ่งจะเพิ่มเข้าไปใหม่ เราก็ทำการอัพเดทด้วยคำสั่งนี้ซะ
~$ sudo apt-get update
หลังจากอัพเดทเสร็จแล้วก็สามารถติดตั้ง Package ของ Kubernete ได้แล้ว โดยเราจะติดตั้งแค่ 3 ตัว ตามนี้
~$ sudo apt-get install -y kubelet kubeadm kubectl kubernetes-cni
แล้วจากนั้นเราก็ต้องไปปิด swap กันก่อน ถ้าปิดชั่วคราวก็ใช้คำสั่งนี้ได้เลย
~$ sudo swapoff -a
แต่ถ้าจะปิดถาวรก็เข้าไปคอมเม้นต์หรือลบบรรทัดที่เขียนว่า swap ในไฟล์ fstab เลยก็ได้ ก็ใช้คำสั่ง
~$ sudo nano /etc/fstab
เตรียมของกันเสร็จแล้วเราก็มาเริ่มลงกันจริงๆ จังๆ เลยดีกว่าเนาะ ก่อนอื่นก็ทำการตั้งค่าให้กับ k8s ของเรากันก่อนดีกว่า ก็ใช้คำสั่งตามนี้เลย
~$ sudo kubeadm init \
--apiserver-advertise-address=<IP เครื่อง> \
--pod-network-cidr=10.244.0.0/16
สำหรับ IP เครื่องก็ของตัว vm นั่นแหละครับ อย่างของผมเป็น 192.168.195.138 ก็จะใส่ตามนี้เลย
~$ sudo kubeadm init \
--apiserver-advertise-address=192.168.195.138 \
--pod-network-cidr=10.244.0.0/16
แล้วจากนั้นก็นั่งรอ รอ.. แป๊ปเดียว เดี่ยวก็เสร็จ
หลังจากเสร็จแล้ว อย่าลืมเก็บ token เผื่อเอาจะเอาเครื่องอื่นเข้ามา join ด้วยละครับ
หลังจากนั้นเราก็จะไปทำการกำหนด config เพื่อใช้งานกันก่อน ถึงจะเริ่มใช้งานกันได้ครับ ก็ใช้คำสั่งนี้ได้เลยครับ
~$ mkdir -p $HOME/.kube &&\
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config &&\
sudo chown $(id -u):$(id -g) $HOME/.kube/config
จริงๆ แค่นี้แหละครับ จบละ แต่…. เดี๋ยวเราจะไปลง pod กันต่อนะครับ ฮ่าๆ ก็ใช้คำสั่งนี้เลยครับ เนื่องจากไฟล์ yaml บางตัวเขาจะตั้งให้ไปโหลดไฟล์ที่เป็น beta ลงมาใช้งาน ผมก็เลยแก้ให้เป็นตัวที่ release แล้วอาขึ้น git ของตัวเองไว้ครับ ก็สามารถไปใช้งานได้เลยครับ
~$ kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
จากนั้นก็ใช้คำสั่งนี้เช็คดูว่าพวก services ต่างๆ ทำงานกันหรือยัง
~$ kubectl get pods -n kube-system
ซึ่งถ้าทำงานหมดแล้วก็จะประมาณนี้ครับ
ต่อจากนั้นเราก็มาทำ taint master node กันต่อเลยด้วยคำสั่ง
~$ kubectl taint nodes --all node-role.kubernetes.io/master-
เอาจริงๆ ตอนนี้ก็พร้อมใช้งานได้แล้วนะครับ แต่ช้าก่อน… ให้ดูแต่หน้า Console ก็จะดูโหดร้ายเกินไป งั้นเรามาทำหน้า dashboard กันต่อเลยดีกว่าครับ
เริ่มแรกก็ต้อง deploy dashboard กันก่อนด้วยคำสั่ง
~$ kubectl create -f https://raw.githubusercontent.com/VatthanachaiW/kubernete-config/master/kubernetes-dashboard.yaml
ต่อจากนั้นก็ config dashboard กันต่อด้วยคำสั่ง
~$ kubectl apply -f https://raw.githubusercontent.com/VatthanachaiW/kubernete-config/master/kube-dashboard-config.yaml
จากนั้นก็ทำการติดตั้ง heapster add-on เพื่อเก็บ statistic ต่างๆ กันต่อ
~$ kubectl create -f https://raw.githubusercontent.com/VatthanachaiW/kubernete-config/master/kube-heapster-addon.yaml
มาทำที่เก็บข้อมูล statistic ด้วยตัว influxdb กันต่อ
~$ kubectl create -f https://raw.githubusercontent.com/VatthanachaiW/kubernete-config/master/influxdb.yaml
จากนั้นก็มาทำ cluster ของตัว heapster กันด้วยคำสั่ง
~$ kubectl create -f https://raw.githubusercontent.com/VatthanachaiW/kubernete-config/master/heapster.yaml
ถ้าเราลองเช็ค services ดูก็จะมีรายการประมาณนี้
วิธีเข้า Dashboard ก็ใช้คำสั่ง
~$ kubectl proxy
แต่!!! เราใช้งานใน console แล้วจะเข้าหน้าเว็บได้ยังไงกันละ ก็ต้องเข้าจากเครื่องอื่นเอาสิจริงมั้ย งั้นเอาใหม่ๆ ลองใช้คำสั่งนี้ดู
~$ sudo kubectl proxy --address="<IP เครื่อง>" -p <port> --accept-hosts='^*$' &
ถ้าเป็นเครื่องผมก็จะใส่ IP แบบนี้
~$ sudo kubectl proxy --address="192.168.195.138" -p 443 --accept-hosts='^*$' &
หรือถ้าใครจะใช้ port 80 ก็ไม่ต้องใส่ -p เข้าไปนะครับ
แต่ถ้าหากจะใช้แบบ public ไปเลย ก็ใช้แบบนี้เลยก็ได้ครับ
~$ sudo kubectl proxy --address="0.0.0.0" -p 443 --accept-hosts='^*$' &
คราวนี้พอลองเปิดหน้าเว็บแล้วเข้า address ของ k8s กันครับ
http://192.168.195.138:443/api/v1/namespaces/kube-system/services/https:kubernetes-dashboard:/proxy
จะเจอกับหน้าจอแบบนี้ กด skip ไปเลยครับ
จากนั้นจะเข้าหน้า dashboard ที่มีลักษณะหน้าตาแบบนี้ได้แล้ว
เป็นไงครับง่ายมั้ยสำหรับการติดตั้ง k8s หรือ kubernete เอาไว้ทดสอบโปรเจคแบบไม่ต้องไปยุ่งกับเครื่อง Production ให้หัวหน้าหรือลูกค่าไล่เตะเวลาเว็บล่มแล้วละครับ
เพิ่มเติมอีกนิดครับ เผื่อใครต้องการ reset k8s เพื่อ init ใหม่ก็สามารถใช้คำสั่งนี้เพื่อ reset ได้เลยครับ แต่ว่าต้องไป copy config ไปไว้ที่ $HOME ใหม่หลังจากทำการ init ใหม่ทุกครั้งด้วยนะครับ
~$ sudo kubeadm reset
ถ้าต้องการปิด process ส่วนของ proxy ก็ใช้คำสั่งนี้เพื่อปิดได้เลยครับ
~$ sudo kill $(sudo lsof -t -i:<port>)
อย่างของผมใช้งานที่ port 443 ก็จะใส่เป็น
sudo kill $(sudo lsof -t -i:443)
ส่วนวิธีใช้งานก็คงต้องติดเอาไว้ก่อนเพราะยังใช้งานไม่เป็น กลัวว่าถ้าลงแล้วจะเข้าใจผิดๆ คงต้องขอให้ใช้งานให้เป็นมากกว่านี้ก่อนนะครับ (แต่ก็ไม่รู้ว่าเมื่อไรที่จะว่าง ฮ่าๆ) หวังว่าบทความนี้คงพอจะมีประโยชน์กันบ้างนะครับ ขอบคุณที่ทนอ่านจนจบครับ และก็หวังว่าคงจะได้มาลงบทความให้รกสมองกันอีกนะครับ ฮ่าๆ :)