LFS258 [2/15]: Kubernetes Installation and Configuration

peepeepopapapeepeepo

Sawit M.

Posted on January 19, 2020

LFS258 [2/15]: Kubernetes Installation and Configuration

คำเตือน! บทความนี้ไม่ใช้ How To นะคร๊าบ 😘

Installation Tools

ในการเริ่มต้นทำความรู้จักกับ Kubernetes แค่อ่านอย่างเดียวคงเบื่อแย่ มันต้องมี cluster ของตัวเองซัก cluster และการที่จะได้มาซึ่ง cluster ก็มี 4 วิธีให้เลือก

  • เล่นผ่าน web: Play with Kubernetes และ Katacoda เหมาะสำหรับการ walk through เพื่อทำความรู้จักเบื้องต้น
  • ใช้ managed service ของ cloud provider ซึ่งส่วนใหญ่จะมี free tier ให้ลองใช้กัน เช่น GKE ของ Google Cloud, AKS ของ Azure, EKS ของ AWS และ น้องใหม่อย่าง ACK ของ Alibaba Cloud เป็นต้น
drawing drawing drawing drawing
GKE
AKS
EKS
ACK
  • ลงมื่อสร้างด้วยตัวเองแบบ single node cluster ซึ่งเพียงพอกับการทำความเข้าใจเบื้องต้น โดยสามรถใช้ tools เช่น minikube ซึ่งจะเป็นการ download Linux Guest ที่มี kubernetes เรียบร้อยแล้วมา run บน VirtualBox ของเครื่องเรา หรือ MicroK8s ที่มีใน Ubuntu 16.04 และ 18.04 ซึ่งเป็นของ Canonical หรือจะเป็น hyperkube ซึ่งเป็น container image ที่มี kubernetes อยู่ในนั้น
drawing drawing
Minikube
MicroK8S
  • ลงเป็น multi-node cluster ถ้าอยากทำความเข้าใจให้มากขึ้น โดย ใช้ Tools kubeadm ซึ่งเป็น community-suggested tool ในการ setup kubernetes cluster ที่ลงง่ายและไม่ยึดติดกับ platform ใดๆ, ถ้าอยากได้สำเร็จรูปเลย อาจใช้พวก automation อย่าง kubespray หรือ kops แต่ kops ต้องใช้บน AWS เท่านั้น
drawing drawing drawing
kubeadm
kubespray
kops

Installing kubectl

drawing

kubectl เป็น command ที่ใช้ในการ configure และ manage kubernetes cluster ถ้าไม่ใช้ kubectl เราก็สามารถจัดการ kubernetes cluster ของเราได้เช่นกัน โดยใช่ curl หรือเขียน client โดยใช้ Go library เช่นกัน แต่ชีวิตก็จะลำบากหน่อยๆ

การที่จะได้มาซึ่ง kubectl มี 3 ทาง

  • Install จาก respository ของ OS ที่เราใช้ เช่น ถ้าใช้ RHEL7/CentOS7 kubectl จากอยู่ใน Package kubernetes-client
  • Download pre-build release จาก Github ผมแนะนำวิธีนี้ เพราะจะได้ kubectl version ตรงกับ kubenetes cluster ของเราและไม่ต้อง compile เองให้ยุ่งยาก
  • Download source code จาก Github มา compile เอง ใช้วิธีนี้เฉพาะตอนที่อยากลอง หรือ pre-build release ไม่ support OS ที่เราใช้เท่านั้น แต่โดยปกติถ้า OS ไหนลง Kubernetes ได้ ก็ใช้ pre-build release ได้แน่นอน

command kubectl จะอ่าน configure จาก ~/.kube/config เพื่อ connect ไปยัง cluster ของเรา ใน file นี้จะประกอบด้วย

  • clusters: เป็นรายละเอียดของ cluster เช่น ชื่อ cluster, credential ของ cluster และ url ของ kube-apiserver (endpoint)
  • users: เป็น username และ credential ของ user นั้นๆ
  • contexts: เป็นชื่อ context, ชื่อ cluster และ username ที่ใช้ในการ connect ไปยัง cluster นั้นๆ

เราสามารถ switch context เพื่อเปลี่ยน user ที่ Login เข้าไปใน cluster หรือ เปลี่ยน cluster ที่ ได้โดยใช้ kubectl config use-context <context_name>

Reference: The Kubectl Book


Using Minikube

drawing

การ install Minikube นั้นง่ายมาก แค่ไป load pre-build binary จาก GitHub มา แล้ว run ได้เลย แต่ต้องแน่ใจก่อนว่า เครื่องเรา install hypervisor KVM หรือ VirtualBox ไว้แล้ว

