どう使う︖データセンターネットワーキング最前線
Yahoo! JAPAN 実⽤例

ヤフー株式会社 サイトオペレーション本部 ネットワーク開発©2021 Yahoo Japan Corporation All rights reserved.

⾼橋 翔

⾃⼰紹介
⾼橋 翔
2017/04: ヤフー⼊社
サイトオペレーション本部
データセンタネットワーク所属 (2019~兼務)
・L2/L3 スイッチ 構築/運⽤
2019/04: 同本部
ネットワーク開発所属
・IP Clos の設計/構築/運⽤©2021 Yahoo Japan Corporation All rights reserved.

2どう使う︖データセンターネットワーキング最前線
1. ヤフーのデータセンタネットワークあらまし
2. Clos Network 構築•Zero Touch Provisioning•Ansible

3. ネットワーク監視体制•Prometheus©2021 Yahoo Japan Corporation All rights reserved.

3ヤフーのデータセンタネットワークあらまし

ヤフーの国内データセンタ

⾃社管理の⼤規模データセンタ©2021 Yahoo Japan Corporation All rights reserved.

4ヤフーのデータセンタネットワークあらまし

稼働している2種類のネットワークアーキテクチャ

Traditional

Clos FabricArchitecture©2021 Yahoo Japan Corporation All rights reserved.

5ヤフーのデータセンタネットワークあらまし

ネットワーク構築に使っているツール
Web UI/⼤規模 NW構築

マルチベンダー対応
https://www.juniper.net/jp/ja/products/network-automation/apstra/apstra-system.html

サポート体制が充実

ライセンス費⽤©2021 Yahoo Japan Corporation All rights reserved.

6ヤフーのデータセンタネットワークあらまし

ネットワーク構築に使っているツール
Open Source

スモールスタートLinux like な conﬁg

今⽇のトピックはこちら©2021 Yahoo Japan Corporation All rights reserved.

Self-support7

Clos Network 構築
Zero Touch Provisioning
Ansible©2021 Yahoo Japan Corporation All rights reserved.

8

Clos Network 構築

Clos Network に使⽤している主なハードウェアと Network OS
•

以前は
•

Broadcom chip 搭載の Whitebox switch + Cumulus Linux
Mellanox(今は NVIDIA傘下) → Cumulus Networks 買収 (2020)
Broadcom chipのサポート終了を発表

https://docs.nvidia.com/networking-ethernet-software/cumulus-linux-44/Whats-New/#unsupported-platforms

最近

•
•

Broadcom chip 搭載の Whitebox switch + Cumulus Linux•

Mellanox chip 搭載の Whitebox switch + Cumulus Linux•

混ぜて使えるように⼯夫している©2021 Yahoo Japan Corporation All rights reserved.

9

Clos Network 構築

Network OS Setup Flow

EMPTY

Conﬁg
DeployZTP

ONIEWhitebox SW

Auto
Provisioned

Network OS
InstalledOS

OS
Pre-conﬁg©2021 Yahoo Japan Corporation All rights reserved.

OS
conﬁg

10

Zero Touch Provisioning - Clos Network 構築

ONIE

Install OS

ONIE (Open Networking Install Environment) https://www.opencompute.org/projects/onie
Network OS を Whitebox SWにインストールツール

Whitebox SW
ONIE

DHCP

- DHCP/USB drive 等から Installer を探し出す

OS Image

Installer を⾒つけると⾃動で OS をインストールする
Installer URL

ヤフーでは
•

DHCP/Webサーバを組み合わせて OS Install•

複数のベンダスイッチ対応のため Installer URL を使

DHCP Server

Web Server

い分ける⼯夫©2021 Yahoo Japan Corporation All rights reserved.

11

Zero Touch Provisioning - Clos Network 構築

DHCP Option 60 – Vendor class identiﬁer
DHCPクライアントが、⾃分が何者なのかDHCPサーバに伝えるオプション
onie_vendor:[ARCH]-[VENDOR_MACHINE]-r[REVISION]
ONIE共通DHCP Discover

