前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >关于docker环境运行zabbix时,你可能不知道的事

关于docker环境运行zabbix时,你可能不知道的事

作者头像
用户6641876
发布2020-02-19 15:05:05
3.4K0
发布2020-02-19 15:05:05
举报

关于docker环境运行zabbix时,可以快速的部署一套zabbix环境,不管是学习docker还是学习zabbix,都是可以作为一个实际项目来进行测试和练习,但是如果对docker的网络模式不熟悉,可能会遇到一些坑,本文就一些你可能不知道的事进行了测试,与试水,希望能给与大家帮助

一、Docker四种网络模式

实现原理

Docker使用Linux桥接(参考《Linux虚拟网络技术》),在宿主机虚拟一个Docker容器网桥(docker0),Docker启动一个容器时会根据Docker网桥的网段分配给容器一个IP地址,称为Container-IP,同时Docker网桥是每个容器的默认网关。因为在同一宿主机内的容器都接入同一个网桥,这样容器之间就能够通过容器的Container-IP直接通信。 Docker网桥是宿主机虚拟出来的,并不是真实存在的网络设备,外部网络是无法寻址到的,这也意味着外部网络无法通过直接Container-IP访问到容器。如果容器希望外部访问能够访问到,可以通过映射容器端口到宿主主机(端口映射),即docker run创建容器时候通过 -p 或 -P 参数来启用,访问容器的时候就通过[宿主机IP]:[容器端口]访问容器。

四类网络模式

Docker网络模式 配置 说明 host模式 –net=host 容器和宿主机共享Network namespace。 container模式 –net=container:NAME_or_ID 容器和另外一个容器共享Network namespace。kubernetes中的pod就是多个容器共享一个Network namespace none模式 –net=none 容器有独立的Network namespace,但并没有对其进行任何网络设置,如分配veth pair 和网桥连接,配置IP等。 bridge模式 –net=bridge (默认为该模式)

host模式

如果启动容器的时候使用host模式,那么这个容器将不会获得一个独立的Network Namespace,而是和宿主机共用一个Network Namespace。容器将不会虚拟出自己的网卡,配置自己的IP等,而是使用宿主机的IP和端口。但是,容器的其他方面,如文件系统、进程列表等还是和宿主机隔离的。 使用host模式的容器可以直接使用宿主机的IP地址与外界通信,容器内部的服务端口也可以使用宿主机的端口,不需要进行NAT,host最大的优势就是网络性能比较好,但是docker host上已经使用的端口就不能再用了,网络的隔离性不好。 Host模式如下图所示:

container模式

这个模式指定新创建的容器和已经存在的一个容器共享一个 Network Namespace,而不是和宿主机共享。新创建的容器不会创建自己的网卡,配置自己的 IP,而是和一个指定的容器共享 IP、端口范围等。同样,两个容器除了网络方面,其他的如文件系统、进程列表等还是隔离的。两个容器的进程可以通过 lo 网卡设备通信。 Container模式示意图:

none模式

使用none模式,Docker容器拥有自己的Network Namespace,但是,并不为Docker容器进行任何网络配置。也就是说,这个Docker容器没有网卡、IP、路由等信息。需要我们自己为Docker容器添加网卡、配置IP等。 这种网络模式下容器只有lo回环网络,没有其他网卡。none模式可以在容器创建时通过--network=none来指定。这种类型的网络没有办法联网,封闭的网络能很好的保证容器的安全性。

None模式示意图:

bridge模式

当Docker进程启动时,会在主机上创建一个名为docker0的虚拟网桥,此主机上启动的Docker容器会连接到这个虚拟网桥上。虚拟网桥的工作方式和物理交换机类似,这样主机上的所有容器就通过交换机连在了一个二层网络中。 从docker0子网中分配一个IP给容器使用,并设置docker0的IP地址为容器的默认网关。在主机上创建一对虚拟网卡veth pair设备,Docker将veth pair设备的一端放在新创建的容器中,并命名为eth0(容器的网卡),另一端放在主机中,以vethxxx这样类似的名字命名,并将这个网络设备加入到docker0网桥中。可以通过brctl show命令查看。 bridge模式是docker的默认网络模式,不写--net参数,就是bridge模式。使用docker run -p时,docker实际是在iptables做了DNAT规则,实现端口转发功能。可以使用iptables -t nat -vnL查看。

bridge模式如下图所示:

二、创建zabbix测试环境

