ค้นหาเว็บไซต์

ติดตั้ง Kubernetes Cluster บน Ubuntu โดยใช้ kubeadm


ในคู่มือนี้ ผมจะพาคุณผ่านขั้นตอนการติดตั้งและตั้งค่า Kubernetes Cluster ที่ทำงานได้บน Ubuntu Linux จำนวน 3 โหนด Kubernetes เป็นระบบจัดการคอนเทนเนอร์แบบโอเพ่นซอร์สที่ใช้สำหรับการปรับใช้ การจัดการ และการปรับขนาดแอปพลิเคชันที่อยู่ในคอนเทนเนอร์โดยอัตโนมัติ

ในบทความนี้เราจะแบ่งปันรายละเอียดเกี่ยวกับกระบวนการของ:

  • การเตรียมโหนด Kubernetes
  • การตั้งค่าที่เก็บ
  • การติดตั้งเครื่องรันไทม์คอนเทนเนอร์
  • การติดตั้งส่วนประกอบของ Kubernetes
  • การบูตสแตรปคลัสเตอร์ของคุณ
  • ติดตั้งปลั๊กอินเครือข่ายสำหรับ Kubernetes
  • การเข้าร่วมหัวข้อผู้ทำงานใหม่เข้ากับคลัสเตอร์

มาเริ่มกันเถอะ!

คู่มือเดสก์ท็อปอูบุนตูฉบับสมบูรณ์

เรียนรู้ Ubuntu อย่างมืออาชีพ - ตั้งแต่การปรับแต่งเดสก์ท็อปให้สวยงามไปจนถึงการทำงานอัตโนมัติด้วยเทอร์มินัลที่ทรงพลัง เหมาะสำหรับนักพัฒนา ผู้ดูแลระบบ และผู้ใช้ขั้นสูงที่ต้องการควบคุมพื้นที่ทำงานของตนอย่างเต็มที่

ขั้นตอนที่ 1: แผนภาพระบบ

การตั้งค่านี้อิงจากแผนภาพดังต่อไปนี้:

ให้เรากำหนดชื่อโฮสต์ของระบบก่อนที่เราจะดำเนินการไปยังขั้นตอนถัดไป:

บนโหนดหลัก:

ตั้งชื่อโฮสต์ดังนี้:

sudo hostnamectl set-hostname k8s-master.example.com

บน Worker Node 01:

ตั้งค่าโฮสต์เนมโดยใช้เครื่องมือบรรทัดคำสั่ง hostnamectl

sudo hostnamectl set-hostname k8s-node-01.example.com

บน Worker Node 02:

ตั้งค่า hostname สำหรับโหนดงาน Kubernetes 02 ด้วย

sudo hostnamectl set-hostname k8s-node-02.example.com

เมื่อได้กำหนดชื่อโฮสต์ที่ถูกต้องบนแต่ละโฮสต์แล้ว ให้กรอกค่าที่กำหนดลงบนแต่ละโหนด

$ sudo vim /etc/hosts
192.168.2.2 k8s-master.example.com    k8s-master
192.168.2.3 k8s-node-01.example.com  k8s-node-01
192.168.2.4 k8s-node-02.example.com  k8s-node-02

ออกจากระบบแล้วเข้าสู่ระบบอีกครั้งเพื่อใช้ชื่อโฮสต์ใหม่ที่กำหนด

exit||logout

ขั้นตอนที่ 2: สร้างผู้ใช้งานแอดมิน

ก่อนทำการกำหนดค่าที่เฉพาะเจาะจงของ Kubernetes ให้แน่ใจว่าทุกส่วนของการพึ่งพาถูกติดตั้งเรียบร้อยแล้ว ที่นี่เราจะทำการอัปเดตระบบและสร้างผู้ใช้ Kubernetes

อัปเดตแพ็กเกจระบบเป็นเวอร์ชันล่าสุดบนทุกโหนด:

sudo apt update && sudo apt upgrade -y
[ -e /var/run/reboot-required ] && sudo reboot

เพิ่มผู้ใช้เพื่อจัดการคลัสเตอร์ Kubernetes:

