Sử dụng Ansible xây dựng môi trường K8s ở local bằng RKE
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/
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 :
- https://viblo.asia/p/gioi-thieu-ve-vagrant-aRBeXnExvWE
- https://viblo.asia/p/tim-hieu-vagrant-phan-1-1l0rvmDQGyqA
- 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)
- Trên toàn bộ các node :
- 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'
- Cài đặt rke
- chuẩn bị source rke, download từ trang chủ https://rancher.com/docs/rke/latest/en/installation/#download-the-rke-binary
- Cp file rke đến thư mục ~/bin/ để $User có thể sử dụng
---
- 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
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
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
Các bạn hãy Add cluster và chọn Import existing cluster để thêm cluster chúng ta đã dựng
Các bạn tiếp tục sẽ thấy hướng dẫn tạo cluster-admin
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)
Sau khi cluster được active, server rancher tự động reload và khi click vào cluster "Mycluster" Ta thu được thành quả sau
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
- Tài liệu tham khảo: https://rancher.com/docs/rke/latest/en/installation/