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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- Kiểm tra môi trường cài đặt
kubeadm init --dry-run
- 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
- 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
- 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
- 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
- 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
- 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
- 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