All Articles

DevOps - Triển khai Kubernetes cluster trong một nốt nhạc

Kubernetes

Trong những năm gần đây, nhiều ứng dụng đã được container hóa (containerized) bằng cách sử dụng docker. Việc đó đã giúp tốc độ phát triển ứng dụng nhanh chưa từng thấy, phải nói “người người dùng docker, nhà nhà dùng docker”. Với việc triển khai hệ thống chỉ sử dụng docker, khiến việc quản lý các containers là vô cùng khó khăn. Vì thế, ông anh to lớn Google đã cho ra đời Kubernetes để giải quyết vấn đề trên và trên hết là free.

Nhưng để tiếp cận nó thì không hẳn là free. Để xây dựng một k8s cluster, thì bạn phải có ít nhất là 3 VPS, hoặc sử dụng các dịch vụ cloud như Google Kubernetes Engine (GKE), Elastic Container Service for Kubernetes(EKS),.. và tất nhiên là tốn phí. Để có thể setup nhanh 1 k8s cluster ở local bạn có thể sử dụng MiniKube, hoặc MicroK8s,.. Tuy nhiên các giải pháp trên có một vài nhược điểm như khó custom, không phải là k8s chính chủ,..

TL;DR Trong bài viết này, mình sẽ hướng dẫn setup nhanh một k8s cluster trong vài giây mà không cần phải setup lằng nhằng bằng cách sử dụng Vagrant. Mình sẽ dành 1 bài để viết về thằng Vagrant sau.

>>> Kubernetes có một người anh em cùng cha khác ông nội là Docker Swarm

1. Chuẩn bị

  • Một PC có ít nhất 8GB ram với Virtual box được cài sẵn
  • Cài đặt Vagrant

2. Triển khai

2.1 Hạ tầng cluster

Như đã nói, chúng ta sẽ dùng Vagrant để xây dựng cluster bao gồm 1 master và 2 worker như sau:

node hostname cpus memory IP OS username/password
master master.dora 2 2GB 172.16.10.100 Centos7 root/11231123
worker1 worker1.dora 1 1GB 172.16.10.101 Centos7 root/11231123
worker2 worker2.dora 1 1GB 172.16.10.102 Centos7 root/11231123

>>> IP các node có thể setup tùy ý, tuy nhiên theo kinh nghiệm của mình thì nên khác với CIDR của một số addons mạng như Calico, Flannel,… để tránh xung đột Xem thêm

2.2 Vagrant boxes structure

Chúng ta sẽ có cấu trúc thư mục và nội dung từng file như sau

. ├── master │   └── Vagrantfile ├── woker1 │   └── Vagrantfile └── worker2 └── Vagrantfile # Nội dung ./master/Vagrantfile # -*- mode: ruby -*- # vi: set ft=ruby : Vagrant.configure("2") do |config| # Vagrant box: https://app.vagrantup.com/tranphuquy19/boxes/centos7-k8s config.vm.box = "tranphuquy19/centos7-k8s" config.vm.box_version = "1.0.0" config.vm.network "private_network", ip: "172.16.10.100" # IP của node master config.vm.hostname = "master.dora" # Hostname config.vm.provider "virtualbox" do |vb| vb.name = "master.dora" # Tên máy ảo vb.cpus = 2 # Số lượng CPU vb.memory = "2048" # Dung lượng RAM end # Setup password và thêm hostname các nodes vào file hosts config.vm.provision "shell", inline: <<-SHELL echo "11231123" | passwd --stdin root sed -i 's/^PasswordAuthentication no/PasswordAuthentication yes/' /etc/ssh/sshd_config systemctl reload sshd cat >>/etc/hosts<<EOF 172.16.10.100 master.dora 172.16.10.101 worker1.dora 172.16.10.102 worker2.dora EOF SHELL end # Nội dung ./worker1/Vagrantfile # -*- mode: ruby -*- # vi: set ft=ruby : Vagrant.configure("2") do |config| config.vm.box = "tranphuquy19/centos7-k8s" config.vm.box_version = "1.0.0" config.vm.network "private_network", ip: "172.16.10.101" config.vm.hostname = "worker1.dora" config.vm.provider "virtualbox" do |vb| vb.name = "worker1.dora" vb.cpus = 1 vb.memory = "1024" end config.vm.provision "shell", inline: <<-SHELL echo "11231123" | passwd --stdin root sed -i 's/^PasswordAuthentication no/PasswordAuthentication yes/' /etc/ssh/sshd_config systemctl reload sshd cat >>/etc/hosts<<EOF 172.16.10.100 master.dora 172.16.10.101 worker1.dora 172.16.10.102 worker2.dora EOF SHELL end # Nội dung ./worker2/Vagrantfile # -*- mode: ruby -*- # vi: set ft=ruby : Vagrant.configure("2") do |config| config.vm.box = "tranphuquy19/centos7-k8s" config.vm.box_version = "1.0.0" config.vm.network "private_network", ip: "172.16.10.102" config.vm.hostname = "worker2.dora" config.vm.provider "virtualbox" do |vb| vb.name = "worker2.dora" vb.cpus = 1 vb.memory = "1024" end config.vm.provision "shell", inline: <<-SHELL echo "11231123" | passwd --stdin root sed -i 's/^PasswordAuthentication no/PasswordAuthentication yes/' /etc/ssh/sshd_config systemctl reload sshd cat >>/etc/hosts<<EOF 172.16.10.100 master.dora 172.16.10.101 worker1.dora 172.16.10.102 worker2.dora EOF SHELL end

