Cài đặt Kubernetes cluster sử dụng containerd

Chuẩn bị môi trường

Trước khi bắt đầu, cần tắt firewall, SELinux, tắt swap partition và cấu hình hosts. Các bạn có thể tìm hiểu thêm trên mạng.

Thông tin các máy chủ

Hệ điều hành

Vai trò trong Cluster

Địa chỉ IP

Hostname

CentOS7.9

Master

192.168.70.150

master-node

CentOS7.9

Node1

192.168.70.151

worker-node1

CentOS7.9

Node2

192.168.70.152

worker-node2

Các phiên bản sử dụng

· containerd: 1.6.8

· kubeadm: 1.24.4

· kubectl: 1.24.4

· kubelet: 1.24.4

Quá trình cài đặt

  1. Cấu hình tham số kernel
# Tải module tạm thời
modprobe br_netfilter
# Lưu module vĩnh viễn
echo 'br_netfilter' | sudo tee /etc/modules-load.d/br_netfilter.conf
modprobe br_netfilter
# Kiểm tra file tồn tại
ls /proc/sys/net/bridge/bridge-nf-call-iptables
# Kiểm tra module đã tải
lsmod | grep br_netfilter
##Cấu hình tham số kernel
cat > /etc/sysctl.d/k8s.conf << EOF
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_forward = 1
vm.swappiness = 0
EOF
# Tắt swap chỉ khi hệ thống thiếu bộ nhớ mới dùng
vm.swappiness = 0  
# Áp dụng cấu hình
sysctl --system  
  1. Thiết lập kho yum
## Đổi sang kho yum阿里
wget -O /etc/yum.repos.d/CenOS-Base.repo https://mirrors.aliyun.com/repo/Centos-7.repo
yum clean all
yum makecache
##Cài đặt phần mềm thông dụng
yum install -y vim net-tools bash-completion wget lrzsz     
##Cấu hình kho docker阿里云
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
## Cấu hình kho kubernetes阿里云
cat <<EOF > /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=http://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64
enabled=1
gpgcheck=0
repo_gpgcheck=0
gpgkey=http://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg
       http://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
EOF
  1. Cấu hình IPVS
yum install -y ipvsadm ipset sysstat conntrack libseccomp  
cat > /etc/sysconfig/modules/ipvs.modules <<EOF
#!/bin/bash
ipvs_modules="ip_vs ip_vs_lc ip_vs_wlc ip_vs_rr ip_vs_wrr ip_vs_lblc ip_vs_lblcr ip_vs_dh ip_vs_sh ip_vs_fo ip_vs_nq ip_vs_sed ip_vs_ftp nf_conntrack ip_tables ip_set xt_set ipt_set ipt_rpfilter ipt_REJECT ipip"
for kernel_module in \${ipvs_modules}; do
  /sbin/modinfo -F filename \${kernel_module} > /dev/null 2>&1
  if [ $? -eq 0 ]; then
    /sbin/modprobe \${kernel_module}
  fi
done
EOF  
chmod 755 /etc/sysconfig/modules/ipvs.modules 
sh /etc/sysconfig/modules/ipvs.modules 
lsmod | grep ip_vs
  1. Cài đặt Containerd (binary)

Tải containerd từ GitHub:

wget https://github.com/containerd/containerd/releases/download/v1.6.8/cri-containerd-1.6.8-linux-amd64.tar.gz
tar zxvf cri-containerd-1.6.8-linux-amd64.tar.gz

Giải thích cấu trúc thư mục:

  • Thư mục etc: Chứa file cấu hình quản lý dịch vụ containerd và cấu hình CNI
  • Thư mục opt: Chứa file cấu hình containerd cho môi trường GCE và plugin CNI
  • Thư mục usr: Chứa các binary runtime của containerd, bao gồm runc

Sao chép các binary vào $PATH:

Các file trong gói containerd:

File Mô tả
containerd Runtime container cung cấp API theo chuẩn OCI qua gRPC
containerd-release Công cụ phát hành containerd
containerd-stress Công cụ stress test cho containerd
containerd-shim Runtime载体 cho mỗi container
ctr CLI đơn giản để debug containerd

Tạo file cấu hình mặc định:

mkdir -p /etc/containerd/
containerd config default > /etc/containerd/config.toml

Chỉnh sửa cấu hình:

Đổi registry image về阿里云:

sed -i "s#k8s.gcr.io/pause#registry.cn-hangzhou.aliyuncs.com/google_containers/pause#g" /etc/containerd/config.toml

