Kiến thức Hữu ích 😍

Hướng dẫn tạo cụm Kubernetes với kubeadm trên Ubuntu 20.04 chi tiết


Kubernetes, thường được gọi là K8s, đang nhanh chóng trở thành tiêu chuẩn vàng trong việc quản lý và điều phối các ứng dụng container hóa. Sức mạnh của nó nằm ở khả năng tự động hóa việc triển khai, mở rộng và vận hành ứng dụng, giúp các nhà phát triển và quản trị viên hệ thống tiết kiệm thời gian và công sức. Tuy nhiên, nhiều người mới bắt đầu thường cảm thấy choáng ngợp trước sự phức tạp khi thiết lập một cụm Kubernetes từ đầu. Các bước cấu hình mạng, quản lý node và đảm bảo tính tương thích có thể trở thành rào cản lớn.

May mắn thay, việc tạo một cụm Kubernetes bằng công cụ kubeadm trên hệ điều hành Ubuntu 20.04 là một cách tiếp cận hiệu quả và tương đối dễ thực hiện. Kubeadm giúp đơn giản hóa quá trình khởi tạo cụm, cho phép bạn tập trung hơn vào việc tìm hiểu cách hoạt động của Kubernetes thay vì sa lầy vào các chi tiết cấu hình phức tạp. Trong bài viết này, chúng ta sẽ cùng nhau đi qua từng bước, từ chuẩn bị môi trường, cài đặt các thành phần cần thiết, thiết lập cụm master và worker, cấu hình mạng, cho đến quản lý và khắc phục các sự cố thường gặp.

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

Trước khi bắt đầu hành trình xây dựng cụm Kubernetes, việc chuẩn bị một môi trường sạch và đúng chuẩn là yếu tố quyết định thành công. Một môi trường được cấu hình tốt sẽ giúp quá trình cài đặt diễn ra suôn sẻ và tránh được những lỗi không đáng có về sau.

Cập nhật hệ thống và yêu cầu phần cứng

Đầu tiên, hãy đảm bảo rằng tất cả các máy chủ (cả master và worker node) đều đang chạy Ubuntu 20.04 và được cập nhật các gói mới nhất. Bạn có thể thực hiện điều này bằng cách chạy các lệnh sau trên mỗi node:

sudo apt update
sudo apt upgrade -y

Sau khi cập nhật, hãy kiểm tra lại phiên bản Ubuntu để chắc chắn bạn đang làm việc trên môi trường chính xác:

lsb_release -a

Về yêu cầu phần cứng, Kubernetes có một số khuyến nghị tối thiểu để cụm hoạt động ổn định. Đối với mỗi node, bạn cần đảm bảo:

  • CPU: Tối thiểu 2 CPU core.
  • RAM: Tối thiểu 2 GB RAM.
  • Mạng: Kết nối mạng ổn định giữa tất cả các node trong cụm. Master node và worker node phải có thể giao tiếp với nhau qua mạng.

Những yêu cầu này là mức tối thiểu để chạy một cụm cơ bản. Đối với môi trường production, bạn sẽ cần cấu hình phần cứng mạnh mẽ hơn tùy thuộc vào khối lượng công việc của ứng dụng.

Hình minh họa

Tắt swap và cấu hình các tham số kernel cần thiết

Một trong những yêu cầu quan trọng nhất của Kubernetes là bạn phải tắt swap trên tất cả các node. Tại sao lại như vậy? Kubernetes được thiết kế để quản lý tài nguyên (CPU, RAM) một cách chính xác cho các container. Khi bộ nhớ RAM đầy và hệ điều hành bắt đầu sử dụng swap (không gian lưu trữ trên đĩa cứng), Kubernetes sẽ không thể kiểm soát và dự đoán được hiệu suất của pod, dẫn đến các hành vi không mong muốn.

Để tắt swap tạm thời, hãy chạy lệnh:

sudo swapoff -a

Để tắt swap vĩnh viễn, bạn cần chỉnh sửa tệp /etc/fstab. Mở tệp này bằng một trình soạn thảo văn bản và comment (thêm dấu # ở đầu) dòng nào liên quan đến swap:

sudo sed -i '/ swap / s/^\(.*\)$/#\1/g' /etc/fstab

Hình minh họa

Tiếp theo, chúng ta cần điều chỉnh một số tham số kernel để cho phép lưu lượng truy cập đi qua bridge, điều này rất cần thiết cho mạng trong Kubernetes. Tạo một tệp cấu hình mới:

cat <<EOF | sudo tee /etc/modules-load.d/k8s.conf
br_netfilter
EOF

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

Sau đó, áp dụng các thay đổi này mà không cần khởi động lại hệ thống:

sudo sysctl --system

Việc hoàn tất các bước chuẩn bị này đảm bảo rằng môi trường của bạn đã sẵn sàng cho việc cài đặt các thành phần của Kubernetes.

Cài đặt và cấu hình kubeadm, kubelet, kubectl

Sau khi môi trường đã được chuẩn bị kỹ lưỡng, bước tiếp theo là cài đặt bộ ba công cụ cốt lõi của Kubernetes: kubeadm, kubelet, và kubectl. Mỗi công cụ có một vai trò riêng biệt: kubeadm dùng để khởi tạo và quản lý cụm, kubelet là agent chạy trên mỗi node để quản lý các container, và kubectl là giao diện dòng lệnh để tương tác với cụm.

Thêm repository Kubernetes và cài đặt gói

Để đảm bảo chúng ta cài đặt phiên bản Kubernetes chính thức và đáng tin cậy, chúng ta cần thêm kho lưu trữ (repository) của Google vào hệ thống. Trước tiên, hãy cài đặt các gói cần thiết để thêm repository qua HTTPS:

sudo apt-get update
sudo apt-get install -y apt-transport-https ca-certificates curl

Tiếp theo, tải xuống Google Cloud public signing key:

curl -s https://packages.cloud.google.com/apt/doc/apt-key.gpg | sudo apt-key add -

Bây giờ, hãy thêm kho lưu trữ Kubernetes vào danh sách nguồn của apt:

cat <<EOF | sudo tee /etc/apt/sources.list.d/kubernetes.list
deb https://apt.kubernetes.io/ kubernetes-xenial main
EOF

Sau khi đã thêm repository, hãy cập nhật lại danh sách gói và tiến hành cài đặt kubeadm, kubelet, và kubectl. Lưu ý rằng bạn nên thực hiện việc này trên tất cả các node (cả master và worker).

sudo apt-get update
sudo apt-get install -y kubelet kubeadm kubectl

Hình minh họa

Khóa phiên bản và cấu hình dịch vụ kubelet

Một trong những rủi ro khi quản trị hệ thống là việc các gói phần mềm tự động nâng cấp lên phiên bản mới có thể gây ra lỗi không tương thích. Để tránh điều này, chúng ta nên khóa phiên bản của kubelet, kubeadm, và kubectl lại. Điều này đảm bảo rằng các công cụ sẽ không tự động cập nhật mà không có sự can thiệp của bạn.
Sử dụng lệnh sau để khóa phiên bản:

sudo apt-mark hold kubelet kubeadm kubectl

Khi bạn muốn nâng cấp cụm Kubernetes sau này, bạn sẽ cần phải unhold các gói này, nâng cấp, và sau đó hold lại.
Cuối cùng, hãy kích hoạt (enable) và khởi động (start) dịch dung kubelet. Dịch vụ này sẽ luôn chạy nền trên các node để lắng nghe chỉ thị từ master node.

sudo systemctl daemon-reload
sudo systemctl enable kubelet
sudo systemctl start kubelet

Đến đây, các thành phần cần thiết đã được cài đặt và sẵn sàng để chúng ta bắt đầu xây dựng cụm Kubernetes.

Thiết lập cụm Kubernetes bằng kubeadm

Với tất cả các công cụ đã được cài đặt và cấu hình, chúng ta đã sẵn sàng cho bước thú vị nhất: khởi tạo cụm Kubernetes. Quá trình này bao gồm hai giai đoạn chính: khởi tạo node master để tạo ra “bộ não” của cụm và sau đó kết nạp các node worker để cung cấp tài nguyên tính toán.

Khởi tạo cụm Master với kubeadm

Quá trình này chỉ được thực hiện trên node mà bạn đã chọn làm master. Lệnh kubeadm init sẽ thực hiện một loạt các kiểm tra và thiết lập để tạo ra control plane của Kubernetes. Một tham số quan trọng cần chỉ định là --pod-network-cidr, đây là dải địa chỉ IP mà các pod trong cụm sẽ sử dụng.
Hãy chạy lệnh sau trên master node:

sudo kubeadm init --pod-network-cidr=192.168.0.0/16

Quá trình này có thể mất vài phút. Nếu thành công, bạn sẽ thấy một thông báo chứa các lệnh cần thiết để cấu hình kubectl và một lệnh kubeadm join để thêm các node worker. Hãy sao chép và lưu lại những thông tin này cẩn thận.

Hình minh họa

Để bắt đầu sử dụng cụm, bạn cần cấu hình kubectl để nó biết cách kết nối đến control plane. Chạy các lệnh sau trên master node (như được hướng dẫn trong output của kubeadm init):

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

Bây giờ, bạn có thể thử lệnh kubectl get nodes để xem trạng thái của master node. Bạn sẽ thấy node này đang ở trạng thái NotReady vì chúng ta chưa cài đặt plugin mạng.

Thêm các node Worker vào cụm

Bây giờ là lúc mở rộng cụm bằng cách thêm các worker node. Hãy sử dụng lệnh kubeadm join mà bạn đã lưu lại từ bước trước. Lệnh này chứa một token và một mã hash để xác thực và thiết lập kết nối an toàn đến master node.
Chạy lệnh kubeadm join trên mỗi worker node. Lệnh sẽ có dạng như sau:

sudo kubeadm join <địa-chỉ-ip-master>:<cổng> --token <token> --discovery-token-ca-cert-hash sha256:<hash>

Nếu bạn vô tình làm mất token, bạn có thể tạo một token mới trên master node bằng lệnh:

kubeadm token create --print-join-command

Sau khi các worker node đã join thành công, bạn có thể quay lại master node và chạy lại lệnh kubectl get nodes. Lúc này, bạn sẽ thấy tất cả các node đã được liệt kê, nhưng chúng vẫn ở trạng thái NotReady. Bước tiếp theo sẽ giải quyết vấn đề này.

Hình minh họa

Cấu hình mạng và kiểm tra trạng thái cụm

Một cụm Kubernetes sẽ không thể hoạt động nếu không có mạng. Các thành phần trong cụm, đặc biệt là các pod, cần giao tiếp với nhau qua một mạng ảo. Đây là lúc các plugin mạng (CNI – Container Network Interface) phát huy tác dụng. Chúng tạo ra một lớp mạng overlay cho phép các container trên các node khác nhau có thể “nói chuyện” với nhau.

C cài đặt plugin mạng (Calico/Flannel)

Có nhiều plugin mạng phổ biến, mỗi loại có ưu và nhược điểm riêng. Hai trong số những lựa chọn phổ biến và dễ cài đặt nhất là Calico và Flannel.

  • Flannel: Đơn giản, dễ sử dụng, phù hợp cho người mới bắt đầu và các cụm nhỏ.
  • Calico: Mạnh mẽ hơn, hỗ trợ các chính sách mạng (Network Policies) để kiểm soát lưu lượng truy cập giữa các pod, phù hợp cho môi trường production.

Trong hướng dẫn này, chúng ta sẽ sử dụng Calico. Để triển khai Calico, bạn chỉ cần áp dụng một tệp manifest YAML từ trang web chính thức của họ. Hãy chắc chắn rằng dải IP bạn cung cấp cho Calico khớp với tham số --pod-network-cidr bạn đã dùng khi khởi tạo cụm (trong ví dụ này là 192.168.0.0/16).
Chạy lệnh sau trên master node:

kubectl apply -f https://docs.projectcalico.org/manifests/calico.yaml

Hình minh họa

Việc áp dụng tệp manifest này sẽ tạo ra các pod cần thiết (như calico-node, calico-kube-controllers) để quản lý mạng trong cụm.

Kiểm tra trạng thái các node và pod

Sau khi cài đặt plugin mạng, hãy đợi một vài phút để các pod của Calico được khởi tạo và chạy trên tất cả các node. Bạn có thể theo dõi tiến trình bằng lệnh:

kubectl get pods --all-namespaces

Lệnh này sẽ hiển thị tất cả các pod trong tất cả các namespace. Hãy chú ý đến các pod trong namespace kube-system, đặc biệt là các pod có tên bắt đầu bằng calico. Khi tất cả các pod này ở trạng thái Running, mạng của bạn đã sẵn sàng.
Bây giờ, hãy kiểm tra lại trạng thái của các node:

kubectl get nodes

Lúc này, bạn sẽ thấy trạng thái của tất cả các node đã chuyển thành Ready. Điều này có nghĩa là cụm Kubernetes của bạn đã được thiết lập thành công và sẵn sàng để triển khai ứng dụng.

Hình minh họa

Hướng dẫn cơ bản quản lý cụm Kubernetes

Khi cụm đã ở trạng thái sẵn sàng, bạn có thể bắt đầu khai thác sức mạnh của Kubernetes bằng cách triển khai và quản lý các ứng dụng. Việc quản lý cụm bao gồm các hoạt động từ triển khai ứng dụng, giám sát hiệu suất cho đến việc bảo trì và nâng cấp.

Triển khai ứng dụng đơn giản trên cụm

Cách phổ biến nhất để triển khai ứng dụng trên Kubernetes là sử dụng đối tượng Deployment. Một Deployment cho phép bạn mô tả trạng thái mong muốn của ứng dụng, ví dụ như “tôi muốn chạy 3 bản sao của container Nginx”. Kubernetes sẽ tự động làm việc để đạt được và duy trì trạng thái đó.
Hãy tạo một Deployment đơn giản cho Nginx:

kubectl create deployment nginx-app --image=nginx

Để cho phép truy cập vào ứng dụng Nginx từ bên ngoài, chúng ta cần tạo một Service. Service sẽ mở một cổng trên các node và điều hướng lưu lượng truy cập đến các pod của Deployment.

kubectl expose deployment nginx-app --type=NodePort --port=80

Bạn có thể kiểm tra trạng thái của pod và service vừa tạo:

kubectl get pods
kubectl get services

Để theo dõi logs của một pod cụ thể, bạn có thể dùng lệnh:

kubectl logs <tên-pod-nginx>

Lệnh này rất hữu ích để gỡ lỗi khi ứng dụng của bạn không hoạt động như mong đợi.

Giám sát và bảo trì cụm Kubernetes

Giám sát là một phần không thể thiếu trong việc quản lý cụm. Bạn cần biết cụm của mình đang hoạt động như thế nào, tài nguyên có đang được sử dụng hiệu quả hay không. Một số công cụ giám sát cơ bản có thể kể đến:

  • Kubernetes Dashboard: Giao diện web chính thức để quản lý và giám sát cụm.
  • Prometheus & Grafana: Bộ đôi mạnh mẽ để thu thập số liệu và trực quan hóa dashboard.
  • Metrics Server: Cung cấp các số liệu cơ bản về tài nguyên (CPU, RAM) cho các lệnh như kubectl top nodekubectl top pod.

Hình minh họa

Bảo trì cụm, chẳng hạn như nâng cấp phiên bản Kubernetes, cần được thực hiện một cách cẩn thận. Quy trình chung là nâng cấp control plane trước, sau đó lần lượt nâng cấp kubelet trên từng node. kubeadm cung cấp các lệnh để hỗ trợ quá trình nâng cấp này một cách an toàn. Luôn đọc kỹ tài liệu hướng dẫn nâng cấp trước khi tiến hành để tránh làm gián đoạn dịch vụ.

Các vấn đề thường gặp và khắc phục

Ngay cả với sự chuẩn bị kỹ lưỡng nhất, bạn vẫn có thể gặp phải một số vấn đề trong quá trình thiết lập và vận hành cụm Kubernetes. Hiểu rõ nguyên nhân và cách khắc phục các lỗi phổ biến sẽ giúp bạn tiết kiệm rất nhiều thời gian và công sức.

Node không thể join cụm

Đây là một trong những vấn đề đầu tiên mà người mới thường gặp phải. Khi bạn chạy lệnh kubeadm join trên một worker node nhưng nó không thể kết nối đến master, hãy kiểm tra các nguyên nhân sau:

  • Kết nối mạng: Đảm bảo rằng worker node có thể ping được địa chỉ IP của master node. Kiểm tra tường lửa (firewall) trên cả hai node để chắc chắn rằng các cổng cần thiết của Kubernetes (ví dụ: 6443) không bị chặn.
  • Token hết hạn: Token dùng để join cụm chỉ có hiệu lực trong một khoảng thời gian nhất định (mặc định là 24 giờ). Nếu token đã hết hạn, bạn cần tạo một token mới trên master node bằng lệnh kubeadm token create --print-join-command.
  • Thời gian không đồng bộ: Kubernetes yêu cầu thời gian trên tất cả các node phải được đồng bộ hóa. Nếu thời gian giữa master và worker bị lệch, quá trình xác thực chứng chỉ TLS có thể thất bại. Hãy sử dụng dịch vụ NTP (Network Time Protocol) để đồng bộ thời gian trên toàn bộ cụm.
  • Phiên bản không tương thích: Đảm bảo phiên bản kubeadm trên worker node khớp với phiên bản trên master node.

Pod không khởi động hoặc CrashLoopBackOff

Khi bạn triển khai một ứng dụng nhưng pod của nó kẹt ở trạng thái Pending hoặc liên tục khởi động lại (CrashLoopBackOff), đây là những điểm bạn cần kiểm tra:

  • Trạng thái Pending: Thường là do không đủ tài nguyên (CPU, RAM) trên các node để lên lịch cho pod, hoặc pod yêu cầu một loại tài nguyên đặc biệt (ví dụ: PersistentVolume) mà chưa được đáp ứng. Sử dụng lệnh kubectl describe pod <tên-pod> để xem phần Events, nó sẽ cho bạn biết lý do tại sao pod không được lên lịch.
  • Trạng thái CrashLoopBackOff: Điều này có nghĩa là container bên trong pod đã khởi động nhưng lại bị lỗi và thoát ngay lập tức. Kubernetes cố gắng khởi động lại nó, nhưng lỗi tiếp tục xảy ra. Nguyên nhân phổ biến nhất là do lỗi trong ứng dụng của bạn (ví dụ: cấu hình sai, lỗi code). Hãy kiểm tra logs của pod bằng lệnh kubectl logs <tên-pod>kubectl logs --previous <tên-pod> (để xem logs của lần chạy trước đó) để tìm ra nguyên nhân gây lỗi.
  • Trạng thái ImagePullBackOff: Kubernetes không thể tải về container image được chỉ định. Nguyên nhân có thể là do tên image sai, tag không tồn tại, hoặc không có quyền truy cập vào private registry.

Hình minh họa

Các lưu ý và Best practices khi tạo cụm Kubernetes

Xây dựng một cụm Kubernetes hoạt động chỉ là bước khởi đầu. Để vận hành một cụm ổn định, an toàn và hiệu quả, việc tuân thủ các nguyên tắc và thực hành tốt nhất (best practices) là vô cùng quan trọng. Dưới đây là những lưu ý bạn nên ghi nhớ.

  • Tắt swap là bắt buộc: Như đã đề cập, Kubernetes yêu cầu tắt swap để đảm bảo việc quản lý tài nguyên được chính xác và hiệu suất ổn định. Đây là một yêu cầu không thể bỏ qua.
  • Đồng bộ thời gian giữa các node: Sử dụng NTP để đảm bảo thời gian trên tất cả các node là nhất quán. Sai lệch thời gian có thể gây ra các lỗi khó chẩn đoán liên quan đến xác thực chứng chỉ và ghi log.
  • Sử dụng phiên bản tương thích: Luôn đảm bảo rằng phiên bản của kubeadm, kubelet, và kubectl là tương thích với nhau trên toàn bộ cụm. Việc sử dụng các phiên bản lệch nhau có thể dẫn đến các hành vi không mong muốn.
  • Luôn có kế hoạch backup etcd: etcd là cơ sở dữ liệu lưu trữ toàn bộ trạng thái của cụm Kubernetes. Mất dữ liệu etcd đồng nghĩa với việc mất toàn bộ cụm. Hãy thiết lập cơ chế backup etcd tự động và thường xuyên để có thể khôi phục lại cụm khi có sự cố xảy ra. Tham khảo thêm backup là gì để biết chi tiết về sao lưu dữ liệu.
  • Giới hạn quyền truy cập kubeconfig: Tệp kubeconfig chứa thông tin xác thực để truy cập cụm với quyền quản trị cao nhất. Hãy bảo vệ tệp này cẩn thận, không chia sẻ nó một cách không cần thiết và sử dụng các cơ chế RBAC (Role-Based Access Control) để tạo ra các tài khoản với quyền hạn giới hạn cho người dùng và ứng dụng.

Việc tuân thủ những nguyên tắc này không chỉ giúp cụm của bạn hoạt động ổn định hơn mà còn tạo nền tảng vững chắc để bạn mở rộng và phát triển hệ thống trong tương lai.

Kết luận

Việc thiết lập một cụm Kubernetes bằng kubeadm trên Ubuntu 20.04 là một cách tuyệt vời để bắt đầu hành trình chinh phục công nghệ điều phối container mạnh mẽ này. Bằng cách đi qua từng bước từ chuẩn bị môi trường, cài đặt các công cụ cần thiết, khởi tạo master node, thêm các worker node và cấu hình mạng, bạn đã xây dựng thành công một nền tảng vững chắc để triển khai và quản lý các ứng dụng hiện đại. Quá trình này giúp bạn hiểu sâu hơn về kiến trúc và cách các thành phần của Kubernetes tương tác với nhau.

Chúng tôi khuyến khích bạn hãy bắt tay vào thực hành theo hướng dẫn để củng cố kiến thức và nắm vững kỹ năng quản trị Kubernetes. Đừng ngần ngại thử nghiệm, triển khai các ứng dụng của riêng mình và khám phá các tính năng của cụm. Khi đã quen thuộc với các khái niệm cơ bản, bạn có thể tiến xa hơn bằng cách tìm hiểu các công cụ nâng cao như Helm để quản lý các gói ứng dụng, hoặc thiết lập các quy trình CI/CD để tự động hóa việc triển khai ứng dụng lên Kubernetes. Chúc bạn thành công trên con đường trở thành một chuyên gia Kubernetes.

Đánh giá