Box tranphuquy19/centos7-k8s là box mình build dựa trên HĐH Centos7, kèm theo đó là Docker v1.13.1 và Kubernetes v1.20.4

cd từng thư mục và chạy vagrant up, Vagrant sẽ giúp chúng ta cấu hình mạng, cpu, dung lượng ram, cũng như hệ điều hành một cách tự động theo files chúng ta đã mô tả

vagrant up

Đến đây, vagrant đã giúp chúng ta khởi tạo một mạng với IP 172.16.10.0/24. Các nodes master, worker1, worker2 được gắn với các IP lần lượt là 172.16.10.100, 172.16.10.101, 172.16.10.102

>>> Thực hiện lệnh ping đến hostname của node khác để kiểm tra kết nối mạng giữa các node với nhau. Vd: ping worker1.dora, ping master.dora, …

Quá trình cài nhanh hoặc chậm tùy thuộc vào tốc độ mạng của bạn. Sau khi cài đặt xong chúng ta ssh đến từng node bằng lệnh ssh [email protected] với password là 11231123

vagrant up

2.3 Setup k8s cluster

Với box tranphuquy19/centos7-k8s đã được cài đặt sẵn docker và k8s. Chúng ta tiến hành Init k8s và join các node vào kube cluster mà không cần phải trải qua các bước cài đặt rườm rà. Chạy lần lượt các lệnh sau:

# Tại node master # Khởi tạo kube master, với pod-network-cidr của Calico kubeadm init --apiserver-advertise-address 172.16.10.100 --pod-network-cidr=192.168.0.0/16

Đến đây, khi chạy lệnh kubectl chúng ta sẽ gặp lỗi The connection to the server localhost:8080 was refused - did you specify the right host or port? Vì chúng ta chưa chưa cấu hình môi trường cho nó. Để fix lỗi này chúng ta chạy lệnh export KUBECONFIG=/etc/kubernetes/admin.conf - và để tránh phải run lệnh trên mỗi khi đăng nhập, chúng ta chạy lệnh sau:

echo "export KUBECONFIG=/etc/kubernetes/admin.conf" >> ~/.bashrc

Với việc thêm export KUBECONFIG=/etc/kubernetes/admin.conf vào file .bashrc nó sẽ được chạy mỗi khi ta đăng nhập vào node. Tiếp theo, ta chạy lệnh exit để đăng xuất vào đăng nhập lại với ssh đã nói ở trên

Chúng ta tiến hành cài đặt network policy provider cho k8s cluster

# Tại node master kubectl apply -f https://docs.projectcalico.org/v3.10/manifests/calico.yaml

Đến đây, việc setup trên node master cơ bản đã hoàn thiện. Chạy lệnh sau để lấy join command

# Tại node master kubeadm token create --print-join-command

Lệnh trên sẽ output ra chuỗi như sau, chúng ta copy chuỗi đó và paste vào worker1 và worker2 để join 2 node này vào cluster

kubeadm join 172.16.10.100:6443 --token jdkri5.0efclctyqi5wzbw9 --discovery-token-ca-cert-hash sha256:8ea0c3f1ade7ebb0220a86ddecf547129c74922db9c874353dee9e8348cf2eb0

join command

Chạy lệnh kubectl get nodes trên master node để kiểm tra các nodes hiện có trong cluster. Nếu như hình bên dưới là đã thành công

kubectl get nodes

Có thể mất 1-2 phút để kube tiến hành cài đặt và join node vào cluster (STATUS = Ready)

Đến đây bạn đã có 1 Kubernetes cluster để vọc vạch và tìm hiểu. Chúc các bạn thành công! 😙