Kubernetes là một hệ thống quản lý, điều phối các ứng dụng chạy trên các container của các cụm máy chủ (cluster). Trong bài viết này, Stringee sẽ hướng dẫn chi tiết cách tạo một cụm Kubernetes bằng Kubeadm trên Ubuntu chỉ trong vài phút.

1. Cài đặt Kubernetes Cluster cần những gì?

Kubernetes (hay K8s) là một nền tảng mã nguồn mở tự động hóa việc quản lý, scaling và triển khai ứng dụng dưới dạng container hay còn gọi là Container orchestration engine. Nó loại bỏ rất nhiều các quy trình thủ công liên quan đến việc triển khai và mở rộng các containerized applications.

>>> Xem thêm: Monitoring trên K8s cluster với Prometheus và Grafana

Kubeadm là một công cụ giúp tự động hóa quá trình cài đặt và triển khai kubernetes trên môi trường Linux, do chính kubernetes hỗ trợ. Kubeadm hỗ trợ các nền tảng là Ubuntu 16.04, CentOS 7 or HypriotOS v1.

Ansible là một công cụ mã nguồn mở để cung cấp phần mềm và triển khai ứng dụng. Saltstack là phần mềm mã nguồn mở để tự động hóa công nghệ thông tin do các event thúc đẩy. Đây là hai công cụ giúp tạo các cluster bổ sung hoặc tạo lại các cluster hiện có ít bị lỗi hơn và có thể được sử dụng cho các tác vụ sơ bộ này. 

Cluster sẽ bao gồm các tài nguyên vật lý sau:

- Master node là nút kiểm soát và quản lý một tập hợp các worker node (workloads runtime) và giống như một cluster trong Kubernetes. Nó cũng nắm giữ kế hoạch tài nguyên của node để xác định hành động thích hợp cho event được kích hoạt. Nó chạy etcd, một kho lưu trữ key-value phân tán mã nguồn mở được sử dụng để lưu giữ và quản lý dữ liệu cluster giữa các thành phần lên lịch workload cho các worker node.

- 2 worker node là các nút tiếp tục công việc được giao ngay cả khi master node ngừng hoạt động sau khi lập lịch hoàn tất. Các worker node là các máy chủ nơi workload của bạn (tức là các ứng dụng và dịch vụ được tích hợp sẵn) sẽ chạy. Bạn cũng có thể tăng công suất của cluster bằng cách thêm các worker.

Sau khi hoàn thành hướng dẫn này, bạn sẽ có một cluster đầy đủ chức năng sẵn sàng để chạy workload (tức là các application và service được chứa trong container) nếu các máy chủ trong cluster có đủ tài nguyên CPU và RAM để các ứng dụng của bạn chạy. Sau khi bạn đã thiết lập thành công cluster, bạn có thể chạy hầu hết mọi ứng dụng UNIX truyền thống. Nó có thể được chứa trong cluster của bạn, bao gồm các ứng dụng web, cơ sở dữ liệu, daemon và các công cụ command-line.

Bản thân cluster sẽ tiêu thụ khoảng 300-500MB bộ nhớ và 10% CPU trên mỗi node.

2. Các bước cài đặt Kubernetes Cluster

Bước 1: Tạo thư mục cho workspace và tệp Ansible inventory

Trước hết, bạn cần thiết lập Ansible trên máy local của mình. Từ đó, bạn có thể thực hiện các lệnh trên các máy chủ remote của mình, giúp chúng ta có thể tự động hóa quá trình triển khai. Để có thể tạo được các kịch bản triển khai cho cluster của mình, bạn cần tạo một thực mục trên máy local của mình để làm một workspace.

Khi bạn tạo một thư mục, bạn sẽ tạo một tệp hosts để lưu trữ tất cả thông tin về địa chỉ IP và group của mỗi máy chủ. Nó sẽ giúp bạn lưu trữ thông tin inventory bên trong. Như đã nói trước đó, sẽ có 3 máy chủ, 1 master node và 2 worker node. Máy chủ chính sẽ là máy chủ có IP được hiển thị là master_ip. Hai máy chủ còn lại sẽ có IP là worker_1_ip và worker_2_ip.

