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

Hướng dẫn cài đặt Kubernetes trên Ubuntu dễ dàng và hiệu quả


Chắc hẳn bạn đã nghe nhiều về container và Docker là gì, nhưng khi số lượng container tăng lên, việc quản lý chúng thủ công trở nên vô cùng phức tạp. Làm thế nào để tự động hóa việc triển khai, mở rộng quy mô và giám sát hàng trăm, thậm chí hàng ngàn container một cách hiệu quả? Đây chính là lúc Kubernetes là gì xuất hiện như một vị cứu tinh. Kubernetes đã nhanh chóng trở thành tiêu chuẩn vàng trong ngành, giúp các nhà phát triển và quản trị hệ thống điều phối container một cách liền mạch, giải quyết các thách thức về vận hành ở quy mô lớn. Bài viết này sẽ hướng dẫn bạn chi tiết từng bước cài đặt Kubernetes trên Ubuntu, từ việc chuẩn bị môi trường cho đến cấu hình một cluster hoàn chỉnh, giúp bạn đặt những viên gạch đầu tiên trên hành trình chinh phục công nghệ mạnh mẽ này.

Giới thiệu về Kubernetes và vai trò trong quản lý container

Bạn có bao giờ tự hỏi tại sao Kubernetes lại trở thành một công nghệ gần như bắt buộc trong thế giới phát triển phần mềm hiện đại? Để hiểu được điều này, chúng ta hãy quay lại với bài toán quản lý container truyền thống. Khi chỉ có vài container, việc quản lý bằng tay có vẻ khả thi. Nhưng khi ứng dụng của bạn phát triển, số lượng container tăng lên theo cấp số nhân, kéo theo đó là hàng loạt vấn đề: làm sao để triển khai phiên bản mới mà không gây gián đoạn dịch vụ? Làm sao để tự động mở rộng khi lưu lượng truy cập tăng đột biến và thu hẹp lại để tiết kiệm chi phí? Làm sao để các container có thể giao tiếp với nhau một cách an toàn và ổn định?

Đây chính là những thách thức mà việc quản lý thủ công không thể giải quyết hiệu quả. Kubernetes ra đời để giải quyết chính xác những vấn đề này. Nó là một hệ thống điều phối container mã nguồn mở, giúp tự động hóa hoàn toàn vòng đời của ứng dụng container hóa. Kubernetes cung cấp các cơ chế mạnh mẽ để triển khai, tự phục hồi, mở rộng và quản lý tài nguyên một cách thông minh. Nó giống như một “nhạc trưởng” tài ba, điều khiển dàn “nhạc công” là các container của bạn hoạt động một cách nhịp nhàng và hiệu quả. Trong bài viết này, chúng ta sẽ cùng nhau đi qua các bước cụ thể để cài đặt một cluster Kubernetes trên hệ điều hành Linux là gì Ubuntu, từ đó tạo nền tảng vững chắc để bạn triển khai và quản lý các ứng dụng của mình.

Yêu cầu hệ thống và chuẩn bị môi trường trên Ubuntu

Trước khi bắt đầu cài đặt, việc chuẩn bị một môi trường đạt chuẩn là yếu tố quyết định sự thành công. Đảm bảo hệ thống của bạn đáp ứng các yêu cầu tối thiểu 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ó.

Yêu cầu phần cứng và phần mềm tối thiểu

Để vận hành một cluster Kubernetes, bạn cần ít nhất hai máy ảo hoặc máy chủ vật lý chạy Ubuntu. Một máy sẽ đóng vai trò là Master Node (nơi điều khiển hoạt động của cluster) và các máy còn lại là Worker Node (nơi thực thi các container).

  • Master Node:
    • CPU: Tối thiểu 2 nhân (vCPUs).
    • Bộ nhớ (RAM): Tối thiểu 2 GB.
    • Dung lượng đĩa: Tối thiểu 20 GB dung lượng trống.
  • Worker Node:
    • CPU: Tối thiểu 1 nhân (vCPU).
    • Bộ nhớ (RAM): Tối thiểu 1 GB.
    • Dung lượng đĩa: Tối thiểu 15 GB dung lượng trống.

Về phần mềm, bài hướng dẫn này tương thích tốt nhất với các phiên bản Ubuntu 20.04 LTS hoặc 22.04 LTS. Hãy đảm bảo tất cả các node trong cluster có thể kết nối mạng với nhau. Ubuntu là một trong những Linux Server là gì phổ biến nhất để triển khai Kubernetes.

Hình minh họa

Cài đặt các công cụ hỗ trợ

Sau khi đã có phần cứng và hệ điều hành phù hợp, chúng ta cần cài đặt các gói phần mềm cần thiết. Hãy thực hiện các bước sau trên tất cả các node (cả master và worker).

