Mục đích blog

Ngày nay tự động hoá các công việc quản lý, scaling và triển khai ứng dụng dưới dạng container hoá đang được coi trọng. Các nhà cung cấp dịch vụ lớn như  Google, Azure, Amazon đều đã đưa ra các pháp như GKE, AKS, Amazon EKS để giải quyết các nhu cầu trên.

Tuy nhiên, dưới góc độ nghiên cứu, việc xây dựng một hệ thống sử dụng K8s từ base-metal  hay là việc bạn có thể tự triển khai các dịch vụ cho riêng mình là điều mình hướng đến trong blog này.

I. Giới thiệu RKE

Rancher Kubernetes Engine (RKE) là một công cụ dùng để triển khai môi trường K8s trên máy chủ vật lý hoặc máy chủ ảo hóa. RKE đơn giản hóa việc cài đặt K8s trên bất kì hệ điều hành và nền tảng nào bạn đang chạy.

II. Mô hình cluster trên local

Trong blog này chúng ta sẽ thử xây dựng một cluster bao gồm có 3 node.
Master sẽ là node đảm nhiệm các nhiệm vụ controlplane
Node* sẽ là các node thực hiện các nhiệm vụ worker,etcd

để rõ hơn các bạn có thể tham khảo các nhiệm vụ trên tại https://rancher.com/docs/rancher/v2.x/en/cluster-provisioning/  

hình 1. Minh họa các node

III. Chuẩn bị môi trường

Để triển khai môi trường K8s bằng RKE đòi hỏi những điều như sau:

  • Các node đều là hệ điều hành linux và đã được cài đặt docker  (Trong bài blog này, các node được mình sử dụng hệ điều hành centos 7.4)
  • SSH user cho mỗi node phải thuộc group docker
  • Swap nên được vô hiệu hóa ở các node woker ( Node1, Node2)

IV. Triển khai

1. Tạo máy ảo

Việc triển khai máy ảo trên local, các bạn có thể sử dụng bộ công cụ virtualbox + vagrant . Dưới đây là một số tài liệu tham khảo về việc sử dụng vagrant :

  1. https://viblo.asia/p/gioi-thieu-ve-vagrant-aRBeXnExvWE
  2. https://viblo.asia/p/tim-hieu-vagrant-phan-1-1l0rvmDQGyqA
  3. https://viblo.asia/p/tim-hieu-vagrant-phan-2-vagrant-chef-wznVGLqQvZOe

Thông tin về cấu hình các máy ảo như sau

server_configs = [    			
  {"hostname" => "master", "ip" => "192.168.30.2", "memory_size" => "1024", "cpus" => 2},   
  {"hostname" => "node1", "ip" => "192.168.30.3", "memory_size" => "1024", "cpus" => 2},   
  {"hostname" => "node2", "ip" => "192.168.30.4", "memory_size" => "1024", "cpus" => 2}  
]

Ở trên node master, các bạn phải cài đặt ansible

2.Xây dựng ansible-playbook

a. Định nghĩa file host
[local_master]
192.168.30.2

[local_node]
192.168.30.3
192.168.30.4

[all:children]
local_master
local_node

[local_rancher]
192.168.30.3

[local:children]
local_master
local_node
b. Định nghĩa file provision và các roles
  • Các công việc trong provison.yml
    • Trên toàn bộ các node :
      • Cài đặt docker (app.docker-install)
      • Thiết lập yêu cầu về swap (app.k8s-provision)
    • Trên node master
      • Cài đặt kubectl (app.setting-kubectl)
      • Cài đặt rke (app.rke-apply)
    • Trên node1 ( rancher)
      • Cài đặt container rancher server (app.rancher-server)
- hosts:
    - local
  become: true
  roles:
    - app.docker-install
    - app.k8s-provision

- hosts:
    - local_master
  become: true
  roles:
    - app.setting-kubectl
    - app.rke-apply

- hosts:
    - local_rancher
  become: true
  roles:
    - app.rancher-server
  • Việc cài đặt docker được định nghĩa tại roles app.docker-install
---
- name: check docker installed
  command: docker --version
  register: docker_existed
  ignore_errors: true

- name: install docker
  shell: curl https://releases.rancher.com/install-docker/18.09.2.sh | sh
  when: docker_existed is failed

- name: install docker-compose
  command: curl -L "https://github.com/docker/compose/releases/download/1.24.0/docker-compose-Linux-x86_64" -o /usr/local/bin/docker-compose
  when: docker_existed is failed

- name: docker-compose permission
  command: chmod +x /usr/local/bin/docker-compose
  when: docker_existed is failed

- name: Add process user to docker groups
  user:
    name: "{{ process_execution_user }}"
    shell: /bin/bash
    groups: docker
    append: yes

- name: check docker start
  command: docker ps
  register: docker_started
  ignore_errors: true

- name: reload Deamon docker
  command: service docker start
  when: docker_started is failed
  
- name: Ensure Docker is started and enabled at boot.
  service:
    name: docker
    state: "{{ docker_service_state }}"
    enabled: "{{ docker_service_enabled }}"
  • Tiếp theo là thiết lập các yêu cầu về swap được định nghĩa tại roles app.k8s-provision
---
- name: disabled swap on worker node
  command: swapoff -a