Cấu hình mirror cho image:

vim /etc/containerd/config.toml
[plugins."io.containerd.grpc.v1.cri".registry.mirrors]
  [plugins."io.containerd.grpc.v1.cri".registry.mirrors."docker.io"]
    endpoint = ["https://xyz12345.mirror.aliyuncs.com"]
# Lưu ý: Cấu hình này cần server阿里云 mới hoạt động

Cấu hình Systemd Cgroup:

sed -i 's#SystemdCgroup = false#SystemdCgroup = true#g' /etc/containerd/config.toml

Tạo service file:

grep -v ^# etc/systemd/system/containerd.service
mv etc/systemd/system/containerd.service /usr/lib/systemd/system/containerd.service

Khởi động containerd:

systemctl daemon-reload
systemctl enable --now containerd.service
systemctl status containerd.service
containerd --version
  1. Cài đặt runc (binary)
# Tải runc từ: https://github.com/opencontainers/runc/releases
chmod +x runc.amd64
mv runc.amd64 /usr/bin/runc
runc -version
  1. Cấu hình crictl client
mv etc/crictl.yaml /etc/
cat /etc/crictl.yaml 
runtime-endpoint: unix:///run/containerd/containerd.sock
image-endpoint: unix:///var/run/containerd/containerd.sock
timeout: 10
debug: false
  1. Cài đặt kubeadm, kubectl, kubelet
yum install -y kubelet-1.24.4 kubeadm-1.24.4 kubectl-1.24.4
systemctl enable kubelet && systemctl start kubelet && systemctl status kubelet
# Trạng thái kubelet không running là bình thường, sau khi cài đặt các thành phần sẽ hoạt động
##Chức năng từng thành phần:
kubeadm: Khởi tạo cluster Kubernetes
kubelet: Cài đặt trên tất cả các node, dùng để khởi động Pod
kubectl: Dùng để triển khai và quản lý ứng dụng, xem các tài nguyên
  1. Cấu hình tab completion
# Giúp gõ lệnh nhanh hơn
kubectl completion bash > /etc/bash_completion.d/kubectl
kubeadm completion bash > /etc/bash_completion.d/kubeadm
  1. Kiểm tra môi trường cài đặt
kubeadm init --dry-run
  1. Tải và import images

Liệt kê các images cần thiết:

kubeadm config images list

Tải images:

kubeadm config images pull \
--image-repository registry.aliyuncs.com/google_containers \
--kubernetes-version v1.24.4
  1. Tạo file cấu hình khởi tạo

Tạo file cấu hình mặc định:

kubeadm config print init-defaults > init-config.yaml

Chỉnh sửa file cấu hình:

apiVersion: kubeadm.k8s.io/v1beta3
bootstrapTokens:
- groups:
  - system:bootstrappers:kubeadm:default-node-token
  token: xyz789.abcdef0123456789
  ttl: 24h0m0s
  usages:
  - signing
  - authentication
kind: InitConfiguration
localAPIEndpoint:
  advertiseAddress: 192.168.70.150
  bindPort: 6443
nodeRegistration:
  criSocket: /run/containerd/containerd.sock
  imagePullPolicy: IfNotPresent
  name: master-node
  taints: null
---
apiServer:
  timeoutForControlPlane: 4m0s
apiVersion: kubeadm.k8s.io/v1beta3
certificatesDir: /etc/kubernetes/pki
clusterName: kubernetes
controllerManager: {}
dns: {}
etcd:
  local:
    dataDir: /var/lib/etcd
imageRepository: registry.aliyuncs.com/google_containers
kind: ClusterConfiguration
kubernetesVersion: 1.24.4
networking:
  dnsDomain: cluster.local
  podSubnet: 10.244.0.0/16
  serviceSubnet: 10.96.0.0/12
scheduler: {}
---
apiVersion: kubeproxy.config.k8s.io/v1alpha1
kind: KubeProxyConfiguration
mode: ipvs
---
apiVersion: kubelet.config.k8s.io/v1beta1
kind: KubeletConfiguration
cgroupDriver: systemd
  1. Khởi tạo Master node
kubeadm init --config init-config.yaml

Kết quả thành công:

Your Kubernetes control-plane has initialized successfully!

Để sử dụng cluster, chạy các lệnh sau với user thường:

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

Hoặc nếu là root:

export KUBECONFIG=/etc/kubernetes/admin.conf