Đầu tiên, cập nhật hệ thống để đảm bảo bạn có các gói mới nhất:

sudo apt-get update && sudo apt-get upgrade -y

Tiếp theo, cài đặt Docker, là container runtime mà Kubernetes sẽ sử dụng:

sudo apt-get install -y docker.io
sudo systemctl enable --now docker

Hình minh họa

Một bước cực kỳ quan trọng là tắt swap. Kubernetes yêu cầu tắt swap để kubelet có thể quản lý tài nguyên một cách chính xác.

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

Cuối cùng, chúng ta sẽ thêm kho lưu trữ của Kubernetes và cài đặt các công cụ chính: kubeadm, kubelet, và kubectl.

sudo apt-get install -y apt-transport-https curl
curl -s https://packages.cloud.google.com/apt/doc/apt-key.gpg | sudo apt-key add -
echo "deb https://apt.kubernetes.io/ kubernetes-xenial main" | sudo tee /etc/apt/sources.list.d/kubernetes.list
sudo apt-get update
sudo apt-get install -y kubelet kubeadm kubectl
sudo apt-mark hold kubelet kubeadm kubectl

Sau khi hoàn tất các bước này, môi trường của bạn đã sẵn sàng cho việc cài đặt Kubernetes là gì.

Các bước cài đặt Kubernetes trên Ubuntu

Khi môi trường đã được chuẩn bị kỹ lưỡng, chúng ta sẽ tiến hành cài đặt cluster Kubernetes. Quá trình này bao gồm hai giai đoạn chính: khởi tạo Master Node để tạo ra “bộ não” của cluster, sau đó kết nối các Worker Node vào để mở rộng năng lực tính toán.

Khởi tạo master node với kubeadm

Trên máy chủ bạn đã chọn làm Master Node, hãy chạy lệnh sau để khởi tạo cluster. Lệnh này sẽ cài đặt và cấu hình các thành phần cốt lõi của control plane.

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

Hãy cùng phân tích lệnh này:

  • kubeadm init: Là lệnh chính để khởi tạo cluster.
  • --pod-network-cidr=192.168.0.0/16: Đây là một tùy chọn rất quan trọng. Nó định nghĩa dải địa chỉ IP sẽ được cấp cho các Pods (container) trong cluster. Dải IP này phải được chọn sao cho không xung đột với mạng nội bộ của bạn. Chúng ta sẽ sử dụng dải IP này khi cài đặt network plugin ở bước sau.

Hình minh họa

Sau khi lệnh chạy thành công, bạn sẽ thấy một thông báo quan trọng ở cuối màn hình. Nó chứa các lệnh cần thiết để cấu hình kubectl cho người dùng của bạn và một lệnh kubeadm join kèm theo token. Hãy sao chép và lưu lại lệnh join này một cách cẩn thận, vì bạn sẽ cần nó để thêm các worker node.

Để bắt đầu sử dụng cluster, hãy chạy các lệnh sau trên master node (như được hướng dẫn trong output):

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 các worker node vào cluster

Bây giờ, hãy chuyển sang các máy chủ Worker Node. Sử dụng lệnh kubeadm join mà bạn đã lưu lại từ bước trước. Dán và chạy lệnh đó với quyền sudo 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>

Hình minh họa

Lệnh này sẽ kết nối worker node vào control plane do master node quản lý. Quá trình này có thể mất vài phút.

Sau khi đã thêm tất cả các worker node, quay trở lại Master Node và chạy lệnh sau để kiểm tra trạng thái của cluster:

kubectl get nodes

Bạn sẽ thấy danh sách tất cả các node (cả master và worker) đã tham gia vào cluster. Ban đầu, trạng thái của chúng có thể là NotReady. Đừng lo lắng, đây là điều bình thường vì chúng ta chưa cài đặt network plugin. Chúng ta sẽ giải quyết vấn đề này trong phần tiếp theo.

Hình minh họa

Cấu hình cluster Kubernetes cơ bản

Một cluster Kubernetes sau khi khởi tạo vẫn chưa thể hoạt động hoàn chỉnh. Chúng ta cần cài đặt một thành phần quan trọng là Network Plugin để các container (Pods) có thể giao tiếp với nhau. Sau đó, chúng ta sẽ kiểm tra lại toàn bộ hệ thống để đảm bảo mọi thứ đã sẵn sàng.

Cài đặt network plugin (Calico, Flannel…)

Network Plugin (còn gọi là CNI – Container Network Interface) là trái tim của hệ thống mạng trong Kubernetes. Nó chịu trách nhiệm cấp phát địa chỉ IP cho mỗi Pod và thiết lập các quy tắc định tuyến để chúng có thể “nói chuyện” với nhau, ngay cả khi chúng nằm trên các Worker Node khác nhau.