1 新建网络

下面自定义创建一个新的bridge模式的Docker网络

代码语言:javascript
复制
[root@centos-linux-4 ]# docker network create -d bridge my-net
2d19b1c8d144a6367810998bc5e001404d34ea1a0f51a52a5246aaeeba04e97a
[root@centos-linux-4 ]# docker network ls
NETWORK ID NAME DRIVER SCOPE
1b86c2f5b04b bridge bridge local
36d9d40bf276 cmp_zabbix_agent_default bridge local
9a3d2b9e95d5 cmp_zabbix_server_default bridge local
f0d6e6c30c66 host host local
2d19b1c8d144 my-net bridge local
bfaa333252cf none null local

-d参数指定Docker网络类型,有bridge、overlay类型,overlay类型适用于Swarm mode,这里我们使用bridge

2 启动一个空的Mysql服务器实例

代码语言:javascript
复制
[root@centos-linux-4 cmp_zabbix_agent]# docker run --name mysql-server --network=my-net -it --restart=always -e MYSQL_DATABASE="zabbix" -e MYSQL_USER="root" -e MYSQL_PASSWORD="123456" -e MYSQL_ROOT_PASSWORD="123456"  -d mysql:5.7 --character-set-server=utf8 --collation-server=utf8_bin
bb6a9117ffec928971b819a1dacb1e62fb748cd9a2d5c9c5f193e5e1cc32eb4f
[root@centos-linux-4 cmp_zabbix_agent]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
bb6a9117ffec mysql:5.6 "docker-entrypoint.s…" 6 seconds ago Up 5 seconds 3306/tcp

3 启动Zabbix server实例,并关联这个实例到已创建的MySQL服务器实例

代码语言:javascript
复制
[root@centos-linux-4 cmp_zabbix_agent]# docker run --name zabbix-server-mysql --network=my-net -it --restart=always -e DB_SERVER_HOST="mysql-server" -e MYSQL_DATABASE="zabbix" -e MYSQL_USER="root" -e MYSQL_PASSWORD="123456" -e MYSQL_ROOT_PASSWORD="123456"  -v /etc/timezone:/etc/timezone:ro -v /etc/localtime:/etc/localtime:ro --link mysql-server:mysql -p 10051:10051 -d zabbix/zabbix-server-mysql:latest
2ef64b4ca60aaf4db2d82d0ac77139675c5ef7ab98f71e6f1c27217e9fb54d66
[root@centos-linux-4 cmp_zabbix_agent]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
2ef64b4ca60a zabbix/zabbix-server-mysql:latest "/sbin/tini -- /usr/…" 23 seconds ago Up 22 seconds 0.0.0.0:10051->10051/tcp zabbix-server-mysql
bb6a9117ffec mysql:5.6 "docker-entrypoint.s…" 2 minutes ago Up 2 minutes 3306/tcp mysql-server

4 启动Zabbix web 接口,并将它与MySQL服务器实例和Zabbix server实例关联

代码语言:javascript
复制
[root@centos-linux-4 cmp_zabbix_agent]# docker run --name zabbix-web-nginx-mysql --network=my-net -it --restart=always -e DB_SERVER_HOST="mysql-server" -e MYSQL_DATABASE="zabbix" -e MYSQL_USER="root" -e MYSQL_PASSWORD="123456" -e MYSQL_ROOT_PASSWORD="123456" --link mysql-server:mysql --link zabbix-server-mysql:zabbix-server -p 8080:80 -d zabbix/zabbix-web-nginx-mysql:latest
effdf23c761b7f4536bf99ef9fea2999a44f6f2eec8b285763708033a3b7ffa7
[root@centos-linux-4 cmp_zabbix_agent]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
effdf23c761b zabbix/zabbix-web-nginx-mysql:latest "docker-entrypoint.sh" 4 seconds ago Up 3 seconds 443/tcp, 0.0.0.0:8088->80/tcp zabbix-web-nginx-mysql
2ef64b4ca60a zabbix/zabbix-server-mysql:latest "/sbin/tini -- /usr/…" 2 minutes ago Up 2 minutes 0.0.0.0:10051->10051/tcp zabbix-server-mysql
bb6a9117ffec mysql:5.6 "docker-entrypoint.s…" 4 minutes ago Up 4 minutes 3306/tcp mysql-server

三、测试场景