Bây giờ cần cài đặt pod network.
Chạy: kubectl apply -f [podnetwork].yaml

Để join các node worker:

kubeadm join 192.168.70.150:6443 --token xyz789.abcdef0123456789 \
    --discovery-token-ca-cert-hash sha256:bb9ef8abc123def4567890123456789012345678901234567890abcdef123456

Cấu hình sau khi khởi tạo:

mkdir -p $HOME/.kube
cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
chown $(id -u):$(id -g) $HOME/.kube/config
export KUBECONFIG=/etc/kubernetes/admin.conf
echo "KUBECONFIG=/etc/kubernetes/admin.conf" >> ~/.bashrc && source ~/.bashrc
kubectl get nodes

Nếu gặp lỗi, reset và thử lại:

kubeadm reset
  1. Join các node Worker
kubeadm join 192.168.70.150:6443 --token xyz789.abcdef0123456789 \
    --discovery-token-ca-cert-hash sha256:bb9ef8abc123def4567890123456789012345678901234567890abcdef123456
# Token có hiệu lực 24 giờ
# Thêm --control-plane để join vào control plane
  1. Kiểm tra trạng thái cluster
kubectl get nodes

Lúc này các node sẽ ở trạng thái NotReady vì chưa cài network plugin. Sau khi cài network plugin, trạng thái sẽ chuyển sang Ready.

Đặt nhãn cho các worker node:

kubectl label node worker-node1 node-role.kubernetes.io/worker=worker
kubectl label node worker-node2 node-role.kubernetes.io/worker=worker

Cài đặt các plugin

  1. Cài đặt Calico Network Plugin

Tải file manifest:

curl https://projectcalico.docs.tigera.io/archive/v3.23/manifests/calico.yaml -O
# Hoặc
wget https://docs.projectcalico.org/v3.23/manifests/calico.yaml --no-check-certificate

Chỉnh sửa calico.yaml để tự động phát hiện network interface:

- name: IP_AUTODETECTION_METHOD
  value: "interface=ens.*"

Lưu ý: Mặc định Calico sử dụng IPIP mode. Để chuyển sang BGP mode, sửa CALICO_IPV4POOL_IPIP thành "off". Thay "ens.*" bằng tên interface thực tế của máy bạn.

Tải trước các images:

ctr images pull docker.io/calico/cni:v3.23.3
ctr images pull docker.io/calico/node:v3.23.3
ctr images pull docker.io/calico/kube-controllers:v3.23.3
# Nếu gặp lỗi với docker.io, dùng quay.io:
ctr images pull quay.io/calico/cni:v3.23.3
ctr images pull quay.io/calico/node:v3.23.3
ctr images pull quay.io/calico/kube-controllers:v3.23.3

Cài đặt Calico:

# Lưu ý: Đổi docker.io thành quay.io trong calico.yaml
kubectl apply -f calico.yaml 

Kiểm tra trạng thái:

kubectl get nodes
kubectl get pods -n kube-system
  1. Cài đặt Metrics Server

Tải file cấu hình:

# Phiên bản mới nhất
wget https://github.com/kubernetes-sigs/metrics-server/releases/latest/download/components.yaml
# Hoặc phiên bản cụ thể
wget https://github.com/kubernetes-sigs/metrics-server/releases/download/v0.4.1/components.yaml
mv components.yaml metrics-server.yaml

Chỉnh sửa file cấu hình:

containers:
- args:
  - --cert-dir=/tmp
  - --secure-port=10250
  - --kubelet-preferred-address-types=InternalIP,ExternalIP,Hostname
  - --kubelet-use-node-status-port
  - --metric-resolution=15s
  - --kubelet-insecure-tls
image: registry.aliyuncs.com/google_containers/metrics-server:v0.8.0

Tải image trước:

ctr images pull registry.aliyuncs.com/google_containers/metrics-server:v0.8.0

Cấu hình API Server để hỗ trợ aggregator:

vim /etc/kubernetes/manifests/kube-apiserver.yaml
# Thêm tham số:
- --enable-aggregator-routing=true

Áp dụng cấu hình API Server:

kubectl apply -f /etc/kubernetes/manifests/kube-apiserver.yaml
kubectl get pods -n kube-system

Cài đặt Metrics Server:

kubectl apply -f metrics-server.yaml
kubectl get pods -n kube-system

Kiểm tra tài nguyên các node:

kubectl top nodes

Xác nhận cluster hoạt động:

kubectl get node

Đăng vào ngày 23 tháng 6 lúc 19:01