Tự động hoá các tác vụ Kubernetes với Ansible Module

Sơ lược về Ansible #

Ansible là một trong những công cụ hỗ trợ việc tự động hoá trong quản trị hệ thống của bạn. Kubernetes là một trong những công cụ hỗ trợ điều phối container tốt nhất. Vậy điều gì nếu chúng có thể hoạt động với nhau? Trong bài viết này mình sẽ nói về vấn đề đó.

Ansible là một framework mạnh làm việc với các file YAML. Thế mạnh của Ansible là ở các module, các module có thể giúp bạn gọi ứng dụng bên ngoài. Trong bài viết này, mình sẽ nói về module có khả năng đọc các cài đặt trong playbook

Truy cập vào một Kubernetes Cluster #

Để có thể sử dụng Kubernetes Module trong Ansible, bạn phải có quyền truy cập vào Kubernetes Cluster. Trong bài viết này, mình sẽ sử dung Minikube

$ kubectl cluster-info
Kubernetes master is running at https://192.168.39.190:8443
KubeDNS is running at https://192.168.39.190:8443/api/v1/namespaces/kube-system/services/kube-dns:dns/proxy

To further debug and diagnose cluster problems, use 'kubectl cluster-info dump'.

Sử dụng K8s Module #

Mục đích của bài viết này là sử dụng Kubernetes thông qua Ansible sử dụng k8s module. Với Module đó, bạn có thể quản lý các đối tượng trong Kubernetes từ playbook của bạn. Cụ thể, bạn tạo namespace mới sử dụng kubectl  sẽ như sau:

$ kubectl create namespace my-tel4vn

thì đoạn lệnh có thể được chạy từ file yaml với cú pháp sau:

- hosts: localhost
  tasks:
    - name: create namespace
      k8s:
        name: my-tel4vn
        api_version: v1
        kind: Namespace
        state: present

Sau đó bạn có thể chạy file với playbook của ansible:

$ ansible-playbook ./example.yaml

Kết quả bạn cũng có namespace cần tạo như khi sử dụng câu lệnh:

$ kubectl get namespaces
NAME              STATUS   AGE
default           Active   37h
kube-node-lease   Active   37h
kube-public       Active   37h
kube-system       Active   37h
demo              Active   11h
my-tel4vn         Active   3s

Tải xuống Image sử dụng Podman #

Với Podman, bạn có thể tải xuống bất image nào từ repository mà không cần daemon nào chạy cả. Tất cả bạn cần là nơi để chạy container và nơi để tải xuống image. Lúc đó, bạn có thể sử dụng các cú pháp của YAML để tự động thao tác này:

  - name: pull an image
      podman_image:
        name: docker.io/nginx:latest

Và chạy playbook:

$ ansible-playbook ./example.yaml
[WARNING]: provided hosts list is empty, only localhost is available.
Note that the implicit localhost does not match 'all'

PLAY [localhost] ************************

TASK [Gathering Facts] ************************
ok: [localhost]

TAStạc vụK [create k8s namespace] ************************
ok: [localhost]

TASK [pull an image] ************************
changed: [localhost]

PLAY RECAP ************************
localhost: ok=3 changed=1 unreachable=0 failed=0
           skipped=0 rescued=0 ignored=0

Deploy ứng dụng với Ansible #

Ansible không chỉ giới hạn trong việc tự động các tác vụ và còn có thể sử dụng như kubectl để deploy một ứng dụng. Nói một cách khác, file YAML mà bạn lấy được từ Kubernetes như một file dùng để cho Ansible có thể chạy. Đây là các cài đặt mà khi bạn sử dụng kubectl để deploy webserver sẽ được tự tạo ra:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: my-webserver
spec:
  selector:
    matchLabels:
      run: my-webserver
  replicas: 1
  template:
    metadata:
      labels:
        run: my-webserver
    spec:
      containers:
      - name: my-webserver
        image: nginx
        ports:
        - containerPort: 80

Nếu bạn có được các thông số trên từ kubectl thì rất dễ dàng cho việc tạo file YAML và thực thi nó với Ansible để có kết quả tương tự. So với thông số yaml tạo bởi K8s thì thông số để Ansible thực thi chỉ thêm một số trường định nghĩa đối tượng mà thôi:

  

- name: deploy a web server
      k8s:
        api_version: v1
        namespace: my-tel4vn
        definition:
          kind: Deployment
          metadata:
            labels:
              app: nginx
            name: nginx-deploy-tel4vn
          spec:
            replicas: 1
            selector:
              matchLabels:
                app: nginx
            template:
              metadata:
                labels:
                  app: nginx
              spec:
                containers:
                  - name: my-webserver
                    image: quay.io/jitesoft/nginx
                    ports:
                      - containerPort: 80
                        protocol: TCP

Sau khi chỉnh sửa cho phù hợp với hạ tầng hiện tại, bạn hoàn toàn có thể dùng ansible để thao tác trên Kubernetes Cluster:

$ kubectl -n my-tel4vn get pods
NAME                      READY  STATUS
nginx-deploy-tel4vn-7fdc9-t9wc2  1/1    Running

Kết luận #

Sau bài viết trên, mục tiêu của mình là bạn đọc có thể sử dụng ansible để tự động thực hiện các thao tác với Kubernetes Cluster, hiểu được cách dùng file YAML để thiết đặt trước các công việc và có thể chuyển file YAML lấy được từ Kubernetes thành file mà ansible có thể đọc được.

Bạn có thể tham khảo Cheat sheet ở đây để hiểu rõ hơn về việc Playbook: Intro to playbooks

Nguồn: opensource.com

Mình là Tùng, hiện đang là DevOps tại Công Ty CP EcoIT. Với kinh nghiệm và thủ thuật đúc rút được từ trong công việc, mình muốn chia sẻ cho bạn đọc cùng biết và cùng nhau học thêm nhiều điều mới trong lĩnh vực DevOps.

Powered by BetterDocs

Để lại bình luận

Email của bạn sẽ không được hiển thị công khai. Các trường bắt buộc được đánh dấu *