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 )
đặ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/