sudo useradd -s /bin/bash -m k8s-admin
sudo passwd k8s-admin
sudo usermod -aG sudo k8s-admin
echo "k8s-admin ALL=(ALL) NOPASSWD:ALL" | sudo tee /etc/sudoers.d/k8s-admin

หากคุณต้องการกรอกรหัสผ่าน sudo เมื่อรันคำสั่ง sudo ในฐานะผู้ใช้ k8s-admin คุณสามารถละเว้นบรรทัดสุดท้ายได้ คุณสามารถทดสอบว่ามีการถามรหัสผ่าน sudo หรือไม่:

$ su - k8s-admin
k8s-admin@k8s-master:~$ sudo su -
root@k8s-master:~# exit

ทุกอย่างดูเรียบร้อย เรามาติดตั้ง Docker engine กันเถอะ

ขั้นตอนที่ 3: ติดตั้ง Containerd

Kubernetes ต้องการเครื่องรันไทม์คอนเทนเนอร์เพื่อรันคอนเทนเนอร์ ในบทความนี้เราจะใช้ Containerd เป็นเครื่องรันคอนเทนเนอร์

ตรวจสอบให้แน่ใจว่าไม่ได้ติดตั้ง Docker ถ้าติดตั้งไว้ให้ถอนการติดตั้ง

sudo apt remove docker docker-engine docker.io

ติดตั้ง dependencies:

sudo apt update
sudo apt install apt-transport-https ca-certificates curl software-properties-common

นำเข้ากุญแจ GPG ของที่เก็บ Docker:

curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/trusted.gpg.d/docker-archive-keyring.gpg
sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"

ติดตั้ง Docker Engine

sudo apt update && sudo apt install containerd.io

บริการเริ่มทำงานโดยอัตโนมัติ

$ systemctl status containerd.service
● containerd.service - containerd container runtime
   Loaded: loaded (/lib/systemd/system/containerd.service; enabled; vendor preset: enabled)
   Active: active (running) since  Sun 2024-07-14 21:22:30 UTC; 34min ago
     Docs: https://containerd.io
  Process: 4265 ExecStartPre=/sbin/modprobe overlay (code=exited, status=0/SUCCESS)
 Main PID: 4270 (containerd)
    Tasks: 8
   CGroup: /system.slice/containerd.service
           └─4270 /usr/bin/containerd

คุณสามารถตรวจสอบเวอร์ชันที่ติดตั้งได้เช่นกัน:

containerd --version

ขั้นตอนที่ 4: ติดตั้งส่วนประกอบของ Kubernetes

ติดตั้งเครื่องมือที่ต้องพึ่งพา

sudo apt install apt-transport-https ca-certificates curl gpg -y

ตั้งค่ารุ่นของ Kubernetes ที่คุณต้องการติดตั้ง

k8s_ver=1.30

ดาวน์โหลดกุญแจสาธารณะสำหรับเก็บข้อมูลแพ็กเกจ Kubernetes

curl -fsSL https://pkgs.k8s.io/core:/stable:/v${k8s_ver}/deb/Release.key | \
 sudo gpg --dearmor -o /etc/apt/trusted.gpg.d/k8s.gpg

เพิ่มที่เก็บ APT ของ Kubernetes อย่างเป็นทางการ

echo "deb https://pkgs.k8s.io/core:/stable:/v${k8s_ver}/deb/ /" | sudo tee /etc/apt/sources.list.d/kubernetes.list

อัปเดตดัชนีแพ็กเกจ apt:

sudo apt update

ติดตั้งส่วนประกอบของ Kubernetes

ติดตั้ง kubectl, kubelet, kubernetes-cni และ kubeadm ส่วนประกอบมาสเตอร์ของ Kubernetes:

sudo apt install kubectl kubelet kubeadm kubernetes-cni

ยืนยันว่ามีไฟล์ไบนารีของแพ็กเกจทั้งหมดอยู่ในระบบไฟล์

$ which kubelet
/usr/bin/kubelet

$ which kubeadm
/usr/bin/kubeadm

ถ้าเปิดสวิตช์สลับอยู่ ให้ปิดมัน

sudo swapoff -a
sudo sed -i.bak -r 's/(.+ swap .+)/#\1/' /etc/fstab