Bạn cần tạo một thư mục có tên ~/kube-cluster trong thư mục chính của local machine và truy cập thư mục đó bằng lệnh cd:

mkdir ~/kube-cluster
cd ~/kube-cluster

Thư mục này từ bây giờ sẽ là workspace của chúng ta.

Tạo file Host

Tạo file có tên ~/kube-cluster/hosts bằng cách sử dụng nano hoặc trình soạn thảo yêu thích của bạn:

Thêm đoạn văn bản sau vào file để chỉ định thông tin về cấu trúc logic của cluster:

[masters]
master ansible_host=master_ip ansible_user=root
[workers]
worker1 ansible_host=worker_1_ip ansible_user=root
worker2 ansible_host=worker_2_ip ansible_user=root
[all:vars]
ansible_python_interpreter=/usr/bin/python3 

Như đã đề cập, tệp inventory đó sẽ giúp bạn lưu trữ tất cả thông tin về địa chỉ IP của các máy chủ và các group của từng máy đó. ~/kube-cluster/hosts sẽ là tệp inventory của bạn và (masters và workers) sẽ là hai nhóm Ansible mà bạn đã thêm vào đó quy định cụ thể cơ cấu của cluster.

Nhóm Master là nhóm chỉ định rằng Ansible nên chạy các lệnh từ xa với tư cách là root user. Nó cũng liệt kê IP của master node (master_ip) có thể được liệt kê bởi mục master. Tương tự như vậy, nhóm Worker có hai mục cho các máy chủ worker (worker_1_ip và worker_2_ip) cũng chỉ định ansible_user làm root.

Dòng cuối cùng của tệp yêu cầu Ansible sử dụng Python 3 trên máy chủ từ xa cho các hoạt động quản lý. Cuối cùng, bạn cần lưu và đóng tệp sau khi đã thêm đoạn mã trên. Sau khi tạo thư mục Workspace và tệp Ansible inventory, hãy chuyển sang bước tiếp theo là cài đặt dependencies ở hệ điều hành và tạo cài đặt cấu hình.

>>> Xem thêm bài viết:

- Hướng dẫn cài đặt Web server Apache trên CentOS 7

- Cài đặt cấu hình cân bằng tải với HaProxy và Docker

- Tìm hiểu về ràng buộc (Constraint) trong SQL

Bước 2: Tạo một Non-Root User trên tất cả máy chủ remote

Tại bước này, chúng ta sẽ tạo một non-root user trên tất cả các máy chủ và có quyền sudo. Việc sử dụng một non/root user cho phép chúng ta có thể chủ động trong quá trình quản trị cluster và tránh việc xóa các folder quan trọng ngoài ý muốn. Nếu bạn muốn thay đổi thiết lập tệp do người chủ sở hữu hoặc xem thông tin hệ thống bằng các lệnh như top/htop và xem danh sách các container đang chạy, bước dưới đây sẽ giúp bạn thực hiện tất cả các tác vụ.

Tạo Playbook

Tạo file có tên ~/kube-cluster/initial.yml trong Workspace:

nano ~/kube-cluster/initial.yml

Một tác vụ trong Ansible là một tập hợp các bước được thực hiện nhắm vào các máy chủ và group cụ thể. Có thể có một hoặc nhiều tác vụ trong một playbook. Tiếp đó, bạn cần thêm đoạn văn bản dưới đây để tạo một non-root sudo user:

- hosts: all
  become: yes
  tasks:
    - name: create the 'ubuntu' user
      user: name=ubuntu append=yes state=present createhome=yes shell=/bin/bash
    - name: allow 'ubuntu' to have passwordless sudo
      lineinfile:
        dest: /etc/sudoers
        line: ‘ubuntu ALL=(ALL) NOPASSWD: ALL’
        validate: ‘visudo -cf %s’
    - name: setup authorized_keys for the ubuntu user
      authorized_key: user=ubuntu key="{{item}}"
      with_file:
        - ~/.ssh/id_rsa.pub 

Chạy Playbook

Tiếp theo, thực thi playbook để tạo non-root user ubuntu bằng cách chạy trên các local machine:

