Cách tạo một cụm Kubernetes bằng Kubeadm trên Ubuntu
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, Bizfly Cloud 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.
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.
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.
Kubernetes Clustersẽ 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.
Điều kiện tiên quyết:
1. Có cặp key SSH trên máy Linux local.
2. 3 máy chủ chạy Ubuntu 18.04 với ít nhất 2GB RAM và 2 vCPU mỗi máy. Có SSH vào từng server với quyền là user root bằng cặp key SSH
3. Cài đặt Ansible trên máy local.
4. Đã quen thuộc với Ansible Playbook.
5. Biết cách khởi chạy container từ Docker image
Bước 1 - Tạo thư mục cho Workspace và tệp Ansible Inventory
Trước tiên, bạn cần thiết lập Ansible trên local machine (máy cục bộ) của mình. Nó sẽ giúp bạn thực hiện các lệnh trên máy chủ remote của mình. Nó cũng giúp giảm bớt công sức triển khai thủ công bằng cách tự động hóa. Bạn cần tạo một thư mục trên local machine của mình, nơi sẽ đóng vai trò là vùng lưu trữ tạm thời (Workspace) của bạn.
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 ~/kube-cluster bây giờ sẽ hoạt động như vùng lưu trữ tạm thời (workspace) bên trong đó bạn sẽ chạy tất cả các lệnh cục bộ để tạo một cụm Kubernetes bằng kubeadm. Thư mục sẽ chứa tất cả các Ansible Playbook của bạn và được sử dụng cho phần còn lại của hướng dẫn. |
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:
nano ~/kube-cluster/hosts |
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.
Bước 2 - Tạo một Non-Root User trên tất cả máy chủ remote
Trong bước này, bạn sẽ tạo một non-root user với các quyền sudo trên tất cả các server để bạn có thể SSH vào chúng theo cách thủ công với tư cách là một user không có quyền. Điều này có thể hữu ích cho các hoạt động được thực hiện thường xuyên để bảo trì một cluster. Hơn nữa, bước này sẽ giúp bạn thực hiện tác vụ chính xác hơn và ít bị lỗi hơn, giảm nguy cơ thay đổi hoặc xóa các tệp 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: set up 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 |
Việc thực thi lệnh này sẽ mất một khoảng thời gian, bạn sẽ thấy kết quả tương tự như sau:
Sau khi bước này hoàn tất, bạn có thể chuyển sang cài đặt các Kubernetes-specific dependencies trong bước tiếp theo.
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 |
Việc thực thi lệnh này sẽ mất một khoảng thời gian, sau đó bạn sẽ thấy kết quả sau:
Sau khi thực thi, Docker kubeadm và kubelet sẽ được cài đặt trên tất cả các máy chủ remote. Kubectl không phải là một thành phần bắt buộc và chỉ cần thiết để thực hiện các lệnh cluster. Việc chỉ cài đặt nó trên master node có ý nghĩa trong lúc này vì bạn sẽ chỉ chạy các lệnh kubectl từ master node. Tuy nhiên, lưu ý rằng các lệnh kubectl có thể được chạy từ bất kỳ worker node nào hoặc từ bất kỳ machine nào mà nó có thể được cài đặt và cấu hình để trỏ đến một cluster. Tất cả các dependencies hệ thống hiện đã được cài đặt. Hãy thiết lập master node và khởi tạo cluster.
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 |
Việc thực thi lệnh này sẽ mất một khoảng thời gian, sau đó bạn sẽ thấy kết quả sau:
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 |
Bây giờ bạn sẽ thấy kết quả sau:
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.
Tạo Playbook
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 |
Việc thực thi lệnh này sẽ mất một khoảng thời gian, sau đó bạn sẽ thấy kết quả sau:
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.
Bước 6 - Kiểm tra Cluster
Có thể có trường hợp một cluster bị lỗi trong quá trình thiết lập. Đó có thể là do lỗi mạng giữa master và worker hoặc sự cố node. Vì vậy, chúng ta cần kiểm tra cluster trước khi lên lịch ứng dụng và đảm bảo rằng không có trục trặc nào xảy ra. Bạn sẽ cần phải kiểm tra trạng thái hiện tại của cluster từ master node để đảm bảo rằng các node đã sẵn sàng. Bạn có thể lấy lại kết nối bằng lệnh sau nếu các nút chưa sẵn sàng hoặc bạn bị ngắt kết nối:
ssh ubuntu@master_ip |
Sử dụng các lệnh sau để nhận trạng thái của cluster:
kubectl get nodes |
Việc thực thi lệnh này sẽ mất một khoảng thời gian, sau đó bạn sẽ thấy kết quả sau:
Bạn cần kiểm tra xem tất cả các node là một phần của cluster có ở trạng thái sẵn sàng hay không. Nếu một vài node có trạng thái Not Ready ở STATUS, điều đó cho thấy rằng các worker node vẫn chưa hoàn thành thiết lập của chúng. Tuy nhiên, trước khi chạy lại kubectl get nodes và kiểm tra output đã cập nhật, bạn nên đợi thêm từ năm đến mười phút. Nếu một số node vẫn hiển thị trạng thái Not Ready như trạng thái của chúng, bạn nên kiểm tra các bước trước đó và chạy lại các lệnh. Chỉ khi các node có giá trị Ready cho TÌNH TRẠNG, chúng là một phần của cluster và sẵn sàng chạy workload.
Sau khi thực hiện bước 6 thành công, cluster của bạn hiện đã được xác minh. Bây giờ hãy lên lịch cho một ứng dụng Nginx mẫu trên cluster.
Bước 7 - Chạy ứng dụng trên Cluster
Tạo Deployment
Sau khi tạo cluster thành công, bạn có thể triển khai bất kỳ ứng dụng nào được chứa trong cluster của mình. Bạn có thể sử dụng các lệnh sau đây cho các ứng dụng được chứa trong container khác nếu bạn đang ở trong master node. Tiếp theo, thực hiện lệnh sau để triển khai nginx:
kubectl create deployment nginx --image=nginx |
Bạn cần thay đổi tên Docker image và bất kỳ flag nào có liên quan (chẳng hạn như ports và volumes). Bạn có thể triển khai Nginx bằng cách sử dụng các deployment và service để xem cách các ứng dụng có thể được triển khai cho cluster.
Triển khai Kubernetes là một đối tượng tài nguyên trong Kubernetes cung cấp các bản cập nhật khai báo cho các ứng dụng. Việc triển khai cho phép bạn mô tả vòng đời của ứng dụng, chẳng hạn như container image, replicas và chiến lược cập nhật. Việc triển khai đảm bảo số lượng các pod mong muốn đang chạy và có sẵn mọi lúc. Nếu một pod bị lỗi trong thời gian tồn tại của cluster, nó sẽ tự “sinh” ra một lần nữa. Quá trình cập nhật cũng được ghi lại toàn bộ và được tạo các version tùy chọn để tạm dừng, tiếp tục và quay trở lại các version trước. Lệnh trên để tạo một lệnh triển khai có tên Nginx sẽ giúp bạn triển khai một pod với một container từ Nginx Docker Image của Docker registry.
Thiết lập Node Port
Tiếp theo, chúng ta cần tạo một NodePort. NodePort là một cổng mở trên mọi nút trong cụm của bạn. Kubernetes định tuyến rõ ràng lưu lượng truy cập đến trên NodePort đến dịch vụ của bạn, ngay cả khi ứng dụng của bạn đang chạy trên một nút khác. Đối với điều này, chúng ta có thể sử dụng lệnh này để tạo tài nguyên NodePort có tên là Nginx sẽ hiển thị ứng dụng công khai:
kubectl expose deploy nginx --port 80 --target-port 80 --type NodePort |
Service là một objective khác của Kubernetes chịu trách nhiệm hiển thị giao diện cho các pod đó, cho phép truy cập mạng từ bên trong cluster hoặc giữa các quy trình bên ngoài và service. Nó có thể được định nghĩa là một phần trừu tượng trên đầu của pod cung cấp một địa chỉ IP và tên DNS duy nhất mà các pod có thể được truy cập. Rất dễ dàng quản lý cấu hình cân bằng tải với service.
Chạy lệnh sau:
kubectl get services |
Kết quả sẽ như sau:
Sau khi nhận được output, Kubernetes sẽ chỉ định một port ngẫu nhiên lớn hơn 30000 một cách tự động, đồng thời đảm bảo rằng port được chỉ định chưa bị ràng buộc bởi service khác. Dòng thứ ba của output ở trên sẽ giúp bạn truy xuất port mà Nginx đang chạy.
Để kiểm tra nó đang hoạt động, hãy truy cập http://worker_1_ip:nginx_port hoặc http://worker_2_ip:nginx_port thông qua trình duyệt trên local machine của bạn. Bạn sẽ thấy trang chào mừng quen thuộc của Nginx.
Xoá Deployment
Nếu bạn muốn xóa ứng dụng Nginx, trước tiên hãy xóa nginx service ra khỏi master node:
kubectl delete service nginx |
Chạy các bước sau để đảm bảo rằng service đã bị xóa:
kubectl delete service nginx |
Kết quả sẽ như sau:
Xóa Deployment bằng lệnh sau:
kubectl delete deployment nginx |
Bạn có thể sử dụng lệnh này để kiểm tra xem deployment cuối cùng có bị xóa hay không:
kubectl get deployments |
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.
Bizfly Kubernetes Engine - triển khai, vận hành Kubernetes 100% tự động chỉ với vài cú click chuột
Nhà cung cấp dịch vụ Kubernetes có máy chủ đặt tại Việt Nam, giúp người dùng tại Việt Nam truy cập ứng dụng nhanh hơn, ít bị ảnh hưởng mỗi khi có sự cố network quốc tế.
Là đơn vị tiên phong trong cung cấp dịch vụ tại Việt Nam, Bizfly Cloud có nhiều ưu thế giúp hỗ trợ khách hàng tốt nhất về: hệ ngôn ngữ tiếng Việt, hỗ trợ 24/7...
Tích hợp đầy đủ với các dịch vụ khác trong bộ giải pháp 20+ dịch vụ của Bizfly Cloud (Load Balancer, Cloud Server, Autoscaling, Cloud Watcher, Firewall, Container Registry,…), giúp đơn giản mô hình, tối ưu về tốc độ và tính bảo mật cho hệ thống của người dùng.
Chi phí tính theo tài nguyên sử dụng theo thời gian thực. Tính tiền theo tháng hoặc theo giờ. Có chính sách hoàn tiền khi xóa tài nguyên.
Cung cấp Dashboard và API giúp khách hàng có nhiều phương thức truy cập để quản lý hệ thống.
Hệ thống vật lý với cấu hình phần cứng mạnh mẽ: Các máy chủ sử dụng CPU Intel E5 v4 và Intel Xeon Gold, RAM lên tới 512 GB , ổ cứng SSD, băng thông hỗ trợ lên tới 10Gbps.
Với những tính năng ưu việt và vượt trội, tích hợp Kubernetes Engine có thể mang lại những tác động tích cực đến các Dev team/DevOps cũng như toàn bộ doanh nghiệp. Nếu bạn đang muốn bắt đầu với Kubernetes, truy cập: https://bizflycloud.vn/kubernetes-engine để trải nghiệm miễn phí ngay hôm nay.