ເລີ່ມຕົນໃຊ້ງານ k8s ສ້າງ cluster ເທິງ cloud server

xangnam phiasakha
VtCamp
Published in
3 min readSep 30, 2018

ສະບາຍດີຜູ້ອ່ານທຸກຄົນກັບມາເຈີກັບ serie k8s ກັນອີກຄັ້ງ ແລະ ບົດຄວາມນີ້ເຮົາຈະມາເວົ້າເຖິງການຕິດຕັ້ງ ແລະ ໃຊ້ງານ k8s ເຖິງ server ແທ້ໆທີ່ບໍ່ແມ່ນການຈຳລອງຢູ່ local ຂອງເຮົາເຊິ່ງໄດ້ເວົ້າກັນໄປແລ້ວໃນບົດຄວາມກ່ອນສາມາດກັບໄປອ່ານກັນໄດ້

ເອົາຫລ່ະບໍ່ອະລຳພະບົດຫຼາຍເຈັບຄໍ!! ກໍ່ມາເຂົ້າເລື່ອງກັນເລີຍ. ໃນການເຮັດ cluster ໂດຍໃຊ້ server ແທ້ໆນັ້ນກ່ອນອື່ນເຮົາຕ້ອງມີ server 3 ເຄື່ອງ ແລະ ແຕ່ລະເຄື່ອງກໍ່ຕິດຕັ້ງ docker ເຊິ່ງບັງເອີນວ່າຜູ້ຂຽນບໍ່ແມ່ນຄົນຮວຍຫຍັງຂະໜາດນັ້ນກໍ່ເລີຍໄປເຊົ່າ cloud ແລ້ວສ້າງ VM ຂື້ນມາ 3 instance (ຄວາມເປັນຈິງແລ້ວ Cloud ທີ່ໃຊ້ທົດລອງໃນຂະນະຂຽນບົດຄວາມນີ້ແມ່ນຜູ້ໃຫຍ່ໃຈດີທີ່ໃຊ້ນາມແຟງວ່າ Os555 ເປັນຜູ້ອຸປະຖຳຂໍ້ຂອບໃຈມາຫຍັງທີ່ນີ້ດ້ວຍ) ແລ້ວກໍ່ຕິດຕັ້ງ docker ໃຫ້ແຕ່ຫລ່ະ VM ດ້ວຍວິທີງ່າຍໆດັ່ງນີ້

  1. copy script ຈາກ https://get.docker.com/
  2. ສ້າງ file .sh ຂຶ້ນມາແລ້ວກໍ່ past script ນ້ັນລົງໄປພ້ອມທັງ chmode +x installFile.sh
  3. run ຄຳສັ່ງ ./installFile.sh ກໍ່ເປັນອັນສຳເລັດ

ຕິດຕັ້ງ kubeadm, kubelet, kubctl

ໃນເຮັດ cluster ໂດຍໃຊ້ k8s ເທິງ cloud server ຫຼື private server ກໍ່ຕາມຕ້ອງໄດ້ຕິດຕັ້ງທັງສາມຕົວນີ້ໃຫ້ແຕ່ລະ node (server ຫຼື VM).

apt-get update && apt-get install -y apt-transport-https curl
curl -s https://packages.cloud.google.com/apt/doc/apt-key.gpg | apt-key add -
cat <<EOF >/etc/apt/sources.list.d/kubernetes.list
deb http://apt.kubernetes.io/ kubernetes-xenial main
EOF
apt-get update
apt-get install -y kubelet kubeadm kubectl
apt-mark hold kubelet kubeadm kubectl

ພຽງເທົ່ານີ້ເຮົາກໍ່ພ້ອມຈະ cluster ກັນແລ້ວ

Start cluster ດ້ວຍ kubeadm

ຫຼັງຈາກຕິດຕັ້ງແລ້ວກໍ່ເຖິງເວລາພາຄວນ start cluster ກັນແລ້ວໂດຍເລືອກເອົາ node ໃດໜຶ່ງເປັນ 3 node ທີ່ເຮົາກຽມໄວ້ນັ້ນມາເປັນ master ຈາກນັ້ນກໍ່ remote ssh ເຂົ້າໄປແລ້ວກໍ່ run ຄຳສັ່ງດັ່ງນີ້

start k8s cluster