前面的zabbix的数据库、server、web都是使用自定义的网桥分配ip地址,正式环境切记需要对一些关键数据进行持久化,同时网络模式也可以不需要指定,使用默认的即可,可以使用如下命令查看自定义的网桥下的容器ip

代码语言:javascript
复制
[root@elk-master ~]# docker network ls
NETWORK ID NAME DRIVER SCOPE
39cad5014ee8 bridge bridge local
e7aa5925d508 host host local
f8d5b552a9e8 my-net bridge local
f4ea566b5201 none null local
[root@elk-master ~]# docker network inspect f8d5b552a9e8
[
    {
        "Name": "my-net",
        "Id": "f8d5b552a9e879a8b973393fff52892c12f9f31a12412cb70b5a16e5bed606b6",
        "Created": "2020-01-19T10:51:01.317838046+08:00",
        "Scope": "local",
        "Driver": "bridge",
        "EnableIPv6": false,
        "IPAM": {
            "Driver": "default",
            "Options": {},
            "Config": [
                {
                    "Subnet": "172.20.0.0/16",
                    "Gateway": "172.20.0.1"
                }
            ]
        },
        "Internal": false,
        "Attachable": false,
        "Ingress": false,
        "ConfigFrom": {
            "Network": ""
        },
        "ConfigOnly": false,
        "Containers": {
            "033bc75eae7d20ec1940a9588bf150eff52575076ea53abe5db7a67e663621bc": {
                "Name": "zabbix-web-nginx-mysql",
                "EndpointID": "bcb44b716858b5b2bd5c4431bf37367771aaade7df5de6fc388f76890d3c64dd",
                "MacAddress": "02:42:ac:14:00:04",
                "IPv4Address": "172.20.0.4/16",
                "IPv6Address": ""
            },
            "b8177b394cac1676e945019d7d6b7252ee6fec88fb6072a197ead2096610aa66": {
                "Name": "zabbix-server-mysql",
                "EndpointID": "78f77f1bc9ad066f2173147c5e342b80ec46f9cc3c93b63be7e0e3d2897c5c93",
                "MacAddress": "02:42:ac:14:00:03",
                "IPv4Address": "172.20.0.3/16",
                "IPv6Address": ""
            },
            "fb7d8240a307f184e5458f54f5a1b2b0e58aba1668af6eefb6a416176b5f9b19": {
                "Name": "mysql-server",
                "EndpointID": "a271a5ca6e58003650169a644558ec68c31ae76f56d0898368c63961209a5f06",
                "MacAddress": "02:42:ac:14:00:02",
                "IPv4Address": "172.20.0.2/16",
                "IPv6Address": ""
            }
        },
        "Options": {},
        "Labels": {}
    }
]

当我们想采集zabbix server上的数据的时候,分别进行了如下几个场景的,可以根据自己的需求选择合适的方式

场景1:

当server服务器上的agent也用docker安装的时候,如果网络模式选择bridge,并且agent和server如果是在同一个网桥时,agent的配置文件中server需要填写成zabbix-server容器名或者ip地址,web端需要配置成agent容器的ip地址,最终发现采集到的将会是agent容器自己的数据,具体操作如下:

  • 选择跟server一样的网桥my-net启动agent
代码语言:javascript
复制
docker run --name zabbix-agent --network=my-net -p 10051:10050 -e ZBX_HOSTNAME="zabbix-server" -e ZBX_SERVER_HOST="zabbix-server-mysql" --link zabbix-server-mysql:zabbix-server-mysql  -d zabbix/zabbix-agent:latest
  • 首先我们看一下web端的server端的agent配置地址为容器ip
代码语言:javascript
复制
[root@elk-master ~]# docker exec -it b8177b394cac bash
bash-5.0$ ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
15: eth0@if16: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu 1500 qdisc noqueue state UP
    link/ether 02:42:ac:14:00:03 brd ff:ff:ff:ff:ff:ff
    inet 172.20.0.3/16 brd 172.20.255.255 scope global eth0
       valid_lft forever preferred_lft forever
bash-5.0$ zabbix_get -s 172.20.0.5 -p 10050 -k "system.uptime"
1858
bash-5.0$ zabbix_get -s zabbix-agent -p 10050 -k "system.uptime"
1878
  • 然后进入容器查看agent中的server地址
代码语言:javascript
复制
[root@elk-master ~]# docker exec -it zabbix-agent bash
bash-5.0$ ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
19: eth0@if20: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu 1500 qdisc noqueue state UP
    link/ether 02:42:ac:14:00:05 brd ff:ff:ff:ff:ff:ff
    inet 172.20.0.5/16 brd 172.20.255.255 scope global eth0
       valid_lft forever preferred_lft forever
bash-5.0$ cat /etc/zabbix/zabbix_agentd.conf|grep -Ev '#|^$'
LogType=console
Server=zabbix-server-mysql
ServerActive=zabbix-server-mysql:10051
Hostname=zabbix-server
User=zabbix
Include=/etc/zabbix/zabbix_agentd.d/
LoadModulePath=/var/lib/zabbix/modules/
  • 进入agent容器验证数据和web端采集的数据
1 查看磁盘工具agent中的数据于web采集的是一致
2 查看进程数量

发现web的数据也是和agent容器是一致的

宿主机进程

server容器进程

结论:这种方式是可行的,但是采集的是agent的容器数据,不能完全代表server服务器的数据

场景2

当server服务器上的agent用安装的时候,使用的网桥模式,但是agent和server如果不是在同一个网桥,相当于两个容器的ip地址将是两个网段,那么这种同主机两个网段的容器,是否可以使用宿主机ip+容器暴露的端口来采集呢,采集是否也是agent容器自己的数据?

  • 使用如下命令,则可以通信
代码语言:javascript
复制
[root@elk-master ~]# docker rm -f zabbix-agent
zabbix-agent
[root@elk-master ~]#docker run --name zabbix-agent --network=bridge -p 10050:10050 -e ZBX_HOSTNAME="Zabbix server" -e ZBX_SERVER_HOST="192.168.73.133" -e ZBX_SERVER_PORT=10054  -d zabbix/zabbix-agent:latest
[root@elk-master ~]# docker exec -it zabbix-server-mysql bash
bash-5.0$ ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
21: eth0@if22: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu 1500 qdisc noqueue state UP
    link/ether 02:42:ac:14:00:03 brd ff:ff:ff:ff:ff:ff
    inet 172.20.0.3/16 brd 172.20.255.255 scope global eth0
       valid_lft forever preferred_lft forever
bash-5.0$ exit
exit
[root@elk-master ~]# docker exec -it zabbix-agent bash
bash-5.0$ ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
23: eth0@if24: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu 1500 qdisc noqueue state UP
    link/ether 02:42:ac:11:00:02 brd ff:ff:ff:ff:ff:ff
    inet 172.17.0.2/16 brd 172.17.255.255 scope global eth0
       valid_lft forever preferred_lft forever
bash-5.0$ ping 172.20.0.3
PING 172.20.0.3 (172.20.0.3) 56(84) bytes of data.
^C
--- 172.20.0.3 ping statistics ---
41 packets transmitted, 0 received, 100% packet loss, time 44ms

bash-5.0$ cat /etc/zabbix/zabbix_agentd.conf |grep -Ev '#|^$'
LogType=console
Server=192.168.73.133
ServerActive=192.168.73.133:10051
Hostname=Zabbix server
User=zabbix
Include=/etc/zabbix/zabbix_agentd.d/
LoadModulePath=/var/lib/zabbix/modules/
bash-5.0$

可以看到容器和zabbix-agent的ip地址和zabbix-server的ip地址是不一致,不能互相通信,因为我在启动容器的时候指定环境变量了,因此此时的server ip为宿主机ip

  • 然后我们看一下web端的server端的agent配置地址为宿主机地址,端口配置为agent映射出来的端口,在server端使用zabbix_get看能否通过宿主机ip地址+映射端口进行数据采集
代码语言:javascript
复制
[root@elk-master ~]# docker exec -it zabbix-server-mysql bash
bash-5.0$ zabbix_get -s 192.168.73.133 -p 10050 -k "system.uptime"
zabbix_get [185]: Check access restrictions in Zabbix agent configuration
bash-5.0$

同主机这种配置方式四没法获取到值,当另外找一台主机使用默认网桥模式,使用宿主机ip+暴露的端口,是可以进行通信的

代码语言:javascript
复制
bash-5.0$ zabbix_get -s 192.168.73.135 -p 10050 -k "system.uptime"
1988
  • 基于docker网络的配置,可以添加iptables的链规则,让两个网桥上的容器可以互相通信
