Cài đặt Kubernetes 1.30.1 trên Ubuntu 22.04 với Docker Runtime

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:

  1. Tìm phần DaemonSet và điều chỉnh cấu hình mạng trong mục env của container calico-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ế ens160 bằng tên giao diện mạng chính của bạn nếu cần (ví dụ: dùng ip 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) ...
  1. Tìm và điều chỉnh CALICO_IPV4POOL_CIDR để khớp với podSubnet đã cấu hình trong kubeadm.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.

Thẻ: Kubernetes K8s Ubuntu docker kubeadm

Đăng vào ngày 5 tháng 7 lúc 07:40