基于k8s集群部署安装Zabbix

一、搭建k8s集群

1、检查环境

1.1配置静态IP


示例(最小化配置必须的参数)

[root@k8s-master01 ~]# vi etc/sysconfig/network-scripts/ifcfg-ens192

BOOTPROTO="none"

NAME="ens192"

DEVICE="ens192"

ONBOOT="yes"

IPADDR=192.168.3.174

PREFIX=24

GATEWAY=192.168.1.1

DNS1=114.114.114.114

[root@k8s-master01 ~]# systemctl restart network  #刷新网络服务

[root@k8s-master01 ~]# ip a  #查看ip


1.2 配置添加hosts

[root@k8s-master01 ~]# cat /etc/hosts

127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4

::1         localhost localhost.localdomain localhost6 localhost6.localdomain6

192.168.3.174 k8s-master01

192.168.3.175 k8s-node01

192.168.3.176 k8s-node02


[root@k8s-master01 ~]#

2、配置docker环境

(1)清理现有 Docker 并配置源

# 卸载可能存在的旧版本 Docker

sudo yum remove docker docker-engine docker-ce docker-* containerd.io

# 添加阿里云 CentOS 8 基础源

sudo curl -o /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-8.repo

# 添加 Docker CE 源(阿里云镜像)

sudo yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

# 修正 yum 变量(关键步骤!强制使用 centos 8 的包)

echo "8" | sudo tee /etc/yum/vars/centos_version > /dev/null

sudo sed -i 's/$releasever/$centos_version/g' /etc/yum.repos.d/docker-ce.repo

sudo sed -i 's/$releasever/$centos_version/g' /etc/yum.repos.d/CentOS-Base.repo

# 更新缓存

sudo yum makecache


# 查看所有可用的 Docker CE 版本

yum list docker-ce --showduplicates | sort -r

#让包管理器自动解决依赖关系。注意,这会安装软件源中标记为默认或最新的版本

yum install -y docker-ce docker-ce-cli containerd.io

或# 选择一个较新但非最新的版本进行安装(例如 26.1.3)

yum install -y docker-ce-26.1.3-1.el8 docker-ce-cli-26.1.3-1.el8 containerd.io


(2)配置docker的国内源

# 创建/etc/docker目录(如果不存在)

sudo mkdir -p /etc/docker


# 配置Docker守护进程,尤其是cgroup驱动

cat <<EOF | sudo tee /etc/docker/daemon.json

{

"registry-mirrors": ["https://hub.docker-alhk.dkdun.com/"],

"exec-opts": ["native.cgroupdriver=systemd"]

}

EOF

# 重启Docker以应用配置

sudo systemctl daemon-reload

sudo systemctl restart docker

# 设置Docker开机自启

sudo systemctl enable docker.service

sudo systemctl status dokcer

3、配置k8s组件源

(1)配置国内yum源

cat <<EOF | tee /etc/yum.repos.d/kubernetes.repo

[kubernetes]

name=Kubernetes

baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64

enabled=1

gpgcheck=0

repo_gpgcheck=0

gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg

EOF

# 更新索引缓冲

yum makecache


(2)安装kubelet、kubeadm和kubectl

# 安装指定版本,建议指定版本以避免兼容性问题

yum install -y kubeadm-1.23.17-0 kubelet-1.23.17-0 kubectl-1.23.17-0 --disableexcludes=kubernetes

# 或者安装当前最新稳定版

# sudo yum install -y kubelet kubeadm kubectl

 

# 启用kubelet服务,但暂不启动(需初始化后才会正常)

sudo systemctl enable kubelet

4、集群初始化

(1)初始化Kubernetes控制平面(Master节点)   以下步骤仅在Master节点上执行:


kubeadm init \

--apiserver-advertise-address=192.168.3.174 \ # 替换为你的Master节点IP

--image-repository registry.aliyuncs.com/google_containers \ # 使用国内镜像源

--kubernetes-version=v1.23.17 \  # 指定与安装一致的版本