โหลดโมดูลที่จำเป็น

sudo tee /etc/modules-load.d/containerd.conf <<EOF
overlay
br_netfilter
EOF

ในการโหลดขณะรัน ให้รัน:

sudo modprobe overlay
sudo modprobe br_netfilter

ตั้งค่าการกำหนดค่า sysctl ด้วยเช่นกัน

sudo tee /etc/sysctl.d/kubernetes.conf<<EOF
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_forward = 1
EOF

โหลดการตั้งค่า

sudo sysctl --system

กำหนดค่า containerd และรีสตาร์ทบริการ

sudo mkdir -p /etc/containerd
sudo containerd config default|sudo tee /etc/containerd/config.toml
sudo systemctl restart containerd

เปิดใช้งานบริการ kubelet

sudo systemctl enable kubelet

ขั้นตอนที่ 5: บูตสแตรปคอนโทรลเพลนของ k8s

คำสั่งทั้งหมดที่รันในส่วนนี้มีวัตถุประสงค์เพื่อรันบนโหนดมาสเตอร์ อย่ารันคำสั่งใดๆ บนโหนดเวิร์กเกอร์ของ Kubernetes ส่วนประกอบของ Kubernetes Master จะให้ส่วนควบคุมของคลัสเตอร์ – API Server, Scheduler, Controller Manager พวกมันตัดสินใจเชิงกลยุทธ์เกี่ยวกับคลัสเตอร์ เช่น การจัดกำหนดการ การตรวจจับ และการตอบสนองต่อเหตุการณ์ของคลัสเตอร์

ยืนยันว่า containerd ทำงานโดยการดึงอิมเมจพื้นฐานของ Kubernetes

$ sudo kubeadm config images pull
[config/images] Pulled registry.k8s.io/kube-apiserver:v1.30.2
[config/images] Pulled registry.k8s.io/kube-controller-manager:v1.30.2
[config/images] Pulled registry.k8s.io/kube-scheduler:v1.30.2
[config/images] Pulled registry.k8s.io/kube-proxy:v1.30.2
[config/images] Pulled registry.k8s.io/coredns/coredns:v1.11.1
[config/images] Pulled registry.k8s.io/pause:3.9
[config/images] Pulled registry.k8s.io/etcd:3.5.12-0

หากคุณมีซ็อกเก็ต CRI หลายอัน โปรดใช้ --cri-socket เพื่อเลือกหนึ่งอัน:

# Containerd
sudo kubeadm config images pull --cri-socket unix:///run/containerd/containerd.sock

# For CRI-O
sudo kubeadm config images pull --cri-socket unix:///var/run/crio/crio.sock

บูตสแตรป (โหนดแผงควบคุมเดียว) – ไม่มีจุดเชื่อมต่อที่ใช้ร่วมกัน

ในการเริ่มต้นคลัสเตอร์โดยไม่ใช้ปลายทาง DNS ให้รัน:

sudo sysctl -p
sudo kubeadm init \
  --pod-network-cidr=172.24.0.0/16 \
  --cri-socket unix:///run/containerd/containerd.sock

เริ่มต้นด้วยจุดเชื่อมต่อที่ใช้ร่วมกัน (ชื่อ DNS สำหรับ API ของ control plane)

นี่เหมาะสำหรับโหนดหลายตัวของแผงควบคุม

ตั้งชื่อ DNS ของจุดปลายคลัสเตอร์ หรือเพิ่มระเบียนในไฟล์ /etc/hosts

$ sudo vim /etc/hosts
172.29.20.5 k8s-cluster.computingforgeeks.com

สร้างคลัสเตอร์:

sudo sysctl -p
sudo kubeadm init \
  --pod-network-cidr=172.24.0.0/16 \
  --upload-certs \
  --control-plane-endpoint=k8s-cluster.computingforgeeks.com

สถานที่ :

  • k8s-cluster.computingforgeeks.com ชี้ไปยัง IP ของ LB สำหรับโหนดคอนโทรลเพลนของ k8s ของคุณ

ถ้าทุกอย่างเป็นไปด้วยดี คุณควรจะได้รับข้อความยืนยันความสำเร็จพร้อมคำแนะนำว่าควรทำอะไรต่อไป:

---
Your Kubernetes master has initialized successfully!

To start using your cluster, you need to run the following as a regular user:

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

You should now deploy a pod network to the cluster.
Run "kubectl apply -f [podnetwork].yaml" with one of the options listed at:
  https://kubernetes.io/docs/concepts/cluster-administration/addons/

You can now join any number of machines by running the following on each node
as root:

  kubeadm join 192.168.2.2:6443 --token 9y4vc8.h7jdjle1xdovrd0z --discovery-token-ca-cert-hash sha256:cff9d1444a56b24b4a8839ff3330ab7177065c90753ef3e4e614566695db273c

กำหนดค่าการเข้าถึงสำหรับผู้ใช้ k8s-admin บนเซิร์ฟเวอร์ Master

สลับไปที่ k8s-admin แล้วคัดลอกไฟล์การตั้งค่า Kubernetes ที่มีข้อมูลคลัสเตอร์

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

ตรวจสอบการใช้งานโดยตรวจสอบข้อมูลคลัสเตอร์

$ kubectl cluster-info
Kubernetes control plane is running at https://192.168.2.2:6443
CoreDNS is running at https://192.168.2.2:6443/api/v1/namespaces/kube-system/services/kube-dns:dns/proxy

To further debug and diagnose cluster problems, use 'kubectl cluster-info dump'.

ขั้นตอนที่ 6: ติดตั้งปลั๊กอิน CNI

ในคู่มือนี้เราจะใช้ Calico คุณสามารถเลือกใช้ปลั๊กอินเครือข่ายที่รองรับอื่น ๆ ได้เช่นกัน

ดาวน์โหลดไฟล์ตัวดำเนินการและทรัพยากรที่กำหนดเอง ดูหน้าปล่อยมาตราสำหรับเวอร์ชันล่าสุด

รับเวอร์ชันล่าสุด:

VERSION=$(curl --silent "https://api.github.com/repos/projectcalico/calico/releases/latest" | grep '"tag_name"' | sed -E 's/.*"([^"]+)".*/\1/')

ดาวน์โหลดทรัพยากรสำหรับการติดตั้ง

curl -O https://raw.githubusercontent.com/projectcalico/calico/${VERSION}/manifests/tigera-operator.yaml
curl -O https://raw.githubusercontent.com/projectcalico/calico/${VERSION}/manifests/custom-resources.yaml 

ก่อนอื่น ติดตั้งตัวควบคุมบนคลัสเตอร์ของคุณ

k8s-admin@k8s-master:~$ kubectl create -f tigera-operator.yaml
namespace/tigera-operator created
customresourcedefinition.apiextensions.k8s.io/bgpconfigurations.crd.projectcalico.org created
customresourcedefinition.apiextensions.k8s.io/bgpfilters.crd.projectcalico.org created
customresourcedefinition.apiextensions.k8s.io/bgppeers.crd.projectcalico.org created
customresourcedefinition.apiextensions.k8s.io/blockaffinities.crd.projectcalico.org created
customresourcedefinition.apiextensions.k8s.io/caliconodestatuses.crd.projectcalico.org created
customresourcedefinition.apiextensions.k8s.io/clusterinformations.crd.projectcalico.org created
customresourcedefinition.apiextensions.k8s.io/felixconfigurations.crd.projectcalico.org created
customresourcedefinition.apiextensions.k8s.io/globalnetworkpolicies.crd.projectcalico.org created
customresourcedefinition.apiextensions.k8s.io/globalnetworksets.crd.projectcalico.org created
customresourcedefinition.apiextensions.k8s.io/hostendpoints.crd.projectcalico.org created
customresourcedefinition.apiextensions.k8s.io/ipamblocks.crd.projectcalico.org created
customresourcedefinition.apiextensions.k8s.io/ipamconfigs.crd.projectcalico.org created
customresourcedefinition.apiextensions.k8s.io/ipamhandles.crd.projectcalico.org created
customresourcedefinition.apiextensions.k8s.io/ippools.crd.projectcalico.org created
customresourcedefinition.apiextensions.k8s.io/ipreservations.crd.projectcalico.org created
customresourcedefinition.apiextensions.k8s.io/kubecontrollersconfigurations.crd.projectcalico.org created
customresourcedefinition.apiextensions.k8s.io/networkpolicies.crd.projectcalico.org created
customresourcedefinition.apiextensions.k8s.io/networksets.crd.projectcalico.org created
customresourcedefinition.apiextensions.k8s.io/apiservers.operator.tigera.io created
customresourcedefinition.apiextensions.k8s.io/imagesets.operator.tigera.io created
customresourcedefinition.apiextensions.k8s.io/installations.operator.tigera.io created
customresourcedefinition.apiextensions.k8s.io/tigerastatuses.operator.tigera.io created
serviceaccount/tigera-operator created
clusterrole.rbac.authorization.k8s.io/tigera-operator created
clusterrolebinding.rbac.authorization.k8s.io/tigera-operator created
deployment.apps/tigera-operator created

