Creating a cluster(K8s)
Chuẩn Bị
Kiểm tra các Ports cần thiết

Bạn có thể dùng netcat để check ports
nc 127.0.0.1 6443 -zv -w 2
Cấu hình Swap
kubelet sẽ start fail nếu swap trên node chưa được tắt, để tắt Swap tạm thời ta dùng:
sudo swrapoff -a
Để thay đổi này không đổi sau khi khởi động lại, bạn tắt swap trong các tệp cấu hình như /etc/fstab, systemd.swap.
Enable IPv4 packet forwarding
Mặc đinh, Linux kernel không cho phép IPc4 packets được định tuyến(chuyển tiếp theo đường đi mạng) giữa các giao diện mạng.
# sysctl params required by setup, params persist across reboots
cat <<EOF | sudo tee /etc/sysctl.d/k8s.conf
net.ipv4.ip_forward = 1
EOF
# Apply sysctl params without reboot
sudo sysctl --system
#
Setup K8s
Installing a container runtime
Để chạy 1 Pops trong container, kubernetes dùng container runtime. Mặc định Kubernetes sử dụng Container Runtime Interface(CRI) để giao tiếp với container runtime
sudo apt-get update
sudo apt-get install -y containerd
# Create default config
sudo mkdir -p /etc/containerd
containerd config default | sudo tee /etc/containerd/config.toml
# Edit:
# SystemdCgroup = true
sudo systemctl restart containerd
sudo systemctl enable containerd
SystemdCgroup = true nó là cấu hình trong container runtime để quyết định ai quảng lý resource(CPU, RAM) của container: systemd hay cgroupfs
Trong đó cgroupfs quản lý tài nguyên là container runtime(kiểu cũ), còn systemd quản lý tài nguyên là systemd(chuẩn mới)
Đối với linux, nó quản lý resource bằng cgroups.
Installing kubeadm, kubelet and kubectl
- kubeadm: công cụ (command) dùng để bootstrap cluster Kubernetes.
- kubelet: thành phần (component) chạy trên tất cả các node trong cluster, chịu trách nhiệm thực thi các tác vụ như khởi tạo và quản lý pods và containers.
- kubectl: công cụ dòng lệnh (CLI) dùng để giao tiếp (interact) với cluster Kubernetes.
#step 1
sudo apt-get update
# apt-transport-https may be a dummy package; if so, you can skip that package
sudo apt-get install -y apt-transport-https ca-certificates curl gpg
#step 2
# If the directory `/etc/apt/keyrings` does not exist, it should be created before the curl command, read the note below.
# sudo mkdir -p -m 755 /etc/apt/keyrings
curl -fsSL https://pkgs.k8s.io/core:/stable:/v1.35/deb/Release.key | sudo gpg --dearmor -o /etc/apt/keyrings/kubernetes-apt-keyring.gpg
#step 3
# This overwrites any existing configuration in /etc/apt/sources.list.d/kubernetes.list
echo 'deb [signed-by=/etc/apt/keyrings/kubernetes-apt-keyring.gpg] https://pkgs.k8s.io/core:/stable:/v1.35/deb/ /' | sudo tee /etc/apt/sources.list.d/kubernetes.list
#step 4
sudo apt-get update
sudo apt-get install -y kubelet kubeadm kubectl
sudo apt-mark hold kubelet kubeadm kubectl
#step 5(optional)
sudo systemctl enable --now kubelet
Creating a cluster with kubeadm
Create control-plane node
control-plane là nơi control pane components run, bao gồm etcd(the cluster database) và API Server(which kubectl command line tool communicates with)
- (Recmomended) Nếu bạn có kế hoạch nâng cấp từ single control-plane to high availability, bạn bên chỉ định
--control-plane-endpointđể thiết lập shared endpoint cho tất cả control-plane nodes. Endpoint có thể là DNS name hoặc OP address của load-balancer. - Chọn Pod network bổ sung, và kiểm tra xem có yêu cầu truyền arguments cho kubedm init không. Tùy thuộ vào nhà cung cấp bên thứ ba mà bạn chọn.(trong kubernetes không tự có network cho pod, pod ở node A gọi pod ở node B cần 1 plugin mạng(CNI), Pod network add-on(CNI plugin)). Khi bạn chọn
--pod-network-cidr=10.244.0.0/16của Flannel, mỗi Pod sẽ được cấp IP trong range này. - High availability(HA), control-plane cần cert TLS, key để giao tiếp (API server, etcd...), nếu có nhiều master thì các node phải giống cert. Trong trường hợp nếu ko có
--upload-certsbạn phải copy cert thủ công.--upload-certssẽ giúp bạn làm điều đó.
Example:
sudo kubeadm init \
--control-plane-endpoint "LOAD_BALANCER_DNS:6443" \
--upload-certs
Considerations about apiserver-advertise-address and ControlPlaneEndpoint
Sử dụng apiserver-advertise-address để thiết lập advertised address, được dùng shared endpoint cho tát cả control-plane nodes.
--control-plane-endpoint cho phép cả 2 IP Address và DNS names có thể map đến IP Address.
Example mapping:
192.168.0.102 cluster-endpoint
192.168.0.102 là IP Address của node and cluster-endpoint là 1 DNS name tùy chỉnh ánh xạ tới IP này. Cách này sẽ cho phép bạn truyền tham số control-plane-endpoint=cluster-endpoint đến kubeadm init và truyền cùng tên DNS đó cho kubeadm join. sau này bạn có thể sửa cluster-endpoint đến IP Address của load-balancer trong high availability.
Biến single control plane cluster được tạo mà không có --control-plane-endpoint thành một highly available cluster không được hỗ trợ bởi kubeadm.
More information
Để kubectl hoạt động với người dùng ko phải root, hãy chạy lệnh sau:
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
Cuối cùng, nếu làm là root user bạn có thể run:
export KUBECONFIG=/etc/kubernetes/admin.conf
Installing a Pod network add-on
Bạn phải triển khai 1 Container Network Interface(CNI) dựa trên Pod network add-on, nó cho phép các Pods có thể kết nối với các Pods khác. Cluster DNS(CoreDNS) sẽ không khỏi động trước network được cài đặt.
- Hãy đảm bảo rằng Pod network của bạn phải không trùng lặp với bât kỳ host networks.
- Mặc định, kubeadm thiết lập cluster sử dụng và thực thi việc sử dụng RBAC(role based access control). Vì vậy CNI plugin bạn chọn phải hỗ trợ RBAC.
Có nhiều dự án bên thứ ba cung cấp Pod network cho Kubernetes thông qua CNI, ví dụ: Calico Flannel Cilium Weave Net
Một số plugin còn hỗ trợ thêm: Network Policy (chính sách kiểm soát traffic giữa các Pod)
Sau khi init xong, bạn phải cài một CNI plugin thì CoreDNS mới chạy; Kubernetes chỉ dùng một Pod network cho toàn cluster. Bạn chỉ cần áp manifest của CNI lên control-plane:
kubectl apply -f <cni-manifest.yaml>
-
Bridge (đơn giản – single node) giống Docker network chỉ dùng trong 1 node
-
Overlay network (phổ biến) VD: Flannel tạo mạng ảo giữa các node dùng VXLAN encapsulation -> Pod ở node A vẫn gọi được node B
-
Routing (advanced) VD: Calico dùng routing thật (BGP) không encapsulation → nhanh hơn
-
eBPF (hiện đại) VD: Cilium dùng kernel eBPF performance cao + security tốt
Managed node labels
Trong Kubernetes, mỗi Node có thể có label (key-value) để:
- phân loại node (vd: control-plane, worker, GPU, region…)
- phục vụ scheduling (Pod sẽ chạy ở node phù hợp) Bạn có thể tự gán label bằng lệnh:
kubectl label node <node-name> node-role.kubernetes.io/control-plane=
Adding worker nodes
Worker nodes nơi run workloads của bạn
sudo kubeadm join --token <token> <control-plane-host>:<control-plane-port> --discovery-token-ca-cert-hash sha256:<hash>
Nếu bạn không có token, bạn có thể lấy nó bằng cách run command sau trong control-plane node:
sudo kubeadm token list
Tokens hết hạng sau 24h, bạn có thể tạo token mới theo:
sudo kubeadm token create
Để in lệnh kubeadm join đồng thời tạo token mới, bạn có thể sử dụng:
sudo kubeadm token create --print-join-command
Nếu bạn không có giá trị của --discovery-token-ca-cert-hash, bạn có thể lấy nó bằng cách chạy các lệnh sau trên control plane node:
sudo cat /etc/kubernetes/pki/ca.crt | openssl x509 -pubkey | openssl rsa -pubin -outform der 2>/dev/null | \
openssl dgst -sha256 -hex | sed 's/^.* //'
Remove the node
Để giao tiếp control-plane node bằng thông tin đăng nhập phù hợp, hãy chạy lệnh sau:
kubectl drain <node name> --delete-emptydir-data --force --ignore-daemonsets
trước khi remove node, bạn cần reset trạng thái đã cài đặt bằng kubedm:
kubeadm reset
The reset process does not reset or clean up iptables rules or IPVS tables. If you wish to reset iptables, you must do so manually:
iptables -F && iptables -t nat -F && iptables -t mangle -F && iptables -X
Nếu bạn muốn đặt lại bảng IPVS, bạn phải chạy lệnh sau:
ipvsadm -C
Bây giờ hãy xóa nút đó đi
kubectl delete node <node name>
All rights reserved