ເລີ່ມຕົ້ນໃຊ້ງານ k8s ສ້າງ cluster ໃນ local ດ້ວຍ minikube

xangnam phiasakha
VtCamp
Published in
5 min readSep 16, 2018
Related image

ສະບາຍດີ ຜູ້ເຂົ້າມາອ່ານທຸກຄົນ!. ບົດຄວາມນີ້ຈະມາເວົ້າເລື່ອງການເລີ່ມຕົ້ນໃຊ້ງານ k8s ໃນການເຮັດ cluster ເຊິ່ງກ່ອນອື່ນສຳລັບໃຜທີ່ຍັງບໍ່ໄດ້ອ່ານບົດຄວາມເກົ່າກັບການແນະນຳ k8s ແລະ Object ຕ່າງໆຂອງ k8s ຄວນໄປອ່ານເສຍກ່ອນຈຶ່ງມາອ່ານບົດຄວາມນີ້ເພາະບໍ່ດັງນັ້ນຈະບໍ່ຮູ້ເລື່ອງຫຍັງເລີຍ (ມືດ 1000 ດ້ານ!!!)

k8s != docker

ກ່ອນຈະໄປຕໍ່ເຮົາມາຕົກແຕກເລື່ອງທີ່ວ່າ k8s ແລະ docker ມັນບໍ່ແມ່ນສິ່ງດຽວກັນເສຍກ່ອນ Docker ຄື container engine ສ່ວນ k8s ຄືສິ່ງທີ່ໃຊ້ບໍລິຫານຈັດການ container ທີ່ຢູ່ໃນ cluster ເວົ້າງ່າຍກໍ່ຄື tool ເອົາໄວ້ເຮັດ cluster ນັ້ນເອງ

Minikube ຄືຫຍັງ! ?

ເມື່ອທຸກຄົນຮູ້ແລ້ວວ່າ k8s ຄືຫຍັງແລະມັນເຮັດວຽກແບບໃດຕໍ່ມາຄືການໃຊ້ງານເຊິ່ງປົກກະຕິແລ້ວການເຮັດ cluster ແລ້ວເຮົາຈຳເປັນຕ້ອງມີ server ຫຼື VM 2 ເຄື່ອງຂຶ້ນໄປເພື່ອ ໃຫ້ເຄື່ອງໜຶ່ງເປັນ master ແລະ ທີ່ເຫຼືອຄື worker ເຊິ່ງແຕ່ລະເຄື່ອງຕ້ອງຕິດຕັ້ງ k8s environment ເຊິ່ງມັນເປັນຫຍັງທີ່ສິ້ນເບືອງສັບພະຍາກອນເພາະເຮົາພຽງແຕ່ຕ້ອງການທົດລອງໃຊ້ k8s ເພື່ອຮຽນຮູ້ຄຳສັ່ງແລະ concept ຕ່າງໆຂອງ k8s ກ່ອນທີ່ຈະນຳໄປໃຊ້ຈິງຈັງ. ຈາກຄວາມຕ້ອງການດັ່ງກ່າວເຮັດໃຫ້ທາງທີມ k8s ຈຶ່ງສ້າງ tool ທີ່ເຮັດໃຫ້ສາມາດ run k8s ຢູ່ local ໄດ້ເຊິ່ງສິ່ງນັ້ນຖືກກ່າວຂານວ່າ “Minikube” ທີ່ support ທັງ 3 platform : Linux, Mac Os, Windows.

ຕິດຕັ້ງ ແລະ ໃຊ້ງານ Minikube

ສຳລັບການຕິດຕັ້ງ Minikube ໃນ blog ນີ້ຈະສະເໝີໃນ platform MacOs ຖ້າຜູ້ອ່ານໃຊ້ platform ອື່ນກໍ່ສາມາດໄປອ່ານວິທີການຕິດຕັ້ງໄດ້ທີ່

ໃນການໃຊ້ງານ k8s ໃນ local ນັ້ນຕ້ອງຕິດຕັ້ງສິ່ງຕ່າງໆດັ່ງຕໍ່ໄປນີ້