สามารถอ่านวิธีการ setup ได้จาก Doc ของ Kubernetes ได้เลย

ทำเสร็จแล้วก็ลองทำ lab ของ Kubernetes ได้เลย

โดยใน VM ที่ Minikube run ขึ้นมา ภายใยจะเป็นการ run binary ชื่อ localkube ซึ่งจะไป run components ของ kubernetes ทั้งหมดขึ้นมาให้เราใช้งาน และ Container runtime ที่ Minikube ทำให้เราคือ Docker


Installing with kubeadm

drawing

เรามาสร้าง cluster จริงๆ กันบ้าง kubeadm เป็น tool ที่ตรงไปตรงมาที่สุดในการ setup multi-node kubernetes cluster โดย เริ่มมีมาตั้งแต่ kubernetes v1.4.0 และเปลี่ยนสถานะจาก beta เป็น statble ใน kubernetes v1.15.0 พร้อมทั้งเพิ่ม function HA เข้าไปด้วย

สามารถดูวิธีการ install kubeadm ได้จาก

จากนั้นลอง setup cluster แบบ single control plane (ไม่มี HA) ได้จาก

และลองของใหม่ แบบที่มี HA ได้จาก

ในการ join cluster ของ kubeadm นั้นต้องใช้ token ที่ hash ด้วย SHA256 เป็นอย่างต่ำ โดยข้อมูลนี้จะได้มาหลังจากที่เรา run kubeadm init ที่ master node สำเร็จ

Step ในการ setup cluster คร่าวจะเป็นแบบนี้

  • kueadm init ที่ master node
  • create cluster network เช่น kubectl create -f https://git.io/weave-kube
  • kubeadm join --token <token> https://<MasterIP>:<Port> ที่ worker nodes

เมื่อทุกอย่างเรียกร้อยอย่าลืม copy config ของ kubectl ทาไว้ที่ home ของ user ที่จะใช้งาน kubectl

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

จากนั้น Logout และ login ก็จะใช้ kubectl เพื่อ interact กับ cluster ได้แล้ว


Installing a Pod Network

ก่อนที่จะ initial cluster ต้องเลือก network ให้ได้เสียก่อนว่าจะใช้อะไร เพราะต้องวางแผน IP ไว้ให้ดี อย่าให้มี IP ซ้ำ โดย network ที่นิยมๆ กันมีดังต่อไปนี้

drawing drawing drawing drawing drawing
Calico
Flannel
Kube-router
Romana
Weave Net
  • Calico: เป็น flat layer 3 network ที่สื่อสารกันโดยไม่มี IP encapsulation ใช้ได้ทั้ง Kubernetes, Openshift, Docker, Mesos และ Openstack เป็น network model ที่ง่ายและยืดหยุ่น สามารถ scale ในระบบใหญ่ๆ ได้ดี ทำ policy ได้ และ สามาถใช้ option Canal เพื่อ integrate กับ Flannel ได้
  • Flannel: เป็น Layer 3 IPv4 network ที่เชื่อต่อระหว่าง nodes ใน cluster ได้รับการพัฒนาโดย CoreOS สามารถใช้ backend mechanism ได้หลายแบบเช่น VXLAN เป็นต้น มี flanneld เป็น host agent
  • Kube-router: claim ว่าเป็น "single binary do it all" ยังอยู่ใน alpha stage และมีแผนว่าจะมี distributed load balancer, firewall และ router ทำมาเพื่อ kubernetes โดยเฉพาะ
  • Romana: เป็นอีก project ที่เน้น automation ของ network และ security สามาถใช้กับ cluster ใหญ่ๆ ได้ IPAM-Aware Topology และ integrate กับ kops ได้
  • Weave Net: เป็น add-on ที่ได้มาตรฐาน CNI

Container Network Interface (CNI) เป็น project ของ CNCF ที่จะทำให้ network ใน ของ container เป็นมาตรฐาน ไม่ผูกติดกับ vendor ใด vendor หนึ่ง และกำลังได้รับความนิยมเป็นอย่างมาก


More Installation Tools