Có nhiều CNI phổ biến như Calico, Flannel, và Weave Net. Trong hướng dẫn này, chúng ta sẽ sử dụng Calico, một lựa chọn mạnh mẽ và phổ biến, hỗ trợ các chính sách mạng (Network Policies) nâng cao.

Trên Master Node, hãy chạy lệnh sau để cài đặt Calico:

kubectl apply -f https://raw.githubusercontent.com/projectcalico/calico/v3.26.1/manifests/calico.yaml

Hình minh họa

Lệnh này sẽ tải file cấu hình YAML của Calico từ internet và áp dụng nó vào cluster. Kubernetes sẽ tự động đọc file này và tạo ra các Pods cần thiết để mạng Calico hoạt động. Quá trình này có thể mất vài phút để các container của Calico được tải về và khởi chạy trên tất cả các node.

Kiểm tra core components và trạng thái cluster

Sau khi cài đặt network plugin, chúng ta cần kiểm tra lại để chắc chắn rằng mọi thứ đã hoạt động ổn định.

Đầu tiên, hãy kiểm tra lại trạng thái các node:

kubectl get nodes

Lúc này, bạn sẽ thấy cột STATUS của tất cả các node đã chuyển thành Ready. Điều này xác nhận rằng network plugin đã được cài đặt thành công và các node đã kết nối hoàn chỉnh với nhau.

Tiếp theo, hãy kiểm tra các thành phần hệ thống cốt lõi của Kubernetes. Các thành phần này chạy trong một namespace riêng biệt có tên là kube-system.

kubectl get pods -n kube-system

Hình minh họa

Bạn sẽ thấy một danh sách các pod như etcd, kube-apiserver, kube-scheduler, kube-controller-manager trên master node, và kube-proxy, calico-node trên tất cả các node. Miễn là tất cả các pod này đều ở trạng thái Running, cluster của bạn đã được cấu hình đúng và sẵn sàng để triển khai ứng dụng.

Kiểm tra và xác nhận hoạt động của Kubernetes trên Ubuntu

Sau khi đã cài đặt và cấu hình xong, bước cuối cùng là triển khai một ứng dụng mẫu để kiểm chứng rằng cluster của chúng ta thực sự hoạt động. Điều này giúp bạn hiểu rõ hơn về luồng làm việc cơ bản trong Kubernetes.

Triển khai ứng dụng mẫu trên cluster

Chúng ta sẽ triển khai một ứng dụng web Nginx đơn giản. Trong Kubernetes, ứng dụng thường được định nghĩa thông qua các file YAML. Hãy tạo một file tên là nginx-test.yaml với nội dung sau:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
spec:
  replicas: 2
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:1.21.0
        ports:
        - containerPort: 80
---
apiVersion: v1
kind: Service
metadata:
  name: nginx-service
spec:
  selector:
    app: nginx
  type: NodePort
  ports:
    - protocol: TCP
      port: 80
      targetPort: 80

File này định nghĩa hai đối tượng: một Deployment để chạy 2 bản sao của Nginx và một Service loại NodePort để đưa ứng dụng ra bên ngoài cluster.

Bây giờ, hãy áp dụng file này bằng lệnh kubectl trên master node:

kubectl apply -f nginx-test.yaml

Kubernetes sẽ bắt đầu tạo các Pods Nginx. Bạn có thể kiểm tra trạng thái của chúng:

kubectl get pods

Khi các pod đã ở trạng thái Running, hãy kiểm tra Service để xem cổng nào đã được mở ra trên các node:

kubectl get service nginx-service

Bạn sẽ thấy một cổng ngẫu nhiên trong khoảng 30000-32767 được gán cho cổng 80 của Nginx. Bây giờ, hãy mở trình duyệt và truy cập vào địa chỉ http://<địa-chỉ-ip-worker-node>:<cổng-nodeport>. Bạn sẽ thấy trang chào mừng của Nginx.

Hình minh họa

Giám sát và kiểm tra các resource trong cluster

Kubernetes cung cấp nhiều công cụ dòng lệnh để bạn giám sát và gỡ lỗi. kubectl là công cụ mạnh mẽ nhất.

Để xem thông tin chi tiết về một Pod, bao gồm các sự kiện (events) liên quan đến nó, hãy dùng lệnh describe:

kubectl describe pod <tên-pod-nginx-của-bạn>

Lệnh này cực kỳ hữu ích khi một pod không khởi động được hoặc gặp lỗi.

Để xem mức sử dụng CPU và bộ nhớ của các node và pod, bạn có thể sử dụng lệnh top (có thể cần cài đặt Metrics Server trước):

kubectl top nodes
kubectl top pods

Việc làm quen với các lệnh này sẽ giúp bạn quản lý và vận hành cluster của mình một cách hiệu quả hơn, đảm bảo các ứng dụng luôn hoạt động ổn định.

Hình minh họa