$ kubeadm init --pod-network-cidr=10.244.0.0/16 --apiserver-advertise-address=<master-ip-address>

ເຊິ່ງ flag — pod-network-cidr ເປັນການບອກ kubeamd ໃຊ້ IP ໃນຊ່ວງໃດໃນການສ້າງ network ໃຫ້ກັບ pods ຫຼັງຈາກນັ້ນແລ້ວກໍ່ຕ້ອງຕິດຕັ້ງ add-on ຂອງ netowrk ນັ້ນໃຫ້ cluster ຮັບຮູ້ເຊິ່ງເຮົາຈະເວົ້າກັນໃນ step ຕໍ່ໄປ. ສ່ວນ — apiserver-advertise-address ຄືການກຳນົດ API endpoint ຂອງ k8s ເຊິ່ງກໍ່ຄື master IP ນັ້ນເອງ. ເມື່ອເຮົາ start k8s cluster ດ້ວຍຄຳສັ່ງຂ້າງເທິງນັ້ນສຳເລັດແລ້ວກໍ່ຈະມີຄຳອະທິໃຫ້ເຮົາວ່າຈະເຮັດຫຍັງຕໍ່ເຊິ່ງຂັ້ນຕອນຕໍ່ໄປນັ້ນກໍ່ຄືການ join node ເຂົ້າສູ່ cluster ແຕ່ກ່ອນອື່ນເຮົາໄປຕິດຕັ້ງ add-on network ເສຍກ່ອນ.

ຕິດຕັ້ງ pod network add-on

ເຊິ່ງໃນທີ່ນີ້ເຮົາຈະໃຊ້ Flannel Add-on ວ່າແລ້ວກໍ່ເລີ່ມຕິດຕັ້ງກັນເລີຍ

$ sysctl net.bridge.bridge-nf-call-iptables=1
$
kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/c5d10c8/Documentation/kube-flannel.yml

ເມື່ອສຳເລັດແລ້ວກໍ່ເປັນອັນວ່າ cluster network ຂອງເຮົາພ້ອມໃຊ້ງານແລ້ວ.

ການ join Node ເຂົ້າສູ່ cluster

ກ່ອນອື່ນໄປສ້າງບ່ອນເກັບ config ຂອງ k8s ກ່ອນເຊິ່ງຂັ້ນຕອນນີ້ຈະເຮັດສະເພາະຢູ່ master ເທົ່ານັ້ນ.

$ mkdir -p $HOME/.kube
$ sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
$ sudo chown $(id -u):$(id -g) $HOME/.kube/config

ເບິ່ງລາຍການ token ທີ່ node ຕ່າງໆ ຈະໃຊ້ join ເຂົ້າສູ່ k8s cluster

$ kubeadm token list
TOKEN TTL EXPIRES USAGES
8ewj1p.9r9hcjoqgajrj4gi 23h 2018-06-12T02:51:28Z authentication

ໂດຍປົກກະຕິແລ້ວ token ຈະໝົດອາຍຸການໃຊ້ງານພາຍໃນ 24 ຊົວໂມງ ຖ້າປະກົດວ່າບໍ່ມີລາຍການ token ກໍ່ໃຫ້ສ້າງ token ຂື້ນມາໄຫມ່

$ kubeadm create token
r3b0f4.itay0hxo3aoyzs17

ສ້າງ hash ເພື່ອໃຊ້ join cluster

$ openssl x509 -pubkey -in /etc/kubernetes/pki/ca.crt | openssl rsa -pubin -outform der 2>/dev/null | \
openssl dgst -sha256 -hex | sed 's/^.* //'

ສຳລັບຂັ້ນຕອນຂ້າງເທິງນັ້ນເວລາເຮົາໃຊ້ຄຳສັ່ງ kube init ມັນຈະສ້າງຂື້ນມາໃຫ້ແລ້ວພຽງແຕ່ຢາກໃຫ້ຮູ້ວ່າຖ້າເຮົາຕ້ອງການສ້າງ token ຫຼື hash ເອງເພື່ອໃນກໍລະນີທີ່ຕ້ອງໄດ້ join node ໃນອະນາຄົດ.

ຫຼັງຈາກນັ້ນກໍ່ ssh ເຂົ້າໄປແຕ່ຫລ່ະ node ທີ່ເຮົາຈະ join ມັນເຂົ້າມາໃນ cluster ແລ້ວກໍ່ run command ດັ່ງນີ້.