ansible-playbook -i hosts ~/kube-cluster/initial.yml

Bước 3: Cài đặt các dependencies của Kubernetes

Trong phần này, bạn sẽ cài đặt các operating-system-level packages theo yêu cầu của Kubernetes với trình quản lý packages của Ubuntu. Các packages này là:

1. Docker: Docker là một nền tảng và công cụ để xây dựng, phân phối và chạy các Docker container.

2. kubeadm - một công cụ CLI thực hiện các hành động cần thiết để thiết lập và chạy tối thiểu một cluster khả thi. Điều đó sẽ giúp bạn cài đặt và xây dựng các thành phần khác nhau của cluster theo tiêu chuẩn.

3. kubelet - là “node agent” chính chạy trên mỗi node và xử lý các hoạt động ở cấp độ node (node-level).

4. kubectl - một công cụ CLI được sử dụng để phát lệnh cho cluster thông qua Server API của nó.

Tạo Playbook

Tạo một file có tên ~/kube-cluster/kube-dependencies.yml trong Workspace:

nano ~/kube-cluster/kube-dependencies.yml

Thực hiện lệnh dưới đây để cài đặt các gói này vào server của bạn:

- hosts: all
  become: yes
  tasks:
   - name: install Docker
     apt:
       name: docker.io
       state: present
       update_cache: true
   - name: install APT Transport HTTPS
     apt:
       name: apt-transport-https
       state: present
   - name: add Kubernetes apt-key
     apt_key:
       url: https://packages.cloud.google.com/apt/doc/apt-key.gpg
       validate_certs: false
       state: present
   - name: add Kubernetes' APT repository
     apt_repository:
      repo: deb http://apt.kubernetes.io/ kubernetes-xenial main
      state: present
      filename: ‘kubernetes’
   - name: install kubelet
     apt:
       name: kubelet=1.16.0-00
       state: present
       update_cache: true
   - name: install kubeadm
     apt:
       name: kubeadm=1.16.0-00
       state: present
- hosts: master
  become: yes
  tasks:
   - name: install kubectl
     apt:
       name: kubectl=1.16.0-00
       state: present
       force: yes 

Chạy Playbook

Sau đó, chúng ta cần thực thi playbook bằng cách chạy trên các local machine:

ansible-playbook -i hosts ~/kube-cluster/kube-dependencies.yml

Bước 4: Cài đặt Master Node

Các Pod là các đối tượng nhỏ nhất, cơ bản nhất có thể triển khai trong Kubernetes. Các Pod chứa một hoặc nhiều container, chẳng hạn như Docker container. Khi một Pod chạy nhiều container, các container được quản lý như một thực thể duy nhất và chia sẻ tài nguyên của Pod.

Mỗi pod có địa chỉ IP riêng, và pod trên một node có thể truy cập các pod trên node khác bằng IP của group. Tuy nhiên, giao tiếp giữa các pod phức tạp hơn. Nó cần một thành phần riêng biệt có thể định tuyến lưu lượng truy cập từ một pod trên một node một cách rõ ràng đến một pod trên một node khác. Các Pod network plugins được sử dụng cho chức năng này. Nhiều Pod network plugins có sẵn, nhưng chúng ta sẽ sử dụng Flannel vì nó là một lựa chọn ổn định và hiệu quả.

Tạo Playbook

Tạo một playbook Ansible có tên master.yml trên local machine:

nano ~/kube-cluster/master.yml

Sau đó hãy thêm đoạn văn bản dưới đây vào tệp để khởi tạo cụm và cài đặt Flannel:

- hosts: master
  become: yes
  tasks:
    - name: initialize the cluster
      shell: kubeadm init --pod-network-cidr=10.244.0.0/16 >> cluster_initialized.txt
      args:
        chdir: $HOME
        creates: cluster_initialized.txt
      become: yes
      become_user: root
    - name: create .kube directory
      become: yes
      become_user: ubuntu
      file:
        path: $HOME/.kube
        state: directory
        mode: 0755
    - name: copy admin.conf to user's kube config
      copy:
        src: /etc/kubernetes/admin.conf
        dest: /home/ubuntu/.kube/config
        remote_src: yes
        owner: ubuntu
    - name: install Pod network
      become: yes
      become_user: ubuntu
      shell: kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/2140ac876ef134e0ed5af15c65e414cf26827915/Documentation/kube-flannel.yml >> pod_network_setup.txt
      args:
        chdir: $HOME
        creates: pod_network_setup.txt 