Kubernetes ก็เหมือน application ทั่วไปที่เราลงใน server ดังนั้น เราสามารถใช้ configuration management system เช่น Chef, Puppet, Ansible หรือ Terraform ในการลงแบบอัตโนมัติได้ โดย Tools ที่เราสามารถใช้ได้มีดังนี้

  • kubespray: ตอนี้เข้ามาเป็น incubator project ของ CNCF แล้ว เป็น Ansible playbook ที่สามารถ setup kubernetes ได้หลากหลาย OS หลากหลาย network providers ชื่อเดิม kargo
  • kops: ทำให้การ setup kubernetes cluster บน AWS เป็นเรื่องไม่ยาก ตอนนี้กำลังทำให้ใช้ได้บน GKE, VMware และ Openstack แต่ยังเป็น beta version อยู่
  • kube-aws: เป็น Tool ที่ใช้ feature Cloud Formation ของ AWS ในการ setup cluster
  • kubicon: ทำให้ kubeadm set up cluster ได้ง่ายขึ้น เค้า claim ว่าไม่มี dependency เกี่ยวกับ DNS, run ได้หลาย OS, สามารถ snapshot cluster แล้ว ย้ายไปที่อื่นได้

ถ้าอยากเข้าใจการ setup Kubernetes แบบลึกซึ้ง... ในทำตาม "Kelsey Hightower walkthrough: kubernetes the hard way" ลึกซึ้งจริงๆ นะ ผมลองมาแล้ว


Installation Considerations

ก่อนอื่นควรลอง install แบบ single node ด้วย Minikube ก่อน จากนั้นค่อยลองทำ Multi Node Cluster โดยก่อนการ set up cluster ให้ตอนคำถามเหล่านี้ก่อน

Type Question
Provider จะลงใน platform ไหน public หรือ private cloud ลงบน Physical หรือ VM
OS จะใช้ OS อะไร ?
Network จะใช้ network provider ไหน ? เป็น overlay ไหม ?
ETCD จะ install etcd แบบ standalone หรือ cluster จะไว้ใน kubenetes หรือ ข้างนอก
HA จะทำ HA ให้กับ Master ไหม ?

Main Deployment Configuration

รูปแบบในการ set up kubernetes cluster มี 4 แบบให้เลือกดังนี้

  • Single-Node: สำหรับการทดสอบ เรียนรู้ หรือ พัฒนา application เบื้องต้น
  • Single Master, Multiple Workers: สำหรับการทดสอบ เรียนรู้ หรือ พัฒนา application ที่ต้องอาศัย feature clustering
  • Multiple Masters with HA, Multiple Workers: เพื่อความน่าเชื่อถือของระบบ สามารถใช้ใน production ได้ แต่ต้องมี load balancer วางไว้หน้า cluster เพื่อ share traffic มายัง worker nodes และ จาก worker node ไปยัง Master Node ที่เป็น leader
  • HA etcd, HA Masters, Multiple Workers: น่าเชื่อถือสุดๆ เพราะ HA ทุก component อาจเอา etcd ไปไว้นอก cluster เพื่อเพิ่ม reliability

เราสามารถทำ Federation เพื่อเพิ่ม HA ระหว่าง cluster โดย join หลายๆ clusters เข้าด้วยกัน เพื่อให้ใช้ control plane เดียวกัน ทำให้สามารถ move resource ข้าม cluster เพื่อ cluster ใด cluster หนึ่ง fail แต่ ใน version นี้ยังมีปัญหาเยอะ รอดูว่า v2 ถ้าดีขึ้นจะเป็นประโยชน์มาก


Systemd Unit Files for Kubernetes

ในการ setup kubernetes cluster ด้วย kubeadm จะมีแค่ kubelet เท่านั้นที่ run เป็น standard system daemon (systemd) แต่เราสามารถนำ component อื่นๆ ของ kubernetes ออกมา run เป็น standard system daemon ได้เช่นกัน


Using Hyperkube

Hyperkube เป็น image ใน Repository ของ Google (gcr)

ในการใช้งาน hyperkube ต้องลง kubelet เป็น system daemon และ configure มันให้อ่าน manifest files ที่จะระบุวิธีการ run แต่ละ component โดยแต่ละ component คือ hyperkube


Compiling from Source

list ของ binary release สามารถดูได้ใน GitHub แต่ถ้าจะ compile เองมี 2 ทางให้เลือก

$ mkdir -p $GOPATH/src/k8s.io
$ cd $GOPATH/src/k8s.io
$ git clone https://github.com/kubernetes/kubernetes
$ cd kubernetes
$ make
Enter fullscreen mode Exit fullscreen mode
$ git clone https://github.com/kubernetes/kubernetes
$ cd kubernetes
$ make quick-release
Enter fullscreen mode Exit fullscreen mode

binary จะอยู่ที่ _output/bin


💖 💪 🙅 🚩
peepeepopapapeepeepo
Sawit M.

Posted on January 19, 2020

Join Our Newsletter. No Spam, Only the good stuff.

Sign up to receive the latest update from our blog.

Related