Giới thiệu chung
Hướng dẫn này trình bày quy trình cài đặt Kubernetes phiên bản 1.30.1 trên hệ điều hành Ubuntu 22.04, sử dụng Docker làm môi trường runtime container. Việc triển khai các phiên bản Kubernetes từ 1.28 trở đi có một số thay đổi đáng kể so với các phiên bản trước đó, đặc biệt là việc loại bỏ docker-shim, đòi hỏi phải sử dụng cri-dockerd.
Cấu hình môi trường
Thiết lập môi trường bao gồm một máy chủ master và một máy chủ worker:
| Tên máy chủ | Cấu hình | Vai trò | Phiên bản HĐH | IP | Các thành phần cài đặt |
|---|---|---|---|---|---|
| master | 4 nhân 4G | master | Ubuntu 22.04 | 192.168.140.75 | apiserver, controller-manager, scheduler, kubelet, etcd, kube-proxy, runtime container, calico |
| node1 | 4 nhân 4G | worker | Ubuntu 22.04 | 192.168.140.76 | kube-proxy, calico, coredns, runtime container, kubelet |
Cấu hình khởi tạo hệ thống
Các bước cấu hình dưới đây cần được thực hiện trên tất cả các máy chủ trong cụm Kubernetes (master và node).
Cấu hình phân giải DNS cục bộ
Thêm các ánh xạ IP-hostname vào file /etc/hosts để các máy chủ có thể phân giải tên lẫn nhau:
cat >> /etc/hosts << EOF
192.168.140.75 master
192.168.140.76 node1
EOF
Thiết lập xác thực không cần mật khẩu (SSH Trust)
Để thuận tiện cho việc quản lý và tránh nhập mật khẩu nhiều lần, hãy thiết lập SSH keypair và sao chép public key giữa các máy chủ.
ssh-keygen
ssh-copy-id master
ssh-copy-id node1
Tắt swap
Kubernetes yêu cầu tắt swap để đảm bảo hiệu suất và ổn định. Chỉnh sửa file /etc/fstab và tắt swap ngay lập tức:
sudo sed -ri 's/^([^#].*swap.*)$/#\1/' /etc/fstab && grep swap /etc/fstab && sudo swapoff -a && free -h
Điều chỉnh tham số Kernel
Cần cấu hình một số tham số kernel để Kubernetes hoạt động chính xác, đặc biệt là liên quan đến mạng.
cat >> /etc/sysctl.conf <<EOF
vm.swappiness = 0
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_forward = 1
net.bridge.bridge-nf-call-ip6tables = 1
EOF
cat >> /etc/modules-load.d/kubernetes.conf <<EOF
br_netfilter
EOF
# Nạp module ngay lập tức
sudo modprobe br_netfilter
# Áp dụng các thay đổi sysctl
sudo sysctl -p
Cài đặt Docker Runtime
Docker sẽ được sử dụng làm môi trường runtime container cho Kubernetes. Các bước này cần được thực hiện trên tất cả các máy chủ.
sudo apt update
sudo apt install -y ca-certificates curl gnupg lsb-release
# Thêm khóa GPG của Docker
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
# Thêm kho lưu trữ Docker vào APT sources
echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
# Cài đặt Docker Engine
sudo apt-get update
sudo apt install -y docker-ce docker-ce-cli containerd.io docker-compose
# Cấu hình Docker daemon
sudo mkdir -p /etc/docker
cat > /etc/docker/daemon.json <<EOF
{
"registry-mirrors": [
"https://docker.mirrors.ustc.edu.cn",
"https://hub-mirror.c.163.com",
"https://reg-mirror.qiniu.com",
"https://registry.docker-cn.com"
],
"exec-opts": ["native.cgroupdriver=systemd"],
"data-root": "/data/docker",
"log-driver": "json-file",
"log-opts": {
"max-size": "20m",
"max-file": "5"
}
}
EOF
# Khởi động lại và bật Docker service
sudo systemctl restart docker.service
sudo systemctl enable docker.service
# Kiểm tra trạng thái Docker
docker info
Cài đặt kubeadm, kubelet và kubectl
Các công cụ này là cần thiết để quản lý cụm Kubernetes. Các bước này cần được thực hiện trên tất cả các máy chủ.
Cấu hình kho lưu trữ Kubernetes
Kho lưu trữ Kubernetes mới được phân tách theo phiên bản. Để cài đặt phiên bản 1.30, chúng ta sẽ cấu hình như sau:
sudo apt-get update && sudo apt-get install -y apt-transport-https
# Tải và thêm khóa GPG của Kubernetes
curl -fsSL https://mirrors.aliyun.com/kubernetes-new/core/stable/v1.30/deb/Release.key | \
sudo gpg --dearmor -o /etc/apt/keyrings/kubernetes-apt-keyring.gpg
# Thêm kho lưu trữ Kubernetes vào APT sources
echo "deb [signed-by=/etc/apt/keyrings/kubernetes-apt-keyring.gpg] https://mirrors.aliyun.com/kubernetes-new/core/stable/v1.30/deb/ /" | \
sudo tee /etc/apt/sources.list.d/kubernetes.list
Cài đặt kubelet, kubeadm và kubectl
sudo apt-get update
# Kiểm tra các phiên bản khả dụng (tùy chọn)
apt-cache madison kubelet kubeadm kubectl
# Cài đặt các gói
sudo apt-get install -y kubelet kubeadm kubectl
# Giữ phiên bản để ngăn cập nhật tự động
sudo apt-mark hold kubelet kubeadm kubectl
# Để bỏ giữ phiên bản (nếu cần cập nhật):
# sudo apt-mark unhold kubelet kubeadm kubectl
Bật dịch vụ kubelet
Mặc dù chưa thể khởi động kubelet hoàn chỉnh vào lúc này (do cụm chưa được cấu hình), chúng ta có thể thiết lập để dịch vụ tự động khởi động cùng hệ thống.
sudo systemctl enable kubelet
Cài đặt cri-dockerd
Từ Kubernetes v1.24, hỗ trợ docker-shim đã bị loại bỏ. Docker Engine không hỗ trợ trực tiếp giao thức CRI (Container Runtime Interface). Do đó, chúng ta cần cài đặt cri-dockerd làm bộ điều hợp để Kubernetes có thể giao tiếp với Docker.
Đối với Ubuntu 22.04 (codename jammy), chúng ta sẽ sử dụng gói .deb tương ứng.
Tải và cài đặt cri-dockerd
wget https://github.com/Mirantis/cri-dockerd/releases/download/v0.3.14/cri-dockerd_0.3.14.3-0.ubuntu-jammy_amd64.deb
sudo dpkg -i ./cri-dockerd_0.3.14.3-0.ubuntu-jammy_amd64.deb
Cấu hình cri-dockerd
Để tránh các vấn đề về tải hình ảnh từ k8s.gcr.io (có thể không truy cập được ở một số khu vực), chúng ta cần điều chỉnh cấu hình cri-dockerd để sử dụng một nguồn hình ảnh proxy.
# Chỉnh sửa file cấu hình để sử dụng registry proxy cho hình ảnh pause container
sudo sed -ri 's@^(.*fd://).*$@\1 --pod-infra-container-image registry.aliyuncs.com/google_containers/pause@' /usr/lib/systemd/system/cri-docker.service
# Tải lại cấu hình systemd và khởi động lại/bật dịch vụ cri-docker
sudo systemctl daemon-reload && sudo systemctl restart cri-docker && sudo systemctl enable cri-docker
Khởi tạo cụm trên máy chủ Master
Các bước này chỉ cần thực hiện trên máy chủ master.
Tạo file cấu hình khởi tạo
Chúng ta sẽ tạo một file cấu hình kubeadm.yaml để tùy chỉnh quá trình khởi tạo cụm.
kubeadm config print init-defaults > kubeadm.yaml
Chỉnh sửa file cấu hình kubeadm.yaml
Mở file kubeadm.yaml và thực hiện các chỉnh sửa sau (sử dụng sudo vim kubeadm.yaml hoặc trình soạn thảo yêu thích):
apiVersion: kubeadm.k8s.io/v1beta3
bootstrapTokens:
- groups:
- system:bootstrappers:kubeadm:default-node-token
token: abcdef.0123456789abcdef # Token mặc định, sẽ được thay thế khi init
ttl: 24h0m0s
usages:
- signing
- authentication
kind: InitConfiguration
localAPIEndpoint:
advertiseAddress: 192.168.140.75 # Địa chỉ IP của máy chủ master
bindPort: 6443
nodeRegistration:
criSocket: unix:///run/cri-dockerd.sock # Đường dẫn socket của cri-dockerd
imagePullPolicy: IfNotPresent
name: master # Tên máy chủ master
taints: null
---
apiServer:
timeoutForControlPlane: 4m0s
apiVersion: kubeadm.k8s.io/v1beta3
certificatesDir: /etc/kubernetes/pki
clusterName: kubernetes
controllerManager: {}
dns: {}
etcd:
local:
dataDir: /data/etcd # Thư mục lưu trữ dữ liệu của etcd
imageRepository: registry.aliyuncs.com/google_containers # Nguồn hình ảnh container
kind: ClusterConfiguration
kubernetesVersion: 1.30.1 # Phiên bản Kubernetes
controlPlaneEndpoint: "master:6443" # Sử dụng hostname của master và port API
networking:
dnsDomain: cluster.local
serviceSubnet: 10.96.0.0/12
podSubnet: 10.244.0.0/16 # Dải IP cho Pods
scheduler: {}
---
apiVersion: kubeproxy.config.k8s.io/v1alpha1
kind: KubeProxyConfiguration
mode: ipvs # Sử dụng IPVS cho kube-proxy
---
apiVersion: kubelet.config.k8s.io/v1beta1
kind: KubeletConfiguration
cgroupDriver: systemd # Cgroup driver phải khớp với Docker
Khởi tạo cụm Kubernetes
Sử dụng file cấu hình đã tạo để khởi tạo cụm.
sudo kubeadm init --config=kubeadm.yaml
Nếu quá trình khởi tạo thành công, bạn sẽ thấy thông báo tương tự như sau:
Your Kubernetes control-plane 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
Alternatively, if you are the root user, you can run:
export KUBECONFIG=/etc/kubernetes/admin.conf
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/
Then you can join any number of worker nodes by running the following on each as root:
kubeadm join 192.168.140.75:6443 --token abcdef.0123456789abcdef \
--discovery-token-ca-cert-hash sha256:0deaa9ceed7266c28c5f5241ed9efea77c798055ebcc7a27dc03f6c97323c8a0
Theo hướng dẫn, hãy cấu hình quyền truy cập kubectl cho người dùng hiện tại:
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
Thêm máy chủ Worker vào cụm
Thực hiện lệnh kubeadm join trên máy chủ worker (node1). Đảm bảo sử dụng lệnh được cung cấp ở cuối quá trình kubeadm init và thêm tham số --cri-socket.
sudo kubeadm join 192.168.140.75:6443 \
--token abcdef.0123456789abcdef \
--discovery-token-ca-cert-hash sha256:0deaa9ceed7266c28c5f5241ed9efea77c798055ebcc7a27dc03f6c97323c8a0 \
--cri-socket unix:///run/cri-dockerd.sock
Sau khi worker node tham gia, kiểm tra trạng thái các node từ máy chủ master:
kubectl get nodes
kubectl get cs
Bạn sẽ thấy các node ở trạng thái NotReady, điều này là bình thường vì mạng Pod chưa được triển khai.
Cài đặt mạng Pod (Calico)
Cần triển khai một giải pháp mạng cho Pod (CNI - Container Network Interface). Chúng ta sẽ sử dụng Calico.
Các bước này chỉ cần thực hiện trên một trong các máy chủ master.
Tải file manifest Calico
wget https://docs.projectcalico.org/manifests/calico.yaml
Chỉnh sửa file manifest Calico
Mở file calico.yaml và thực hiện các thay đổi sau:
- Tìm phần
DaemonSetvà điều chỉnh cấu hình mạng trong mụcenvcủa containercalico-node. Thêm các dòng sau để bật IPIP và cấu hình phương thức tự động phát hiện IP, cũng như tắt VXLAN. Thay thếens160bằng tên giao diện mạng chính của bạn nếu cần (ví dụ: dùngip ađể kiểm tra).
# ... (nội dung file calico.yaml) ...
env:
# Auto-detect the BGP IP address.
- name: IP
value: "autodetect"
# Enable IPIP
- name: CALICO_IPV4POOL_IPIP
value: "Always"
# Thêm dòng này để chỉ định giao diện mạng tự động phát hiện IP
- name: IP_AUTODETECTION_METHOD
value: "interface=ens160" # Thay thế bằng tên giao diện mạng của bạn
# Enable or Disable VXLAN on the default IP pool.
- name: CALICO_IPV4POOL_VXLAN
value: "Never"
# ... (nội dung file calico.yaml) ...
- Tìm và điều chỉnh
CALICO_IPV4POOL_CIDRđể khớp vớipodSubnetđã cấu hình trongkubeadm.yaml(ví dụ:10.244.0.0/16).
# ... (nội dung file calico.yaml) ...
# The default IPv4 pool to create on startup if none exists. Pod IPs will be
# chosen from this range. Changing this value after installation will have
# no effect. This should fall within `--cluster-cidr`.
- name: CALICO_IPV4POOL_CIDR
value: "10.244.0.0/16" # Cần khớp với podSubnet trong kubeadm.yaml
# Disable file logging so `kubectl logs` works.
- name: CALICO_DISABLE_FILE_LOGGING
value: "true"
# ... (nội dung file calico.yaml) ...
Triển khai Calico
Áp dụng file manifest Calico đã chỉnh sửa vào cụm.
kubectl apply -f calico.yaml
Theo dõi trạng thái các Pod trong cụm cho đến khi tất cả các Pod của Calico và CoreDNS chuyển sang trạng thái Running:
watch kubectl get pods --all-namespaces -o wide
Kiểm tra trạng thái Node
Khi các Pod mạng đã chạy bình thường, các node sẽ chuyển sang trạng thái Ready.
kubectl get nodes
Kết quả mong đợi:
NAME STATUS ROLES AGE VERSION
master Ready control-plane ... v1.30.1
node1 Ready <none> ... v1.30.1
Kiểm tra kết nối mạng cụm
Để xác minh rằng mạng Pod và CoreDNS hoạt động chính xác, chúng ta sẽ tạo một Pod busybox và thực hiện tra cứu DNS.
kubectl run my-busybox --image=busybox:1.28 --restart=Never --rm -it -- sh
Trong shell của Pod my-busybox, chạy lệnh nslookup:
/ # nslookup kubernetes.default.svc.cluster.local
Kết quả tương tự như sau sẽ chỉ ra rằng CoreDNS đang hoạt động và có thể phân giải các dịch vụ trong cụm:
Server: 10.96.0.10
Address 1: 10.96.0.10 kube-dns.kube-system.svc.cluster.local
Name: kubernetes.default.svc.cluster.local
Address 1: 10.96.0.1 kubernetes.default.svc.cluster.local
Lưu ý: Bạn phải sử dụng phiên bản busybox:1.28 vì các phiên bản mới hơn có thể không có công cụ nslookup hoặc có hành vi khác.