代码语言:javascript
复制
[root@elk-master ~]# iptables -t filter -I DOCKER-ISOLATION-STAGE-2 1 -j ACCEPT   -s  172.20.0.0/16 -d 172.17.0.0/16
[root@elk-master ~]# iptables -t filter -I DOCKER-ISOLATION-STAGE-2 1 -j ACCEPT   -s  172.17.0.0/16 -d 172.20.0.0/16
[root@elk-master ~]# docker exec -it zabbix-server-mysql
bash-5.0$ zabbix_get -s 172.17.0.2 -p 10050 -k "system.uptime"
zabbix_get [196]: Check access restrictions in Zabbix agent configuration
bash-5.0$ ping 172.17.0.2
PING 172.17.0.2 (172.17.0.2) 56(84) bytes of data.
64 bytes from 172.17.0.2: icmp_seq=1 ttl=63 time=0.068 ms
64 bytes from 172.17.0.2: icmp_seq=2 ttl=63 time=0.096 ms
^C
--- 172.17.0.2 ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 1ms
rtt min/avg/max/mdev = 0.068/0.082/0.096/0.014 ms
bash-5.0$

结果发现就算两个容器互相通信了,但不是在一个网桥,所以还是不能够采集到数据(我删除了容器,从新配置server的ip启动)

  • 最终可以使用一个容器多网桥的概念,把zabbix-agent也加入到zabbix-server所使用的my-net网桥
代码语言:javascript
复制
[root@elk-master ~]# docker network connect my-net zabbix-agent
[root@elk-master ~]# docker exec -it zabbix-agent bash
bash-5.0$ ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
25: eth0@if26: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu 1500 qdisc noqueue state UP
    link/ether 02:42:ac:11:00:02 brd ff:ff:ff:ff:ff:ff
    inet 172.17.0.2/16 brd 172.17.255.255 scope global eth0
       valid_lft forever preferred_lft forever
27: eth1@if28: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu 1500 qdisc noqueue state UP
    link/ether 02:42:ac:14:00:05 brd ff:ff:ff:ff:ff:ff
    inet 172.20.0.5/16 brd 172.20.255.255 scope global eth1
       valid_lft forever preferred_lft forever
bash-5.0$ exit
exit
[root@elk-master ~]# docker exec -it zabbix-server-mysql bash
bash-5.0$ zabbix_get -s 192.168.73.133 -p 10050 -k "system.uptime"
zabbix_get [203]: Check access restrictions in Zabbix agent configuration
bash-5.0$ zabbix_get -s 172.20.0.5 -p 10050 -k "system.uptime"
6748

场景3

当server服务器上的agent用安装的时候,使用的host模式,server使用的是网桥模式,采集的是否将会是agent容器自己的数据?

  • 首先,使用网络模式host启动agent,并且server配置成容器ip,这样agent将会与宿主机一样公用一个网络
代码语言:javascript
复制
[root@elk-master ~]# docker rm -f zabbix-agent
zabbix-agent
[root@elk-master ~]# docker run --name zabbix-agent --network=host  -e ZBX_HOSTNAME="Zabbix server" -e ZBX_SERVER_HOST="172.20.0.3" -e ZBX_SERVER_PORT=10051  -d zabbix/zabbix-agent:latest
05f9576a0e8384ea509d47dd974d410886556aecee391beb6ed96269ce3642d2
[root@elk-master ~]# docker exec -it zabbix-agent bash
bash-5.0$ ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host
       valid_lft forever preferred_lft forever
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
    link/ether 00:0c:29:0b:95:34 brd ff:ff:ff:ff:ff:ff
    inet 192.168.73.133/24 brd 192.168.73.255 scope global ens33
       valid_lft forever preferred_lft forever
    inet6 fe80::20c:29ff:fe0b:9534/64 scope link
       valid_lft forever preferred_lft forever
3: docker0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN
    link/ether 02:42:64:f5:ce:26 brd ff:ff:ff:ff:ff:ff
    inet 172.17.0.1/16 brd 172.17.255.255 scope global docker0
       valid_lft forever preferred_lft forever
    inet6 fe80::42:64ff:fef5:ce26/64 scope link
       valid_lft forever preferred_lft forever
6: br-f8d5b552a9e8: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP
    link/ether 02:42:bf:8c:b4:5a brd ff:ff:ff:ff:ff:ff
    inet 172.20.0.1/16 brd 172.20.255.255 scope global br-f8d5b552a9e8
       valid_lft forever preferred_lft forever
    inet6 fe80::42:bfff:fe8c:b45a/64 scope link
       valid_lft forever preferred_lft forever
