Triển khai ứng dụng Vuejs sử dụng Kubernetes trên môi trường Local ( Docker + Ansible + K8s + Vuejs)
Bạn cần có hiểu biết về Docker, Ansible để có thể dễ dàng nắm bắt những nội dung dưới đây
I.Giới thiệu
Việc sử dụng Kubernetes để triển khai ứng dụng một cách tự động đang trở nên phổ biến và tiện lợi. Chỉ cần cấu hình môi trường ban đầu một lần và duy nhất mọi công việc deploy đều sẽ dễ dàng hơn rất nhiều.
Trong blog này mình sẽ trình bày một cách triển khai ứng dụng nodejs và đặc biệt là vuejs nói riêng bằng kubernetes.
II.Mô hình hệ thống
Master: Là nơi chứa source code và các ứng dụng để triển khai hệ thống như ansible, docker, kubernetes(k8s)
Node: Là nơi triển khai app
III.Triển khai hệ thống trên local
Từ phần này trở đi, các bạn hãy dùng source code của mình để dễ dàng theo dõi nội dung: https://github.com/namntdnc/try-k8s/tree/1ci-1node
1. Mô phỏng hệ thống
Để mô phỏng hệ thống như sơ đồ trên mình sử dụng Virtualbox và Vagrant để cài đặt các máy ảo. Trên máy master, mình sẽ cài đặt các gói ứng dụng ansible để có thể cài đặt tự động các gói ứng dụng cho các máy local.
2. Chuẩn bị môi trường
Để có thể tạo được cluster, việc đầu tiên là phải chuẩn bị các gói phần mềm cần thiết cho Master và các Node bao gồm:
- docker
- rke ( Công cụ để tạo cluster )
Và đặt biệt
trên master cần cài đặt kubectl
Với file hosts.local có nội dung như sau
[local_master]
192.168.30.2
[local_node]
192.168.30.3
192.168.30.4
Các công việc cài đặt môi trường cho Master, Node được cài đặt thông qua công cụ ansible, và được mình định nghĩa trong ansible-playbook như sau
#provision.yml
- hosts:
- local
become: true
roles:
- app.docker-install
- app.k8s-provision
- app.rke-apply
- hosts:
- local_master
become: true
roles:
- app.setting-kubectl
Việc cài đặt docker được thực hiện thông qua roles app.docker-install
- name: install docker
shell: curl https://releases.rancher.com/install-docker/18.09.2.sh | sh
- 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
Để k8s hoạt động bình thường cần phải disable swap, việc này đượ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'
Tiếp theo là cài đặt rke trên máy Master, bạn cần chuẩn bị rke download từ trang chủ của rancher:
https://rancher.com/docs/rke/latest/en/installation/
bạn có thể liên kết file rke đến thư mục ~/bin/ .
- name: Create 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
Cuối cùng là cài đặt kubectl trên master:
các bạn có thể tham khảo source của mình để cài đặt kubectl
https://github.com/namntdnc/try-k8s/blob/1ci-1node/roles/app.setting-kubectl/tasks/main.yml
3. Tạo cluster
Sau khi chạy ansible-playbook thì đã hoàn thành việc cài đặt môi trường
Chúng ta tạo một file yaml định nghĩa chức năng của các máy trong hệ thống như sau
---
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
sau đó execute
rke up --config cluster.yml
Quá trình tạo cluster sẽ trông như sau
Chạy command kubectl get nodes
, sẽ thu được kết quả trông như thế này :
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 bạn đã hoàn tất quá trình cluster
4. Triển khai ứng dụng
a. Chuẩn bị source code
Ở đây có rất nhiều cách để chuẩn bị source code ví dụ như pull source code về máy master thông qua git, nhưng vì đây là môi trường local nên mình đã pull nó về máy thật rồi chia sẻ thư mục này cho máy master.
b. Build app
Đầu tiên, việc cần làm là build app. Đối với vuejs, thư mục được build sẽ là dist/
. Các bạn có thể dùng một docker image như node:10.0 để build source code của mình rồi link ra thư mục dist/
.
Vì bài viết này đề cập cập tới việc triển khai trên môi trường local nên mình đã build app trên máy thật rồi chia sẻ cho máy ảo Master
c. Xây dựng deployment.yml
Ta có thể thấy việc triển khai ứng dụng này chỉ cần thông qua 1 pod chưa container nginx, và thư mục nginx\html trong container này liên kết tới /dist
Bây giờ ta sẽ dùng DaemonSet để triển khai pod vuejs trên mỗi node, do đó công việc deploy được định nghĩa trong file deployment.yml như sau
apiVersion: apps/v1
kind: DaemonSet
metadata:
name: vue-deployment
spec:
selector:
matchLabels:
app: vue-app
template:
metadata:
labels:
app: vue-app
spec:
containers:
- name: nginx-container
image: nginx:1.12
ports:
- containerPort: 80
volumeMounts:
- mountPath: /usr/share/nginx/html/
name: source-code
volumes:
- name: source-code
hostPath:
path: "/home/vagrant/ansible-playbook/vuetify-todo-app/dist"
---
apiVersion: v1
kind: Service
metadata:
name: vue-app-service
labels:
app: vue-app-client-service
spec:
ports:
- port: 80
targetPort: 80
nodePort: 30000
selector:
app: vue-app
type: NodePort
execute : kubectl apply -f deployment.yml
Khi vào trình duyệt sẽ được kết quả như sau
Như vậy chúng ta đã hoàn thành việc triển khai một ứng dụng vuejs, sử dụng kubernetes
IV.Tài liệu tham khảo
https://blog.vietnamlab.vn/2019/04/26/nhap-mon-kubernetes-p4-kubernetes-workloads-resource-1/