Kubernetes-cli

ເປັນ client command line interface ໄວ້ຕິດຕໍ່ກັບ k8s API ທີ່ເຮັດໃຫ້ເຮົາສາມາດສັ່ງງານ k8s ໄດ້. ການຕິດຕັ້ງກໍ່ງ່າຍແສນງ່າຍ

  • macOS
$ brew install kubernetes-cli

ທົດສອບວ່າ k8s-cli ຕິດຕັ້ງສຳເລັດ

$ kubectl --help

Minikube

ເປັນຕົວສ້າງ k8s cluster ໃນ local ຂອງເຮົາເຊິ່ງມັນຈະສ້າງ vm ຂຶ້ນມາໃຫ້ເຮົາ 1 vm (1 node) ແລະໃນນັ້ນກໍ່ຈະມີການຕິດຕັ້ງ docker ເອົາໄວ້ພ້ອມທັງ run docker container ຂອງອົງປະກອບຕ່າງໆຂອງ k8s cluster ຕຽມໄວ້ໃຫ້ເຮົາ. ສຳລັບເຄື່ອງ macOs ຖ້າໃຊ້ docker for Mac ເຮົາສາມາດສ້າງ vm ໂດຍໃຊ້ hyperkit ໄດ້ເລີຍ ແຕ່ຖ້າບໍ່ຢາກໃຊ້ hyperkit ກໍ່ຕ້ອງຕິດຕັ້ງ VirtualBox ເສຍກ່ອນ

  • Install Minikube
$ brew cask install minikube

ຫຼັງຈາກຕິດຕັ້ງສຳເລັດແລ້ວກໍ່ສັ່ງ start minikube cluster ຂຶ້ນມາໃຊ້ງານໄດ້ເລີຍ

  • Hyperkit
$ minikube start --vm-driver=hyperkit

ສຳລັບ — vm-driver=hyperkit ຄືການບອກໃຫ້ minikube ໃຊ້ hyperkit ເປັນຕົວສ້າງ vm ເຊິ່ງ default ຂອງມັນຈະເປັນ visualBox

  • VirtualBox
$ minkube start

ໃນຂັ້ນຕອນນີ້ minikube ຈະ download container ຕ່າງໆຂອງ k8s cluster ຕິດຕັ້ງລົງ vm ໃຫ້ເຮົາໃຊ້ເວລາໄລຍະໜຶ່ງ. ເມື່ອສຳເລັດແລ້ວກໍ່ລອງທົດສອບເບິ່ງວ່າ k8s-cli ຕິດຕໍ່ກັບ k8s cluster ໄດ້ແລ້ວ

$ kubectl cluster-info

ຖ້າຫາກເກີດຂໍ້ຜິດພາດໃຫ້ config kubectl ໃຊ້ minikube context

$ kubectl config use-context minikube

ວ່າແລ້ວກໍ່ເປີດ dashboard ຂຶ້ນມາເລີຍ

$ minikube dashboard

ກໍ່ຈະໄປເປີດ browser ແລະ ກໍ່ boom!!!

k8s dashboard

ແຕ່ສຳລັບບົດຄວບນີ້ຈະບໍ່ໃຊ້ dashboard ແຕ່ຈະໃຊ້ k8s ຜ່ານ command line ແທນເພື່ອໃຫ້ເຮົາຮູ້ໄດ້ເຖິງຂັ້ນຕອນການໃຊ້ງານ k8s cluster ຢ່າງແທ້ຈິ່ງຖ້າໃຊ້ command line ໄດ້ແລ້ວໄປໃຊ້ໃນ UI mode ກໍ່ແສນຈະງ່າຍດາຍ.

Let Start My First Cluster Application

ເພື່ອເຮັດໃຫ້ເຫັນພາບກັນຫຼາຍຂຶ້ນເຮົາມາລອງ cluster application ງ່າຍໆກັນລອງເບິ່ງເຊິ່ງຈະໃຊ້ເປັນ nodejs Application ແລະ ເພື່ອງ່າຍໄປອີກເຮົາກໍ່ໃຊ້ container ທີ່ທາງ k8s ກຽມໄວ້ໃຫ້ແລ້ວ.