--service-cidr=10.96.0.0/12 \    #指定 Service 网络的 IP 地址范围。

--pod-network-cidr=10.244.0.0/16  # 设置Pod网络CIDR,需与后续CNI插件匹配


成功后会提示一下信息

继续执行

mkdir -p $HOME/.kube

sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config

sudo chown $(id -u):$(id -g) $HOME/.kube/config


在node节点执行加入到集群

kubeadm join 192.168.3.174:6443 --token g5aqri.02haydobvjfu7dnl \

--discovery-token-ca-cert-hash sha256:95fd4a7fd82ccde7b329ea551130340a837a3aa612145caa2435d2c18b3c91ef


查看集群

[root@k8s-master01 ~]# kubectl label node k8s-node01 node-role.kubernetes.io/worker=worker

node/k8s-node01 labeled

[root@k8s-master01 ~]# kubectl label node k8s-node02 node-role.kubernetes.io/worker=worker

node/k8s-node02 labeled

[root@k8s-master01 ~]# kubectl get nodes

NAME           STATUS     ROLES                  AGE     VERSION

k8s-master01   NotReady   control-plane,master   4h29m   v1.23.17

k8s-node01     NotReady   worker                 3m45s   v1.23.17

k8s-node02     NotReady   worker                 41m     v1.23.17

[root@k8s-master01 ~]#


#过一段时间

[root@k8s-master01 ~]# kubectl get nodes

NAME           STATUS   ROLES                  AGE   VERSION

k8s-master01   Ready    control-plane,master   24m   v1.23.17

k8s-node01     Ready    worker                 18m   v1.23.17

k8s-node02     Ready    worker                 18m   v1.23.17


二、部署zabbix