ONIE:/ # onie-sysinfo
x86_64-dellemc_z9264f_c3538-r0
⾃分のスイッチが何者か
ONIE console から調べることができる

Whitebox SW

Installer URL
for Vendor A

DHCP Server
DHCP Discover
ペイロードの⼀部

https://opencomputeproject.github.io/onie/design-spec/discovery.html©2021 Yahoo Japan Corporation All rights reserved.

12Vendor-class-identifier の設定例

dhcpd.confclass "mellanox-switch" {match if (substring(option vendor-class-identifier, 0, 23) = "onie_vendor:x86_64-mlnx");
option default-url = "http://192.0.2.1/images/onie-installer-x86_64-mlnx.bin";}
OS Image URL
class "dell-switch" {match if (substring(option vendor-class-identifier, 0, 26) = "onie_vendor:x86_64-dellemc");
option default-url = "http://192.0.2.1/images/onie-installer-x86_64-bcm.bin";}kea-dhcp4.conf{"Dhcp4": {"client-classes": [{"name": "dell-switch","test": "substring(option[60].hex,0,26) == 'onie_vendor:x86_64-dellemc'","option-data": [{"name": "default-url","data": "http://192.0.2.1/images/onie-installer-x86_64-bcm.bin"
}
]
}
]
}}

©2021 Yahoo Japan Corporation All rights reserved.

インストーラファイル名はONIE の命名規則に従う

13

OS image は onie-installer**** のフォーマットでホストする

onie-installer-x86_64-mlnx.bin

https://opencomputeproject.github.io/onie/design-spec/discovery.html©2021 Yahoo Japan Corporation All rights reserved.

14

Cumulus ZTP - Clos Network 構築

Network OS Setup Flow

EMPTY

Conﬁg
Deployed

ZTP

ONIE

Whitebox SW

Auto
Provisioned

Network OS
InstalledOS

OS
Pre-conﬁg©2021 Yahoo Japan Corporation All rights reserved.

OS
conﬁg

15

Cumulus ZTP - Clos Network 構築

Cumulus Zero Touch Provisioning
Cumulus Linux 初回起動時、ZTP プロセスが 1度だけ⽴ち上がる
DHCP/USB Drive/Local Drive のスクリプトを読み込んで任意の設定を⾏う機能
•

Perl

•

Python

•

Ruby

•

Shell

専⽤の DHCP option を使ってScriptの場所 を DHCPサーバからスイッチに伝える

Auto Provisioning では必要最低限 (SSH できる状態まで) 設定する
https://docs.nvidia.com/networking-ethernet-software/cumulus-linux-44/Installation-Management/Zero-Touch-Provisioning-ZTP/©2021 Yahoo Japan Corporation All rights reserved.

16

Cumulus ZTP - Clos Network 構築

DHCP Option 239
ZTP script URL を Cumulus に渡すために、Cumulus Linux が指定する DHCP Option番号
DHCPサーバからの応答に Option 239 がある場合、指定された URL から ZTP script をダウンロードして実⾏
dhcpd.conf

kea-dhcp4.conf

option cumulus-provision-url code 239 = text;
option cumulus-provision-url = "http://192.0.2.1/config/cumulus/boot";{"Dhcp4": {"option-def": [{"name": "cumulus-provision-url","code": 239,
"type": "string"}],"option-data": [{"name": "cumulus-provision-url","data": "http://192.0.2.1/config/cumulus/boot"}]}}©2021 Yahoo Japan Corporation All rights reserved.

Op-on 239 を定義

Op-on 239 で渡す URL をセット

17

Cumulus ZTP - Clos Network 構築

config/cumulus/bootZTP Script
Mgmt IP を Static に埋め込みたい
社内IPAMと連携して IP/Hostname 収集
内部的に script を呼び出す⼯夫

Cumulus Linux

DHCP

Web

IPAM
API

Cumulus ZTP process

S/N: XXXXXX
Hostname: leaf-1
Mgmt IP: x.x.y.z/24

Get request
ZTP script
シリアルNo.

ZTP script

Conﬁg script©2021 Yahoo Japan Corporation All rights reserved.

シリアルNo.
IP/Hostname

