小阿轩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

初始账号

  • 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云原生环境

相关推荐
S+叮当猫1 小时前
第五部分:2---信号的介绍、产生、处理
linux·运维·服务器
东城绝神2 小时前
《Linux运维总结:基于ARM64+X86_64架构CPU使用docker-compose一键离线部署mongodb 7.0.14容器版副本集群》
linux·运维·mongodb·架构
Jasonakeke4 小时前
本地镜像发布到阿里云
阿里云·云计算
WZF-Sang4 小时前
Linux权限理解【Shell的理解】【linux权限的概念、管理、切换】【粘滞位理解】
linux·运维·服务器·开发语言·学习
小橞5 小时前
Linux搭建简易路由转发
linux·运维·服务器
robot_大菜鸟5 小时前
linux-L7-linux 查看json文件
linux·运维
Flying_Fish_roe5 小时前
linux-网络管理-网络抓包
linux·网络·php
小技与小术7 小时前
lvs-nat模式实验详解
linux·运维·服务器·网络·lvs
py.鸽鸽7 小时前
Linux2-mkdir,touch,cat,more
linux
aabbcc456aa7 小时前
ubuntu安装mysql 8.0忘记root初始密码,如何重新修改密码
linux·mysql·ubuntu