Các lưu ý và kinh nghiệm khi triển khai Kubernetes

Cài đặt một cluster Kubernetes thành công là một thành tựu lớn, nhưng hành trình vận hành nó mới thực sự bắt đầu. Dưới đây là một số vấn đề thường gặp và kinh nghiệm thực tế để giúp bạn quản lý cluster của mình một cách hiệu quả và an toàn hơn.

Các vấn đề thường gặp trong quá trình cài đặt

Quá trình cài đặt có thể gặp một số trở ngại phổ biến. Việc nhận biết sớm sẽ giúp bạn tiết kiệm rất nhiều thời gian gỡ lỗi.

  • Swap chưa được tắt: Đây là lỗi phổ biến nhất. Kubelet sẽ từ chối khởi động nếu swap được kích hoạt. Hãy đảm bảo bạn đã chạy sudo swapoff -a và xóa mục swap trong /etc/fstab trên tất cả các node.
  • Cgroup driver không khớp: Docker và Kubelet phải sử dụng cùng một cgroup driver (thường là systemd). Nếu không, kubelet sẽ không thể quản lý tài nguyên của container đúng cách.
  • Firewall chặn kết nối: Các node trong cluster cần giao tiếp với nhau qua một số cổng nhất định. Hãy đảm bảo firewall của bạn (ví dụ: ufw) cho phép lưu lượng truy cập qua các cổng mà Kubernetes yêu cầu, chẳng hạn như cổng 6443 trên master node.
  • Phiên bản không tương thích: Luôn đảm bảo phiên bản của kubeadm, kubelet, kubectl và Docker tương thích với nhau. Đọc kỹ tài liệu chính thức của Kubernetes trước khi cài đặt là một thói quen tốt.

Kinh nghiệm tối ưu hiệu suất và bảo mật

Khi cluster đã đi vào hoạt động, việc tối ưu và bảo mật là ưu tiên hàng đầu.

  • Quản lý quyền truy cập (RBAC): Mặc định, Kubernetes sử dụng Role-Based Access Control (RBAC). Đừng bao giờ sử dụng tài khoản admin cho các tác vụ hàng ngày. Hãy tạo các vai trò (Roles) và ràng buộc vai trò (RoleBindings) với quyền hạn tối thiểu cần thiết cho từng người dùng hoặc dịch vụ.
  • Cấu hình Firewall và Network Policies: Sử dụng Network Policies (được hỗ trợ bởi CNI như Calico) để kiểm soát luồng giao tiếp giữa các Pods. Chỉ cho phép các kết nối thực sự cần thiết để giảm bề mặt tấn công.
  • Quản lý tài nguyên: Luôn định nghĩa requestslimits cho CPU và bộ nhớ của các container. Điều này giúp Kubernetes lập lịch (schedule) các Pods một cách thông minh hơn và ngăn chặn một ứng dụng “ngốn” hết tài nguyên của một node.
  • Backup cấu hình và dữ liệu: Dữ liệu trạng thái của cluster được lưu trong etcd. Việc sao lưu etcd thường xuyên là cực kỳ quan trọng để có thể khôi phục lại cluster khi có sự cố. Các công cụ như Backup là gì và Velero cũng có thể giúp bạn sao lưu toàn bộ tài nguyên và dữ liệu ứng dụng.

Kết luận

Qua bài viết này, chúng ta đã cùng nhau đi qua một hành trình chi tiết để cài đặt và cấu hình một cluster Kubernetes trên nền tảng Ubuntu. Từ việc chuẩn bị môi trường, yêu cầu hệ thống, khởi tạo master node, kết nối các worker node, cho đến việc cài đặt network plugin và triển khai ứng dụng thử nghiệm, bạn đã nắm được những bước cơ bản nhưng vô cùng quan trọng để xây dựng nền tảng cho hệ thống của mình. Lợi ích của Kubernetes trong việc tự động hóa, mở rộng và quản lý container là không thể bàn cãi, và việc tự tay cài đặt một cluster là cách tốt nhất để hiểu sâu hơn về cách nó hoạt động.

Tuy nhiên, đây mới chỉ là điểm khởi đầu. Thế giới của Kubernetes còn rất rộng lớn với nhiều khái niệm nâng cao như Deployments, Services, Ingress, Persistent Volumes, và Helm. AZWEB khuyến khích bạn hãy tiếp tục thực hành, thử nghiệm triển khai các ứng dụng phức tạp hơn và khám phá hệ sinh thái phong phú xung quanh Kubernetes. Nếu bạn cần một môi trường VPS mạnh mẽ và ổn định để thực hành, các gói dịch vụ VPS của AZWEB luôn sẵn sàng đáp ứng nhu cầu của bạn. Chúc bạn thành công trên con đường chinh phục công nghệ điều phối container hàng đầu thế giới này.

Đánh giá