18

Cumulus ZTP - Clos Network 構築

config/cumulus/bootZTP Script
S/N をキーにして設定⽤ script を呼び出し
初期ログイン⽤の Credential も設定
SSH login ready

Cumulus Linux

DHCP

IP/Hostname

Web

config/cumulus/init
IPAM
API

Cumulus ZTP process

Get request
ZTP script
シリアルNo.

ZTP script

Conﬁg script©2021 Yahoo Japan Corporation All rights reserved.

シリアルNo.
IP/Hostname

19Ansible - Clos Network 構築

ここまで Zero Touch, ここから Ansible

Auto
Provisioned

Network OS
Installed

EMPTY

Conﬁg
Deploy

ZTP

ONIE

OS

Whitebox SW

OS
Pre-config

OS
conﬁg

Zero Touch©2021 Yahoo Japan Corporation All rights reserved.

20

Ansible - Clos Network 構築

Ansible を使った Network 設定
Cumulus Linux
基本的にファイルのコピー/Jinja2 tempate にレンダリングした設定ファイルを転送
設定更新は プロセス restart OR reload
注⼒するポイント
1. ⼿で⼊れる変数を少なくする
2. テンプレートの種類を少なくする。できる限り使い回す
3. 何でもできるテンプレートにしない（何でもできるようにがんばらない）•

If ⽂が増えるとメンテしにくい©2021 Yahoo Japan Corporation All rights reserved.

21

Ansible - Clos Network 構築

ヤフーの Clos Network トポロジ
BGP Unnumbered

IPv4 Only
v4/v6 dual stack
XXX overlay

Exit

AS: 65400

Spine

AS: 65300

FabricAS: 65100

AS: 65200

Leaf
AS: 65001

AS: 65002

AS: 65003

AS: 65004©2021 Yahoo Japan Corporation All rights reserved.

22

Ansible - Clos Network 構築

Leaf スイッチの 設定に必要な情報
Fabric

1. IPv4 Loopback → IPAM
2. ASN → Loopback IP からスクリプトで⽣成•4-Byte Private-AS 4200000000-4294967294•

Shared IP, だいたい 4200000個

BGP Unnumbered

3. Vlan interface IPv4 (Leaf-1 のみ) → IPAM•

Leaf-2

Leaf-1
vlan

lo

ASN

lo

ASN

サーバの初期設定にどうしても L2 が必要

4. Management IP/Gateway → IPAM
leaf-1:
profile: leaf_vendor1
interfaces:
eth0:
ipv4: {{ ip }}/{{ subnet }}gateway: {{ gateway }}lo:
ipv4: {{ loopback }}/32
vlan:
ipv4: {{ vlan_ip }}/{{ vlan_subnet }}IPAM

devices:leaf-1:
profile: leaf_vendor1
interfaces:
eth0:
ipv4: 192.0.2.100/24
gateway: 192.0.2.254
lo:
ipv4: 100.64.0.0/32
vlan:
ipv4: 198.51.100.1/28©2021 Yahoo Japan Corporation All rights reserved.

BGP Unnumbered

Server23

Ansible - Clos Network 構築

Ansible Playbook の構造※本来は all.yml に書くのがお作法

hostsgroup_vars/
roles/
host_vars/
init.yml
deploy.yml
utils/

Inventory

全てのスイッチで使う共通の変数
syslog/ntp の向き先各スイッチ毎の変数
IP address
proﬁle

各種変数の置き場所

group_vars├── common.yml├── devices.yml├── networks.yml├── profiles.yml└── private.yml
Ansible-vault で暗号化
平⽂で保存できない変数
Login credential
License key
snmp

devices:leaf-1:
profile: leaf_52port_switch
interfaces:
eth0:
ipv4: 192.0.2.100/24
gateway: 192.0.2.254
lo:
ipv4: 100.64.0.0/32
vlan:
ipv4: 198.51.100.1/28

Clos Network が広報する Preﬁx 情報
Fabric/Spine/Exit固有の AS番号

異なる種類のスイッチに1つの template で対応する⼯夫©2021 Yahoo Japan Corporation All rights reserved.

profiles:leaf_52port_switch:
template: leafinterfaces:
uplinks: [49,52]
downlinks: [1,48]
leaf_32port_switch:
template: leafinterfaces:
uplinks: [31,32]
downlinks: [1,30]

24

Ansible - Clos Network 構築

Ansible Playbook の構造tasks└── main.yml
Role の中で実⾏する task

hosts

handlers└── main.yml

group_vars/
roles/

init.yml
deploy.yml
utils/

特定の task を trigger にして実⾏される

⼤量の task を分類するための
roles

roles
├── config_apt├── config_common├── config_exporter├── config_dhcprelay├── config_frr├── config_interfaces├── config_ptm├── config_restserver└── install_licensefiles└── ntp.conf
静的ファイルの置き場所

templates└── hogehoge.j2
Jinja2 template の置き場所

defaults└── main.yml
変数のデフォルト値を定義
各 Role の task 実⾏時に参照される©2021 Yahoo Japan Corporation All rights reserved.

25

Ansible - Clos Network 構築

Ansible Playbook の構造
hosts
group_vars/
roles/

init.yml
deploy.yml
utils/- name: Initial setup
hosts: cumulus
roles:- install_license- config_common- config_apt- config_ptm- config_exporter- config_restserver- config_interfaces- config_dhcprelay- config_frr
vars_files:- "{{ inventory_dir }}/group_vars/private.yml"- "{{ inventory_dir }}/group_vars/devices.yml"- "{{ inventory_dir }}/group_vars/common.yml”- "{{ inventory_dir }}/group_vars/profiles.yml”- "{{ inventory_dir }}/group_vars/networks.yml"
vars:- init_playbook: this_is_just_flag

初期設定⽤ playbook

全て設定

roles
├── config_apt├── config_common├── config_exporter├── config_dhcprelay├── config_frr├── config_interfaces├── config_ptm├── config_restserver└── install_license

この Playbook を実⾏するときだけ定義される変数©2021 Yahoo Japan Corporation All rights reserved.

26

Ansible - Clos Network 構築

Ansible Playbook の構造
hosts
group_vars/
roles/

init.yml
deploy.yml
utils/- name: Deploy
hosts: cumulus
roles:- config_interfaces- config_dhcprelay- config_frr
vars_files:- "{{ inventory_dir }}/group_vars/private.yml"- "{{ inventory_dir }}/group_vars/devices.yml"- "{{ inventory_dir }}/group_vars/common.yml”- "{{ inventory_dir }}/group_vars/profiles.yml”- "{{ inventory_dir }}/group_vars/networks.yml"

⼀部だけ設定roles├── config_apt├── config_common├── config_exporter├── config_dhcprelay├── config_frr├── config_interfaces├── config_ptm├── config_restserver└── install_license

サービスインに使う Playbook
トラフィックを落とさずに動く Playbook- FRR は reload で設定を更新する(BGP Peer が切断される restart はしない)©2021 Yahoo Japan Corporation All rights reserved.

27

Ansible - Clos Network 構築

Ansible Playbook の構造

defaults└── main.yml

hosts
tasks
└── main.yml

group_vars/
roles/

init.yml
deploy.yml
utils/

⼤量の task を分類するための
roles

roles
├── config_apt├── config_common├── config_exporter├── config_dhcprelay├── config_frr├── config_interfaces├── config_ptm├── config_restserver└── install_license©2021 Yahoo Japan Corporation All rights reserved.

templates├── leaf_frr.conf.j2├── fabric_frr.conf.j2├── spine_frr.conf.j2└── exit_frr.conf.j2
役割毎に template を⽤意

handlers/└── main.yml

28

Ansible - Clos Network 構築

FRRouting の設定 - task

IPからAS番号を⽣成する CLIコマンドを開発