เรามาอัปเดต Calico IP Pool ด้วยกันเถอะ

sed -ie 's/192.168.0.0/172.24.0.0/g' custom-resources.yaml

จากนั้นให้ใช้การกำหนดค่าของ manifest

k8s-admin@k8s-master:~$  kubectl create -f custom-resources.yaml
installation.operator.tigera.io/default created
apiserver.operator.tigera.io/default created

รอให้ Calico Pod อยู่ในสถานะกำลังทำงาน

k8s-admin@k8s-master:~$ kubectl get pods --all-namespaces
NAMESPACE          NAME                                             READY   STATUS    RESTARTS   AGE
calico-apiserver   calico-apiserver-5476c484c4-rmmts                1/1     Running   0          37s
calico-apiserver   calico-apiserver-5476c484c4-z9phf                1/1     Running   0          37s
calico-system      calico-kube-controllers-6945f87bd4-2xwx4         1/1     Running   0          80s
calico-system      calico-node-tkwtv                                1/1     Running   0          80s
calico-system      calico-typha-65f575c9fc-xx8m8                    1/1     Running   0          81s
calico-system      csi-node-driver-kngdn                            2/2     Running   0          80s
kube-system        coredns-5dd5756b68-77x77                         1/1     Running   0          11m
kube-system        coredns-5dd5756b68-plpd6                         1/1     Running   0          11m
kube-system        etcd-k8s-master.example.com                      1/1     Running   0          11m
kube-system        kube-apiserver-k8s-master.example.com            1/1     Running   0          11m
kube-system        kube-controller-manager-k8s-master.example.com   1/1     Running   0          11m
kube-system        kube-proxy-bxq4x                                 1/1     Running   0          11m
kube-system        kube-scheduler-k8s-master.example.com            1/1     Running   0          11m
tigera-operator    tigera-operator-94d7f7696-xls25                  1/1     Running   0          3m20s

โหนดควรพร้อมใช้งานแล้วตอนนี้

k8s-admin@k8s-master:~$ kubectl get nodes
NAME                     STATUS   ROLES           AGE   VERSION
k8s-master.example.com   Ready    control-plane   20m   v1.30.2

ขั้นตอนที่ 7: ตั้งค่าโหนดผู้ปฏิบัติงาน

เมื่อคลัสเตอร์ Kubernetes ได้รับการเริ่มต้นและโหนดมาสเตอร์ออนไลน์แล้ว ให้เริ่มการกำหนดค่าโหนดเวิร์กเกอร์ โหนดคือเครื่องเวิร์กใน Kubernetes ซึ่งอาจเป็น VM หรือเครื่องจริง แต่ละโหนดจะถูกจัดการโดยมาสเตอร์และมีบริการที่จำเป็นในการรันพ็อด เช่น Docker, kubelet, kube-proxy

1) ตรวจสอบให้แน่ใจว่าได้ติดตั้ง Containerd runtime แล้ว (ครอบคลุม)

ใช้ขั้นตอนที่ให้มาในบทความนี้เกี่ยวกับการติดตั้ง containerd

2) เพิ่มรีโพซิทอรีของ Kubernetes (ครอบคลุม)

ตรวจสอบให้แน่ใจว่ามีการเพิ่มที่เก็บสำหรับแพ็กเกจ Kubernetes ลงในระบบแล้ว