14: veth7292b59@if13: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu 1500 qdisc noqueue master br-f8d5b552a9e8 state UP
    link/ether 56:9f:c2:70:eb:36 brd ff:ff:ff:ff:ff:ff
    inet6 fe80::549f:c2ff:fe70:eb36/64 scope link
       valid_lft forever preferred_lft forever
18: vetha3f4946@if17: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu 1500 qdisc noqueue master br-f8d5b552a9e8 state UP
    link/ether 86:71:f9:d9:83:93 brd ff:ff:ff:ff:ff:ff
    inet6 fe80::8471:f9ff:fed9:8393/64 scope link
       valid_lft forever preferred_lft forever
22: veth36efc5f@if21: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu 1500 qdisc noqueue master br-f8d5b552a9e8 state UP
    link/ether fe:62:61:ad:8a:de brd ff:ff:ff:ff:ff:ff
    inet6 fe80::fc62:61ff:fead:8ade/64 scope link
       valid_lft forever preferred_lft forever
bash-5.0$ exit
exit
[root@elk-master ~]# docker exec -it zabbix-server-mysql bash
bash-5.0$ zabbix_get -s 192.168.73.133 -p 10050 -k "system.uptime"
6946
  • 然后,我们需要把web端的server端的agent配置地址为宿主机地址,端口为默认端口

这样是可以采集到数据,但是采集的也是容器的数据,不是宿主机的数据

  • 如果想让zabbix-agent启动的时候注入的ip地址为宿主机ip地址的话,需要把zabbix-server启动的网络模式也改成host,这样才采集到数据

四、结论 1 当使用docker环境部署zabbix的时候,对于zabbix-server和zabbix-agent容器的网络模式需要注意,如果设置的不对会导致采集不到agent的数据 2 只有当zabbix-server和zabbix-agent启动的时候在一个网桥下,或者zabbix-agent使用宿主机网络的时候才可以采集到数据 3 如果是容器启动的agent,那么server端采集到的数据是agent容器的数据,不能全部代表宿主机的指标 4 如果想准确的采集宿主机的指标,应该是用rpm源码包进行安装agent服务

代码语言:javascript
复制
CentOS 7.x 下安装Zabbix Agent 4.4 操作指引
=====
第一步:安装rpm包
rpm -ivh https://repo.zabbix.com/zabbix/4.4/rhel/7/x86_64/zabbix-agent-4.4.4-1.el7.x86_64.rpm

注:此处的RPM安装包可以根据URL查找更多版本的RPM包

第二步:安装agent
yum install zabbix-agent

第三步:启动agent并检查是否成功
systemctl start zabbix-agent
systemctl status zabbix-agent

第四步:配置Zabbix Agent
vim /etc/zabbix/zabbix_agentd.conf
更改Server的地址为zabbix server的ip地址或域名

第五步:重启zabbix并将Zabbix Agent加入开机启动项
systemctl restart zabbix-agent
systemctl enable zabbix-agent

第六步:配置防火墙允许被访问10050端口
firewall-cmd --zone=public --add-port=10050/tcp --permanent
firewall-cmd --reload
firewall-cmd --zone=public --list-ports

参考文章: https://www.jianshu.com/p/22a7032bb7bd

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2020-01-22,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 阿冬的运维技术栈 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一、Docker四种网络模式
    • None模式示意图:
      • bridge模式如下图所示:
      • 二、创建zabbix测试环境
        • 1 新建网络
          • 2 启动一个空的Mysql服务器实例
          • 3 启动Zabbix server实例,并关联这个实例到已创建的MySQL服务器实例
          • 4 启动Zabbix web 接口,并将它与MySQL服务器实例和Zabbix server实例关联
            • 三、测试场景
              • 1 查看磁盘工具agent中的数据于web采集的是一致
          • 四、结论 1 当使用docker环境部署zabbix的时候,对于zabbix-server和zabbix-agent容器的网络模式需要注意,如果设置的不对会导致采集不到agent的数据 2 只有当zabbix-server和zabbix-agent启动的时候在一个网桥下,或者zabbix-agent使用宿主机网络的时候才可以采集到数据 3 如果是容器启动的agent,那么server端采集到的数据是agent容器的数据,不能全部代表宿主机的指标 4 如果想准确的采集宿主机的指标,应该是用rpm源码包进行安装agent服务
          相关产品与服务
          容器服务
          腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
          领券
          问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档