tasks/main.yml- name: generate AS number (leaf)
shell: asncalc "{{ devices[inventory_hostname].interfaces.lo.ipv4.split('/')[0] }}"delegate_to: localhost
register: asncalc
when: profiles[device_profile].template in ["leaf”]
tags:- local- set_fact:
asnum: "{{ asncalc.stdout }}"when: profiles[device_profile].template in ["leaf"]tags:- local- name: Configure frr daemons
become: yescopy:
src: "daemons.j2"
dest: /etc/frr/daemonsowner: frrgroup: frr
mode: u=rw,g=r,o=notify:- Enable and start frr.service

profiles:leaf_52port_switch:
template: leafinterfaces:
uplinks: [49,52]
downlinks: [1,48]
leaf_32port_switch:
template: leafinterfaces:
uplinks: [31,32]
downlinks: [1,30]

初期設定⽤ Playbook を動かすときだけ
process restartEx:$ asncalc 100.64.0.0 → 4200000000$ asncalc 100.64.0.1 → 4200000001

defaults/main.yml

conﬁg_frr role の中で使える変数を定義

device_profile: "{{ devices[inventory_hostname].profile }}"- name: Configure /etc/frr/frr.conf
become: yes
template:
src: "{{ profiles[device_profile].template }}_frr.conf.j2"
dest: /etc/frr/frr.conf
owner: frrgroup: frr
mode: u=rw,g=r,o=notify:- Enable and start frr.service- Reload frr.service- name: Restart frr at init
become: yessystemd:
name: frr
state: restarted
when: init_playbook is defined©2021 Yahoo Japan Corporation All rights reserved.

29

Ansible - Clos Network 構築

FRRouting の設定 - template
templates/leaf_frr.conf.j2{% set switch = devices[inventory_hostname] %}{% set device_profile = devices[inventory_hostname].profile %}{% set downlinks = profiles[device_profile].interfaces.downlinks %}{% set uplinks = profiles[device_profile].interfaces.uplinks %}frr defaults datacenter
hostname {{ inventory_hostname }}username cumulus nopassword!
service integrated-vtysh-config!
log syslog informational!
初期設定 (init.yml 実⾏時) はrouter bgp {{ asnum }}トラフィックが流れてほしくない{% if init_playbook is defined %}bgp graceful-shutdown
サービスイン (deploy.yml 実⾏時) は{% endif %}bgp graceful-shutdown
bgp bestpath as-path multipath-relax
が外れてトラフィックが流れ始める
bgp bestpath compare-routerid
bgp always-compare-med
update-delay 300 90
bgp router-id {{ switch.interfaces.lo.ipv4.split("/")[0] }}異なる機種で使い回せるように
ポート構成はハードコードしないneighbor DOWNLINK peer-group{% for downlink in range(downlinks[0], downlinks[1] + 1) %}{%- set bgpinfo = switch.bgp.peer["swp"+downlink|string] %}neighbor swp{{ downlink }}.100 interface peer-group DOWNLINK
neighbor swp{{ downlink }}.200 interface peer-group DOWNLINK{% if bgpinfo.state | default() == "down" %}neighbor swp{{ downlink }}.100 shutdown
neighbor swp{{ downlink }}.200 shutdown{% endif %}{% endfor %}{% endif %}{% for uplink in range(uplinks[0], uplinks[1] + 1) %}{%- set bgpinfo = switch.bgp.peer["swp"+uplink|string] %}neighbor swp{{ uplink }} interface peer-group UPLINK{% if bgpinfo.state | default() == "down" %}neighbor swp{{ uplink }} shutdown{% endif %}{% endfor %}!
~~~ snip ~~~©2021 Yahoo Japan Corporation All rights reserved.

30

Ansible - Clos Network 構築

その他の定形作業に使う Ansible Playbook
hostsgroup_vars/

ネットワークオペレーション⽤ Playbook

roles/

utils/graceful-shutdown.yml

tasks:- name: Maintenanceshell: /usr/bin/vtysh -c "config t" -c "router bgp" -c "bgp graceful-shutdown" -c "end" -c "wr"init.yml
deploy.yml
utils/

シェルから操作する定形作業を playbook として作成
例• FRR に “bgp graceful-shutdown” を⼊れてトラフィック迂回する playbook• BGP peer の状態をチェックする playbook• OS upgrade する playbook• Reboot する playbook©2021 Yahoo Japan Corporation All rights reserved.

31

Ansible - Clos Network 構築

OS upgrade メンテナンスの⼀例
ansible-playbook –i hosts –l leaf-1 utils/graceful-shutdown.yml
bgp graceful-shutdown でトラフィックを迂回
ansible-playbook –i hosts –l leaf-1 utils/os-upgrade.yml
OS upgrade を実⾏
ansible-playbook –i hosts –l leaf-1 utils/reboot.yml
再起動して OS をクリーンインストール
ansible-playbook –i hosts –l leaf-1 init.yml
初期設定を実⾏
ansible-playbook –i hosts –l leaf-1 utils/check-bgp-state.yml

utils/check-bgp-state.yml

BGP Peer が想定通りに Up しているかチェック
いわゆる「確認系作業」も playbook の assert で実⾏

tasks:- name: Collect bgp neighbors to fabricshell: net show bgp summary | grep fabric- | grep -v -e Idle -e Active | awk '{print $1}' | wc -lregister: peers_fabricchanged_when: false

ansible-playbook –i hosts –l leaf-1 deploy.yml
graceful-shutdown を解除してトラフィックを流す

全ての作業を playbook 化
オペミスを回避- name: Confirm that BGP peers to all fabric are establishedassert:that:- peers_fabric.stdout | int == 4
fail_msg: "{{peers_fabric.stdout}} peers to fabric"©2021 Yahoo Japan Corporation All rights reserved.

32

Ansible - Clos Network 構築(最後に) すべての⼿順を Playbook化した次にやりたくなること
Playbook の実⾏を⾃動化したい

メンテナンス用 Workﬂow
スタート

成功?

ansible-playbook –i hosts –l leaf-1 utils/graceful-shutdown.yml
bgp graceful-shutdown でトラフィックを迂回

ansible-playbook –i hosts –l leaf-1 utils/os-upgrade.yml
成功?

OS upgrade を実⾏

ansible-playbook –i hosts –l leaf-1 utils/reboot.yml
再起動して OS をクリーンインストール

成功?

ansible-playbook –i hosts –l leaf-1 init.yml

https://github.com/ansible/awx

Ansible のTask Engine

実⾏履歴の管理

成功?

初期設定を実⾏

ansible-playbook –i hosts –l leaf-1 utils/check-bgp-state.yml
成功?

BGP Peer が想定通りに Up しているかチェック
いわゆる「確認系作業」も playbook の assert で実⾏

ansible-playbook –i hosts –l leaf-1 deploy.yml
graceful-shutdown を解除してトラフィックを流す

成功?

終了

Production の運⽤に導⼊できないか検討中©2021 Yahoo Japan Corporation All rights reserved.

33

ネットワーク監視体制
監視体制の紹介
Prometheus©2021 Yahoo Japan Corporation All rights reserved.

34

ネットワーク監視体制

Syslog を使った監視

Flap 系ログの取り扱いに困る
センサ系とか事前に syslog をレベル別仕分け
Warnwatchfrr[18602]: [EC 268435457] bgpd state -> down : read returned EOF

Noticebgpd[10014]: %ADJCHANGE: neighbor swp55(neighbor_hostname) in vrf default Down Interface downInfosystemd[1]: Reloading FRRouting.

Ignoreswitchd[2573]: sync.c:3802 IPv4 Route Summary (2553556) : 1 Added, 0 Deleted, 0 Updated, 0 Skipped in 23468 usecs

syslogWarn

緊急連絡Notice

⽇中連絡

ログのパースは⼤変

Info

IgnoreLog History

ログレベルに応じて通知⽅法を選択

⾃動で仕分け©2021 Yahoo Japan Corporation All rights reserved.

35

ネットワーク監視体制

Prometheus によるモニタリング
PING

緊急度が⾼いアラートは通知+電話(夜間)Interface Error

集めた Metrics 情報を分析©2021 Yahoo Japan Corporation All rights reserved.

36

Prometheus

https://www.janog.gr.jp/meeting/janog40/program/soft
JANOG40: フロントエンドエンジニアがY!のNW部隊で取り組んだこと©2021 Yahoo Japan Corporation All rights reserved.

37

Prometheus

Prometheus の構成要素•

Prometheus• Exporter に対して Scraping を掛けて Metrics を収集する• Exporter から集めた情報を貯める• Alertmanager に対してアラートを通知する•

SNMP Exporter / Blackbox Exporter / XXXX Exporter• NW機器から情報を取得して Metrics を⽣成する実体• Prometheus からScrape されると、実際に Metrics を⽣成する•

Alertmanager• 通知されたアラートのハンドリング©2021 Yahoo Japan Corporation All rights reserved.

38

Prometheus

Prometheus を使う理由
MRTG や Syslog では実現の難しい監視/可視化を Prometheus を使うことで実現したい

綺麗な UI で可視化
Grafana + PromQL

Intent ベースのアラート

Prometheus サーバの冗⻑性

スケーラビリティ
⻑期間の Metrics 可視化©2021 Yahoo Japan Corporation All rights reserved.

39

Prometheus

Clos 向けネットワーク機器の監視状況
SNMP/Blackbox Exporter に加えて
Cumulus のセンサ情報/HWリソース/FRRの各種エントリ数

PING

SNMP

Cumulus
HWセンサ/FRR utilization
https://github.com/tynany/cumulus̲exporter
https://github.com/tynany/frr̲exporter©2021 Yahoo Japan Corporation All rights reserved.

40

Prometheus

モニタリング構成 – PING
Datacenter 1

Blackbox aggregator-A

Prometheus

複数の DC からデバイスへの疎通性を収集

Federation

Blackbox Server

x6K nodes

Prometheus
Alertmanager 1
ActiveScrapeBlackbox
Exporter

Slack

PING

HA
email

Alertmanager 2StandbyBlackbox aggregator-B

Prometheus

公式の HA 機能で
Active-Standby の構成

Datacenter 2Federation

データセンタ毎に集めた情報を集約 (Federation) /分析

Datacenter N

Blackbox ServerBlackbox ServerBlackbox
ExporterBlackbox
Exporter

ScrapePrometheus©2021 Yahoo Japan Corporation All rights reserved.

ScrapePrometheus

41

Prometheus

モニタリング構成 – SNMP/3rd party exporter
Datacenter 1

Prometheus scraping server
Datacenter1 aggregator-A

Alertmanager 1
ActiveSlackPrometheus

Data Hall 1

SNMP Exporter
Scrape9116/tcp
Cumulus Exporter
9365/tcp

HA
email

Alertmanager 2Standby

FRR Exporter

単⼀障害点

Prometheus scraping server

Data Hall 2

SNMP Exporter
9116/tcp
Cumulus Exporter
9365/tcp
FRR Exporter©2021 Yahoo Japan Corporation All rights reserved.

42

Prometheus

モニタリング構成 – 冗⻑性 vs Scrape頻度
Datacenter 1

Datacenter1 aggregator-A

ScrapePrometheus scraping server

Prometheus

SNMP Exporter
9116/tcp

Alertmanager 1
ActiveCumulus Exporter

Slack9365/tcp

HA
email

Alertmanager 2Standby

FRR Exporter
Datacenter1 aggregator-B

Prometheus

⼆重に Scraping

Scrape

デバイスのC-Plane へ負荷をかけたくない©2021 Yahoo Japan Corporation All rights reserved.

43

Prometheus

モニタリング構成 – キャッシュ
Datacenter 1

Datacenter1 aggregator-A

ScrapePrometheus scraping server

Prometheus

SNMP Exporter
9116/tcp

Alertmanager 1
ActiveCumulus Exporter

Slack9365/tcp

HA
email

Alertmanager 2Standby

FRR Exporter

プライベートクラウドの
k8s クラスタで⾼可⽤性を担保

Datacenter1 aggregator-B

Proxy Query
Once

Prometheus

Prometheus Scrape
Cache/Proxy(self-developed)

Scrape©2021 Yahoo Japan Corporation All rights reserved.

Cache

Redis

backend database

独⾃に開発した
Cache 層を間に挟み込み
44

Prometheus

Prometheus Scrape Cacher
Datacenter 1

Datacenter1 aggregator-A

Scrape① リクエストパラメータ毎に⼆重scrapeを防⽌する
Alertmanager 1
Active
2回⽬の scrape はcache を返す

Prometheus scraping server

Prometheus

SNMP Exporter
9116/tcp
Cumulus Exporter

Slack9365/tcp

HA② リクエストパラメータ毎に
email
任意の時間
Alertmanager 2
Metrics情報を Standby
Cache できる

FRR Exporter
Datacenter1 aggregator-B

Proxy Query
Once

Prometheus

Prometheus Scrape
Cache/Proxy③ 1つのエンドポイントを利⽤して任意の宛先ポートに Proxy できる(self-developed)

Scrape©2021 Yahoo Japan Corporation All rights reserved.

Cache

Redis

backend database

Endpoint: /scrape
ReqParams: XXXX
_cache=15s_url=xxx:9116/metrics

45

Prometheus

Prometheus を使う理由
MRTG や Syslog では実現の難しい監視を Prometheus を使うことで実現したい

綺麗な UI で可視化
Grafana + PromQL

Intent ベースのアラート

Prometheus サーバの冗⻑性

スケーラビリティ
⻑期間の Metrics 可視化©2021 Yahoo Japan Corporation All rights reserved.

46

Prometheus

可視化の課題Grafana
Grafana

⾼速に閲覧したいキャッシュ

https://github.com/trickstercache/trickster
Prometheus への Query 結果をキャッシュ

Grafana

Prometheus の時系列DBが増え続ける貯め続けたい©2021 Yahoo Japan Corporation All rights reserved.

Thanoshttps://thanos.io/

オブジェクトストレージを利⽤して⻑期間の Metrics を管理するアプリケーション

47

Prometheus

Thanos のコンポーネント (⼀部)Thanos Sidecar

Prometheus へのクエリを発⾏

Thanos Store

Thanos Query

オブジェクトストレージに保管されたTSDBを参照する
API

Thanos Sidecar や
Thanos Store にPromQL を発⾏/
結果をマージする

オブジェクトストレージにTSDBをアップロード©2021 Yahoo Japan Corporation All rights reserved.

48

Prometheus with Thanos

Thanos を併⽤した可視化構成
Datacenter 1

Blackbox aggregator-A

Trickster

Grafana

Proxy/Cache

Blackbox Server

Prometheus

x6K nodes

Prometheus

昔の Metrics は Object
Storage から読み出し

ThanosQuery

Thanos Store

ThanosSidecarBlackbox
Exporter

PING

直近の Metrics はThanos Sidecar 経由でPrometheus から読み出し

Old metrics

Thanos Store

Blackbox aggregator-B

Very Old metrics

Thanos Store

Prometheus

Very very Old metrics

Download TSDB ﬁleUpload TSDB ﬁleObject Storage

ThanosSidecarDatacenter 2

Datacenter N

Blackbox ServerBlackbox ServerBlackbox
ExporterBlackbox
Exporter

⼀定間隔で Metrics 情報 (TSDB) を
Prometheus
Object Storage に Upload

Prometheus

過去の情報を失わないように

Object Storage へ Metrics を保管©2021 Yahoo Japan Corporation All rights reserved.

49

本⽇のまとめ•

Zero Touch Provisioning + Ansible を組み合わせてネットワークを構築
⼀般的な DHCPサーバ/Webサーバを使って SSH できるまで Zero Touch•••

Ansible•複数の機種で conﬁg template を使い回せる⼯夫•構築だけでなく、オペレーションも Ansible Playbook 管理で事故防⽌•常により良い構成管理をするための改良を重ねている

Prometheus を使ったネットワーク監視•

様々な Exporter を駆使して情報を収集•

冗⻑化された Prometheusサーバで情報を分析、アラートの仕組みを構築•

集めた情報は⼤変価値がある•

Thanos を利⽤して Object Storage に過去のMetricsを保管•

後から参照できるように©2021 Yahoo Japan Corporation All rights reserved.

50

©2021 Yahoo Japan Corporation All rights reserved.