3) ติดตั้งส่วนประกอบของ Kubernetes (ขั้นตอนที่ 4)

เมื่อคุณได้เพิ่มที่เก็บ Kubernetes แล้ว ให้ติดตั้งส่วนประกอบโดยใช้:

sudo apt install kubelet kubeadm kubectl kubernetes-cni

4) เข้าร่วมโหนดเข้ากับคลัสเตอร์:

ใช้คำสั่ง join หลังจากที่ทำการเริ่มต้นคลัสเตอร์ Kubernetes แล้ว คุณสามารถพิมพ์คำสั่งเหล่านี้ได้โดยใช้:

kubeadm token create --print-join-command

เมื่อเสร็จแล้ว ตรวจสอบสถานะของโนดบนมาสเตอร์:

k8s-admin@k8s-master:~$ kubectl get nodes
NAME          STATUS    ROLES     AGE       VERSION
k8s-master    Ready     master    35m       v1.30.2
k8s-node-01   Ready     <none>    2m        v1.30.2
k8s-node-02   Ready     <none>    1m        v1.30.2

ขั้นตอนที่ 8: ยืนยันการตั้งค่า Kubernetes

สร้างเนมสเปซทดสอบ:

$ kubectl create namespace test
namespace/test created

ปรับใช้แอปพลิเคชันทดสอบ

kubectl create deployment hello-node --image=registry.k8s.io/e2e-test-images/agnhost:2.39 -- /agnhost netexec --http-port=8080

ดูการปรับใช้งานที่มีอยู่:

$ kubectl get deployments
NAME         READY   UP-TO-DATE   AVAILABLE   AGE
hello-node   1/1     1            1           1m

ดูพ็อดที่กำลังทำงาน

$ kubectl get pods
NAME                          READY     STATUS    RESTARTS   AGE
hello-node-5f76cf6ccf-br9b5   1/1       Running   0          1m

ในการล้างทรัพยากรให้รัน:

kubectl delete deployment hello-node

ขั้นตอนที่ 9: กำหนดค่า kubectl completion

เปิดใช้งานการเติมคำอัตโนมัติสำหรับคำสั่ง kubectl kubectl มีการรองรับการเติมคำอัตโนมัติ ซึ่งสามารถช่วยประหยัดการพิมพ์ได้มาก! ในการเปิดใช้งานการเติมคำในเซสชันปัจจุบัน ให้รัน:

source <(kubectl completion bash)

ในการเพิ่มการเติมคำอัตโนมัติของ kubectl ไปยังโปรไฟล์ของคุณ เพื่อให้โหลดโดยอัตโนมัติในเชลล์ในอนาคต ให้รัน:

echo "source <(kubectl completion bash)" >> ~/.bashrc

หากคุณกำลังใช้ zsh ให้แก้ไขไฟล์ ~/.zshrc และเพิ่มโค้ดต่อไปนี้เพื่อเปิดใช้งานการเติมคำอัตโนมัติของ kubectl:

if [ $commands[kubectl] ]; then
source <(kubectl completion zsh)
fi

หรือเมื่อใช้ Oh-My-Zsh ให้แก้ไขไฟล์ ~/.zshrc และอัปเดตบรรทัด plugins= ให้รวมปลั๊กอิน kubectl ด้วย

source <(kubectl completion zsh)

นอกจากนี้ คำสั่ง Top ยังเกี่ยวข้องกับเมตริกของคอนเทนเนอร์ด้วย

วัสดุการฝึกอบรมความเชี่ยวชาญ Kubernetes:

  • หนังสือเรียน Kubernetes ที่ดีที่สุด

บทสรุป

เราประสบความสำเร็จในการติดตั้งคลัสเตอร์ Kubernetes จำนวน 3 โหนดบนเซิร์ฟเวอร์ Ubuntu LTS คู่มือต่อไปของเราจะครอบคลุมเรื่อง Kubernetes HA, การตรวจสอบ Kubernetes, วิธีการกำหนดค่าที่จัดเก็บข้อมูลภายนอก และเรื่องเจ๋งๆ อื่นๆ รอติดตามนะ!