$ kubeadm join --token <token> <master-ip>:<master-port> --discovery-token-ca-cert-hash sha256:<hash>

ເອົາຄ່າ token ແລະ hash ທີ່ໄດ້ມາແທນທີ່ <token> , <hash> ຕາມລຳດັບ. ພຽງເທົ່ານີ້ node ນັ້ນໆກໍ່ join cluster ເປັນອັນສຳເລັດແລ້ວສາມາດກວດສອບໄດ້ຈາກ master node

$ kubectl get node
NAME STATUS ROLES AGE VERSION
xangnam-k8s-lab1 Ready master 13d v1.11.3xangnam-k8s-lab2 Ready <none> 13d v1.11.3xangnam-k8s-lab3 Ready <none> 13d v1.11.3

ພຽງເທົ່ານີ້ cluster ກໍ່ພ້ອມໃນການ deployment application ແລ້ວ.

ທົດລອງ deploy application

ເມື່ອເຮົາສ້າງ cluster ແລະ join node ເຂົ້າມາແລ້ວກໍ່ມາລອງ deploy application ເຂົ້າມາໃນ cluster ລອງເບິ່ງວ່າມັນຈະຍິງໃຫຍ່ອະລັງການແນວໃດ. ເຊິ່ງຜູ້ຂຽນຂໍ້ຍົກເອົາ nginx ຂື້ນມາເປັນຕົວຢ່າງວ່າແລ້ວກໍ່ເລີມກັນເລີຍ

deployment

$  kubectl run nginx --image=nginx --port=80

ສ້າງ service

$ kubectl expose deployments/nginx  --type="NodePort" --port=80
$ kubectl get services
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) kubernetes ClusterIP 10.96.0.1 <none> 443/TCP nginx NodePort 10.104.144.33 <none> 80:30269/TCP

ຫຼັງຈາກນັ້ນກໍ່ລອງ access ເຂົ້າເບິ່ງວ່າ nginx ເຮັດວຽກຫຼືຍັງ <master-ip>:<service-port> ຫຼື <worker-node-ip>:<service-port> ຖ້າບໍ່ມີຫຍັງຜິດພາດກໍ່ຈະປະກົດໜ້າ wellcome ຂອງ nginx.

Scale application

$ kubectl scale deployments/nginx --replicas=5
$ kubectl get deployments
NAME DESIRED CURRENT UP-TO-DATE AVAILABLE AGE
nginx 5 5 5 5 2

ມາຮອດນີ້ເຮົາກໍ່ສຳເລັດການສ້າງ cluster server ໃນ cloud ເປັນທີ່ຮຽບຮ້ອຍແລ້ວກໍ່ຈະເຫັນວ່າບໍ່ມີຫຍັງຫຍຸງຍາກເລີຍເພາະ k8s ພັດທະນາຂຶ້ນມາເພື່ອໃຫ້ຄົນທຳມະດາສາມັນສາມາດເຮັດ cluster ໄດ້ຢູ່ແລ້ວ. ເຊິ່ງບົດຄວາມນີ້ຈະເປັນບົດຄວາມສຸດທ້າຍທີ່ຈະເວົ້າເຖິງພື້ນຖານການໃຊ້ງານ k8s ເພາະບົດຄວາມຕໍ່ໄປຈະເວົ້າຂັ້ນ advance ຂື້ນໄປອີກເຊັ່ນ persistance storage, deployments file, ການນຳໃຊ້ helm ໃນການ deployment application.

ສຳລັບໃຜທີ່ຄິດວ່າວິທີຕິດຕັ້ງຂ້າງເທິງຍາກ ແລະ ສັບສົນຢູ່ຢາກຫາໂຕຊ່ວຍປະມານວ່າຄຳສັ່ງດຽວຈົບແນະນຳ script ຕິດຕັ້ງ k8s ທີ່ມີຄົນໃຈດີເຮັດໄວ້ໃຫ້ແລ້ວ.

ສາມາດຫາຂໍ້ມູນເພີ່ມເຕີມໄດ້ທີ່

ຂອບໃຈທຸກຄົນທີ່ອ່ານຈົນຈົບ ແລ້ວເຈີກັນໃນບົດຄວາມຕໍ່ໄປ!!

--

--