node

ໃນການກວດສອບວ່າ cluster ຂອງເຮົາມີຈຳນວນ node ທີ່ເຂົ້າມາ join ເທົ່າໃດສາມາດໃຊ້ຄຳສັ່ງ

$ kubectl get node
NAME STATUS ROLES AGE VERSION
minikube Ready master 17h v1.10.0

ເຊິ່ງໃນທີ່ນີ້ເຮົາໃຊ້ພຽງແຕ່ node ດຽວໃນການທົດສອບເຮັດ cluster

deployment

ຄືຂັ້ນຕອນໃນການ run application ເຂົ້າໄປໃນ k8s cluster

$ kubectl run kubernetes-bootcamp --image=gcr.io/google-samples/kubernetes-bootcamp:v1 --port=8080

ການ deploy application ໃນ k8s ນັ້ນກໍ່ພຽງແຕ່ກຳນົດວ່າ image ແລະ port ຂອງ application ຂອງເຮົາຈະ run ເທົ່ານັ້ນກໍ່ເປັນອັນໃຊ້ງານໄດ້ (ຄືກັບການ run container ໃນ docker) ສຳລັບ option ອື່ນໆຂອງ kubectl run ສາມາດນຳໄປອ່ານໄດ້ໃນເວັບຂອງ k8s ເອງເມື່ອ run command line ຂ້າງເຖິງແລ້ວ k8s cluster ກໍ່ຈະສ້າງ pod application ຂອງເຮົາຂື້ນມາໃຫ້ສາມາດ check ໄດ້ຈາກ

ລາຍການທັງໝົດຂອງການ deploy

$ kubectl get deploymentsNAME                  DESIRED   CURRENT   UP-TO-DATE   AVAILABLE   
kubernetes-bootcamp 1 1 1 1

ບັນດາ pod ຕ່າງໆໃນ cluster

$ kubectl get podsNAME                                   READY     STATUS    RESTARTS   
kubernetes-bootcamp-7799cbcb86-7ztnx 1/1 Running 1

ເຮົາສາມາດເບິ່ງ log ຫຼື remote ເຂົ້າໄປໃນ pod ນັ້ນໄດ້ແບບງ່າຍໆ

ເບິ່ງ logs

$ kubectl logs kubernetes-bootcamp-7799cbcb86-7ztnxKubernetes Bootcamp App Started At: 2018-09-16T02:29:29.765Z | Running On:  kubernetes-bootcamp-7799cbcb86-7ztnx

remote

$ kubectl exec -ti kubernetes-bootcamp-7799cbcb86-7ztnx bash

ຈະເຫັນວ່າມີຄວາມຄ້າຍຄືກັບ docker run command ຫຼາຍ. ສຳລັບ pod ທີ່ຖືກສ້າງຂື້ນມານີ້ແມ່ນບໍ່ສາມາດ access ຈາກທາງນອກເຂົ້າມາໄດ້. ມີແຕ່ internal IP ບໍ່ມີ external IP ຫຼື endpoint ດັ່ງນັ້ນຕ້ອງສ້າງ service ຂອງ application ນີ້ຂຶ້ນມາ

Service

ຄືສ່ວນສຳຄັນທີ່ເຮັດໃຫ້ application ທີ່ເຮົາ deploy ໄປນັ້ນ public ໃຫ້ຄົນພາຍນອກເຂົ້າມາໃຊ້ງານໄດ້ ນອກນັ້ນ service ຍັງເປັນຕົວກາງໃຫ້ກັບ pod ດ້ວຍກັນເອງ ແລະ ກະຈ່າຍ load ໄປໃຫ້ບັນດາ pod ຕ່າງໆໃນ Service ເຮັດໃຫ້ Application ຂອງເຮົາຈະບໍ່ມີວັນ downtime ເກີດຂື້ນຍົກເວັນໂລກແຕກ!! ຮອດຕອນນັ້ນກໍ່ບໍ່ຕ້ອງຄິດຫຍັງໃຫ້ມັນຫຼາຍ

