小阿轩yx-案例:Zabbix监控kubernetes云原生环境
小阿轩yx-案例:Zabbix监控kubernetes云原生环境
前言
传统监控的本质
- 就是收集、分析和使用信息来观察一段时间内监控对象的运行进度,并且进行相应的决策管理的过程,监控侧重于观察特定指标。
随着云原生时代的到来
- 我们对监控的功能提出了更多的要求,要实现这些功能,就要实现的云原生的“可观测性”。
- 可观测性是云原生时代必须具备的能力。
目前,“可观测性” 逐渐取代 “监控”,成为云原生技术领域最热门的话题之一。
Zabbix 新版本功能介绍
zabbix 新功能
- 是一个基于 web 界面的分布式系统监控的企业级开源软件。
- 可以监视各种系统与设备的参数,保障服务器及设备的安全运营。
Zabbix 6.0 LTS
- 新增 Kubernetes 监控功能,可以在 Kubernetes 系统从多个维度采集指标。
zabbix 特点
- 安装与配置简单。
- 可视化 web 管理界面。
- 免费开源。
- 支持中文。
- 自动发现。
- 分布式监控。
- 实时绘图。
zabbix 的主要功能
硬件监控
- 如交换机、路由器、打印机等。
系统监控
- 如 CPU、内存,磁盘。硬盘 IO,系统负载等。
服务监控
- 如 apache、nginx、tomcat、redis、TCP 连接数等。
性能监控
- 如网站性能,服务器性能,数据库性能。
日志监控
- 如访问日志,错误日志。
安全监控
- 如用户登录数,本地文件改动,passwd 文件变化。
网络监控
- 如端口,SMTP,网络使用率,网络入流量,网络出流量。
kubernetes 集群及组件监控模板
新版本的 zabbix 中
- 提供了专门针对 kubernetes 原生架构的监控模板,用户可以直接使用这些模板对 kubernetes 的原生组件进行监控。
模板名称 | 备注 |
Kubernetes API server by HTTP | K8S ApiServer 组件指标模板 |
Kubernetes cluster state by HTTP | k8S 集群指标模板 |
Kubernetes controller manager by HTTP | K8S ControllerManager 组件指标模板 |
Kubernetes kubelet by HTTP | K8S Kubelet 组件指标模板 |
Kubernetes nodes by HTTP | K8S 集群节点发现以及状态指标模板 |
Kubernetes scheduler by HTTP | K8S Scheduler 组件指标模板 |
K8S 节点基础信息指标模板
- 对 kubernetes 的主机进行监控的时候,仍然可以使用 Linux by zabbix agent 模板对集群中的各个主机进行晚上的监控。
模板名称 | 备注 |
Linux by Zabbix agent | OS Linux 系统监控模板 |
监控指标
- 云原生环境中,需要监控的指标很多
监控名称 | 监控对象 |
节点基础信息 | CPU、内存,磁盘 ,IO ,网络,system info等 |
集群指标 [组件] | Api Server 、controllerManage、SchedulerServer,、kubelet等 |
资源对象指标 | Daemonset、Deployment、Replicaset,Endpoint,Pod等 |
Pod 容器指标 | Container:Menory max usage,Pod CpU:User seconds等 |
Agentless
- 通过 Zabbix 内置的 “HTTP agent”,“Script” 两种类型的监控项,无需安装客户端,通过访问被监控端的 API 接口即可采集监控指标数据,主要用于K8S 集群、服务组件、pod 容器状态及性能指标的采集。
项目环境
设备列表
主机 | IP |
k8s-master | 192.168.10.101 |
k8s-node01 | 192.168.10.102 |
k8s-node02(zabbix server) | 192.168.10.103 |
mariadb-10、NFS | 192.168.10.108 |
案例拓扑图
数据库配置
关闭防火墙、内核机制(在108主机上)
[root@localhost ~]# systemctl stop firewalld
[root@localhost ~]# systemctl disable firewalld
[root@localhost ~]# setenforce 0
[root@localhost ~]# vim /etc/sysconfig/selinux
##修改为永久关闭
SELINUX=disabled
将 mysql-8.0.31-linux 的源码包通过 Xftp 上传至主机108
用 bash 快速部署 mysql
[root@localhost ~]# bash mysql-8.0.31-linux-glibc2.12-x86_64.tar.xz
NFS 配置
开启会话同步(101、102、103)
创建 NFS 存储目录
[root@k8s-master ~]# mkdir -p /nfs
[root@k8s-node01 ~]# mkdir -p /nfs
[root@k8s-node02 ~]# mkdir -p /nfs
安装 nfs 服务
[root@k8s-master ~]# yum -y install nfs-utils rpcbind
[root@k8s-node01 ~]# yum -y install nfs-utils rpcbind
[root@k8s-node02 ~]# yum -y install nfs-utils rpcbind
重定向配置文件
[root@k8s-master ~]# echo "/nfs *(rw,sync,no_root_squash)" >> /etc/exports
[root@k8s-node01 ~]# echo "/nfs *(rw,sync,no_root_squash)" >> /etc/exports
[root@k8s-node02 ~]# echo "/nfs *(rw,sync,no_root_squash)" >> /etc/exports
启动服务
[root@k8s-master ~]# systemctl start nfs && systemctl start rpcbind
[root@k8s-node01 ~]# systemctl start nfs && systemctl start rpcbind
[root@k8s-node02 ~]# systemctl start nfs && systemctl start rpcbind
设置开机自启
[root@k8s-master ~]# systemctl enable nfs-server && systemctl enable rpcbind
[root@k8s-node01 ~]# systemctl enable nfs-server && systemctl enable rpcbind
[root@k8s-node02 ~]# systemctl enable nfs-server && systemctl enable rpcbind
在所有 k8s 节点安装 nfs
[root@k8s-master ~]# yum -y install nfs-utils
[root@k8s-node01 ~]# yum -y install nfs-utils
[root@k8s-node02 ~]# yum -y install nfs-utils
- 所有节点都要安装 nfs-utils,否则无法使用 pv
安装 zabbix server 和 web
将镜像文件通过 Xftp 上传至master、node01、node02(101、102、103)
开启会话同步
进入镜像文件目录
[root@k8s-master ~]# cd images/
[root@k8s-node01 ~]# cd images/
[root@k8s-node02 ~]# cd images/
导入镜像
[root@k8s-master images]# bash imp_docker_img.sh
[root@k8s-node01 images]# bash imp_docker_img.sh
[root@k8s-node02 images]# bash imp_docker_img.sh
取消会话同步
创建动态 PV
编辑 nfs 的 yaml 文件
[root@localhost ~]# vim storageclass-nfs.yaml
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: managed-nfs-storage
provisioner: fuseim.pri/ifs
parameters:
archiveOnDelete: "true"
---
kind: ServiceAccount
apiVersion: v1
metadata:
name: nfs-client-provisioner
---
kind: ClusterRole
apiVersion: rbac.authorization.k8s.io/v1
metadata:
name: nfs-client-provisioner-runner
rules:
- apiGroups: [""]
resources: ["persistentvolumes"]
verbs: ["get", "list", "watch", "create", "delete"]
- apiGroups: [""]
resources: ["persistentvolumeclaims"]
verbs: ["get", "list", "watch", "update"]
- apiGroups: ["storage.k8s.io"]
resources: ["storageclasses"]
verbs: ["get", "list", "watch"]
- apiGroups: [""]
resources: ["events"]
verbs: ["create", "update", "patch"]
---
kind: ClusterRoleBinding
apiVersion: rbac.authorization.k8s.io/v1
metadata:
name: run-nfs-client-provisioner
subjects:
- kind: ServiceAccount
name: nfs-client-provisioner
namespace: default
roleRef:
kind: ClusterRole
name: nfs-client-provisioner-runner
apiGroup: rbac.authorization.k8s.io
---
kind: Role
apiVersion: rbac.authorization.k8s.io/v1
metadata:
name: leader-locking-nfs-client-provisioner
rules:
- apiGroups: [""]
resources: ["endpoints"]
verbs: ["get", "list", "watch", "create", "update", "patch"]
---
kind: RoleBinding
apiVersion: rbac.authorization.k8s.io/v1
metadata:
name: leader-locking-nfs-client-provisioner
subjects:
- kind: ServiceAccount
name: nfs-client-provisioner
namespace: default
roleRef:
kind: Role
name: leader-locking-nfs-client-provisioner
apiGroup: rbac.authorization.k8s.io
---
apiVersion: v1
kind: ServiceAccount
metadata:
name: nfs-client-provisioner
---
kind: Deployment
apiVersion: apps/v1
metadata:
name: nfs-client-provisioner
spec:
replicas: 1
strategy:
type: Recreate
selector:
matchLabels:
app: nfs-client-provisioner
template:
metadata:
labels:
app: nfs-client-provisioner
spec:
serviceAccountName: nfs-client-provisioner
containers:
- name: nfs-client-provisioner
image: arawak/nfs-client-provisioner
volumeMounts:
- name: nfs-client-root
mountPath: /persistentvolumes
env:
- name: PROVISIONER_NAME
value: fuseim.pri/ifs
- name: NFS_SERVER
value: 192.168.10.108 #指定nfs地址
- name: NFS_PATH
value: /nfs
volumes:
- name: nfs-client-root
nfs:
server: 192.168.10.108 #指定nfs地址
path: /nfs
生成动态 PV
[root@localhost ~]# kubectl apply -f storageclass-nfs.yaml
安装 zabbix-server
编写 zabbix_server.yaml
[root@localhost ~]# zabbix-server.yaml
apiVersion: v1
kind: Namespace
metadata:
name: zabbix
---
apiVersion: v1
kind: Service
metadata:
name: zabbix-server
namespace: zabbix
labels:
app: zabbix-server
spec:
selector:
app: zabbix-server
ports:
- name: zabbix-server
port: 10051
nodePort: 30051
type: NodePort
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: zabbix-scripts
namespace: zabbix
spec:
storageClassName: "managed-nfs-storage"
accessModes:
- ReadWriteMany
resources:
requests:
storage: 1Gi
---
apiVersion: apps/v1
kind: Deployment
metadata:
labels:
app: zabbix-server
name: zabbix-server
namespace: zabbix
spec:
replicas: 1
selector:
matchLabels:
app: zabbix-server
template:
metadata:
labels:
app: zabbix-server
spec:
nodeSelector:
zabbix-server: "true"
hostNetwork: true
containers:
- image: zabbix/zabbix-server-mysql:6.4.8-centos
imagePullPolicy: IfNotPresent
name: zabbix-server-mysql
volumeMounts:
- mountPath: /usr/lib/zabbix/alertscripts
name: zabbix-scripts
env:
- name: DB_SERVER_HOST
value: 192.168.10.108
- name: DB_SERVER_PORT
value: "3306"
- name: MYSQL_DATABASE
value: zabbix
- name: MYSQL_USER
value: zabbix
- name: MYSQL_PASSWORD
value: zabbix
- name: ZBX_CACHESIZE
value: "512M"
- name: ZBX_HISTORYCACHESIZE
value: "128M"
- name: ZBX_HISTORYINDEXCACHESIZE
value: "128M"
- name: ZBX_TRENDCACHESIZE
value: "128M"
- name: ZBX_VALUECACHESIZE
value: "256M"
- name: ZBX_TIMEOUT
value: "30"
resources:
requests:
cpu: 500m
memory: 500Mi
limits:
cpu: 1000m
memory: 1Gi
volumes:
- name: zabbix-scripts
persistentVolumeClaim:
claimName: zabbix-scripts
为 node02 节点设置标签
[root@localhost ~]# kubectl label node k8s-node02 zabbix-server=true
安装 zabbix-server
[root@localhost ~]# kubectl apply -f zabbix-server.yaml
查看 pod 状态
[root@localhost ~]# kubectl get pod -n zabbix
NAME READY STATUS RESTARTS AGE
zabbix-server-5f48d9d57d-rkr5p 1/1 Running 0 66s
部署 zabbix-web
编写 zabbix_web.yaml 文件
[root@localhost ~]# vim zabbix-web.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
labels:
app: zabbix-web
name: zabbix-web
namespace: zabbix
spec:
replicas: 1
selector:
matchLabels:
app: zabbix-web
template:
metadata:
labels:
app: zabbix-web
spec:
containers:
- image: zabbix/zabbix-web-nginx-mysql:6.4.8-centos
imagePullPolicy: IfNotPresent
name: zabbix-web-nginx-mysql
env:
- name: DB_SERVER_HOST
value: 192.168.10.108
- name: MYSQL_USER
value: zabbix
- name: MYSQL_PASSWORD
value: zabbix
- name: ZBX_SERVER_HOST
value: zabbix-server
- name: PHP_TZ
value: Asia/shanghai
resources:
requests:
cpu: 500m
memory: 500Mi
limits:
cpu: 1000m
memory: 1Gi
---
apiVersion: v1
kind: Service
metadata:
labels:
app: zabbix-web
name: zabbix-web
namespace: zabbix
spec:
ports:
- name: web
port: 8080
protocol: TCP
targetPort: 8080
nodePort: 30008
selector:
app: zabbix-web
type: NodePort
安装 zabbix-web
[root@localhost ~]# kubectl apply -f zabbix-web.yaml
查看 pod 状态
[root@localhost ~]# kubectl get pod -n zabbix
NAME READY STATUS RESTARTS AGE
zabbix-server-5f48d9d57d-rkr5p 1/1 Running 0 66s
zabbix-web-55cd66f74f-9f284 1/1 Running 0 44s
访问 zabbix 的 web
查看 svc
[root@localhost ~]# kubectlget svc -n zabbix
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
zabbix-server NodePort 10.100.40.247 <none> 10051:30051/TCP 2m39s
zabbix-web NodePort 10.100.202.232 <none> 8080:30008/TCP 21s
登录 web
- 等待片刻后访问网站
- http://192.168.10.101:30008/
初始账号
- Admin
- zabbix
安装 zabbix proxy 和 agent
- 官方给我们提供了全套的容器化服务部署方式,这里采用官方提供的 Helm chart 来安装。
安装 helm 工具(如果有 helm,忽略此步)
- 将 zabbix-helm-chrt-1.3.4 源码包上传至 master(101)
解压
[root@localhost ~]# tar zxvf zabbix-helm-chrt-1.3.4.tgz
拷贝文件到指定目录下
[root@localhost ~]# cp linux-amd64/helm /usr/local/bin/helm
添加仓库(已有离线包,此步可忽略)
[root@localhost ~]# helm repo add zabbix-chart-6.2 https://cdn.zabbix.com/zabbix/integrations/kubernetes-helm/6.2/
查看列表
[root@localhost ~]# helm repo list
NAME URL
zabbix-chart-6.0 https://cdn.zabbix.com/zabbix/integrations/kubernetes-helm/6.4
搜索仓库中的 helm 包(已有离线包,此步可忽略)
[root@localhost ~]# helm search repo zabbix-chart-6.2
NAME CHART VERSION APP VERSION DESCRIPTION
zabbix-chart-6.0/zabbix-helm-chrt 1.3.4 6.0.21 A Helm chart for deploying ZAbbix agent and proxy
拉取 helm 包(已有离线包,此步可忽略)
[root@localhost ~]# helm pull zabbix-chart-6.2/zabbix-helm-chrt
配置 values.yaml
解压
[root@localhost ~]# tar zxvf zabbix-helm-chrt-1.3.4.tgz
进入目录
[root@localhost ~]# cd zabbix-helm-chrt
修改配置文件
[root@localhost zabbix-helm-chrt]# vim values.yaml
#修改以下内容
zabbixProxy:
image:
repository: zabbix/zabbix-proxy-sqlite3
tag: 6.4.8-centos
pullPolicy: IfNotPresent
- name: ZBX_SERVER_HOST
value: "192.168.10.103"
zabbixAgent:
image:
repository: zabbix/zabbix-agent2
tag: 6.4.8-centos
pullPolicy: IfNotPresent
- name: ZBX_SERVER_HOST
value: 0.0.0.0/0
## Zabbix server port
- name: ZBX_SERVER_PORT
value: 10051
- name: ZBX_PASSIVE_ALLOW
value: true
- name: ZBX_ACTIVE_ALLOW
value: true
- zabbixProxy:
- tag: 6.4.8-centos
- value: "192.168.10.103"
- zabbixAgent:
- tag: 6.4.8-centos
- value: true
IP 地址为 zabbix server 主机的地址,我们是将 zabbix server 安装到了 node82 的节点上,此节点的 IP 地址为 192.168.10.103。
安装 Zabbix Chart
创建 zabbix agent 和 proxy 的命名空间
[root@localhost zabbix-helm-chrt]# kubectl create namespace monitoring
利用 helm 部署 agent 和 proxy 组件
[root@localhost zabbix-helm-chrt]# kubectl taint node k8s-master node-role.kubernetes.io/master:NoSchedule-
[root@localhost zabbix-helm-chrt]# helm install zabbix .--dependency-update -n monitoring
[root@localhost zabbix-helm-chrt]# kubectl taint node k8s-master node-role.kubernetes.io/master:NoSchedule
- 如果需要在 master 节点上安装 agent 程序,需要将 master 节点的污点去掉,本案例的 k8s 集群使用 kubeadm 安装,默认 master 节点为污点。
- 部署好后还可以再将 master 设置为污点。
查看安装结果
[root@localhost ~]# kubectl get pod -n monitoring
NAME READY STATUS RESTARTS AGE
zabbix-agent-78kvh 1/1 Running 0 20s
zabbix-agent-hxjns 1/1 Running 0 20s
zabbix-agent-lpw9j 1/1 Running 0 20s
zabbix-kube-state-metrics-6b588697b8-gw422 1/1 Running 0 20s
zabbix-proxy-59bcf6d9c4-44dt2 1/1 Running 0 20s
如果要卸载 helm 安装的程序,可以使用下面的命令
helm uninstall zabbix -n monitoring
验证安装结果
- 如果 proxy 和 agnet 正常安装,则会看到 zabbix server 主机已经处于正常的监控状态。
修改 UI 界面语言
- “Administration” --> “General”,找到 “Default language”,在下拉菜单中选择 “chinese(zh_CN)”,然后点击下方的 “update” 按钮,页面即可修改为中文界面。
在 Web 管理界面添加 proxy
添加 zabbix-proxy
- “管理” --> “Proxy”,在右上角点击 “创建 Proxy” 按钮,打开创建 proxy 的界面。
- 填写信息,其中 agnet 代理程序名称是在 value.yaml 中设置的 ZBX_HOSTNAME 的值,系统代理模式为主动式,代理地址不用填写。
等待一会,刷新一下页面,观察 proxy 的状态,如果不正常,Last seen 的位置会显示成红色的 Never 字样。
创建主机群组
- 创建主机群组,群组命名为 k8s Server
- “数据采集” --> “主机群组”,添加主机组。
节点状态监控
- 创建 k8s-node 主机,用于自动发现 K8S 各个节点主机
添加主机模板
- “数据采集” --> “主机”,创建主机 k8s-nodes,用于自动发现节点。
需要配置的信息
- 主机名:k8s-nodes
- 模板:Templates 下的Kubernetes nodes by HTTP
- 主机群组:K8S Server
- 代理程序检测:zabbix-proxy
- 已启用:true
为主机设置宏参数
配置信息宏变量表
宏变量 | 值 |
{$KUBE.API.ENDPOINT.URL} | https://192.168.10.101:6443/api |
{$KUBE.API.TOKEN} | 你的 Token 值 |
{$KUBE.NODES.ENDPOINT.NAME} | zabbix-zabbix-helm-chrt-agent |
获取 Token 值
kubectl get secret zabbix-service-account -n monitoring -o jsonpath={.data.token}base64 -d
获取endpoint
kubectl get ep -n monitoring
集群服务监控
添加主机模板
- “数据采集” --> “主机”,创建主机 k8s-cluster
- 关联模板 “Kubernetes cluster state by HTTP”,用于自动发现服务组件。
设置宏变量
- 需要填写的宏变量表
宏变量 | 值 |
{$KUBE.API.HOST} | 192.168.10.101 |
{$KUBE.API.PORT} | 6443 |
{$KUBE.API.TOKEN} | 你的Token值 |
{$KUBE.API.URL} | https://192.168.10.101:6443 |
{$KUBE.API_SERVER.PORT} | 6443 |
{$KUBE.API_SERVER.SCHEME} | https |
{$KUBE.CONTROLLER_MANAGER.PORT} | 10252 |
{$KUBE.CONTROLLER_MANAGER.SCHEME} | http |
{$KUBE.KUBELET.PORT} | 10250 |
{$KUBE.KUBELET.SCHEME} | https |
{$KUBE.SCHEDULER.PORT} | 10251 |
{$KUBE.SCHEDULER.SCHEME} | http |
{$KUBE.STATE.ENDPOINT.NAME} | zabbix-zabbix-helm-chrt-agent |
验证监控主机
- 因为没有使用 Linux by Zabbix agent 模板,所以集群服务相关的监控项,ZBX 为灰色的。
- 只要能査看到监控信息就是成功的。
- 如果想让其他的主机的 ZBX 也显示为绿色,可以单独给他们添加一个 Zabbix agent 模板,结果如图
查看监控数据
- “检测” --> “主机”,可以看到所有被检测的主机。
点击某一个主机或组件的 “最新数据”,可以看到对应的具体监控到的信息。
小阿轩yx-案例:Zabbix监控kubernetes云原生环境