Triển khai Zabbix server trên Kubernetes cung cấp nhiều lợi ích cho việc quản lý hệ thống giám sát của bạn, bao gồm:
- Tự động hóa triển khai: Kubernetes cho phép bạn triển khai và quản lý các ứng dụng và dịch vụ một cách tự động. Điều này giúp giảm thiểu thời gian và công sức cần thiết để triển khai Zabbix server.
- Quản lý tài nguyên: Kubernetes cung cấp các công cụ để quản lý tài nguyên máy chủ và tối ưu hóa việc sử dụng tài nguyên, điều này giúp bạn đảm bảo rằng Zabbix server của bạn được triển khai và hoạt động hiệu quả.
- Tính mở rộng: Kubernetes cho phép bạn mở rộng Zabbix server của mình dễ dàng hơn bằng cách thêm các nút worker mới hoặc tăng khả năng chịu tải cho các nút hiện có.
- Khả năng di động: Với Kubernetes, bạn có thể triển khai Zabbix server trên bất kỳ nền tảng điện toán đám mây hoặc trên các máy chủ cục bộ. Điều này giúp bạn tăng tính di động và linh hoạt trong việc quản lý hệ thống giám sát.
Tóm lại, triển khai Zabbix server trên Kubernetes là một giải pháp hiệu quả để quản lý hệ thống giám sát của bạn, cung cấp tính mở rộng và di động, và giảm thiểu thời gian và công sức cần thiết để triển khai và quản lý Zabbix server.
Ưu điểm của việc triển khai Zabbix server trên Kubernetes:
- Tính linh hoạt và di động: Triển khai Zabbix server trên Kubernetes cho phép bạn triển khai nó trên bất kỳ nền tảng điện toán đám mây hoặc trên các máy chủ cục bộ.
- Tự động hóa triển khai: Kubernetes cho phép bạn tự động hóa việc triển khai và quản lý các ứng dụng và dịch vụ, giảm thiểu thời gian và công sức cần thiết để triển khai Zabbix server.
- Quản lý tài nguyên: Kubernetes cung cấp các công cụ để quản lý tài nguyên máy chủ và tối ưu hóa việc sử dụng tài nguyên, giúp bạn đảm bảo rằng Zabbix server của bạn được triển khai và hoạt động hiệu quả.
- Tính mở rộng: Kubernetes cho phép bạn mở rộng Zabbix server của mình dễ dàng hơn bằng cách thêm các nút worker mới hoặc tăng khả năng chịu tải cho các nút hiện có.
Nhược điểm của việc triển khai Zabbix server trên Kubernetes:
- Khó khăn trong triển khai: Triển khai Zabbix server trên Kubernetes yêu cầu có kiến thức chuyên sâu về cả Zabbix và Kubernetes, vì vậy nó có thể đòi hỏi một mức độ kiến thức và kinh nghiệm cao.
- Chi phí cao: Triển khai Zabbix server trên Kubernetes có thể đòi hỏi nhiều tài nguyên máy chủ và kinh phí hơn so với triển khai trên một máy chủ đơn lẻ.
Tóm lại, triển khai Zabbix server trên Kubernetes cung cấp nhiều lợi ích về tính linh hoạt, tự động hóa, quản lý tài nguyên và tính mở rộng. Tuy nhiên, việc triển khai này cũng có thể gặp khó khăn và đòi hỏi chi phí cao.
1. Tạo Deployment và Service cho Zabbix Database
Dưới đây là một file định nghĩa Kubernetes cho việc triển khai và cấu hình một máy chủ cơ sở dữ liệu MariaDB để sử dụng cho Zabbix server.
Cụ thể, file này bao gồm hai phần:
- Deployment: định nghĩa cách MariaDB sẽ được triển khai. Trong phần này, MariaDB sẽ được triển khai dưới dạng một container trong một Pod với một tên là “zabbix-db”. Nó cũng cấu hình các biến môi trường như mật khẩu, tên cơ sở dữ liệu và người dùng cho MariaDB container. Container sẽ lắng nghe trên cổng 3306, được chỉ định bởi “containerPort” trong file định nghĩa.
- Service: định nghĩa cách truy cập đến MariaDB. Trong phần này, Service sẽ tạo một địa chỉ IP tĩnh cho MariaDB container để các container khác trong cùng một namespace của Kubernetes có thể truy cập vào nó. Nó cũng cấu hình cổng truy cập là 3306, giống như trong phần Deployment.
Với cấu hình này, khi triển khai Zabbix server, bạn có thể sử dụng địa chỉ IP của Service để kết nối đến cơ sở dữ liệu MariaDB.
apiVersion: apps/v1
kind: Deployment
metadata:
name: zabbix-mariadb
namespace: monitoring
spec:
selector:
matchLabels:
app: zabbix-mariadb
template:
metadata:
labels:
app: zabbix-mariadb
spec:
containers:
- name: zabbix-db
image: mariadb:10.7.8
env:
- name: MYSQL_ROOT_PASSWORD
value: "password"
- name: MYSQL_PASSWORD
value: "password"
- name: MYSQL_DATABASE
value: "zabbixdb"
- name: MYSQL_USER
value: hoanghd
ports:
- containerPort: 3306
---
apiVersion: v1
kind: Service
metadata:
name: zabbix-mariadb
namespace: monitoring
spec:
selector:
app: zabbix-mariadb
ports:
- name: mysql
port: 3306
protocol: TCP
targetPort: 3306
type: ClusterIP
. Tạo Deployment và Service cho Zabbix Server
Đây là một file định nghĩa Kubernetes cho việc triển khai và cấu hình Zabbix server.
Cụ thể, file này bao gồm hai phần:
- Deployment: định nghĩa cách Zabbix server sẽ được triển khai. Trong phần này, Zabbix server sẽ được triển khai dưới dạng một container trong một Pod với một tên là “zabbix-server”. Nó cũng cấu hình các biến môi trường như địa chỉ IP hoặc tên máy chủ của MariaDB, tên người dùng và mật khẩu để kết nối đến MariaDB container. Container sẽ lắng nghe trên cổng 10051, được chỉ định bởi “containerPort” trong file định nghĩa.
- Service: định nghĩa cách truy cập đến Zabbix server. Trong phần này, Service sẽ tạo một địa chỉ IP tĩnh cho Zabbix server container để các container khác trong cùng một namespace của Kubernetes có thể truy cập vào nó. Nó cũng cấu hình cổng truy cập là 10051, giống như trong phần Deployment.
Với cấu hình này, khi triển khai Zabbix server, bạn có thể sử dụng địa chỉ IP của Service để kết nối đến Zabbix server container. Trong đó, biến môi trường “DB_SERVER_HOST” được cấu hình với tên Service “zabbix-mariadb”, tức là Zabbix server container sẽ kết nối đến MariaDB thông qua địa chỉ IP của Service “zabbix-mariadb” mà không cần biết địa chỉ IP thực tế của MariaDB container.
apiVersion: apps/v1
kind: Deployment
metadata:
name: zabbix-server
namespace: monitoring
spec:
selector:
matchLabels:
app: zabbix-server
template:
metadata:
labels:
app: zabbix-server
spec:
containers:
- name: zabbix-server
image: zabbix/zabbix-server-mysql
env:
- name: DB_SERVER_HOST
value: zabbix-mariadb
- name: MYSQL_USER
value: hoanghd
- name: MYSQL_PASSWORD
value: password
- name: MYSQL_DATABASE
value: zabbixdb
ports:
- containerPort: 10051
---
apiVersion: v1
kind: Service
metadata:
name: zabbix-server
namespace: monitoring
spec:
selector:
app: zabbix-server
ports:
- name: zabbix-trapper
port: 10051
protocol: TCP
targetPort: 10051
type: ClusterIP
3. Tạo Deployment và Service cho Zabbix Webserver.
Trong file YAML này, ta đang định nghĩa một deployment cho Zabbix Web Server, được triển khai trên Kubernetes. Sau đó, ta cũng định nghĩa một service để cho phép các pods khác trong cụm Kubernetes có thể truy cập được vào Zabbix Web.
Cụ thể, các trường thông tin được sử dụng trong các định nghĩa YAML này bao gồm:
apiVersion
: phiên bản API của Kubernetes được sử dụng (ở đây làv1
vàapps/v1
)kind
: loại resource Kubernetes được sử dụng (ở đây làDeployment
vàService
)metadata
: thông tin metadata cho resource, bao gồm tên, nhãn và namespace của resourceselector
: các nhãn được sử dụng để lựa chọn các pods cụ thểreplicas
: số lượng pods được triển khai bởi deploymenttemplate
: mẫu cho các pods được triển khaicontainers
: danh sách các container được triển khai trong podimage
: tên image của containerenv
: danh sách các biến môi trường được định nghĩa cho containerports
: cổng mà container lắng nghe để cho phép các kết nối từ bên ngoài vào containertype
: loại service được triển khai (ở đây làClusterIP
)
Các thông tin được sử dụng trong định nghĩa YAML này tương tự như trong các định nghĩa YAML cho Zabbix Server và MariaDB Server. Tuy nhiên, ở đây chúng ta sử dụng image zabbix/zabbix-web-nginx-mysql:latest
để triển khai Zabbix Web Server, và định nghĩa cổng 80
cho service để cho phép các kết nối HTTP được truy cập vào Zabbix Web.
apiVersion: apps/v1
kind: Deployment
metadata:
name: zabbix-web
namespace: monitoring
labels:
app: zabbix-web
spec:
replicas: 1
selector:
matchLabels:
app: zabbix-web
template:
metadata:
labels:
app: zabbix-web
spec:
containers:
- name: zabbix-web
image: zabbix/zabbix-web-nginx-mysql:latest
env:
- name: DB_SERVER_HOST
value: zabbix-mariadb
- name: MYSQL_USER
value: hoanghd
- name: MYSQL_PASSWORD
value: password
- name: MYSQL_DATABASE
value: zabbixdb
- name: ZBX_SERVER_HOST
value: zabbix-server
- name: PHP_TZ
value: Asia/Ho_Chi_Minh
ports:
- name: http
containerPort: 80
---
apiVersion: v1
kind: Service
metadata:
name: zabbix-web
namespace: monitoring
labels:
app: zabbix-web
spec:
selector:
app: zabbix-web
ports:
- name: http
port: 80
targetPort: 8080
type: ClusterIP
4. Tạo Ingress cho Zabbix Webserver.
Đây là file YAML để triển khai một Ingress trên Kubernetes để định tuyến traffic từ bên ngoài tới service zabbix-web
trong namespace monitoring
.
Cụ thể, trong YAML này:
apiVersion: networking.k8s.io/v1
: Định nghĩa phiên bản API mà YAML này sử dụng.kind: Ingress
: Xác định đối tượng mà YAML này triển khai, ở đây là một Ingress.metadata
: Chứa các thông tin về đối tượng, bao gồm tên của Ingress và namespace mà nó thuộc về.name: zabbix-ingress
: Tên của Ingress làzabbix-ingress
.namespace: monitoring
: Ingress này thuộc namespacemonitoring
.annotations
: Các thông tin khác về Ingress, ở đây là thông tin để Ingress controller (ở đây là Nginx) định tuyến traffic và chỉnh sửa URL.nginx.ingress.kubernetes.io/rewrite-target: /
: Thông tin để Ingress controller thực hiện chỉnh sửa URL và định tuyến traffic đến đúng service.ingressClassName: nginx
: Định nghĩa lớp Ingress controller mà Ingress này sử dụng, ở đây là Nginx.rules
: Định nghĩa các quy tắc để định tuyến traffic.host: zabbix.hoanghd.com
: Tên miền của Ingress, ở đây làzabbix.hoanghd.com
.http
: Khai báo sử dụng giao thức HTTP.paths
: Các đường dẫn để định tuyến traffic.path: /
: Đường dẫn được định tuyến, ở đây là/
.pathType: Prefix
: Loại đường dẫn, ở đây là Prefix. Prefix nghĩa là Ingress controller sẽ so khớp đường dẫn bắt đầu bằng/
.backend
: Các thông tin về service mà traffic sẽ được định tuyến đến.service
: Chứa các thông tin về service, ở đây làzabbix-web
.name: zabbix-web
: Tên của service.port
: Số cổng của service, ở đây là 80.
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: zabbix-ingress
namespace: monitoring
annotations:
nginx.ingress.kubernetes.io/rewrite-target: /
spec:
ingressClassName: nginx
rules:
- host: zabbix.hoanghd.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: zabbix-web
port:
number: 80
5. Triển khai
Tạo namespace cho dự án.
kubectl create namspace monitoring
Lệnh kubectl apply
được sử dụng để triển khai các đối tượng Kubernetes từ các file cấu hình YAML hoặc JSON. Trong trường hợp này, lệnh sẽ triển khai các đối tượng Zabbix Server và Zabbix Web trên Kubernetes, được định nghĩa trong các file cấu hình YAML trong thư mục /home/zabbix-kubernetes
.
kubectl apply -f /home/zabbix-kubernetes
Output
deployment.apps/zabbix-mariadb created
service/zabbix-mariadb created
ingress.networking.k8s.io/zabbix-ingress created
deployment.apps/zabbix-server created
service/zabbix-server created
deployment.apps/zabbix-web created
service/zabbix-web created
Sử dụng lênh kubectl get po,svc,ingress -n monitoring để xác nhận các dịch vụ đã chạy.
kubectl get po,svc,ingress -n monitoring
Output
NAME READY STATUS RESTARTS AGE
pod/zabbix-mariadb-576b5d7cc8-9tg2c 0/1 ContainerCreating 0 0s
pod/zabbix-mariadb-576b5d7cc8-lvm2s 1/1 Terminating 0 50s
pod/zabbix-server-5c666cc5c5-zhrb9 0/1 ContainerCreating 0 0s
pod/zabbix-web-64c6d7c5d5-tj45g 0/1 ContainerCreating 0 0s
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
service/zabbix-mariadb ClusterIP 10.98.184.29 <none> 3306/TCP 0s
service/zabbix-server ClusterIP 10.106.191.154 <none> 10051/TCP 0s
service/zabbix-web ClusterIP 10.108.192.209 <none> 80/TCP 0s
NAME CLASS HOSTS ADDRESS PORTS AGE
ingress.networking.k8s.io/zabbix-ingress nginx zabbix.hoanghd.com 192.168.13.208 80 0s
Kết quả.