https://medium.com/sirisoft/getting-start-with-kubernetes-5b4e6b89241e

ສຳລັບ application ທີ່ເຮົາ deploy ໄປກ່ອນໜ້ານີ້ກໍ່ຈັບມາສ້າງ service ໃຫ້ໄດ້ເລີຍ

$ kubectl expose deployments/kubernetes-bootcamp --type="NodePort" --port=8080

ກວດສອບເບິ່ງ service ທີ່ສ້າງຂື້ນ

$ kubectl get service

ຈະເຫັນ service ທີ່ເຮົາສ້າງຂຶ້ນມາສ່ວນທີ່ສຳຄັນໃນການສ້າງ service ແມ່ນການເລື່ອກໃຊ້ type Network ຂອງການ expose ເຊິ່ງຈະມີ type ດັ່ງນີ້

  • ClusterIP (default) — ເປັນການ expose service ໂດຍ service ຈະເປັນ Internal IP ໃຊ້ໄດ້ສະເພາະໃນ cluster ເທົ່ານັ້ນ
  • NodePort — ເປັນການ expose service ໂດຍແຕ່ລະ node ຈະໃຊ້ port ດຽວກັນໂດຍ port ນັ້ນເປັນ endpoint ທີ່ສາມາດ access ເຂົ້າຈາກພາຍນອກໄດ້ <NodeIP>:<NodePort>
  • LoadBalancer — ເປັນການ expose service ໂດຍໃຊ້ external load balance
  • ExternalName — ເປັນການ expose service ໂດຍໃຊ້ kube-dns

ກວດສອບ endpoint port ຂອງ application service

$ kubectl describe service/kubernetes-bootcamp

ໃຫ້ສັງເກດເບິ່ງ NodePort ເຊິ່ງເປັນ port ທີ່ເຮົາສາມາດ access ເຂົ້າໄປຫາ application ຂອງເຮົາໄດ້

$ curl $(minikube ip):31709Hello Kubernetes bootcamp! | Running on: kubernetes-bootcamp-7799cbcb86-7ztnx | v=2

ພຽງເທົ່ານີ້ application ຂອງເຮົາກໍ່ສາມາດ access ເຂົ້າໄປຈາກທາງນອກໄດ້ແລ້ວ

Scale

ຖ້າເວົ້າເຖິງເລື່ອງຂອງ cluster ແລ້ວກໍ່ຕ້ອງຄິດເຖິງເລື່ອງການ scale application ໄປໃນແຕ່ລະ node ຕາມຈຳນວນ replica ທີ່ຕ້ອງການເຊິ່ງການ scale ໃນ k8s ນັ້ນກໍ່ຄືການ scale pod ນັ້ນເອງ ໂດຍຈຳນວນ pod ທີ່ເພີ່ມຂື້ນນັ້ນຈະຢູ່ພາຍໃຕ service ດຽວກັນ

$ kubectl scale deployments/kubernetes-bootcamp --replicas=4

ກວດສອບ deployment

kubectl get deployments
NAME DESIRED CURRENT UP-TO-DATE AVAILABLE
kubernetes-bootcamp 4 4 4 4

ຈະເຫັນວ່າຈຳນວນ pod ເພີ່ມຂຶ້ນເປັນ 4 pod

ກວດສອບ pod ໃນ cluster

$ kubectl get podsNAME                                   READY     STATUS    RESTARTS   
kubernetes-bootcamp-7799cbcb86-242rf 1/1 Running 0
kubernetes-bootcamp-7799cbcb86-7ztnx 1/1 Running 0
kubernetes-bootcamp-7799cbcb86-9v5g2 1/1 Running 0
kubernetes-bootcamp-7799cbcb86-s6rcv 1/1 Running 0

ທົດສອບ load balance ຂອງ service ໝາຍເຖິງການກະຈາຍ load ໄປແຕ່ລະ pod

