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
Xem thêm: Sử dụng Ansible để cài đặt và thiết lập Docker trên Ubuntu 18.04
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
Xem thêm: Sử dụng Ansible để cài đặt và thiết lập Docker trên Ubuntu 20.04
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
Xem thêm: Top 10 tips khi sử dụng Ansible
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ài viết tiếp theo mình sẽ nói về Tự động hóa PostgreSQL bằng Ansible.
Một số bài viết liên quan có thể bạn quan tâm:
- [Ansible] Xử lý ngoại lệ trong Ansible Playbooks với block và rescue
- [Ansible] Thuộc tính selectattr trong playbook
- [Ansible] Ansible Role
- Tự xây dựng hệ thống CI/CD cùng Ansible, Docker và Drone
- Build Container Image Sử dụng Ansible-Bender
- Hướng dẫn cài đặt Kubernetes trên CentOS 7 tự động hoá với Ansible
Mọi thắc mắc xin hãy liên hệ
Email: [email protected]
(Nguồn: tel4vn.edu.vn)