มาทำ Kubernetes แบบ Single Cluster เพื่อ Develop กันดีกว่า

Docker ❤ K8s

บทความนี้จะเน้นปฏิบัติไม่เน้นทฤษฎีครับ ส่วนทฤษฎีมีพี่ๆ หลายๆ คนเขาเขียนเอาไว้และเข้าใจง่ายกว่าผมเขียนเยอะครับ งั้นเรามาปฏิบัติกันดีเลยกว่า

**บทความนี้ขอลงรูปน้อยเนาะ เจ็บคอ :)

เตรียมของกันก่อน

สำหรับบทความนี้ผมใช้งาน 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)
vm spec

ส่วนวิธีลง 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 ด้วยละครับ

K8s join token

หลังจากนั้นเราก็จะไปทำการกำหนด 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

ซึ่งถ้าทำงานหมดแล้วก็จะประมาณนี้ครับ

k8s service status

ต่อจากนั้นเราก็มาทำ 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
k8s dashboard create result

ต่อจากนั้นก็ config dashboard กันต่อด้วยคำสั่ง

~$ kubectl apply -f https://raw.githubusercontent.com/VatthanachaiW/kubernete-config/master/kube-dashboard-config.yaml
k8s dashboard config apply result

จากนั้นก็ทำการติดตั้ง heapster add-on เพื่อเก็บ statistic ต่างๆ กันต่อ

~$ kubectl create -f https://raw.githubusercontent.com/VatthanachaiW/kubernete-config/master/kube-heapster-addon.yaml
k8s heapster add-on create result

มาทำที่เก็บข้อมูล statistic ด้วยตัว influxdb กันต่อ

~$ kubectl create -f https://raw.githubusercontent.com/VatthanachaiW/kubernete-config/master/influxdb.yaml
k8s influxdb create result

จากนั้นก็มาทำ cluster ของตัว heapster กันด้วยคำสั่ง

~$ kubectl create -f https://raw.githubusercontent.com/VatthanachaiW/kubernete-config/master/heapster.yaml
k8s heapster cluster create result

ถ้าเราลองเช็ค services ดูก็จะมีรายการประมาณนี้

k8s service list

วิธีเข้า 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 ไปเลยครับ

Kubernetes Dashboard Authentication

จากนั้นจะเข้าหน้า dashboard ที่มีลักษณะหน้าตาแบบนี้ได้แล้ว

k8s dash board

เป็นไงครับง่ายมั้ยสำหรับการติดตั้ง 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)

ส่วนวิธีใช้งานก็คงต้องติดเอาไว้ก่อนเพราะยังใช้งานไม่เป็น กลัวว่าถ้าลงแล้วจะเข้าใจผิดๆ คงต้องขอให้ใช้งานให้เป็นมากกว่านี้ก่อนนะครับ (แต่ก็ไม่รู้ว่าเมื่อไรที่จะว่าง ฮ่าๆ) หวังว่าบทความนี้คงพอจะมีประโยชน์กันบ้างนะครับ ขอบคุณที่ทนอ่านจนจบครับ และก็หวังว่าคงจะได้มาลงบทความให้รกสมองกันอีกนะครับ ฮ่าๆ :)