$ curl $(minikube ip):31709
Hello Kubernetes bootcamp! | Running on: kubernetes-bootcamp-7799cbcb86-s6rcv | v=2
$ curl $(minikube ip):31709
Hello Kubernetes bootcamp! | Running on: kubernetes-bootcamp-7799cbcb86-9v5g2 | v=2

ຈະສັງເກດເຫັນວ່າ request ຈະຖືກກະຈາຍໄປໃນແຕ່ລະ pod ນອກນີ້ຖ້າເຮົາເກີດປ່ຽນໃຈຫຼຸດ replica ຂອງ application ລົງກໍ່ພຽງແຕ່ເອີ້ນໃຊ້ຄຳສັ່ງ scale ແລະ ປ່ຽນຈຳນວນ replica ລົງ k8s ກໍ່ຈະໄປຈັດການຫຼຸດໃຫ້ເຮົາແບບທີ່ application ຂອງເຮົາບໍ່ມີ downtime ເກີດຂຶ້ນເລີຍເຊິ່ງເປັນຫຍັງທີ່ດີຫຼາຍ!!.

Rolling update

ໜຶ່ງໃນຄວາມສາມາດຂອງ k8s ທີ່ໂຄດຈະດີຄືການ update container ໂດຍທີ່ບໍ່ມີ downtime ເກີດຂື້ນເລີຍ ຕົວຢ່າງເຊັ່ນ ວັນດີຄືນດີເຮົາ update application ຂອງເຮົາເປັນ version ໄຫມ່ໂດຍມີການເພີ່ມນັ້ນເພີ່ມນີ້ເຂົ້າໄປແລະເວລາ deploy ອາດຈະໃຊ້ເວລາໄລຍະໜຶ່ງໃນການ update ເຮັດໃຫ້ application ຂອງເຮົາຈຳເປັນຕ້ອງ down ໄປ. ຖ້າເປັນ application ທີ່ມີຄົນໃຊ້ບໍ່ຫຼາຍກໍ່ບໍ່ມີບັນຫາຫຍັງແຕ່ຖ້າເປັນລະບົບທີ່ໃຫຍ່ມີຄົນເຂົ້າໄປເປັນລ້ານທຸກໆວິນາທີ ການ down ໄປ 5 ນາທີກໍ່ມີຜົນເສຍຫາຍອັນມະຫາສານໃຫ້ແກ່ທຸລະກິດແລ້ວ. ແຕ່ບັນຫານີ້ຈະບໍ່ມີວັນເກີດຂຶ້ນກັບ k8s ເພາະມັນຈະຄ່ອຍໆ update ແຕ່ລະ pod ເປັນ version ໄຫມ່ໃຫ້ອັດໂຕໂນມັດ ເຊິ່ງເອີ່ນວ່າ rolling update

$ kubectl set image deployments/kubernetes-bootcamp kubernetes-bootcamp=jocatalin/kubernetes-bootcamp:v2

ດ້ວຍຄຳສັ່ງພຽງເທົ່ານີ້ການ update application ຂອງເຮົາກໍ່ສຳເລັດແລ້ວ. ໂດຍຄຳສັງຂ້າງເທິງເປັນການ update version ຂອງ container application ເປັນ version 2.

ສະຫຼຸບ

ມາຮອດນີ້ກໍ່ເປັນອັນຈົບ basic ການເລີ່ມຕົ້ນໃຊ້ງານ k8s cluster ເຊິ່ງບອກໄດ້ຄຳດຽວວ່າເປັນ tool ທີ່ໃຊ້ເຮັດ cluster ລະດັບເທບ. ໃນບົດຄວາມຕໍ່ໄປຈະລອງເຮັດ cluster ໂດຍມີຫຼາຍໆ node ແລະ ການສ້າງ file config .yml ຂອງ k8s ທີ່ເອີ່ນວ່າ all in one ຂອງແທ້!!!.

ຂອບໃຈທຸກຄົນ!!

thank you babe!!

--

--