Chạy Playbook

Sau đó, chúng ta cần thực thi playbook bằng cách chạy trên các local machine:

ansible-playbook -i hosts ~/kube-cluster/master.yml

Bây giờ hãy SSH vào nó bằng lệnh sau để kiểm tra trạng thái của master node:

ssh ubuntu@master_ip

Khi ở bên trong master node, hãy thực hiện:

kubectl get nodes

Khi nhận được output như trên, bạn có thể thông báo rằng tất cả các tác vụ thiết lập đã được hoàn thành bởi master node và có thể bắt đầu chấp nhận các worker node và thực thi các tác vụ khi nó chuyển sang trạng thái Sẵn sàng. Bây giờ bạn có thể thêm các worker từ local machine của mình.

Bước 5: Cài đặt các worker node

Sau khi cài đặt master node, bây giờ chúng ta có thể chuyển sang bước tiếp theo là thiết lập các worker node. Việc thêm các worker node vào cluster có thể được thực hiện đơn giản bằng cách thực hiện một lệnh duy nhất trên mỗi máy chủ worker. Thông tin quan trọng như địa chỉ IP, port của máy chủ API master và secure token được bao gồm trong lệnh này. Bạn cần lưu ý rằng, tất cả các node sẽ không thể tham gia vào cluster, chỉ những node nào vượt qua secure token mới có thể tham gia vào cluster.

Lệnh này sẽ giúp bạn điều hướng trở lại Workspace và tạo một playbook có tên workers.yml:

nano ~/kube-cluster/workers.yml

Thêm đoạn text sau vào tệp để thêm worker vào cụm:

- hosts: master
  become: yes
  gather_facts: false
  tasks:
    - name: get join command
      shell: kubeadm token create --print-join-command
      register: join_command_raw
    - name: set join command
      set_fact:
        join_command: “{{ join_command_raw.stdout_lines[0] }}”
- hosts: workers
  become: yes
  tasks:
    - name: join cluster
      shell: “{{ hostvars['master'].join_command }} >> node_joined.txt”
      args:
        chdir: $HOME
        creates: node_joined.txt

Chạy Playbook

Thực thi playbook bằng cách chạy trên các local machine:

ansible-playbook -i hosts ~/kube-cluster/workers.yml

Lúc này cụm Kubernetes của bạn đã được thiết lập đầy đủ và hoạt động với các worker sẵn sàng chạy workload. Trước khi chuyển sang bước tiếp theo, hãy kiểm tra rằng cụm đang hoạt động theo kế hoạch.

Kết bài

Trên đây là toàn bộ các bước hướng dẫn giúp bạn tạo lập một cluster trên Ubuntu bằng Kubeadm và Ansible. Bây giờ cluster của bạn đã được thiết lập, bạn có thể dễ dàng bắt đầu triển khai các ứng dụng và dịch vụ của riêng mình.


Stringee Communication APIs là giải pháp cung cấp các tính năng giao tiếp như gọi thoại, gọi video, tin nhắn chat, SMS hay tổng đài CSKH cho phép tích hợp trực tiếp vào ứng dụng/website của doanh nghiệp nhanh chóng. Nhờ đó giúp tiết kiệm đến 80% thời gian và chi phí cho doanh nghiệp bởi thông thường nếu tự phát triển các tính năng này có thể mất từ 1 - 3 năm.

Bộ API giao tiếp của Stringee hiện đang được tin dùng bởi các doanh nghiệp ở mọi quy mô, lĩnh vực ngành nghề như TPBank, VOVBacsi24, VNDirect, Shinhan Finance, Ahamove, Logivan, Homedy,  Adavigo, bTaskee…

Quý bạn đọc quan tâm xin mời đăng ký NHẬN TƯ VẤN TẠI ĐÂY: