Chuyển tới nội dung chính

Cài Đặt Kubernetes Cơ Bản với Kubeadm trên Linux

Giới Thiệu

Kubernetes (thường gọi là K8s) là một nền tảng mã nguồn mở mạnh mẽ để tự động hóa việc triển khai, mở rộng và quản lý các ứng dụng được đóng gói (containerized applications). Nó giúp bạn quản lý các container trên nhiều máy chủ, đảm bảo ứng dụng của bạn luôn hoạt động ổn định và có thể mở rộng dễ dàng. Việc cài đặt Kubernetes cơ bản là bước đầu tiên để bạn làm quen và khám phá sức mạnh của nền tảng này.

Trong hướng dẫn này, chúng ta sẽ cài đặt một cluster Kubernetes nhỏ gồm một Master Node và một Worker Node sử dụng kubeadm trên hệ điều hành Linux. kubeadm là một công cụ giúp khởi tạo một cluster Kubernetes tối thiểu và tuân thủ các thực tiễn tốt nhất.

📋 Thời gian: 45 phút | Độ khó: Trung bình

Yêu Cầu

Để thực hiện theo hướng dẫn này, bạn cần chuẩn bị các điều kiện sau:

  • Hai máy chủ Linux: Một cho Master Node và một cho Worker Node. Khuyến nghị sử dụng Ubuntu 20.04 LTS hoặc 22.04 LTS.
    • Master Node: Tối thiểu 2 CPU, 2GB RAM và 20GB ổ đĩa trống.
    • Worker Node: Tối thiểu 1 CPU, 1GB RAM và 10GB ổ đĩa trống.
  • Quyền sudo: Người dùng có quyền thực thi lệnh sudo trên cả hai máy chủ.
  • Kết nối Internet: Cần thiết để tải xuống các gói phần mềm.
  • Vô hiệu hóa Swap: Kubernetes yêu cầu swap phải được tắt.
  • Mở các cổng cần thiết:
    • Master Node: 6443, 2379-2380, 10250, 10251, 10252
    • Worker Node: 10250, 30000-32767
    • Hoặc đơn giản hơn là tắt firewall (chỉ nên làm trong môi trường thử nghiệm).
  • Địa chỉ IP tĩnh cho cả hai máy chủ (khuyến nghị).

Các Bước Thực Hiện

Bước 1: Chuẩn bị các máy chủ (Master và Worker)

Thực hiện các lệnh sau trên CẢ HAI MÁY CHỦ (Master và Worker).

  1. Cập nhật hệ thống và cài đặt các gói cần thiết:

    # Cập nhật danh sách gói và nâng cấp các gói đã cài đặt
    sudo apt update -y
    sudo apt upgrade -y

    # Cài đặt các gói cần thiết cho việc tải xuống qua HTTPS
    sudo apt install -y apt-transport-https ca-certificates curl gnupg
  2. Vô hiệu hóa Swap: ⚠️ Quan trọng: Kubernetes không hoạt động nếu swap được bật.

    # Tắt swap ngay lập tức
    sudo swapoff -a

    # Chỉnh sửa file /etc/fstab để vô hiệu hóa swap vĩnh viễn
    # Tìm dòng chứa "swap" và thêm dấu # vào đầu dòng để comment nó lại.
    # Ví dụ: /swapfile none swap sw 0 0 -> #/swapfile none swap sw 0 0
    sudo sed -i '/ swap / s/^\(.*\)$/#\1/g' /etc/fstab
  3. Thêm các mô-đun hạt nhân (kernel modules) và cấu hình sysctl: Các mô-đun overlaybr_netfilter cần thiết cho Containerd và network của Kubernetes.

    # Tải các mô-đun hạt nhân
    sudo modprobe overlay
    sudo modprobe br_netfilter

    # Thêm cấu hình sysctl cho Kubernetes networking
    cat <<EOF | sudo tee /etc/modules-load.d/k8s.conf
    overlay
    br_netfilter
    EOF

    cat <<EOF | sudo tee /etc/sysctl.d/k8s.conf
    net.bridge.bridge-nf-call-iptables = 1
    net.bridge.bridge-nf-call-ip6tables = 1
    net.ipv4.ip_forward = 1
    EOF

    # Áp dụng các thay đổi sysctl
    sudo sysctl --system
  4. Tắt Firewall (chỉ cho môi trường thử nghiệm) hoặc mở cổng: 💡 Tip: Trong môi trường sản phẩm, bạn nên cấu hình firewall để mở các cổng cụ thể thay vì tắt hoàn toàn.

    # Tắt tường lửa UFW (trên Ubuntu)
    sudo ufw disable
  5. Cài đặt Container Runtime (Containerd): Kubernetes cần một container runtime để chạy các container. Containerd là runtime khuyến nghị.

    # 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 repository của Docker
    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ập nhật lại danh sách gói và cài đặt containerd
    sudo apt update -y
    sudo apt install -y containerd.io

    # Tạo file cấu hình mặc định cho containerd
    sudo mkdir -p /etc/containerd
    sudo containerd config default | sudo tee /etc/containerd/config.toml

    # Chỉnh sửa file cấu hình để sử dụng systemd cgroup driver
    # Tìm dòng SystemdCgroup = false và đổi thành SystemdCgroup = true
    sudo sed -i 's/SystemdCgroup = false/SystemdCgroup = true/g' /etc/containerd/config.toml

    # Khởi động lại containerd để áp dụng thay đổi
    sudo systemctl restart containerd
    sudo systemctl enable containerd
  6. Cài đặt kubelet, kubeadm, kubectl:

    # Tải khóa GPG của Google Cloud
    curl -fsSL https://packages.cloud.google.com/apt/doc/apt-key.gpg | sudo gpg --dearmor -o /etc/apt/keyrings/kubernetes-archive-keyring.gpg

    # Thêm repository của Kubernetes
    echo "deb [signed-by=/etc/apt/keyrings/kubernetes-archive-keyring.gpg] https://apt.kubernetes.io/ kubernetes-xenial main" | sudo tee /etc/apt/sources.list.d/kubernetes.list

    # Cập nhật danh sách gói và cài đặt các công cụ Kubernetes
    sudo apt update -y
    sudo apt install -y kubelet kubeadm kubectl
    sudo apt-mark hold kubelet kubeadm kubectl # Ngăn chặn việc tự động nâng cấp

Bước 2: Khởi tạo Master Node

Thực hiện các lệnh sau CHỈ TRÊN MASTER NODE.

  1. Khởi tạo Kubernetes Cluster: Sử dụng kubeadm init để khởi tạo cluster. Thay YOUR_MASTER_IP bằng địa chỉ IP tĩnh của Master Node.

    # Khởi tạo cluster. Sử dụng --pod-network-cidr để định nghĩa dải IP cho Pods.
    # Calico thường dùng 192.168.0.0/16
    sudo kubeadm init --apiserver-advertise-address=YOUR_MASTER_IP --pod-network-cidr=192.168.0.0/16

    ✅ Sau khi lệnh chạy thành công, bạn sẽ nhận được một thông báo chúc mừng và các hướng dẫn để cấu hình kubectl và lệnh kubeadm join cho Worker Nodes. Hãy lưu lại lệnh kubeadm join này, bạn sẽ cần nó cho Bước 3.

  2. Cấu hình 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
  3. Cài đặt Container Network Interface (CNI - Calico): CNI là cần thiết để các Pods có thể giao tiếp với nhau.

    # Tải file cấu hình Calico
    kubectl apply -f https://raw.githubusercontent.com/projectcalico/calico/v3.26.1/manifests/calico.yaml

    💡 Tip: Có thể mất vài phút để các Pods của Calico khởi động. Bạn có thể kiểm tra trạng thái bằng kubectl get pods -n kube-system.

Bước 3: Tham gia Worker Node vào Cluster