如果镜像拉取有问题,可先手动导入(连接下载解压:通过网盘分享的文件:zabbix-all.zip链接: https://pan.baidu.com/s/1VsVlPF8RAZUlP3F2b5IxYQ?pwd=5h2u提取码: 5h2u)

# 导入 Zabbix Server

docker load -i zabbix-server-mysql.tar.gz


# 导入 Zabbix Web

docker load -i zabbix-web-nginx-mysql.tar.gz


# 导入 Zabbix Agent

docker load -i zabbix-agent.tar.gz


#导入 数据库

docker load -i mysql:8.0.gz


1、安装zabbix的数据库(MySQL或PostgreSQL)

(1)本次测试选择MySQL,创建mysql-deploy.yaml文件

apiVersion: v1

kind: PersistentVolumeClaim

metadata:

  name: mysql-pvc

  namespace: zabbix

spec:

  accessModes:

    - ReadWriteOnce

  resources:

    requests:

storage: 10Gi  #根据需求调整存储大小

#若有StorageClass,取消注释并指定(如:storageClassName: "standard")

  # storageClassName: "your-storage-class"

---

apiVersion: apps/v1

kind: Deployment

metadata:

  name: mysql

  namespace: zabbix

spec:

  replicas: 1

  selector:

    matchLabels:

      app: mysql

  template:

    metadata:

      labels:

        app: mysql

    spec:

      containers:

      - name: mysql

image: mysql:8.0  #官方MySQL镜像

        imagePullPolicy: IfNotPresent

        ports:

        - containerPort: 3306

        env:

        - name: MYSQL_ROOT_PASSWORD

value: "Root@123"  # root密码,建议修改

        - name: MYSQL_DATABASE

value: "zabbix"    # Zabbix数据库名

        - name: MYSQL_USER

value: "zabbix"    # Zabbix数据库用户

        - name: MYSQL_PASSWORD

value: "zabbix"  # Zabbix用户密码,建议修改

        volumeMounts:

        - name: mysql-data

mountPath: /var/lib/mysql  # MySQL数据目录

        resources:

          requests:

            cpu: 300m

            memory: 300Mi

          limits:

            cpu: 800m

            memory: 800Mi

      volumes:

      - name: mysql-data

        persistentVolumeClaim:

          claimName: mysql-pvc

---

apiVersion: v1

kind: Service

metadata:

  name: mysql

  namespace: zabbix

spec:

  selector:

    app: mysql

  ports:

  - port: 3306

    targetPort: 3306

type: ClusterIP  #仅集群内部访问


(2) 应用部署

kubectl apply -f mysql-deploy.yaml


(3)验证 MySQL 是否运行

kubectl get pods -n zabbix -l app=mysql

# 状态应为Running


示例:

[root@k8s-master01 ~]# kubectl get pods -n zabbix -l app=mysql

NAME                     READY   STATUS    RESTARTS   AGE

mysql-758b6cf559-7d2kh   1/1     Running   0          40m

[root@k8s-master01 ~]#



2、部署zabbix server


(1)Zabbix Server 是核心组件,负责处理监控数据。需连接 MySQL,创建zabbix-server-deploy.yaml

[root@k8s-master01 ~]# cat zabbix-server-deploy.yaml

apiVersion: apps/v1

kind: Deployment

metadata:

name: zabbix-server

namespace: zabbix

spec:

replicas: 1

selector:

matchLabels:

app: zabbix-server

template:

metadata:

labels:

app: zabbix-server

spec:

containers:

- name: zabbix-server

image: zabbix/zabbix-server-mysql:latest  # 官方Zabbix Server镜像(6.4版本)

imagePullPolicy: IfNotPresent

ports:

- containerPort: 10051  # Zabbix Server默认端口

env:

- name: DB_SERVER_HOST

value: "mysql"  # 对应MySQL Service名称

- name: MYSQL_DATABASE

value: "zabbix"

- name: MYSQL_USER

value: "zabbix"

- name: MYSQL_PASSWORD

value: "zabbix"  # 与MySQL中Zabbix用户密码一致

- name: MYSQL_ROOT_PASSWORD

value: "Root@123"    # MySQL root密码(用于初始化数据库)

resources:

requests:

cpu: 300m

memory: 300Mi

limits:

cpu: 1000m

memory: 800Mi

---

apiVersion: v1

kind: Service

metadata:

name: zabbix-server

namespace: zabbix

spec:

selector:

app: zabbix-server

ports:

- port: 10051

targetPort: 10051

type: ClusterIP  # 内部访问

[root@k8s-master01 ~]#


(2)应用部署

kubectl apply -f zabbix-server-deploy.yaml


(3)验证 Zabbix Server 状态

kubectl get pods -n zabbix -l app=zabbix-server




3、部署 Zabbix Web 前端(Nginx+PHP)

(1)Zabbix Web 提供可视化界面,需连接 Zabbix Server 和 MySQL。创建zabbix-web-deploy.yaml


[root@k8s-master01 ~]# cat zabbix-web-deploy.yaml

apiVersion: apps/v1

kind: Deployment

metadata:

  name: zabbix-web

  namespace: zabbix

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  #官方Web镜像(Nginx+PHP)

        imagePullPolicy: IfNotPresent

        ports:

- containerPort: 8080  # Web端口

        env:

        - name: ZBX_SERVER_HOST

value: "zabbix-server"  #对应Zabbix Server Service名称

        - name: DB_SERVER_HOST

          value: "mysql"

        - name: MYSQL_DATABASE

          value: "zabbix"

        - name: MYSQL_USER

          value: "zabbix"

        - name: MYSQL_PASSWORD

          value: "zabbix"

        - name: PHP_TZ

value: "Asia/Shanghai"  #设置时区为上海

        resources:

          requests:

            cpu: 200m

            memory: 256Mi

          limits:

            cpu: 1000m

            memory: 512Mi

---

apiVersion: v1

kind: Service

metadata:

  name: zabbix-web

  namespace: zabbix

spec:

  selector:

    app: zabbix-web

  ports:

  - port: 80

    targetPort: 8080

type: NodePort  #暴露到节点端口,便于外部访问

[root@k8s-master01 ~]#


(2)应用部署

kubectl apply -f zabbix-web-deploy.yaml


(3)验证 Web 状态

kubectl get pods -n zabbix -l app=zabbix-web


[root@k8s-master01 ~]# kubectl get pods -n zabbix -l app=zabbix-web

NAME                          READY   STATUS    RESTARTS   AGE

zabbix-web-7bc9f48d8f-7bvvz   1/1     Running   0          27m

[root@k8s-master01 ~]#







4、部署 Zabbix Agent(可选,监控 K8s 节点)

[root@k8s-master01 ~]# cat zabbix-agent-daemonset.yaml

apiVersion: apps/v1

kind: DaemonSet

metadata:

  name: zabbix-agent

  namespace: zabbix

spec:

  selector:

    matchLabels:

      app: zabbix-agent

  template:

    metadata:

      labels:

        app: zabbix-agent

    spec:

      hostNetwork: true

#新增:容忍 master 节点的污点(关键!)

      tolerations:

      - key: "node-role.kubernetes.io/master"

        operator: "Exists"

        effect: "NoSchedule"

#保留原有其他容忍(内存压力、磁盘压力等,无需修改)

      - key: "node.kubernetes.io/memory-pressure"

        operator: "Exists"

        effect: "NoSchedule"

      - key: "node.kubernetes.io/disk-pressure"

        operator: "Exists"

        effect: "NoSchedule"

#容器配置不变(保留原有内容)

      containers:

      - name: zabbix-agent

        image: zabbix/zabbix-agent:latest

        ports:

        - containerPort: 10050

        env:

        - name: ZBX_SERVER_HOST

          value: "zabbix-server"

        - name: ZBX_HOSTNAME

          valueFrom:

            fieldRef:

              fieldPath: spec.nodeName

        resources:

          requests:

            cpu: 50m

            memory: 64Mi

          limits:

            cpu: 100m

            memory: 128Mi

[root@k8s-master01 ~]#


kubectl apply -f zabbix-agent-daemonset.yaml



[root@k8s-master01 ~]# kubectl get pods -n zabbix -l app=zabbix-agent -o wide

NAME                 READY   STATUS    RESTARTS   AGE   IP              NODE           NOMINATED NODE   READINESS GATES

zabbix-agent-6lgmp   1/1     Running   0          41m   192.168.3.174   k8s-master01   <none>           <none>

zabbix-agent-hm6fz   1/1     Running   0          41m   192.168.3.176   k8s-node02     <none>           <none>

zabbix-agent-t7jd5   1/1     Running   0          33m   192.168.3.175   k8s-node01     <none>           <none>

[root@k8s-master01 ~]#


5、访问 Zabbix Web 界面

(1)获取节点 IP(任意 worker 节点或 master 节点均可


[root@k8s-master01 ~]# kubectl get nodes -o wide

NAME           STATUS   ROLES                  AGE   VERSION    INTERNAL-IP     EXTERNAL-IP   OS-IMAGE                                  KERNEL-VERSION                    CONTAINER-RUNTIME

k8s-master01   Ready    control-plane,master   30d   v1.23.17   192.168.3.174   <none>        Kylin Linux Advanced Server V10 (Lance)   4.19.90-52.22.v2207.ky10.x86_64   docker://20.10.24

k8s-node01     Ready    worker                 30d   v1.23.17   192.168.3.175   <none>        Kylin Linux Advanced Server V10 (Lance)   4.19.90-52.22.v2207.ky10.x86_64   docker://20.10.24

k8s-node02     Ready    worker                 30d   v1.23.17   192.168.3.176   <none>        Kylin Linux Advanced Server V10 (Lance)   4.19.90-52.22.v2207.ky10.x86_64   docker://20.10.24

[root@k8s-master01 ~]#


(2)访问地址:http://<节点IP>:

[root@k8s-master01 ~]# kubectl get svc zabbix-web -n zabbix

NAME         TYPE       CLUSTER-IP      EXTERNAL-IP   PORT(S)        AGE

zabbix-web   NodePort   10.99.186.185   <none>        80:30211/TCP   177m

[root@k8s-master01 ~]#


(3)登录

用户名:Admin

密码:zabbix(首次登录建议修改)

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容