- name: disable swap parmanently
  replace:
    path: /etc/fstab
    regexp: '^/dev/mapper/centos-swap swap(.*)'
    replace: '#/dev/mapper/centos-swap swap\1'
---
- name: Crete folder bin
  command: mkdir -p {{user_home}}/bin/
  ignore_error: true
  
- name: Bring rke to local PATH
  command: cp {{user_home}}/ansible-playbook/resource/rke {{user_home}}/bin/rke
  • Các bạn cần cài đặt kubectl để xem thông tin các node, việc này mình định nghĩa trong roles app.setting-kubectl. Các bạn có thể tham khảo phần thông tin đính kèm bên dưới
  • Rancher cung cấp GUI để các bạn dễ dàng quản lý các node của mình, công việc này thực hiện như là việc cài đặt 1 container được thực hiện tại role app.rancher-server. Ở đây mình sẽ cài đặt rancher container trên node1  
---
- name: check rancher container
  shell: docker ps | grep rancher_server
  register: result
  failed_when: result.rc not in [0, 1]

- name: Pull and run the Rancher server
  command:  sudo docker run -d --name "rancher_server" --restart=unless-stopped -p 80:80 -p 443:443 rancher/rancher 

3. Triển khai cluster sử dụng rke

a. Cài đặt provision

Sau khi chuẩn bị ansible-playbook, việc đầu tiên là thực hiện các thao tác trong provision.yml.

b. Định nghĩa file cấu hình cluster.yml
---
nodes:
  - address: 192.168.30.2
    user: vagrant
    role: [controlplane]
  - address: 192.168.30.3
    user: vagrant
    role: [worker, etcd]
  - address: 192.168.30.4
    user: vagrant
    role: [worker, etcd]

services:
  etcd:
    image: quay.io/coreos/etcd:latest
  kube-api:
    image: rancher/k8s:v1.8.3-rancher2
  kube-controller:
    image: rancher/k8s:v1.8.3-rancher2
  scheduler:
    image: rancher/k8s:v1.8.3-rancher2
  kubelet:
    image: rancher/k8s:v1.8.3-rancher2
  kubeproxy:
    image: rancher/k8s:v1.8.3-rancher2
b. Tạo cluster thông qua rke

Bây giờ việc tạo cluster vô cùng đơn giản, việc cài đặt các container đều được tự động chỉ bằng 1 command: rke up --config cluster.yml
Qui trình sẽ trông như thế này

hình 2. Qui trình tạo cluster bằng rke

Lúc này 1 file cấu hình kube.config_cluster.yml sẽ tự động sinh ra tại thư mục ansible-playbook

Công việc cuối cùng là copy file cấu hình này vào file kube config ~/.kube/config

mkdir -p ~/.kube
cp ~/ansible-playbook/kube_config_cluster.yml ~/.kube/config

Thử kiểm tra thông tin các node bằng kubectl

kubectl get nodes

Thu được kết quả như sau

NAME           STATUS   ROLES          AGE   VERSION
192.168.30.2   Ready    controlplane   10h   v1.13.5
192.168.30.3   Ready    etcd,worker    10h   v1.13.5
192.168.30.4   Ready    etcd,worker    10h   v1.13.5

Như vậy là đã tạo được cluster bằng cách sử dụng rke

IV. Giao diện Rancher

Sau khi các bạn đã cài đặt toàn bộ môi trường và cài đặt rancher container trên node1 (192.168.30.3) , các bạn hãy vào địa chỉ 192.168.30.3 trên browser để tham quan giao diện Rancher GUI

Hình 3: Giao diện đăng nhập rancher 

Sau khi cài đặt mật khẩu, các bạn sẽ phải thực hiện một số thao tác thiết lập thông tin cơ bản để có thể sử dụng GUI

Hình 4: Thiết lập cluster

Các bạn hãy Add cluster và chọn Import existing cluster để thêm cluster chúng ta đã dựng

Hình 5: Import cluster

Các bạn tiếp tục sẽ thấy hướng dẫn tạo cluster-admin

Hình 6: Hướng dẫn tạo cluster

Bây giờ chúng ta quay về node master (controlplane) nơi mà chúng ta đã cài kubectl và thực hiện các việc như hướng dẫn
- Đầu tiên là tạo user role cluster-admin với user vagrant

kubectl create clusterrolebinding cluster-admin-binding --clusterrole cluster-admin --user vagrant

- Sau đó import cluster bằng cách thử 2 command bên dưới ( nếu câu lệnh ở trên không được thì hãy thử câu thứ 2)

Sau khi thực hiện 2 công việc trên thì chúng ta sẽ ở màn hình chờ, lúc này trạng thái của cluster mới import vào sẽ là pending (Các bạn phải chờ đợi để thành công nhé :3)

Hình 7: Trạng thái các cluster

Sau khi cluster được active, server rancher tự động reload và khi click vào cluster "Mycluster" Ta thu được thành quả sau

Hình 8 : Trạng thái cluster

Bởi vì node master chỉ thực hiện nhiệm vụ controlplane nên các bạn có thể thấy được gắn 1 nhãn vàng "Unschedulable"

~Yay : Blog này của mình đã trình bày cách cài đặt, setting rke và rancher. Việc sử dụng rancher để quan sát việc triển khai các pod mình sẽ đề cập trong một bài viết khác. Cảm ơn các bạn đã theo dõi

V. Thông tin thêm