Thực hiện các lệnh sau CHỈ TRÊN WORKER NODE.

  1. Tham gia Worker Node vào Cluster: Sử dụng lệnh kubeadm join mà bạn đã lưu lại từ Bước 2.1. Lệnh này sẽ có dạng như sau:

    sudo kubeadm join YOUR_MASTER_IP:6443 --token YOUR_TOKEN \
    --discovery-token-ca-cert-hash sha256:YOUR_HASH

    Thay thế YOUR_MASTER_IP, YOUR_TOKEN, và YOUR_HASH bằng thông tin thực tế từ đầu ra của lệnh kubeadm init trên Master Node.

    ✅ Sau khi lệnh chạy thành công, Worker Node sẽ bắt đầu tham gia vào cluster.

Bước 4: Kiểm tra Cluster

Thực hiện các lệnh sau CHỈ TRÊN MASTER NODE.

  1. Kiểm tra trạng thái các Node:

    kubectl get nodes

    Bạn sẽ thấy cả Master Node và Worker Node với trạng thái Ready. Có thể mất một chút thời gian để Worker Node chuyển sang trạng thái Ready sau khi tham gia.

  2. Kiểm tra trạng thái các Pods trong kube-system namespace:

    kubectl get pods -n kube-system

    Tất cả các Pods (bao gồm kube-apiserver, kube-controller-manager, kube-scheduler, etcd, kube-proxy, và các Pods của CNI Calico) nên có trạng thái Running.

Troubleshooting

  • Node ở trạng thái NotReady:

    • Nguyên nhân: Thường là do CNI chưa được cài đặt hoặc cấu hình sai trên Master Node, hoặc firewall đang chặn các cổng cần thiết.
    • Cách xử lý:
      • Kiểm tra lại xem bạn đã chạy lệnh kubectl apply -f calico.yaml trên Master Node chưa.
      • Đảm bảo firewall đã được tắt hoặc các cổng cần thiết đã được mở.
      • Kiểm tra log của kubelet trên Node bị lỗi: sudo journalctl -u kubelet.
  • Lỗi kubeadm init không chạy (ví dụ: [ERROR Swap]: running with swap on is not supported):

    • Nguyên nhân: Bạn chưa vô hiệu hóa swap thành công.
    • Cách xử lý: Chắc chắn rằng bạn đã thực hiện sudo swapoff -a và comment dòng swap trong /etc/fstab như hướng dẫn ở Bước 1.
  • Lỗi kubectl không kết nối (ví dụ: The connection to the server localhost:8080 was refused):

    • Nguyên nhân: File cấu hình kubeconfig chưa được thiết lập đúng.
    • Cách xử lý: Đảm bảo bạn đã chạy các lệnh cấu hình kubectl trên Master Node sau khi kubeadm init thành công (Bước 2.2).
  • Lỗi khi Worker Node tham gia Cluster (lệnh kubeadm join):

    • Nguyên nhân: Token đã hết hạn (mặc định 24 giờ) hoặc hash CA cert không đúng.
    • Cách xử lý: Trên Master Node, tạo một join token mới:
      sudo kubeadm token create --print-join-command
      Sử dụng lệnh kubeadm join mới được in ra trên Worker Node.

Kết Luận

Chúc mừng! Bạn đã hoàn thành việc cài đặt một cluster Kubernetes cơ bản với một Master Node và một Worker Node sử dụng kubeadm. Giờ đây, bạn đã có một môi trường để triển khai và quản lý các ứng dụng container của mình.

Việc cài đặt này là bước đệm quan trọng để bạn khám phá sâu hơn về Kubernetes.

Best practices và các bước tiếp theo:

  • Bảo mật: Trong môi trường sản phẩm, hãy cấu hình firewall một cách cẩn thận, sử dụng chứng chỉ SSL/TLS, và quản lý quyền truy cập.
  • Mở rộng: Thêm nhiều Worker Node vào cluster để tăng khả năng chịu tải.
  • Giám sát: Cài đặt các công cụ giám sát như Prometheus và Grafana để theo dõi hiệu suất của cluster và ứng dụng.
  • Triển khai ứng dụng: Bắt đầu triển khai các ứng dụng mẫu để làm quen với các khái niệm như Pods, Deployments, Services và Ingress.

Hãy tiếp tục khám phá và thử nghiệm với cluster Kubernetes mới của bạn!