Skip to main content
开放网络的先行者与推动者—星融元
加入我们技术支持(Support)  TEL:(+86)4000989811

基于CX-N产品的MC-LAG应用场景配置

1 目的

本文主要讲解企业级SONiC交换机的 MC-LAG解决方案和配置。

2 型号和版本

以下产品可以实现本方案:
CX-N系列交换机
AsterNOS系统软件版本:
AsterNOSv3.1

3 MC-LAG介绍

MC-LAG(Multi Chassis Link Aggregation Group,跨设备链路聚合组)是一种实现跨设备链路聚合的机制,通过将一台设备与另外两台设备进行跨设备链路聚合,保留了普通链路聚合的优点,同时提供了设备级别的冗余。

MC-LAG提供了一种横向虚拟化技术,将两台物理设备虚拟成单台逻辑设备,这台虚拟出来的“单个设备”与其相连的上行或下行设备实现“一对一”链路聚合。如下图所示:

链路聚合

本文所介绍的设备MC-LAG工作模式为:控制面主备模式、数据面双活模式,即:

在控制面需要区分主设备和备设备,主链路和备用链路;

在数据面采用双活方式,两台设备各自决定转发数据流。

4 MC-LAG基础配置说明

Asterfusion交换机运行企业级SONiC(AsterNOS)系统,能够灵活支持MC-LAG组网。

4.1 配置MC-LAG

mclag domain domain-id #创建MC-LAG域并进入视图,当前只支持创建一个域,范围1-4095。

session-timeout timeout #超时时间,单位秒,取值范围为3~3600,默认值为15秒;心跳检测报文的时间间隔应小于MC-LAG会话超时时间的1/3;会话超时时间应为心跳检测报文时间间隔的倍数。

Example:
sonic(config)# mclag domain 10
sonic(mclag-domain)# session-timeout 15

4.2 配置peer-link

vlan vlan-id #在全局视图下配置专用vlan,1-4095。

interface link-aggregation lag-id #创建聚合组,1-9999。

mode static #配置聚合模式为静态

commit #提交配置

switchport trunk vlan vlan-id #指定专用vlan并加入业务vlan

interface ethernet interface-name #进入接口视图

link-aggregation-group lag-id [port-priority port-priority] #加入相应lag,并可指定优先级0-65535,默认255。

startup-delay delay #配置接口延迟,默认为150秒,建议peer-link所在的物理接口上配置延迟值为145秒。

mclag domain domain-id #进入mclag域,id为之前配置的值。

peer-link link-aggregation name #指定peer-link。

commit #提交配置

Example:
sonic(config)# vlan 10
sonic(config-vlan-10)# exit
sonic(config)# interface link-aggregation 10
sonic(config-lagif-10)# mode static
sonic(config-lagif-10)# commit
sonic(config-lagif-10)# switchport trunk vlan 10
sonic(config-lagif-10)# exit
sonic(config)# interface ethernet 0/10
sonic(config-if-0/10)# link-aggregation-group 10
sonic(config-if-0/10)# startup-delay 100
sonic(config-if-0/10)# exit
sonic(config)# mclag domain 10
sonic(mclag-domain)# peer-link link-aggregation 10
sonic(mclag-domain)# commit

4.3 配置心跳检测链路

说明:心跳检测链路用来转发MC-LAG的控制报文,可以与peer-link共用,也可以使用单独的物理链路;

当开启双主检测功能时,要求心跳检测链路与peer-link共用,否则将导致功能失效。

使用单独的物理链路配置心跳检测

interface ethernet interface-name #进入接口视图

ip address A.B.C.D/M #配置接口ip地址

mclag domain domain-id #进入mclag域视图

peer-address A.B.C.D #配置心跳检测链路对端ip地址

local-address A.B.C.D #配置线条检测链路本端ip地址

vrf vrf-name #指定心跳检测链路VRF,默认default

heartbeat-interval interval #配置MC-LAG 心跳检测报文发送间隔时间,单位为秒,取值1~60,默认为1秒;

commit #提交配置

Example:
sonic(config)# interface ethernet 0/11
sonic(config-if-0/11)# ip address 10.0.0.11/24
sonic(config-if-0/11)# exit
sonic(config)# mclag domain 10
sonic(mclag-domain)# peer-address 10.0.0.12
sonic(mclag-domain)# local-address 10.0.0.11
sonic(mclag-domain)# heartbeat-interval 1
sonic(mclag-domain)# commit

使用peer-link配置心跳检测链路

interface vlan vlan-id #进入peer-link专用vlanif配置视图

ip address A.B.C.D/M #配置vlanif的ip地址

mclag domain domain-id #进入mclag域视图

peer-address A.B.C.D #配置心跳检测链路对端ip地址

local-address A.B.C.D #配置线条检测链路本端ip地址

vrf vrf-name #指定心跳检测链路VRF,默认default

commit #提交配置

Example:
sonic(config)# vlan 10
sonic(config-vlan-10)# ip address 10.0.0.11/24
sonic(config- vlan-10)# exit
sonic(config)# mclag domain 10
sonic(mclag-domain)# peer-address 10.0.0.12
sonic(mclag-domain)# local-address 10.0.0.11
sonic(mclag-domain)# commit

4.4 配置MC-LAG成员接口

说明:建议使用低速接口作为MC-LAG成员接口,为提高系统可靠性,建议跨设备聚合组使用动态聚合,并开启LACP短超时。要求部署MC-LAG的两台设备成员物理接口的port ID相同,否则无法正常聚合。

vlan vlan-id #创建业务VLAN,1-4094。

interface link-aggregation lag-id #进入LAG接口配置视图并创建下行聚合组,1-9999。

lacp fast-rate#开启lacp短超时

commit #提交配置

switchport trunk vlan vlan-id #加入业务vlan

mclag domain domain-id #进入mclag域视图

member lag lag-id #添加mclag成员接口

Example:
sonic(config)# vlan 10
sonic(config-vlan-10)# exit
sonic(config)# interface link-aggregation 10
sonic(config-lagif-10)# lacp fast-rate
sonic(config-lagif-10)# commit
sonic(config-lagif-10)# switchport trunk vlan 10
sonic(config-lagif-10)# exit
sonic(config)# mclag domain 10
sonic(mclag-domain)# member lag 10

4.5 配置Monitor Link组

说明:建议在部署MC-LAG的主备设备上配置Monitor Link组,上行口配置为uplink,下行口配置为downlink,开启该功能后,上行口状态down后,下行口会联动down,保证拓扑中出现故障时能够快速收敛。

monitor-link-group group-name [delay-time]#创建monitor-link组,delay-time为可选参数,表示上行口up后下行口up的延迟时间,单位秒,不配置时默认值为0。

interface ethernet interface-name #进入接口视图

monitor-link group-name uplink #配置上行口为uplink

interface link-aggregation lag-id #进入下行聚合组接口配置视图

monitor-link group-name downlink #配置MC-LAG成员接口为downlink

Example:
sonic(config)# monitor-link-group monitor1
sonic(config)# interface ethernet 0/48
sonic(config-if-0/48)# monitor-link monitor1 uplink
sonic(config-if-0/48)# exit
sonic(config)# interface ethernet 0/0
sonic(config-if-0/0)# monitor-link monitor1 downlink

5 MC-LAG典型配置案例

5.1 要求

用户的一台服务器server1运行着重要应用,希望接入的网络稳定可靠,现在用4台Asterfusion sonic交换机搭建网络,将两台leaf设备组成mc-lag与server1连接,测试其中一条链路断开的情况下server1是否会断网,测试过程中用server1与server2进行数据传输测试。

5.2 拓扑图

拓扑图

5.3 测试环境

硬件

名称型号硬件指标数量
spine交换机CX532P-N参见彩页1
Leaf交换机CX308P-48Y-N-V2参见彩页3
服务器X86普通服务器2
光模块多模100G QSFP286
光纤多模100G适用3
光模块多模10G SFP+6
光纤多模10G适用3

软件

软件版本
交换机操作系统AsterNOSv3.1
服务器系统CentOS Linux 7.8.2003
服务器内核 3.10.0-1127.18.2.el7
iperf33.9

管理IP

设备名称接口IP地址
Spine管理口10.230.1.31
Leaf1管理口10.230.1.21
Leaf2管理口10.230.1.22
Leaf3管理口10.230.1.23
Server-1管理口10.230.1.11
Server-2管理口10.230.1.12

设备通信IP

设备名称接口IP地址
SpineEthernet 0/0 10.0.10.201
SpineEthernet 0/410.0.11.201
SpineEthernet 0/810.0.12.201
SpineLoopback 0 172.16.0.1
Leaf1Ethernet 0/0 (Mc-Lag)100.0.10.201
Leaf1Ethernet 0/4(peer-link)11.0.0.11
Leaf1Ethernet 0/4810.0.10.1
Leaf1Loopback 0 172.16.0.2
Leaf2Ethernet 0/0 (Mc-Lag)100.0.10.201
Leaf2Ethernet 0/4(peer-link)11.0.0.12
Leaf2Ethernet 0/4810.0.11.1
Leaf2Loopback 0 172.16.0.3
Leaf3Ethernet 0/0 100.0.20.201
Leaf3Ethernet 0/4810.0.12.1
Leaf3Loopback 0 172.16.0.4
Server-1Bond0100.0.10.200
Server-2Eth0100.0.20.200

5.4 测试前的准备工作

确保各设备按照拓扑图正确连接,确保iperf3测试软件正确安装。

5.5 配置步骤

第 1 步

配置 server1 的 bond0 接口的 IP 地址和网关。

[admin@Server1~]# sudo vim /etc/sysconfig/network-scripts/ifcfg-bond0
DEVICE=bond0
BOOTPROTO=none
BROADCAST=100.0.10.255
IPADDR=100.0.10.200
NETMASK=255.255.255.0
NETWORK=100.0.10.0
ONBOOT=yes
USERCTL=no
GATEWAY=100.0.10.201
BONDING_OPTS=”miimon=100 mode=4 lacp_rate=fast xmit_hash_policy=layer2+3 fail_over_mac=1″
MASTER=yes
[admin@Server1~]# sudo vim /etc/sysconfig/network-scripts/ifcfg-eth0
DEVICE=”eth0″
BOOTPROTO=none
ONBOOT=”yes”
MASTER=bond0
SLAVE=yes
HWADDR=”b8:59:9f:42:36:68″
[admin@Server1~]# sudo vim /etc/sysconfig/network-scripts/ifcfg-eth1
DEVICE=”eth1″
BOOTPROTO=none
ONBOOT=”yes”
MASTER=bond0
SLAVE=yes
HWADDR=”b8:59:9f:42:36:69″
[admin@Server1~]# sudo systemctl restart network

第 2 步

配置 server2 的 eth0 接口的 IP 地址和网关。

[admin@Server1~]# sudo ifconfig eth0 100.0.20.200/24 up
[admin@Server1~]# sudo route add default gw 100.0.20.201

第 3 步

配置spine switch IP地址。

sonic# configure terminal
sonic(config)# interface ethernet 0/0
sonic(config-if-0/0)# ip address 10.0.10.201/24
sonic(config-if-0/0)# interface ethernet 0/4
sonic(config-if-0/4)# ip address 10.0.11.201/24
sonic(config-if-0/4)# interface ethernet 0/8
sonic(config-if-0/8)# ip address 10.0.12.201/24
sonic(config-if-0/8)# exit
sonic(config)# interface loopback 0
sonic(config-loif-0)# ip address 172.16.0.1/32

第 4 步

配置三台leaf设备的IP 地址和 MC-LAG。

Leaf1 配置

sonic# configure terminal
sonic(config)# interface ethernet 0/48
sonic(config-if-0/48)# ip address 10.0.10.1/24
sonic(config-if-0/48)# interface loopback 0
sonic(config-loif-0)# ip address 172.16.0.2/32
sonic(config-loif-0)# exit
sonic(config)# vlan 10
sonic(config-vlan-10)# exit
sonic(config)# vlan 30
sonic(config-vlan-30)# exit
sonic(config)# interface link-aggregation 10
sonic(config-lagif-10)# exit
sonic(config)# interface ethernet 0/0
sonic(config-if-0/0)# speed 10000
sonic(config-if-0/0)# link-aggregation-group 10
sonic(config-if-0/0)# exit
sonic(config)# interface ethernet 0/4
sonic(config-if-0/4)# speed 10000
sonic(config-if-0/4)# switchport trunk vlan 10
sonic(config-if-0/4)# switchport trunk vlan 30
sonic(config-if-0/4)# exit
sonic(config)# interface link-aggregation 10
sonic(config-lagif-10)# switchport trunk vlan 10
sonic(config-lagif-10)# exit
sonic(config)# vlan 10
sonic(config-vlan-10)# ip address 100.0.10.201/24
sonic(config-vlan-10)# exit
sonic(config)# vlan 30
sonic(config-vlan-30)# ip address 11.0.0.11/24
sonic(config-vlan-10)# exit
sonic(config)# monitor-link-group monitor1
sonic(config)# interface ethernet 0/48
sonic(config-if-0/48)# monitor-link monitor1 uplink
sonic(config-if-0/48)# exit
sonic(config)# interface ethernet 0/0
sonic(config-if-0/0)# monitor-link monitor1 downlink
sonic(config-if-0/0)# exit
sonic(config)# mclag domain 10
sonic(mclag-domain)# peer-link ethernet 0/4
sonic(mclag-domain)# local-address 11.0.0.11
sonic(mclag-domain)# peer-address 11.0.0.12
sonic(mclag-domain)# member lag 10
sonic(mclag-domain)# commit
sonic(mclag-domain)# interface vlan 10
sonic(config-vlan-10)# mac-address 00:11:22:33:44:55
sonic(config-vlan-10)# exit
sonic(config)# write

Leaf2 配置

sonic# configure terminal
sonic(config)# interface ethernet 0/48
sonic(config-if-0/48)# ip address 10.0.11.1/24
sonic(config-if-0/48)# interface loopback 0
sonic(config-loif-0)# ip address 172.16.0.3/32
sonic(config-loif-0)# exit
sonic(config)# vlan 10
sonic(config-vlan-10)# exit
sonic(config)# vlan 30
sonic(config-vlan-30)# exit
sonic(config)# interface link-aggregation 10
sonic(config-lagif-10)# exit
sonic(config)# interface ethernet 0/0
sonic(config-if-0/0)# speed 10000
sonic(config-if-0/0)# link-aggregation-group 10
sonic(config-if-0/0)# exit
sonic(config)# interface ethernet 0/4
sonic(config-if-0/4)# speed 10000
sonic(config-if-0/4)# switchport trunk vlan 10
sonic(config-if-0/4)# switchport trunk vlan 30
sonic(config-if-0/4)# exit
sonic(config)# interface link-aggregation 10
sonic(config-lagif-10)# switchport trunk vlan 10
sonic(config-lagif-10)# exit
sonic(config)# vlan 10
sonic(config-vlan-10)# ip address 100.0.10.201/24
sonic(config-vlan-10)# exit
sonic(config)# vlan 30
sonic(config-vlan-30)# ip address 11.0.0.12/24
sonic(config-vlan-10)# exit
sonic(config)# monitor-link-group monitor1
sonic(config)# interface ethernet 0/48
sonic(config-if-0/48)# monitor-link monitor1 uplink
sonic(config-if-0/48)# exit
sonic(config)# interface ethernet 0/0
sonic(config-if-0/0)# monitor-link monitor1 downlink
sonic(config-if-0/0)# exit
sonic(config)# mclag domain 10
sonic(mclag-domain)# peer-link ethernet 0/4
sonic(mclag-domain)# local-address 11.0.0.12
sonic(mclag-domain)# peer-address 11.0.0.11
sonic(mclag-domain)# member lag 10
sonic(mclag-domain)# commit
sonic(mclag-domain)# interface vlan 10
sonic(config-vlan-10)# mac-address 00:11:22:33:44:55
sonic(config-vlan-10)# exit
sonic(config)# write

Leaf3 配置

sonic# configure terminal
sonic(config)# interface ethernet 0/48
sonic(config-if-0/48)# ip address 10.0.12.1/24
sonic(config-if-0/48)# interface ethernet 0/0
sonic(config-if-0/0)# speed 10000
sonic(config-if-0/0)# ip address 100.0.20.201/24
sonic(config-if-0/0)# interface loopback 0
sonic(config-loif-0)# ip address 172.16.0.4/32
sonic(config-loif-0)# exit
sonic(config)# write

第 5 步

配置spine设备bgp。

sonic# configure terminal
sonic(config)# router bgp 65001
sonic(config-router)# bgp router-id 171.16.0.1
sonic(config-router)# no bgp ebgp-requires-policy
sonic(config-router)# neighbor 172.16.0.2 remote-as 65002
sonic(config-router)# neighbor 172.16.0.3 remote-as 65002
sonic(config-router)# neighbor 172.16.0.4 remote-as 65004
sonic(config-router)# address-family l2vpn evpn
sonic(config-router)# neighbor 172.16.0.2 activate
sonic(config-router)# neighbor 172.16.0.3 activate
sonic(config-router)# neighbor 172.16.0.4 activate
sonic(config-router)# advertise-all-vni
sonic(config)# write
sonic(config)# reload

第 6 步

 配置三台leaf设备bgp。

Leaf1 配置

sonic(config)# router bgp 65002
sonic(config-router)# bgp router-id 171.16.0.2
sonic(config-router)# no bgp ebgp-requires-policy
sonic(config-router)# neighbor 172.16.0.1 remote-as 65001
sonic(config-router)# neighbor 172.16.0.3 remote-as 65002
sonic(config-router)# address-family ipv4 unicast
sonic(config-router-af)# network 172.16.0.2/32
sonic(config-router-af)# exit
sonic(config)# router bgp 65002
sonic(config-router)# address-family l2vpn evpn
sonic(config-router)# neighbor 172.16.0.1 activate
sonic(config-router)# neighbor 172.16.0.3 activate
sonic(config-router)# advertise-all-vni
sonic(config)# write
sonic(config)# reload

Leaf2 配置

sonic(config)# router bgp 65002
sonic(config-router)# bgp router-id 171.16.0.3
sonic(config-router)# no bgp ebgp-requires-policy
sonic(config-router)# neighbor 172.16.0.1 remote-as 65001
sonic(config-router)# neighbor 172.16.0.2 remote-as 65002
sonic(config-router)# address-family ipv4 unicast
sonic(config-router-af)# network 172.16.0.3/32
sonic(config-router-af)# exit
sonic(config)# router bgp 65002
sonic(config-router)# address-family l2vpn evpn
sonic(config-router)# neighbor 172.16.0.1 activate
sonic(config-router)# neighbor 172.16.0.2 activate
sonic(config-router)# advertise-all-vni
sonic(config)# write
sonic(config)# reload

Leaf3 配置

sonic(config)# router bgp 65004
sonic(config-router)# bgp router-id 171.16.0.4
sonic(config-router)# no bgp ebgp-requires-policy
sonic(config-router)# neighbor 172.16.0.1 remote-as 65001
sonic(config-router)# address-family ipv4 unicast
sonic(config-router-af)# network 172.16.0.4/32
sonic(config-router-af)# exit
sonic(config)# router bgp 65004
sonic(config-router)# address-family l2vpn evpn
sonic(config-router)# neighbor 172.16.0.1 activate
sonic(config-router)# advertise-all-vni
sonic(config)# write
sonic(config)# reload

第 7 步

用server1发送流量到server2,并查看spine上流量走向

[admin@Server2~]# iperf3 -s
[admin@Server1~]# iperf3 -c 100.0.20.200 -l 20k -b 100G -M 9000 -t 1000

查看Spine设备流量

查看Spine设备流量

第 8 步

将leaf1上行接口0/48 down,查看spine流量走向

查看spine流量走向

6 结论

本次测试中,mc-lag链路故障后服务器之间可以正常通信,mc-lag链路恢复后服务器之间仍然可以正常通信,说明通过两台asterfusion sonic switch组成的mc-lag网络可以满足用户对网络高稳定性及高可靠性的需求。

点击了解Asterfusion CX-N数据中心交换机

如有其它问题,请填写右侧需求表单联系我们

EVPN Multihoming场景配置

1 目的

本文主要介绍EVPN Multihoming场景在Asterfusion虚拟SONiC交换机(vAsterNOS)上的配置实现。通过阅读本文,用户可以快速理解和掌握EVPN Multihoming在Asterfusion SONiC交换机上的配置方法。

2 简介

2.1 vAsterNOS

vAsterNos是星融元推出的一款sonic交换机的虚拟操作系统,它继承了AsterNOS的所有软件特性,可运行在GNS3、EVE-NG等网络虚拟软件中。用户可以通过使用vAsterNos更好地了解星融元企业级sonic交换机的特性,从而为构建高效网络环境提供有力支撑。

关于设置vAsterNOS的使用环境的信息,请阅读:
Asterfusion虚拟SONiC交换机使用说明

2.2 EVPN Multihoming

EVPN Multihoming是指在使用以太网VPN(Ethernet VPN,EVPN)技术构建的数据中心网络中,使用多个物理链路和IP地址来实现冗余和负载均衡的技术。在EVPN Multihoming中,每个用户可以使用多个物理链路来与数据中心网络进行连接,这些链路可以来自不同的交换机。当一个链路或设备发生故障时,可以自动切换到备用链路或设备,保证数据中心网络的可用性。也可以通过负载均衡的方式,将网络流量分配到多个链路或地址中,提高网络性能和效率。Multihoming技术标准可参照RFC7432 and RFC4116,其具有良好的兼容性。

2.3 ESI

ESl(Ethernet Segmentldentifier,以太网段标识),用于标识 ES(Ethernet Segment),长度为 10 字节。
当前支持两种方式配置 ES1:
(1)配置唯一10 字节的 ESI、格式为 00:AA:BB:CC:DD:EE:FF:GG:HH:II;

(2)配置 es-id 和 es-sys-mac,再与保留位组成唯一 10 字节的 ESI。

使用时,为一组Leaf 设备连接到同一用户侧设备或主机的下行聚合口配置相同的 ESI,则这两个聚合口互为EVPN-Multihoming 对等体,该聚合接口也称为 ES 接口,该 Leaf 交换机也称为 ES 设备。

2.4 DF设备

在一组 ES 设备上,会为每个 ES 选择一个指定转发器,被选中的交换机称为DF(Designated Forwarder)设备,相应的,没有被选举成为DF的则称为 Non-DF设备。只有DF设备才允许将VXLAN 隧道收到的泛洪流量转发到本地配置 ESI的下行口,Non-DF设备则不允许。

3 技术原理

3.1 对等体发现

与 MC-LAG不同,EVPN-Multihoming 对等体之间无需 peer-link 互通,而是通过 EVPNtype-4路由(EthernetSegment Route)和type-1路由(Ethernet Auto-Discovery Route)进行动态发现。

EVPN-Multihoming 对等体节点通过配置相同的 ESI 进行互通、作为独立的 VTEP,具有唯一的 VTEP IP 地址

3.2 DF选举算法

DF 选举算法用于解决远端 BUM 流量复制问题:只有 DF 设备才允许将 VXLAN 隧道收到的泛洪流量转发到本地配置 ESI的下行口,Non-DF 设备则不允许。

在同一个 ES 中,具有最高 DF 偏好的 VTEP节点将成为 DF 设备,若偏好值相同,则选举具有最小 VTEPIP 地址的成为 DF 设备。DF选举动作由 EVPN type-4路由完成。

3.3 水平分割算法

水平分割算法用于防止同一个 ESI的 BUM 流量环路和复制:只有来自远程站点的 BUM 流量才被允许转发到本地站点。

4 EVPN Multihoming典型场景配置

4.1 要求

用户的数据中心拥有一套2+4的spine-leaf网络,现在需要将3台server部署在此网络中,要求使用multihoming部署方式,保障网络的高可靠性。具体组网情况参见4.2章网络拓扑。

4.2 拓扑

网络拓扑

4.3 测试环境

此配置示例采用 Asterfusion 虚拟 SONiC 交换机 (vAsterNOS) 实现,因此需要运行 vAsterNOS 的虚拟环境。具体环境搭建请参考本文2.1节的相关链接。

4.4 设备互联IP

设备名称接口IP地址备注
Spine1Ethernet 0/0 172.16.11.1/24
Spine1Ethernet 0/1172.16.12.1/24
Spine1Ethernet 0/2172.16.13.1/24
Spine1Ethernet 0/3172.16.14.1/24Router-id same as loopback0
Spine1Loopback 0 10.1.0.210/32
Spine2Ethernet 0/0 172.16.15.1/24
Spine2Ethernet 0/1172.16.16.1/24
Spine2Ethernet 0/2172.16.17.1/24
Spine2Ethernet 0/3172.16.18.1/24
Spine2Loopback 0 10.1.0.211/32Router-id same as loopback0
Leaf1Ethernet 0/2172.16.11.2/24
Leaf1Ethernet 0/3172.16.15.2/24
Leaf1Vlan 100100.0.0.1/24
Leaf1Vlan 200110.0.0.1/24
Leaf1Loopback 0 10.1.0.212/32Router-id and vtep ip same as loopback0
Leaf2Ethernet 0/2172.16.12.2/24
Leaf2Ethernet 0/3172.16.16.2/24
Leaf2Vlan 100100.0.0.1/24
Leaf2Vlan 200110.0.0.1/24
Leaf2Loopback 0 10.1.0.213/32Router-id and vtep ip same as loopback0
Leaf3Ethernet 0/1172.16.13.2/24
Leaf3Ethernet 0/2172.16.17.2/24
Leaf3Vlan 300120.0.0.1/24
Leaf3Loopback 0 10.1.0.214/32Router-id and vtep-ip same as loopback0
Leaf4Ethernet 0/1172.16.14.2/24
Leaf4Ethernet 0/2172.16.18.2/24
Leaf4Vlan 300120.0.0.1/24
Leaf4Loopback 0 10.1.0.215/32Router-id and vtep-ip same as loopback0
Server-1bond0100.0.0.12/24

4.5 测试前的准备工作

确保各switch及server设备正确上线,并按照拓扑正确连接。

确保设备正确上线

4.6 配置步骤

第 1 步

修改6台switches设备的mac地址,由于初始mac地址相同,所以在进行业务配置之前,必须先进行mac地址的修改。才能使设备功能正常运行。

sonic# system bash
admin@sonic:~$ sudo vi /etc/sonic/config_db.json

修改如下位置

修改位置

重新加载配置并退出system bash。

admin@sonic:~$ sudo config reload -yf
admin@sonic:~$ exit

第 2 步

配置各交换机设备的互联端口。

Spine1

sonic# configure terminal
sonic(config)# interface ethernet 0/1
sonic(config-if-0/1)# ip address 172.16.11.1/24
sonic(config-if-0/1)# interface ethernet 0/2
sonic(config-if-0/2)# ip address 172.16.12.1/24
sonic(config-if-0/2)# interface ethernet 0/3
sonic(config-if-0/3)# ip address 172.16.13.1/24
sonic(config-if-0/3)# interface ethernet 0/4
sonic(config-if-0/4)# ip address 172.16.14.1/24
sonic(config-if-0/4)# exit
sonic(config)# interface loopback 0
sonic(config-loif-0)# ip address 10.1.0.210/32
sonic(config-loif-0)#exit

Spine2

sonic# configure terminal
sonic(config)# interface ethernet 0/1
sonic(config-if-0/1)# ip address 172.16.15.1/24
sonic(config-if-0/1)# interface ethernet 0/2
sonic(config-if-0/2)# ip address 172.16.16.1/24
sonic(config-if-0/2)# interface ethernet 0/3
sonic(config-if-0/3)# ip address 172.16.17.1/24
sonic(config-if-0/3)# interface ethernet 0/4
sonic(config-if-0/4)# ip address 172.16.18.1/24
sonic(config-if-0/4)# q
sonic(config)# interface loopback 0
sonic(config-loif-0)# ip address 10.1.0.211/32
sonic(config-loif-0)#exit

Leaf1

sonic# configure terminal
sonic(config)# interface ethernet 0/3
sonic(config-if-0/3)# ip address 172.16.11.2/24
sonic(config-if-0/3)# interface ethernet 0/4
sonic(config-if-0/4)# ip address 172.16.15.2/24
sonic(config-if-0/4)# exit
sonic(config)# interface loopback 0
sonic(config-loif-0)# ip address 10.1.0.212/32

Leaf2

sonic# configure terminal
sonic(config)# interface ethernet 0/3
sonic(config-if-0/3)# ip address 172.16.12.2/24
sonic(config-if-0/3)# interface ethernet 0/4
sonic(config-if-0/4)# ip address 172.16.16.2/24
sonic(config-if-0/4)# exit
sonic(config)# interface loopback 0
sonic(config-loif-0)# ip address 10.1.0.213/32

Leaf3

sonic# configure terminal
sonic(config)# interface ethernet 0/2
sonic(config-if-0/2)# ip address 172.16.13.2/24
sonic(config-if-0/2)# interface ethernet 0/3
sonic(config-if-0/3)# ip address 172.16.17.2/24
sonic(config-if-0/3)# exit
sonic(config)# interface loopback 0
sonic(config-loif-0)# ip address 10.1.0.214/32

Leaf4

sonic# configure terminal
sonic(config)# interface ethernet 0/2
sonic(config-if-0/2)# ip address 172.16.14.2/24
sonic(config-if-0/2)# interface ethernet 0/3
sonic(config-if-0/3)# ip address 172.16.18.2/24
sonic(config-if-0/3)# exit
sonic(config)# interface loopback 0
sonic(config-loif-0)# ip address 10.1.0.215/32

第 3 步

配置Leaf设备的聚合口

Leaf1

sonic(config)# interface link-aggregation 5
sonic(config-lagif-5)# exit
sonic(config)# interface ethernet 0/1
sonic(config-if-0/1)# switchport
sonic(config-if-0/1)# link-aggregation-group 5
sonic(config-if-0/1)# exit
sonic(config)# interface link-aggregation 6
sonic(config-lagif-6)# exit
sonic(config)# interface ethernet 0/2
sonic(config-if-0/2)# switchport
sonic(config-if-0/2)# link-aggregation-group 6
sonic(config-if-0/2)# exit
sonic(config)# vlan 100
sonic(config-vlan-100)# vlan 200
sonic(config-vlan-200)# exit
sonic(config)# interface link-aggregation 5
sonic(config-lagif-5)# switchport access vlan 100
sonic(config-lagif-5)# lacp system-id 00:00:01:00:00:01
sonic(config-lagif-5)# exit
sonic(config)# interface link-aggregation 6
sonic(config-lagif-6)# switchport access vlan 200
sonic(config-lagif-6)# lacp system-id 00:00:01:00:00:02
sonic(config-lagif-6)# exit
sonic(config)# vrf 123
sonic(config-vrf)# exit
sonic(config)# interface vlan 100
sonic(config-vlanif-100)# ip address 100.0.0.1/24
sonic(config-vlanif-100)# mac-address 00:11:22:33:44:55
sonic(config-vlanif-100)# vrf 123
sonic(config-vlanif-100)# interface vlan 200
sonic(config-vlanif-200)# ip address 110.0.0.1/24
sonic(config-vlanif-200)# mac-address 00:11:22:33:44:66
sonic(config-vlanif-200)# vrf 123
sonic(config-vlanif-200)# exit

Leaf2

sonic(config)# interface link-aggregation 5
sonic(config-lagif-5)# exit
sonic(config)# interface ethernet 0/1
sonic(config-if-0/1)# switchport
sonic(config-if-0/1)# link-aggregation-group 5
sonic(config-if-0/1)# exit
sonic(config)# interface link-aggregation 6
sonic(config-lagif-6)# exit
sonic(config)# interface ethernet 0/2
sonic(config-if-0/2)# switchport
sonic(config-if-0/2)# link-aggregation-group 6
sonic(config-if-0/2)# exit
sonic(config)# vlan 100
sonic(config-vlan-100)# vlan 200
sonic(config-vlan-200)# exit
sonic(config)# interface link-aggregation 5
sonic(config-lagif-5)# switchport access vlan 100
sonic(config-lagif-5)# lacp system-id 00:00:01:00:00:01
sonic(config-lagif-5)# exit
sonic(config)# interface link-aggregation 6
sonic(config-lagif-6)# switchport access vlan 200
sonic(config-lagif-6)# lacp system-id 00:00:01:00:00:02
sonic(config-lagif-6)# exit
sonic(config)# vrf 123
sonic(config-vrf)# exit
sonic(config)# interface vlan 100
sonic(config-vlanif-100)# ip address 100.0.0.1/24
sonic(config-vlanif-100)# mac-address 00:11:22:33:44:55
sonic(config-vlanif-100)# vrf 123
sonic(config-vlanif-100)# interface vlan 200
sonic(config-vlanif-200)# ip address 110.0.0.1/24
sonic(config-vlanif-200)# mac-address 00:11:22:33:44:66
sonic(config-vlanif-200)# vrf 123
sonic(config-vlanif-200)# exit

Leaf3

sonic(config)# interface link-aggregation 7
sonic(config-lagif-7)# exit
sonic(config)# interface ethernet 0/1
sonic(config-if-0/1)# switchport
sonic(config-if-0/1)# link-aggregation-group 7
sonic(config-if-0/1)# exit
sonic(config)# vlan 300
sonic(config-vlan-300)# exit
sonic(config)# interface link-aggregation 7
sonic(config-lagif-7)# switchport access vlan 300
sonic(config-lagif-7)# lacp system-id 00:00:01:00:00:03
sonic(config-lagif-7)# exit
sonic(config)# vrf 456
sonic(config-vrf)# exit
sonic(config)# interface vlan 300
sonic(config-vlanif-300)# ip address 120.0.0.1/24
sonic(config-vlanif-300)# mac-address 00:11:22:33:44:77
sonic(config-vlanif-300)# vrf 456
sonic(config-vlanif-300)# exit

Leaf4

sonic(config)# interface link-aggregation 7
sonic(config-lagif-7)# exit
sonic(config)# interface ethernet 0/1
sonic(config-if-0/1)# switchport
sonic(config-if-0/1)# link-aggregation-group 7
sonic(config-if-0/1)# exit
sonic(config)# vlan 300
sonic(config-vlan-300)# exit
sonic(config)# interface link-aggregation 7
sonic(config-lagif-7)# switchport access vlan 300
sonic(config-lagif-7)# lacp system-id 00:00:01:00:00:03
sonic(config-lagif-7)# exit
sonic(config)# vrf 456
sonic(config-vrf)# exit
sonic(config)# interface vlan 300
sonic(config-vlanif-300)# ip address 120.0.0.1/24
sonic(config-vlanif-300)# mac-address 00:11:22:33:44:77
sonic(config-vlanif-300)# vrf 456
sonic(config-vlanif-300)# exit

第 4 步

配置 BGP

Spine1

sonic(config)# router bgp 65200
sonic(config-router)# bgp router-id 10.1.0.210
sonic(config-router)# no bgp ebgp-requires-policy
sonic(config-router)# neighbor PEER_V4_EBGP peer-group
sonic(config-router)# neighbor 172.16.11.2 remote-as 65202
sonic(config-router)# neighbor 172.16.11.2 peer-group PEER_V4_EBGP
sonic(config-router)# neighbor 172.16.12.2 remote-as 65203
sonic(config-router)# neighbor 172.16.12.2 peer-group PEER_V4_EBGP
sonic(config-router)# neighbor 172.16.13.2 remote-as 65204
sonic(config-router)# neighbor 172.16.13.2 peer-group PEER_V4_EBGP
sonic(config-router)# neighbor 172.16.14.2 remote-as 65205
sonic(config-router)# neighbor 172.16.14.2 peer-group PEER_V4_EBGP
sonic(config-router)# address-family ipv4 unicast
sonic(config-router-af)# network 10.1.0.210/32
sonic(config-router-af)# neighbor PEER_V4_EBGP activate
sonic(config-router-af)# redistribute connected
sonic(config-router-af)#exit
sonic(config-router)# address-family l2vpn evpn
sonic(config-router-af)# advertise-all-vni
sonic(config-router-af)# neighbor PEER_V4_EBGP activate
sonic(config-router-af)#end
sonic#write
sonic#reload

Spine2

sonic(config)# router bgp 65201
sonic(config-router)# bgp router-id 10.1.0.211
sonic(config-router)# no bgp ebgp-requires-policy
sonic(config-router)# neighbor PEER_V4_EBGP peer-group
sonic(config-router)# neighbor 172.16.15.2 remote-as 65202
sonic(config-router)# neighbor 172.16.15.2 peer-group PEER_V4_EBGP
sonic(config-router)# neighbor 172.16.16.2 remote-as 65203
sonic(config-router)# neighbor 172.16.16.2 peer-group PEER_V4_EBGP
sonic(config-router)# neighbor 172.16.17.2 remote-as 65204
sonic(config-router)# neighbor 172.16.17.2 peer-group PEER_V4_EBGP
sonic(config-router)# neighbor 172.16.18.2 remote-as 65205
sonic(config-router)# neighbor 172.16.18.2 peer-group PEER_V4_EBGP
sonic(config-router)# address-family ipv4 unicast
sonic(config-router-af)# network 10.1.0.211/32
sonic(config-router-af)# neighbor PEER_V4_EBGP activate
sonic(config-router-af)# redistribute connected
sonic(config-router-af)#exit
sonic(config-router)# address-family l2vpn evpn
sonic(config-router-af)# advertise-all-vni
sonic(config-router-af)# neighbor PEER_V4_EBGP activate
sonic(config-router-af)#end
sonic# write
sonic# reload

Leaf1 

sonic(config)# router bgp 65202
sonic(config-router)# bgp router-id 10.1.0.212
sonic(config-router)# no bgp ebgp-requires-policy
sonic(config-router)# neighbor PEER_V4_EBGP peer-group
sonic(config-router)# neighbor 172.16.11.1 remote-as 65200
sonic(config-router)# neighbor 172.16.11.1 peer-group PEER_V4_EBGP
sonic(config-router)# neighbor 172.16.15.1 remote-as 65201
sonic(config-router)# neighbor 172.16.15.1 peer-group PEER_V4_EBGP
sonic(config-router)# address-family ipv4 unicast
sonic(config-router-af)# network 10.1.0.212/32
sonic(config-router-af)# neighbor PEER_V4_EBGP activate
sonic(config-router-af)# redistribute connected
sonic(config-router-af)# exit
sonic(config-router)# address-family l2vpn evpn
sonic(config-router-af)# advertise-all-vni
sonic(config-router-af)# neighbor PEER_V4_EBGP activate
sonic(config-router-af)#exit
sonic(config-router)#exit

Leaf2

sonic(config)# router bgp 65203
sonic(config-router)# bgp router-id 10.1.0.213
sonic(config-router)# no bgp ebgp-requires-policy
sonic(config-router)# neighbor PEER_V4_EBGP peer-group
sonic(config-router)# neighbor 172.16.12.1 remote-as 65200
sonic(config-router)# neighbor 172.16.12.1 peer-group PEER_V4_EBGP
sonic(config-router)# neighbor 172.16.16.1 remote-as 65201
sonic(config-router)# neighbor 172.16.16.1 peer-group PEER_V4_EBGP
sonic(config-router)# address-family ipv4 unicast
sonic(config-router-af)# network 10.1.0.213/32
sonic(config-router-af)# neighbor PEER_V4_EBGP activate
sonic(config-router-af)# redistribute connected
sonic(config-router-af)# exit
sonic(config-router)# address-family l2vpn evpn
sonic(config-router-af)# advertise-all-vni
sonic(config-router-af)# neighbor PEER_V4_EBGP activate
sonic(config-router-af)#exit
sonic(config-router)#exit

Leaf3

sonic(config)# router bgp 65204
sonic(config-router)# bgp router-id 10.1.0.214
sonic(config-router)# no bgp ebgp-requires-policy
sonic(config-router)# neighbor PEER_V4_EBGP peer-group
sonic(config-router)# neighbor 172.16.13.1 remote-as 65200
sonic(config-router)# neighbor 172.16.13.1 peer-group PEER_V4_EBGP
sonic(config-router)# neighbor 172.16.17.1 remote-as 65201
sonic(config-router)# neighbor 172.16.17.1 peer-group PEER_V4_EBGP
sonic(config-router)# address-family ipv4 unicast
sonic(config-router-af)# network 10.1.0.214/32
sonic(config-router-af)# neighbor PEER_V4_EBGP activate
sonic(config-router-af)# redistribute connected
sonic(config-router-af)# exit
sonic(config-router)# address-family l2vpn evpn
sonic(config-router-af)# advertise-all-vni
sonic(config-router-af)# neighbor PEER_V4_EBGP activate
sonic(config-router-af)# exit
sonic(config-router)# exit

Leaf4

sonic(config)# router bgp 65205
sonic(config-router)# bgp router-id 10.1.0.215
sonic(config-router)# no bgp ebgp-requires-policy
sonic(config-router)# neighbor PEER_V4_EBGP peer-group
sonic(config-router)# neighbor 172.16.14.1 remote-as 65200
sonic(config-router)# neighbor 172.16.14.1 peer-group PEER_V4_EBGP
sonic(config-router)# neighbor 172.16.18.1 remote-as 65201
sonic(config-router)# neighbor 172.16.18.1 peer-group PEER_V4_EBGP
sonic(config-router)# address-family ipv4 unicast
sonic(config-router-af)# network 10.1.0.215/32
sonic(config-router-af)# neighbor PEER_V4_EBGP activate
sonic(config-router-af)# redistribute connected
sonic(config-router-af)# exit
sonic(config-router)# address-family l2vpn evpn
sonic(config-router-af)# advertise-all-vni
sonic(config-router-af)# neighbor PEER_V4_EBGP activate
sonic(config-router-af)# exit
sonic(config-router)# exit

第 5 步

配置evpn multihoming

Leaf1

sonic(config)# interface vxlan 0
sonic(config-vxlanif-0)# source 10.1.0.212
sonic(config-vxlanif-0)# exit
sonic(config)# vlan 100
sonic (config-vlan-100)# vni 100
sonic (config-vlan-100)# exit
sonic(config)# vlan 200
sonic (config-vlan-200)# vni 200
sonic (config-vlan-200)# exit
sonic(config)# vrf 123
sonic(config-vrf)# vni 1000
sonic(config-vrf)# exit
sonic(config)# evpn mh redirect-off
sonic(config)# evpn mh mac-holdtime 0
sonic(config)# evpn mh neigh-holdtime 0
sonic(config)# interface ethernet 0/3
sonic(config-if-0/3)# evpn mh uplink
sonic(config-if-0/3)# exit
sonic(config)# interface ethernet 0/4
sonic(config-if-0/4)# evpn mh uplink
sonic(config-if-0/4)# exit
sonic(config)# interface link-aggregation 5
sonic(config-lagif-5)# evpn mh es-id 100
sonic(config-lagif-5)# evpn mh es-sys-mac 00:00:01:00:00:01
sonic(config-lagif-5)# interface link-aggregation 6
sonic(config-lagif-6)# evpn mh es-id 200
sonic(config-lagif-6)# evpn mh es-sys-mac 00:00:01:00:00:02
sonic(config-lagif-6)#end
sonic# write
sonic# reload

Leaf2

sonic(config)# interface vxlan 0
sonic(config-vxlanif-0)# source 10.1.0.213
sonic(config-vxlanif-0)# exit
sonic(config)# vlan 100
sonic (config-vlan-100)# vni 100
sonic (config-vlan-100)# exit
sonic(config)# vlan 200
sonic (config-vlan-200)# vni 200
sonic (config-vlan-200)# exit
sonic(config)# vrf 123
sonic(config-vrf)# vni 1000
sonic(config-vrf)# exit
sonic(config)# evpn mh redirect-off
sonic(config)# evpn mh mac-holdtime 0
sonic(config)# evpn mh neigh-holdtime 0
sonic(config)# interface ethernet 0/3
sonic(config-if-0/3)# evpn mh uplink
sonic(config-if-0/3)# exit
sonic(config)# interface ethernet 0/4
sonic(config-if-0/4)# evpn mh uplink
sonic(config-if-0/4)# exit
sonic(config)# interface link-aggregation 5
sonic(config-lagif-5)# evpn mh es-id 100
sonic(config-lagif-5)# evpn mh es-sys-mac 00:00:01:00:00:01
sonic(config-lagif-5)# interface link-aggregation 6
sonic(config-lagif-6)# evpn mh es-id 200
sonic(config-lagif-6)# evpn mh es-sys-mac 00:00:01:00:00:02
sonic(config-lagif-6)#end
sonic# write
sonic# reload

Leaf3

sonic(config)# interface vxlan 0
sonic(config-vxlanif-0)# source 10.1.0.214
sonic(config-vxlanif-0)# exit
sonic(config)# vlan 300
sonic (config-vlan-300)# vni 300
sonic (config-vlan-300)# exit
sonic(config)# vrf 456
sonic(config-vrf)# vni 1000
sonic(config-vrf)# exit
sonic(config)# evpn mh redirect-off
sonic(config)# evpn mh mac-holdtime 0
sonic(config)# evpn mh neigh-holdtime 0
sonic(config)# interface ethernet 0/2
sonic(config-if-0/2)# evpn mh uplink
sonic(config-if-0/2)# exit
sonic(config)# interface ethernet 0/3
sonic(config-if-0/3)# evpn mh uplink
sonic(config-if-0/3)# exit
sonic(config)# interface link-aggregation 7
sonic(config-lagif-7)# evpn mh es-id 300
sonic(config-lagif-7)# evpn mh es-sys-mac 00:00:01:00:00:03
sonic(config-lagif-7)#end
sonic# write
sonic# reload

Leaf4

sonic(config)# interface vxlan 0
sonic(config-vxlanif-0)# source 10.1.0.215
sonic(config-vxlanif-0)# exit
sonic(config)# vlan 300
sonic (config-vlan-300)# vni 300
sonic (config-vlan-300)# exit
sonic(config)# vrf 456
sonic(config-vrf)# vni 1000
sonic(config-vrf)# exit
sonic(config)# evpn mh redirect-off
sonic(config)# evpn mh mac-holdtime 0
sonic(config)# evpn mh neigh-holdtime 0
sonic(config)# interface ethernet 0/2
sonic(config-if-0/2)# evpn mh uplink
sonic(config-if-0/2)# exit
sonic(config)# interface ethernet 0/3
sonic(config-if-0/3)# evpn mh uplink
sonic(config-if-0/3)# exit
sonic(config)# interface link-aggregation 7
sonic(config-lagif-7)# evpn mh es-id 300
sonic(config-lagif-7)# evpn mh es-sys-mac 00:00:01:00:00:03
sonic(config-lagif-7)#end
sonic# write
sonic# reload

第 6 步

配置 3 台server的bond接口

Server-1

#configure bond0
[root@localhost /]# cd /etc/sysconfig/network-scripts/
[root@localhost network-scripts]# vi ifcfg-bond0
DEVICE=bond0
BOOTPROTO=static
TYPE=bond
ONBOOT=yes
BONDING_OPTS=”miimon=100 mode=4 lacp_rate=fast xmit_hash_policy=layer3+4 fail_over_mac=1 “
IPADDR=100.0.0.12
NETMASK=255.255.255.0
GATEWAY=100.0.0.1
MASTER=yes

#configure eth0
[root@localhost network-scripts]# vi ifcfg-eth0
DEVICE=”eth0″
BOOTPROTO=none
ONBOOT=”yes”
MASTER=bond0
SLAVE=yes

#configure eth1
[root@localhost network-scripts]# vi ifcfg-eth1
DEVICE=”eth1″
BOOTPROTO=none
ONBOOT=”yes”
MASTER=bond0
SLAVE=yes

Server-2

#configure bond0
[root@localhost /]# cd /etc/sysconfig/network-scripts/
[root@localhost network-scripts]# vi ifcfg-bond0
DEVICE=bond0
BOOTPROTO=static
TYPE=bond
ONBOOT=yes
BONDING_OPTS=”miimon=100 mode=4 lacp_rate=fast xmit_hash_policy=layer3+4 fail_over_mac=1 “
IPADDR=110.0.0.12
NETMASK=255.255.255.0
GATEWAY=110.0.0.1
MASTER=yes

#configure eth0
[root@localhost network-scripts]# vi ifcfg-eth0
DEVICE=”eth0″
BOOTPROTO=none
ONBOOT=”yes”
MASTER=bond0
SLAVE=yes

#configure eth1
[root@localhost network-scripts]# vi ifcfg-eth1
DEVICE=”eth1″
BOOTPROTO=none
ONBOOT=”yes”
MASTER=bond0
SLAVE=yes

Server-3

#configure bond0
[root@localhost /]# cd /etc/sysconfig/network-scripts/
[root@localhost network-scripts]# vi ifcfg-bond0
DEVICE=bond0
BOOTPROTO=static
TYPE=bond
ONBOOT=yes
BONDING_OPTS=”miimon=100 mode=4 lacp_rate=fast xmit_hash_policy=layer3+4 fail_over_mac=1 “
IPADDR=120.0.0.12
NETMASK=255.255.255.0
GATEWAY=120.0.0.1
MASTER=yes

#configure eth0
[root@localhost network-scripts]# vi ifcfg-eth0
DEVICE=”eth0″
BOOTPROTO=none
ONBOOT=”yes”
MASTER=bond0
SLAVE=yes

#configure eth1
[root@localhost network-scripts]# vi ifcfg-eth1
DEVICE=”eth1″
BOOTPROTO=none
ONBOOT=”yes”
MASTER=bond0
SLAVE=yes

完成配置后的server接口状态如下:

完成配置后的server接口状态

4.7 验证网络配置

1.各server之间互ping,能够ping通。

2.检查每个交换机的BGP状态。以 Spine1 和 Leaf1 为例:

Spine1

sonic# show bgp summary
Spine1 BGP状态

Leaf1

sonic# show bgp summary

Leaf1 BGP状态

从查询结果可以看出各switch的bgp状态正常。

3.查看各leaf的聚合口状态,以leaf1和leaf3为例:

Leaf1

sonic# show link-aggregation summary
Leaf1聚合口状态

Leaf3

sonic# show link-aggregation summary
Leaf3聚合口状态

从查询结果可以看出各leaf的lag口状态正常。

4.查看各leaf的vxlan隧道,以leaf1和leaf3为例

Leaf1

sonic# show vxlan tunnel
查看Leaf1 vxlan隧道

Leaf3

sonic# show vxlan tunnel
查看Leaf3 vxlan隧道

从查询结果可以看出各leaf vxlan tunnel状态正常。

5.查看各leaf的evpn multihoming 状态

Leaf1

sonic# show evpn es detail
查看leaf1的evpn multihoming 状态

Leaf2

sonic# show evpn es detail
查看leaf2的evpn multihoming 状态

Leaf3

sonic# show evpn es detail
查看leaf3的evpn multihoming 状态

Leaf4

sonic# show evpn es detail
查看各leaf4的evpn multihoming 状态

从查询结果可以看出4台leaf的状态正常,其中leaf1和leaf3分别作为DF设备。

6.用server1 ping server3,将leaf1的ethernet0/1接口down掉,查看lag5的DF设备状态,并查看server1的ping是否中断。

sonic(config-if-0/1)# shutdown
sonic# show evpn es detail
shutdown leaf1的ethernet0/1接口

从结果看,down掉0/1接口后,lag5的leaf1转变为non-df状态,同时leaf2转变为df状态。

并且Server1的ping没有中断。

5 结论

本次测试中,使用vAsterNOS及VM设备组网并配置EVPN Multihoming网络后,各VM之间能互相正常通信,并且leaf之间能正确建立vxlan隧道,相关路由也正常工作。当VM的其中一条接入链路断开后,数据会无缝切换到另一条链路继续传输,DF设备切换正常。当断开的链路重新连接正常后,DF设备也切回原来的设备,数据重新回到原来链路上传输。说明EVPN Multihoming功能工作正常,满足用户的网络高可靠需求。

6 设备升级

6.1 注意事项

以升级 Leaf-1 交换机为例,有以下注意事项:
(1)为减少 Leaf 设备升级期间对业务的影响,应当手动关闭 Leaf-1相应接口,将业务流量全部切换至 Leaf-2后,再对 Leaf-1 进行升级。
(2)如果在 Unique-IP VLAN 下有终端接入,若终端的网关设置为 Leaf-1 的 VLAN,需提前修改终端的网关为Leaf-2、再对 Leaf-1 进行升级。
(3)建议 Leaf 设备升级间隔至少 10 分钟。
下面对具体的操作步骤进行说明。

6.2 操作步骤

  • 登录 Leaf-1 交换机,完成待升级的镜像安装后,执行configure terminal命令,进入系统配置视图;
  • 将下行聚合接口的 LACP 协议状态依次置为 Down(该命令单次有效,重启自动恢复),实现用户侧流量的切换;
evpnmh-leaf-1(config)# interface link-aggregation 100 
evpnmh-leaf-1(config-lagif-100)# lacp graceful-down 
evpnmh-leaf-1(config)# interface link-aggregation 101 
evpnmh-leaf-1(config-lagif-100)# lacp graceful-down 

检查Leaf-1的下行聚合组状态:

evpnmh-leaf-1# show link-aggregation summary 
Flags: A - active, I - inactive, Up - up, Dw - Down, N/A - not available, 
       S - selected, D - deselected, * - not synced 
  No.  Team Dev         Protocol     Ports          Description -----  ---------------  -----------  -------------  ------------- 
 0100  lag 100          LACP(A)(Dw)  0/64      (D)  N/A 
  • 将上行口的物理状态依次置为 Down,实现隧道流量的切换
evpnmh-leaf-1(config)# interface ethernet 0/48 
evpnmh-leaf-1(config-if-0/48)# shutdown 
evpnmh-leaf-1(config-if-0/48)# interface ethernet 0/52 
evpnmh-leaf-1(config-if-0/52)# shutdown 
  • 通过show counters interface命令确定Leaf-1上没有流量经过,已完全切换至Leaf-2。
  • 升级重启Leaf-1;
 evpnmh-leaf-1# reboot 
Do you want to reboot? [y/N]: y 

待升级完成,流量将自动切回 Leaf-1,检査 Leaf-1 的下行聚合组状态、BGP 邻居状态是否正常,确认 Leaf-1 恢复转发流量,再按照同样步骤进行 Leaf-2 设备的升级。

点击了解Asterfusion CX-N数据中心交换机

如有其它问题,请填写右侧需求表单联系我们

星融元(Asterfusion) SONiC交换机的RoCE方案配置

1 目的

本文主要讲解企业级SONiC交换机的RoCE方案及配置。

2 型号和版本

以下产品可以实现本方案:
CX-N系列交换机
AsterNOS系统软件版本:
AsterNOSv3.1

3 RoCE 原理和配置注意事项

3.1 RoCE介绍

在各种HPC高性能计算场景中,对网络的诉求基本上是高吞吐和低时延这两个重要特性,为了实现高吞吐和低时延,业界一般采用 RDMA(Remote Direct Memory Access,远程直接内存访问)替代 TCP 协议。但是RDMA 对于丢包非常敏感,一旦发生丢包重传,性能会急剧下降。因此要使得 RDMA 吞吐不受影响,丢包率必须保证在 1e-05(十万分之一)以下,最好为零丢包。

RoCE (RDMA over Converged Ethernet)网络通过PFC+ECN特性来保障网络传输过程不丢包。

3.2 RoCE 原理和配置注意事项

RoCE网络通过PFC+ECN方式保证网络无损。具体原理如下:

PFC+ECN原理

当serverA与serverB通信时,正常数据流向如绿色实线所示,从A经过交换机S到达B,然后再由B返回到A。

当报文发生拥塞时,需要先使ECN发挥作用,设置交换机的ECN缓存阈值区间为N~M,当缓存超过N时,S开始随机在报文中标记ECN位,当缓存超过M时,S开始在所有报文中标记ECN位。B收到带有ECN标记的报文后,开始向A发送CNP报文,通知A降低发送速率,直到找到最佳速率后,以该速率持续发送数据,从而达到不丢包的目的。

当报文发生拥塞时,PFC也会发挥作用,设置交换机的PFC缓存阈值为Q,当缓存超过Q时,交换机会立即向A持续发送PAUSE数据帧,A收到PAUSE帧后,会立即停止向S的该队列发送报文,这时数据流会中断。当A不再收到pause报文之后,将重新开始向S发送报文。

因此,为了降低数据中断对业务的影响,应尽量避免PFC的触发,使用ECN来保障数据传输,此时就需要交换机的缓存阈值设置Q应该大于M。确保ECN先于PFC触发。

4 Asterfusion Enterprise SONiC 交换机 RoCE 配置

Asterfusion交换机运行企业级SONiC(AsterNOS)系统,采用PFC+ECN的方式保障RoCE网络无损。

有两种配置方式:

4.1 一键自动配置RoCE参数

Example:
sonic# configure terminal
sonic(config)# qos roce lossless
sonic(config)# qos service-policy roce_lossless

它还提供所有与 RoCE 相关配置信息的一键查看功能。命令如下:

sonic# show qos roce

4.2 手动配置RoCE参数

当一键RoCE的配置参数与当前场景并不是很匹配时,也可以手动进行参数配置,以达到最佳效果,相关配置如下:

修改 DSCP 映射

configure termin

diffserv-map type ip-dscp roce_lossless_diffserv_map   #进入DSCP映射配置视图

ip-dscp value cos cos_value  #配置DSCP到COS的映射,value指定DSCP值,范围0-63;cos_value指定COS值,范围0-7

default {cos_value|copy}  #default cos_value表示所有数据包被映射到相应的COS值;default copy表示系统默认的映射

Example:
sonic# configure terminal
sonic(config)# diffserv-map type ip-dscp roce_lossless_diffserv_map
sonic(config-diffservmap-roce_lossless_diffserv_map)# ip-dscp 1 cos 1
sonic(config-diffservmap-roce_lossless_diffserv_map)# default copy

修改队列调度策略

configure terminal

policy-map roce_lossless    #进入相关视图

queue-scheduler priority queue queue-id  #配置SP模式调度,queue-id表示队列,范围0-7

queue-scheduler queue-limit percent queue-weight queue queue-id #配置DWRR模式调度queue-weight表示调度权重百分比,范围0-100;queue-id表示队列,范围0-7

Example:
sonic# configure terminal
sonic(config)# policy-map roce_lossless
sonic(config-pmap-roce-lossless)# queue-scheduler priority queue 3
sonic(config-pmap-roce_lossless)# queue-scheduler queue-limit percent 60 queue 3

调整PFC水线

configure terminal

buffer-profile roce_lossless_profile #进入PFC配置视图

mode lossless dynamic dynamic_th size size xoff xoff xon-offset xon-offset [xon xon]

#修改PFC无损Buffer。

dynamic_th表示动态阈值系数,取值范围为[-4,3];动态阈值= 2dynamic_th×剩余可用buffer。例如,dynamic_th设为1,那么动态阈值为2倍的剩余可用buffer,即实际threshold为2/3的总可用buffer;

size表示保留大小,单位为字节,建议配置值为1518;

xoff表示PFC反压帧触发缓存门限值,建议配置为cell size(224 Bytes)的整数倍,单位为字节。xoff与线缆长度,接口速率等参数有关。xoff值必须大于xon值;

xon-offset表示PFC反压帧停止缓存门限值,建议配置为cell size(224 Bytes)的整数倍,单位为字节。建议配置值为13440;

xon为可选参数一般配置为0。

Example:
sonic# configure terminal
sonic(config)# buffer-profile roce_lossless_profile
sonic(config-buffer-profile-roce_lossless_profile)# mode lossless dynamic 1 size 1518 xoff 896 xon-offset 13440 xon 0

调整ECN水线

configure terminal

wred roce_lossless_ecn  #进入ECN配置视图

mode ecn gmin min_th gmax max_th gprobability probability [ymin min_th ymax max_th yprobability probability|rmin min_th rmax max_th rprobability probability]

#修改ECN参数。

min_th设置显式拥塞通告的下限绝对值,单位为字节。即当队列中的报文长度达到此数值时,接口开始按照概率将报文的ECN字段置为CE。可配置的min threshold最小值为15KB,建议配置值为15360;

max_th设置显式拥塞通告的上限绝对值,单位为字节。即当队列中的报文长度达到此数值时,接口开始将全部报文的ECN字段置为CE;不同速率接口的建议值分别为:100/200G为76800,400G为1536000。

probability设置将报文的ECN字段的设置为CE的最大概率,整数形式,取值范围[1,100]。对于时延敏感型业务,建议最大丢弃概率设置为90%;对于吞吐敏感型业务,建议设置为10%。

Example:
sonic# configure terminal
sonic(config)# wred roce_lossless_ecn
sonic(config-wred-roce_lossless_ecn)# mode ecn gmin 15360 gmax 76800 gprobability 90

5 用户测试案例

5.1 要求

现用三台已安装Mellanox 100G网卡的服务器,测试CX532P-N交换机无损转发数据的特性,如下图所示,用server1发送RDMA流量经过交换机的无损队列转发给server3,同时用server2发送普通TCP流量经交换机转发给server3,查看数据接收情况。

5.2 拓扑图

拓扑图

5.3 测试环境

硬件

名称型号硬件指标数量备注
交换机CX532P-N参见彩页2
服务器X86普通服务器3安装100G IB网卡
光模块100GQSFP286
光纤多模100G适用3
网卡MCX653195A-ECAT100G3

软件

软件版本备注
交换机操作系统AsterNOSv3.1
宿主机操作系统openEuler 22.03
宿主机内核 5.10.0-136.33.0.109
Mellanox网卡驱动5.10.0-60.18.0网卡驱动版本要适配宿主机内核版本
iperf33.9

管理网口IP地址规划

设备名称接口IP地址备注
CX532P-N管理口10.230.1.18
Server-1管理口10.230.1.11
Server-2管理口10.230.1.12
Server-3管理口10.230.1.13

业务网口IP地址规划

设备名称接口IP地址备注
CX532P-NVlan接口100.0.10.200
Server-1业务接口100.0.10.10Mellanox 网卡接口
Server-2业务接口100.0.10.11Mellanox 网卡接口
Server-3业务接口100.0.10.12Mellanox 网卡接口

5.4 测试前的准备工作

根据拓扑图将每台服务器连接到交换机,确保服务器上已正确安装 Mellanox 网卡和驱动程序,并安装 iperf3 测试工按照组网图将各服务器与交换机正确连接,确保服务器上安装好mellanox网卡及驱动,并安装好iperf3测试工具。

5.5 配置步骤

第 1 步

对交换机进行基础配置,确保三个接口在同一二层网络中,数据能正常转发。

sonic# configure terminal
sonic(config)# vlan 101
sonic(config-vlan-101)# interface ethernet 0/0
sonic(config-if-0/0)# switchport access vlan 101
sonic(config-if-0/0)# interface ethernet 0/4
sonic(config-if-0/4)# switchport access vlan 101
sonic(config-if-0/4)# interface ethernet 0/8
sonic(config-if-0/8)# switchport access vlan 101
sonic(config-if-0/8)# exit
sonic(config)# interface vlan 101
sonic(config-vlanif-101)# ip address 100.0.10.200/24

第 2 步

一键配置交换机RoCE参数。

onic# configure terminal
sonic(config)# qos roce lossless
sonic(config)# qos service-policy roce_lossless

查看交换机RoCE配置

sonic# show qos roce

第 3 步

配置三台服务器ip地址,并配置网卡的RoCE参数,本次无损队列使用队列3。

[admin@Server1~]# sudo ifconfig ens1f2 100.0.10.10/24 up
[admin@Server2~]# sudo ifconfig ens1f2 100.0.10.11/24 up
[admin@Server3~]# sudo ifconfig ens1f2 100.0.10.12/24 up
[admin@Server1~]# sudo mlnx_qos -i ens1f2 –trust dscp
[admin@Server1~]# sudo mlnx_qos -i ens1f2 –pfc 0,0,0,1,0,0,0,0
[admin@Server1~]# sudo cma_roce_mode -d mlx5_0 -p 1 -m 2
[admin@Server1~]# sudo echo 96 > /sys/class/infiniband/mlx5_0/tc/1/traffic_class
[admin@Server1~]# sudo cma_roce_tos -d mlx5_0 -t 96
[admin@Server1~]# sudo echo 1 > /sys/class/net/ens1f2/ecn/roce_np/enable/3
[admin@Server1~]# sudo echo 1 > /sys/class/net/ens1f2/ecn/roce_rp/enable/3
[admin@Server1~]# sudo echo 16 > /sys/class/net/ens1f2/ecn/roce_np/cnp_dscp
[admin@Server1~]# sudo sysctl -w net.ipv4.tcp_ecn=1
[admin@Server3~]# sudo mlnx_qos -i ens1f2 –trust dscp
[admin@Server3~]# sudo mlnx_qos -i ens1f2 –pfc 0,0,0,1,0,0,0,0
[admin@Server3~]# sudo cma_roce_mode -d mlx5_0 -p 1 -m 2
[admin@Server3~]# sudo echo 96 > /sys/class/infiniband/mlx5_0/tc/1/traffic_class
[admin@Server3~]# sudo cma_roce_tos -d mlx5_0 -t 96
[admin@Server3~]# sudo echo 1 > /sys/class/net/ens1f2/ecn/roce_np/enable/3
[admin@Server3~]# sudo echo 1 > /sys/class/net/ens1f2/ecn/roce_rp/enable/3
[admin@Server3~]# sudo echo 16 > /sys/class/net/ens1f2/ecn/roce_np/cnp_dscp
[admin@Server3~]# sudo sysctl -w net.ipv4.tcp_ecn=1

第 4 步

使用server1和server2向server3发数据包,其中server1发送RoCE流量,server2发送tcp流量。

[admin@Server3~]# ib_send_lat -R -d mlx5_0 -F –report_gbits -a
[admin@Server1~]# ib_send_lat -a -R -x 3 -d mlx5_0 -F -f 2 100.0.10.12
[admin@Server3~]# iperf3 -s
[admin@Server2~]# iperf3 -c 100.0.10.12 -l 20k -b 100G -M 9000 -t 1000

查看三个接口的各队列数据转发情况。

sonic# show counters queue 0/0
sonic# show counters queue 0/4
查看0/4接口的队列转发
sonic# show counters queue 0/8
查看0/8接口的队列转发

6 结论

由转发结果可以看出,经过队列3转发的RoCE流量未丢包,经过队列0转发的TCP流量由于带宽不足产生丢包。CX532P-N交换机可以通过RoCE功能实现网络无损传输。

点击了解Asterfusion CX-N数据中心交换机

如有其它问题,请填写需求表单联系我们

Asterfusion 企业级SONiC交换机虚拟环境搭建

1 目的

本文主要介绍Asterfusion企业级SONiC交换机虚拟操作系统(vAsterNOS)环境的搭建。通过阅读本文,用户可以在GNS3虚拟平台上快速部署vAsterNOS镜像,从而使用户更容易学习和理解Asterfusion企业级SONiC交换机的使用。

2 vAsterNos介绍

vAsterNos是星融元推出的一款sonic交换机的虚拟操作系统,它继承了AsterNOS的所有软件特性,可运行在GNS3、EVE-NG等网络虚拟软件中。用户可以通过使用vAsterNos更好地了解星融元企业级sonic交换机的特性,从而为构建高效网络环境提供有力支撑。

3 环境要求

3.1 硬件

名称型号硬件指标数量备注
PCX86普通个人PC1
服务器X86 CPU:Intel Xeon Gold5118 2.30GHZ
内存:512GB
1BIOS开启VT

3.2 软件

软件版本备注
ESXI 镜像ESXI-6.7.0-20191204001VMware 服务器版本
GNS3 VM Server2.2.45GNS3 版本 > 2.2.43
QEMU4.2.1
GNS3 VM Client2.2.45GNS3 Client版本必须与Server版本相同
VM Server0.15.0
vAsterNOS3.1AsterNOS社区版镜像,最低配置2C4G
vAsterNOS.gns34GNS3 registry 版本 > 3
Centos76.qcow2Centos7.6

3.3 获取软件镜像

用户可从网上自行下载GNS3、VM、Centos等相关软件的镜像,也可向我们提出申请来获取vAsterNOS镜像软件。当然,Asterfusion也可提供上述提到的其它所有软件。只需申请通过即可全部下载。

4 vAsterNOS运行环境搭建

vAsterNOS可以在GNS3和EVE-NG等网络虚拟软件中运行。本文主要介绍GNS3网络虚拟化软件中搭建。首先,您需要下载上述软件镜像并将其放在您的电脑上,并将安装有vmware ESXI的服务器开启,使PC与服务器连接,pc端通过web能够访问到服务器。装GNS3、vAsterNOS等软件。

4.1 安装 GNS3 server

通过PC端Web访问ESXI server并登录。单击创建/注册虚拟机,如下所示:

创建/注册虚拟机

选择从 OVF 或 OVA 文件部署虚拟机,然后单击下一步

部署虚拟机

输入虚拟机的名称,然后单击下一步

输入虚拟机的名称

选择 GNS3 VM.ova 并安装

选择 GNS3 VM.ova

4.2 配置 GNS3 VM

完成GNS3 VM的创建后,在管理页面通过Network配置VM管理口IP,并重启虚拟机。

右键单击 GNS3 VM 窗口,选择“控制台”,然后在新窗口中打开控制台,如下所示:

打开控制台

此时出现相关配置界面,选择network进入

相关配置界面

然后出现以下界面:

配置界面

修改IP地址、网关、DNS等相关参数。IP 地址需要与 VMware ESXI 系统同网段。如下:

修改参数

然后保存并退出,完成网络相关配置。

接下来点击编辑,进入虚拟机设置界面,如下图所示:

虚拟机设置

需要将CPU及内存设置为合适的值,例如运行一个2+4的spine-leaf网络,需要运行6个vAsterNos镜像,每个vAsterNos镜像的运行配置不低于2核4G,那么就需要将CPU合数设置为大于12核,将内存设置为大于24G。同时,如果运行虚拟PC作为验证数据使用,也同样需要计算所占用的cpu及内存资源。本文设置为24核130G。

完成设置后的GNS3配置如下图:

GNS3配置

其用户名和密码默认为 gns3/gns3。

4.3 配置vswitch

选择网络-vswitch-vswitch0,如下图所示:

网络-vswitch-vswitch0

单击编辑设置。您需要将安全策略调整为混杂模式,如下所示:

模式调整

完成上述所有设置后,重新启动 GNS3 虚拟机。

4.4 安装GNS3 VM client

GNS3 VM client安装在个人计算机中,直接使用准备的EXE文件安装即可。安装完成之后用于远程连接GNS3 VM Server。完成镜像导入、网络拓扑创建以及基础配置等操作。

打开GNS3 client,点击edit,选择preferences,如下:

选择preferences

选择server,并设置host及user/passward,如下:

设置host及user/passward

4.5 导入vAsterNOS镜像文件

打开GNS3 client,选择file-new blank project,如下

选择file-new blank project

输入项目名称,如下所示:

输入项目名称

然后选择 file-import appliance 并导入 vAsterNos 镜像配置文件,如下所示:

导入镜像配置文件

选择要导入的镜像配置文件,如下所示:

选择镜像文件

然后选择安装到主server,如下所示:

安装到主Server

然后检查镜像文件是否匹配

检查镜像文件

然后点击next,等待导入完成即可。 新导入的vAsterNos系统,默认用户名密码为admin/asteros. 需要说明的是Asterfusion-vAsterNOS.gns3a和vAsterNOS-V3.1.img文件需放在同一路径下。

等待导入

4.6 为vAsterNOS分配资源和导入图标

将准备好的asterfusion-vAsterNOS.svg文件,通过scp等方式上传到GNS3 VM Server相关目录中,文件路径:/home/gns3/GNS3/symbols/asterfusion-vAsterNOS.svg。

然后在GNS3 client端选择使用该图标文件,如下图,在左侧红框内找到vAsterNos设备

选择图标

然后右键,选择configure template

选择configure template

在symbol选择browse,如下

在symbol选择browse

选择 vAsterNOS 图标文件,如下所示:

选择图标文件

同时,在该界面配置cpu核数及内存容量,如下:

配置cpu核数及内存容量

至此,vAsterNOS的导入工作已经完成,用户可以正常使用。

4.7 vAsterNOS的使用

拖出vAsterNOS并右键单击,会出现以下界面,您可以启动或停止设备,并可以通过custom console,调出配置界面,如下:

拖出vAsterNOS并右键单击

输入用户名和密码admin/asteros,开始探索vAsterNOS。

输入用户名和密码

4.8 安装Centos

组网过程中需要用到终端进行数据传输试验,以验证网络配置是否正确,所以需要再GNS3 vm server上安装centos程序,安装过程与vAsterNos类似,只需将centos镜像文件导入即可。需要说明的是,如果使用星融元提供的centos镜像,其默认用户名和密码为:root/ yx979150

5 验证 vAsterNOS 设备运行状态

我们组建了一个简单的网络来验证设备转发数据状态是否正常。网络拓扑如下:

网络拓扑

将一台vAsterNos设备及两台server设备链接,分别配置不同网段的ip地址并配置静态路由,用server-1 ping server-2,能够ping通,说明三台设备运行正常。

点击了解Asterfusion CX-N数据中心交换机

如有其它问题,请填写右侧需求表单联系我们

基于LVM的xfs文件系统动态扩容

1 操作目标

本文档的目标是完成对基于LVM的xfs文件系统的动态扩容。

2 LVM基本术语

  • PV:物理卷,LVM的基本存储逻辑块。
  • VG:卷组,类似于非LVM系统中的物理磁盘,由一个或多个物理卷PV组成,可以在卷组上创建多个LV。
  • LV:逻辑卷:类似于非LVM系统中的磁盘分区,建立在VG上。在逻辑卷LV上可以创建文件系统。
  • PE:物理块:每一个物理卷PV被划分为称为PE的基本单元,具有唯一编号的PE是可以被LVM寻址的最小单元。PE的大小是可配置的,默认为4MB。所以PV由大小等同的基本单元PE组成。
  • LE:逻辑块,逻辑卷LV也被划分为可被寻址的基本单位,称为LE。在同一个卷组中,LE的大小和PE是相同的,并且一一对应。

3 扩容文件系统(不添加PV)

文档中实例是私有云二期物理服务器:10.106.100.11,20G根目录扩容至2T。本次操作适用于要扩容的分区所在VG有剩余空间,不需要额外添加PV。注意:xfs支持动态扩容但不可以缩容,缩容需要格式化分区。

3.1 查看分区类型

首先确认要扩容的分区类型是LVM。

[root@controller ~]# lsblk
命令行展示

3.2 查看VG大小

查看要扩容的分区所在VG大小:3.27T,剩余3.18T。

[root@controller ~]# vgdisplay
命令行展示

3.3 扩容LV

LVroot扩容2T空间。

[root@controller ~]# lvextend -L +2T /dev/VolGroup00/LVroot
Size of logical volume VolGroup00/LVroot changed from 20.00 GiB (640 extents) to <2.02 TiB (66176 extents).
Logical volume VolGroup00/LVroot successfully resized.

3.4 写入文件系统,扩容生效

xfs文件系统使用xfs_growfs命令,如果是ext4文件系统使用resize2fs命令替换xfs_growfs命令。

[root@controller ~]# xfs_growfs /dev/VolGroup00/LVroot
命令行展示
[root@controller ~]# df -Th
命令行展示

4 扩容文件系统(添加PV)

文档中实例是Centos7虚拟机,50G根目录扩容至150G。本次操作适用于要扩容的分区所在VG没有剩余空间,需要额外添加PV。注意:xfs支持动态扩容但不可以缩容,缩容需要格式化分区

4.1 查看分区类型

首先确认要扩容的分区类型是LVM,以及新添加的硬盘sdb。

[root@controller ~]# lsblk
确认要扩容的分区类型是LVM

4.2 查看VG大小

查看要扩容的分区所在VG大小:100G,剩余4M,需要在VG中添加PV来扩容。

[root@controller ~]# vgdisplay
查看要扩容的分区所在VG大小

4.3 新建分区

对sdb硬盘分区。

[root@controller ~]# fdisk /dev/sdb
对sdb硬盘分区

4.4 格式化新分区

把sdb1分区格式化为xfs文件系统。

[root@controller ~]# mkfs.xfs /dev/sdb1
命令行展示

4.5 扩容VG卷组

将格式化后的sdb1扩容到VGcentos中。

[root@controller ~]# vgextend centos /dev/sdb1
将格式化后的sdb1扩容到VGcentos中
[root@controller ~]# vgs
命令行展示

4.6 扩容LV

LVroot扩容100G空间

[root@controller ~]# lvextend -L +100G /dev/centos/root
LVroot扩容100G空间

4.7 写入文件系统,扩容生效

xfs文件系统使用xfs_growfs命令,如果是ext4文件系统使用resize2fs命令替换xfs_growfs命令。

[root@controller ~]# xfs_growfs /dev/centos/root
xfs文件系统使用xfs_growfs命令
[root@controller ~]# df -Th
替换xfs_growfs命令

如有其它问题,请填写右侧需求表单联系我们。www.asterfusion.com

整合 OpenStack 与 Kubernetes 网络

整合 OpenStack 与 Kubernetes 网络

1 目标

本文的目标是通过安装配置Kuryr-Kubernetes组件,实现OpenStack的网络和Kubernetes的网络整合,实现统一管理。
部署过程中所涉及到的设备、接口及管理网口的IP地址如下表所示:

部署过程中所涉及到的设备、接口及管理网口的IP地址如下表所示:

设备名称IP地址备注
K8s-master192.168.4.100Master节点
K8s-node1192.168.4.101Node节点
K8s-node2192.168.4.103Node节点
Openstack-controller192.168.4.154控制节点、网络节点
Openstack-compute1192.168.4.155计算节点
Openstack-compute2192.168.4.156计算节点

表1:设备管理口IP及组件列表

2 硬件与软件环境

部署环境中涉及到的硬件和软件如表2和表3所示:

名称型号硬件指标数量备注
服务器CPU:至少2核
内存:最低2
磁盘:不少于20G
6

表2:硬件环境

软件版本备注
操作系统Centos7.6安装时选择Compute Node 模式
OpenStackstein
Kubernetes1.18.0
DockerDocker-ce19.03
Etcd3.3.11

表3:软件环境

在整合之前,需要提前安装好OpenStack和Kubernetes。

3 Kuryr-Kubernetes简介

Kuryr-Kubernetes是一个用Python编写的OpenStack项目,它作为一个容器网络接口(CNI)插件,通过使用OpenStack Neutron和Octavia为Kubernetes pods提供网络。这个项目经过了实验阶段,成为OpenStack Queens版本(第17版)中完全支持的OpenStack生态系统项目。

Kuryr-Kubernetes的主要优点之一是不需要在OpenStack和Kubernetes中使用多个软件定义网络(SDN)进行网络管理。它还解决了在OpenStack云中运行Kubernetes集群时使用网络数据包双重封装的问题。使用Calico进行Kubernetes网络,使用Neutron进行Kubernetes集群的虚拟机(VM)网络。使用Kuryr-Kubernetes,只需使用一个sdn-Neutron,就可以为运行这些pod和vm提供连接。

还可以在裸机节点上运行Kuryr-Kubernetes作为普通的OpenStack服务。这样,可以在Kubernetes pod和OpenStack VM之间提供互连,即使这些集群是分开的,只需将Neutron-agent和Kuryr-Kubernetes放在Kubernetes节点上即可。

Kuryr-Kubernetes由三部分组成:

  • kuryr-controller观察Kubernetes资源,决定如何将它们转换为OpenStack资源,并创建这些资源。有关OpenStack资源的信息将保存到相应Kubernetes资源的注释中。
  • kuryr-cni是由CNI运行的可执行文件,它将调用传递给kuryr-daemon。
  • kuryr-daemon应该在每个Kubernetes节点上运行。它监视在主机上创建的pod,当CNI请求进入时,根据pod注释中包含的Neutron端口连接pod。

Kuryr-Kubernetes 支持两种典型场景:

  • 第一种:单独的 Kubernetes 集群 和 OpenStack环境,Kubernetes node 与 nova compute node 二层互通,在每个 Kubernetes node 上需要安装 neutron agent,实现 pod 与 vm 通信 。
Kubernetes 和 OpenStack独立部署网络集成
图1:Kubernetes 和 OpenStack独立部署网络集成
  • 第二种:Kubernetes 部署在vm中。即 OpenStack环境中创建 vm,在 vm 中安装 Kubernetes 集群,vm 中的 pod 与其他vm通信。典型的应用就是在 magnum 实现租户的 pod 能够访问自己vm。需要在 Kubernetes vm中安装Kuryr-controller 和Kuryr-cni,利用 neutron 的 trunk port 功能实现 vm中的 pod 跟 OpenStack环境中其他 vm 通信。
运行在OpenStack之上的Kubernetes与OpenStack网络集成
图2:运行在OpenStack之上的Kubernetes与OpenStack网络集成

本文主要实现第一种集成。

4 安装步骤

4.1 K8s各节点安装Neutron agent组件

  • 安装Neutron服务,并编辑配置文件。
[root@localhost  ~]# yum -y install openstack-neutron-openvswitch ebtables ipset -y
[root@localhost  ~]# vi /etc/neutron/neutron.conf
[DEFAULT]
state_path = /var/lib/neutron
auth_strategy = keystone
transport_url = rabbit://openstack:tera123@192.168.4.154
[keystone_authtoken]
www_authenticate_uri = http://192.168.4.154:5000
auth_url = http://192.168.4.154:5000
memcached_servers = 192.168.4.154:11211
auth_type = password
project_domain_name = default
user_domain_name = default
project_name = service
username = neutron
password = tera123
[oslo_concurrency]
lock_path = $state_path/lock

[root@localhost  ~]# vi /etc/neutron/plugins/ml2/openvswitch_agent.ini
[ovs]
local_ip  =  192.168.4.100
[agent]
tunnel_types  =  vxlan
l2_population  =  True
prevent_arp_spoofing = True
[securitygroup]
enable_security_group = True
firewall_driver = neutron.agent.linux.iptables_firewall.OVSHybridIptablesFirewallDriver

[root@localhost  ~]# vi /etc/nova/nova.conf
[neutron]
url=http://192.168.4.154:9696
auth_type=password
auth_url=http://192.168.4.154:5000
project_name=service
project_domain_name=default
username=neutron
user_domain_name = default
password=tera123
region_name=RegionOne
  • 启动Neutron服务
[root@localshot  ~]# systemctl start neutron-openvswitch-agent
[root@localshot  ~]# systemctl enable neutron-openvswitch-agent
  • 验证Neutron网络服务(OpenStack控制节点)

验证Neutron agent启动状态

验证Neutron agent启动状态

4.2 准备OpenStack中K8S所需项⽬、⽤户及⽹络信息

创建K8S所需资源可以在dashboard中进行,也可以直接通过命令行操作

  • 创建K8S专⽤的项⽬,⽤户信息:
#openstack project create k8s
#openstack user create --password tera123 k8s-user
#openstack role add --project k8s  --user k8s-user admin
  • 在K8S项⽬下创建pod ⽹络⼦⽹及service ⽹络⼦⽹:
#openstack network create pod_network
#openstack network create service_network
#openstack subnet create --ip-version 4 --subnet-range 10.1.0.0/16  --network pod_network pod_subnet
#openstack subnet create --ip-version 4 --subnet-range 10.2.0.0/16 --network service_network service_subnet

pod-subnet和service-subnet的ip网段要分别跟k8s创建的时候初始化的pod-network-cidr和service-cidr一致

  • 在K8S项⽬路由器连接pod⽹络⼦⽹与service⽹络⼦⽹:
#openstack router create k8s-router
#openstack router add subnet k8s-router pod_subnet
#openstack router add subnet k8s-router service_subnet
  • 在K8S项⽬创建pod安全组:
#openstack security group create service_pod_access_sg
#openstack security group rule create --remote-ip 10.1.0.0/16 --ethertype IPv4 --protocol tcp service_pod_access_sg
#openstack security group rule create --remote-ip 10.2.0.0/16 --ethertype IPv4 --protocol tcp service_pod_access_sg

注意,这里的创建的project id,user name,password,pod subnet id,service subnet id,security group id均需要记录,用于后期配置kuryr controller。

4.3 kubeadm安装Kubernetes

以下操作在master节点和work 节点均执行。

  • 关闭虚拟内存
#swapoff -a
#sed -i  ‘s/.*swap.*/#&/’ /etc/fstab
  • 配置转发参数
# cat <<EOF > /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
vm.swappiness=0
net.ipv4.ip_forward = 1
EOF
# sysctl --system
  • 配置kubernetes阿里源
#cat <<EOF>/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
  • 设置docker源
# wget https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo -P /etc/yum.repos.d/
  • 安装docker
#yum install docker-ce-19.03.12  -y
  • 启动docker
# systemctl daemon-reload
# systemctl enable docker
# systemctl start docker
  • 安装kubernetes相关组件
# yum install kubelet-1.18.0  kubeadm-1.18.0  kubectl-1.18.0  kubernetes-cni-0.8.6  -y
#systemctl enable kubelet && systemctl start kubelet
  • 开启IPVS

加载ipvs内核,使node节点kube-proxy支持ipvs代理规则。

# modprobe ip_vs
modprobe ip_vs_rr 
  modprobe ip_vs_wrr
  modprobe ip_vs_sh

 cat <<EOF >> /etc/rc.local
modprobe ip_vs
  modprobe ip_vs_rr
  modprobe ip_vs_wrr
  modprobe ip_vs_sh
 EOF

以下在Master节点操作

#kubeadm init --apiserver-advertise-address=192.168.4.100 --image-repository registry.aliyuncs.com/google_containers --kubernetes-version v1.18.0 --service-cidr=10.2.0.0/16  --pod-network-cidr=10.1.0.0/16

装完后输出内容如下:

输出内容

然后根据提示执行如下操作,并相关work节点加入。

# mkdir -p $HOME/.kube
# cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
# chown $(id -u):$(id -g) $HOME/.kube/config

以下在Work节点操作

使用在master节点安装成功后保存的hubedem join命令,添加node节点。

# kubeadm join 192.168.4.100:6443 --token x8cl7c.ev3xby1nad04aysi \
    --discovery-token-ca-cert-hash sha256:d9c6234623e26f87d308d07433f0d6d82f62c783037dd74f522f6f3a0b3a88bc
  • 安装flannel

下载kube-flannel.yml

内容如下

#wget https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml

修改几处地方:

“Network”: “10.244.0.0/16″, 改为”Network”: “10.1.0.0/16”,

在所有containers下面的args:添加- –iface=ens192 ,即出口网卡

然后执行

#kubectl apply -f kube-flannel.yml
  • 安装dashboard

下载recommended.yaml

#wget https://raw.githubusercontent.com/kubernetes/dashboard/v2.0.3/aio/deploy/recommended.yaml

修改

kind: Service
apiVersion: v1
metadata:
  labels:
    k8s-app: kubernetes-dashboard
  name: kubernetes-dashboard
  namespace: kubernetes-dashboard
spec:
  type: NodePort
  ports:
    - port: 443
      targetPort: 8443
      nodePort: 30001
  selector:
    k8s-app: kubernetes-dashboard

spec添加type:NodePort

Ports添加nodePort: 30001

然后执行

#kubectl apply -f recommended.yaml
  • 设置代理

为了方便让 Kuryr Controller 简单取得 K8s API Server

kubectl proxy --port=8080 --accept-hosts='.*' --address='0.0.0.0'

4.4 安装配置kur

  • 安装kuryr-k8s-controller(k8s的master节点)

安装

#mkdir kuryr-k8s-controller
# cd kuryr-k8s-controller
# virtualenv env
# git clone https://git.openstack.org/openstack/kuryr-kubernetes -b stable/rocky
# . env/bin/activate
# pip install -e kuryr-kubernetes

如果始终无法编译通过,可以跳过. env/bin/activate,直接执行pip install -e kuryr-kubernetes

配置

#cd kuryr-kubernetes
# ./tools/generate_config_file_samples.sh
# mkdir /etc/kuryr
# cp etc/kuryr.conf.sample /etc/kuryr/kuryr.conf

这里需要修改配置文件kuryr.conf。具体配置项需根据上文中在openstack内创建的用于K8S环境的信息填写。

[DEFAULT]
use_stderr = true
bindir = /usr/libexec/kuryr
[kubernetes]
api_root = http://192.168.4.100:8080
[neutron]
# 需根据上文章节中创建的项目、用户信息填写
auth_url = http://192.168.4.154:5000/v3
username = k8s-user
user_domain_name = Default
password = tera123
project_name = k8s
project_domain_name = Default
auth_type = password

[neutron_defaults]
ovs_bridge = br-int
# 下面的网络资源ID需根据上文章节中创建的资源ID填写
pod_security_groups = 2d572ef8-2e90-4a5b-a515-9e32fe07a7c4
pod_subnet = f3c34801-6da3-43b9-a2bf-947c7da4ed89
project = 02461bcb1d5f490ca4fdb99b7a32914e
service_subnet = b15f4105-3f12-4976-a83a-d2174a42622a

运行

#kuryr-k8s-controller --config-file /etc/kuryr/kuryr.conf -d
  • 安装kuryr-cni

安装

需提前安装gcc pip python-devel

# mkdir kuryr-k8s-cni
#cd kuryr-k8s-cni
#virtualenv env
#. env/bin/activate
#git clone https://git.openstack.org/openstack/kuryr-kubernetes -b stable/rocky
#pip install -e kuryr-kubernetes

如果始终无法编译通过,可以跳过. env/bin/activate,直接执行pip install -e kuryr-kubernetes

配置

#cd kuryr-kubernetes
#./tools/generate_config_file_samples.sh
#mkdir /etc/kuryr
#cp etc/kuryr.conf.sample /etc/kuryr/kuryr.conf

此处需要修改配置文件kuryr.conf。

[DEFAULT]
use_stderr = true
bindir = /usr/libexec/kuryr
lock_path=/var/lib/kuryr/tmp

 [kubernetes]
# 填k8s master的IP
api_root = http://192.168.4.100:8080
  • 修改cni配置

执行下述命令。

#mkdir -p /opt/cni/bin
#ln -s $(which kuryr-cni) /opt/cni/bin/

由于前文安装k8s时已经安装过flannel,这里/opt/cni/bin目录已经存在。新增/etc/cni/net.d/10-kuryr.conf文件,按如下信息。

修改配置文件,同时删除同目录下flannel的配置文件。

{
 “cniVersion”: “0.3.1”,
 “name”: “kuryr”,
 “type”: “kuryr-cni”,
 “kuryr_conf”: “/etc/kuryr/kuryr.conf”,
 “debug”: true
 }

运行

# kuryr-daemon --config-file /etc/kuryr/kuryr.conf -d

5 结果验证

在OpenStack创建一个VM,挂载到pod_network下面,在k8s运行一个测试示例,创建一个Nginx,看是否可以相互ping通:

  • 创建nginx.yaml
[root@k8s-master~]#vi nginx.yaml 
# API 版本号
apiVersion: apps/v1
# 类型,如:Pod/ReplicationController/Deployment/Service/Ingress
kind: Deployment
metadata:
  # Kind 的名称
  name: nginx-app
spec:
  selector:
    matchLabels:
      # 容器标签的名字,发布 Service 时,selector 需要和这里对应
      app: nginx
  # 部署的实例数量
  replicas: 2
  template:
    metadata:
      labels:
        app: nginx
    spec:
      # 配置容器,数组类型,说明可以配置多个容器
      containers:
      # 容器名称
      - name: nginx
        # 容器镜像
        image: nginx:1.17
        # 只有镜像不存在时,才会进行镜像拉取
        imagePullPolicy: IfNotPresent
        ports:
        # Pod 端口
        - containerPort: 80
  • 创建pods:
[root@k8s-master~]#kubectl  apply -f nginx.yaml
  • 查看pod详细信息:
pod详细信息
  • 查看VM详细信息:
VM详细信息
  • 在VM上ping pod

6 参考资料

如有其它问题,请填写右侧需求表单联系我们。www.asterfusion.com

如何使用Nginx部署YUM源服务器

什么是YUM?

YUM是Yellow dog Updater, Modified的简写,它是由杜克大学团队修改Yellow Dog Linux的Yellow Dog Updater开发而成。

YUM源本质上是一个包含软件包的仓库, 其中包括了软件包的元数据信息,如软件包的版本、依赖关系等等。 管理员可以通过配置服务器上的YUM源来轻松管理服务器上的软件包,并且从中选择需要安装的软件包。本篇文章将提供一个使用Nginx配置自定义YUM源的操作实例。

虽然 YUM 最初是为 Linux 创建的,但它已被移植到许多其他操作系统上。

使用Nginx部署YUM源服务器流程

1 YUM源服务器使用场景

  • 服务器处于无网环境
  • 缓解公司网络带宽压力
  • 加快服务器软件安装部署

2 YUM源服务器必备条件

  • YUM源服务器能够自动定期的更新YUM源
  • 使用CentOS官方标准源保持更新
  • Linux客户端可以直接使用YUM源

3 YUM源服务器配置

主机系统IP地址软件
yum repoCentos7.4192.168.4.188Nginx+createrepo

服务器具体配置要求如下:

  • 至少2G内存
  • 至少2核CPU
  • 至少100G硬盘

4 环境准备

4.1 关闭SELinux

SELinux不关闭的情况下无法实现,会限制客户机和YUM源服务器的通信。

[root@yum~]# setenforce 0
[root@yum ~]# sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/sysconfig/selinux

4.2 关闭防火墙

防止安装时出现各个组件的端口不能访问的问题。

[root@yum ~]# systemctl stop firewalld && systemctl disable firewalld                          

5 部署YUM源服务器

部署YUM源的必要服务,并且修改相关服务的配置文件。

5.1 部署Nginx服务

我们使用Nginx配置YUM源服务器。

[root@yum ~]# yum -y install nginx
[root@yum ~]# vi /etc/nginx/nginx.conf
user nginx;
worker_processes auto;
error_log /var/log/nginx/error.log;
pid /run/nginx.pid;
include /usr/share/nginx/modules/*.conf;
events {
    worker_connections 1024;
}
http {
    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';
    access_log  /var/log/nginx/access.log  main;
    sendfile            on;
    tcp_nopush          on;
    tcp_nodelay         on;
    keepalive_timeout   65;
    types_hash_max_size 2048;
    include             /etc/nginx/mime.types;
    default_type        application/octet-stream;
    # Load modular configuration files from the /etc/nginx/conf.d directory.
    # See http://nginx.org/en/docs/ngx_core_module.html#include
    # for more information.
    include /etc/nginx/conf.d/*.conf;
    server {
        listen       80 default_server;
        listen       [::]:80 default_server;
        server_name  _;
        root         /usr/share/nginx/html;
        # Load configuration files for the default server block.
        include /etc/nginx/default.d/*.conf;
        location / {
        }
	    autoindex on;
	autoindex_exact_size on;
 	    autoindex_localtime on;
        error_page 404 /404.html;
        location = /404.html {
        }
        error_page 500 502 503 504 /50x.html;
        location = /50x.html {
        }
    }
} 
[root@yum ~]# systemctl start nginx
[root@yum ~]# systemctl enable nginx

5.2 在Nginx建立目录

创建yum源目录。

[root@yum ~]# cd /usr/share/nginx/html
[root@yum html]# mkdir -p centos/asterfusion/7/7.4/x86_64
[root@yum html]# tree
├── html
│   ├── 404.html
│   ├── 50x.html
│   ├── centos
│   │   └── asterfusion
│   │       └── 7
│   │           ├── 7.4
│   │               ├── x86
│   │               └── x86_64

5.3 修改Nginx HTML

自定义yum源页面。本篇使用的是星融元Asterfusion自定义YUM源。

[root@yum ~]# cat /usr/share/nginx/html/index.html
        <h1>Welcome to <strong>Asterfusion</strong> on Internet!</h1>
    <div class="content">
    <a href="http://192.168.4.188/centos/asterfusion">Asterfusion Yum Repo</a><br/>
    <br/>
   </div
[root@yum ~]# systemctl restart nginx

5.4 验证yum源

使用服务器IP访问浏览器。

5.5 同步官方yum源

同步官方CentOS7源到本地,如果出现同步后没有对应的文件和目录的情况,检查本地的repo文件是否有错误。

[root@yum x86_64]# pwd
/usr/share/nginx/html/centos/asterfusion/7/7.4/x86_64
[root@yum x86_64]# yum -y install yum-utils createrepo
[root@yum x86_64]# reposync --repoid base  -p ./
[root@yum x86_64]# reposync --repoid epel  -p ./
[root@yum x86_64]# reposync --repoid extras  -p ./
[root@yum x86_64]# reposync --repoid updates  -p ./
[root@yum x86_64]# createrepo -p /usr/share/nginx/html/centos/asterfusion/7/7.4/x86_64/base
[root@yum x86_64]# createrepo -p /usr/share/nginx/html/centos/asterfusion/7/7.4/x86_64/epel
[root@yum x86_64]# createrepo -p /usr/share/nginx/html/centos/asterfusion/7/7.4/x86_64/extras
[root@yum x86_64]# createrepo -p \
/usr/share/nginx/html/centos/asterfusion/7/7.4/x86_64/updates

5.6 创建yum repo

部署优先级控制工具,可以控制客户端优先使用优先级较高的yum源,创建yum源repo文件。\

[root@yum x86_64]# yum install yum-plugin-priorities -y 
[root@yum x86_64]# cd /etc/yum.repos.d/
[root@yum yum.repos.d]# mkdir bak
[root@yum yum.repos.d]# mv ./* bak
[root@yum yum.repos.d]# vi Asterfusion.repo
[Asterfusion-base]
name=asterfusion-base
baseurl=http://192.168.4.188/centos/asterfusion/7/7.4/x86_64/base
gpgcheck=0
enable=1
priority=1
[Asterfusion-epel]
name=asterfusion-epel
baseurl=http://192.168.4.188/centos/asterfusion/7/7.4/x86_64/epel
gpgcheck=0
enable=1
priority=1
[Asterfusion-extras]
name=asterfusion-extras
baseurl=http://192.168.4.188/centos/asterfusion/7/7.4/x86_64/extras
gpgcheck=0
enable=1
priority=1
[Asterfusion-updates]
name=asterfusion-updates
baseurl=http://192.168.4.188/centos/asterfusion/7/7.4/x86_64/updates
gpgcheck=0
enable=1
priority=1

部署优先级控制工具,可以控制客户端优先使用优先级较高的yum源,创建yum源repo文件。

[root@yum x86_64]# yum install yum-plugin-priorities -y 
[root@yum x86_64]# cd /etc/yum.repos.d/
[root@yum yum.repos.d]# mkdir bak
[root@yum yum.repos.d]# mv ./* bak
[root@yum yum.repos.d]# vi Asterfusion.repo
[Asterfusion-base]
name=asterfusion-base
baseurl=http://192.168.4.188/centos/asterfusion/7/7.4/x86_64/base
gpgcheck=0
enable=1
priority=1
[Asterfusion-epel]
name=asterfusion-epel
baseurl=http://192.168.4.188/centos/asterfusion/7/7.4/x86_64/epel
gpgcheck=0
enable=1
priority=1
[Asterfusion-extras]
name=asterfusion-extras
baseurl=http://192.168.4.188/centos/asterfusion/7/7.4/x86_64/extras
gpgcheck=0
enable=1
priority=1
[Asterfusion-updates]
name=asterfusion-updates
baseurl=http://192.168.4.188/centos/asterfusion/7/7.4/x86_64/updates
gpgcheck=0
enable=1
priority=1

5.7 重新建立缓存

清除本地缓存和重新建立缓存,检查yum源中的软件包。

[root@yum ~]# yum clean all
[root@yum ~]# yum makecache
[root@yum ~]# yum repolist

使用Nginx部署YUM源服务器-截图1

5.8 测试安装速度

使用本地源安装mariadb数据库,安装速度大大加快。

[root@yum ~]# yum install -y mariadb-server
使用Nginx部署YUM源服务器-截图2

5.9 配置yum源自动更新

在计划任务中加入yum源更新脚本,每周六18:30自动更新CentOS7.4 yum源。

[root@yum home]# vi updateyumrepo.sh
#!/bin/bash
reposync -n --repoid=extras --repoid=updates --repoid=base --repoid=epel -p \
/usr/share/nginx/html/centos/asterfusion/7/7.4/x86_64/
[root@yum home]# crontab -e
30 18 * * 6 /bin/bash /home/updateyurepo.sh
[root@yum home]# crontab -l
30 18 * * 6 /bin/bash /home/updateyurepo.sh

更多相关内容,请访问:A-Lab


星融元(Asterfusion)是领先的开放网络解决方案提供商,产品包括网络操作系统、数据中心交换机、智算交换机、园区交换机、NPB、DPU网卡和P4可编程硬件平台等。为行业企业、数据中心和云运营商提供基于通用解耦硬件和SONiC软件框架的全场景交钥匙网络解决方案,帮助用户构建AI时代中立、透明,易于运维、高性价比的基础网络自由选择。 www.asterfusion.com

Kubernetes部署方案

1 目标

K8S集群部署有几种方式:kubeadm、minikube和二进制包。前两者属于自动部署,简化部署操作。但自动部署屏蔽了很多细节,使得对各个模块感知很少,本文主要采用二进制包手动部署。

部署过程中所涉及到的设备、接口及管理网口的IP地址如下表所示:

设备名称IP地址组件
master192.168.4.154etcd
kube-apiserver
kube-controller-manager
kube-scheduler
node1192.168.4.155etcd
kubelet
kube-proxy
docker
node2192.168.4.156etcd
kubelet
kube-proxy
docker

表1:设备管理口IP及组件列表

2 硬件与软件环境

部署环境中涉及到的硬件和软件如表2和表3所示:

名称型号硬件指标数量备注
服务器CPU:至少2核
内存:最低2
磁盘:不少于20G
3

表2:硬件环境

软件版本备注
操作系统Centos7.6安装时选择Compute Node 模式
Kubernetes1.18.0
DockerDocker-ce19.03
Etcd3.3.11

表3:软件环境

3 Kubernetes简介

Kubernetes 是是一个基于容器技术的分布式架构领先方案。Kubernetes(k8s)是Google开源的容器集群管理系统,Kubernetes简称K8S,K8S用于容器化应用程序的部署,扩展和管理。K8S提供了容器编排,资源调度,弹性伸缩,部署管理,服务发现等一系列功能。

  • Kubernetes集群架构
图1: Kubernetes集群架构图
  • Kubernetes核心概念

cluster

cluster是 计算、存储和网络资源的集合,k8s利用这些资源运行各种基于容器的应用。

master

master是cluster的大脑,他的主要职责是调度,即决定将应用放在那里运行。master运行linux操作系统,可以是物理机或者虚拟机。为了实现高可用,可以运行多个master。

node

node的职责是运行容器应用。node由master管理,node负责监控并汇报容器的状态,同时根据master的要求管理容器的生命周期。node运行在linux的操作系统上,可以是物理机或者是虚拟机。

pod

pod是k8s的最小工作单元。每个pod包含一个或者多个容器。pod中的容器会作为一个整体被master调度到一个node上运行。

controller-manager

k8s通常不会直接创建pod,而是通过controller-manager来管理pod的。controller-manager中定义了pod的部署特性,比如有几个副本,在什么样的node上运行等。为了满足不同的业务场景,k8s提供了多种controller-manager,包括deployment、replicaset、daemonset、statefulset、job等。

1) deployment
是最常用的controller。deployment可以管理pod的多个副本,并确保pod按照期望的状态运行。

2) replicaset
实现了pod的多副本管理。使用deployment时会自动创建replicaset,也就是说deployment是通过replicaset来管理pod的多个副本的,我们通常不需要直接使用replicaset。

3) daemonset
用于每个node最多只运行一个pod副本的场景。正如其名称所示的,daemonset通常用于运行daemon。

4) statefuleset
能够保证pod的每个副本在整个生命周期中名称是不变的,而其他controller不提供这个功能。当某个pod发生故障需要删除并重新启动时,pod的名称会发生变化,同时statefulset会保证副本按照固定的顺序启动、更新或者删除。、

5) job
用于运行结束就删除的应用,而其他controller中的pod通常是长期持续运行的。

service

deployment可以部署多个副本,每个pod 都有自己的IP,外界通过service访问这些副本。

k8s的 service定义了外界访问一组特定pod的方式。service有自己的IP和端口,service为pod提供了负载均衡。
k8s运行容器pod与访问容器这两项任务分别由controller和service执行。

namespace

可以将一个物理的cluster逻辑上划分成多个虚拟cluster,每个cluster就是一个namespace。不同的namespace里的资源是完全隔离的。

lable

标签用于区分对象(比如pod、service),键/值对存在;每个对象可以有多个标签,通过标签关联对象。

  • K8s的Master组件

kube-apiserver

Kubernetes API,集群的统一入口,各组件协调者,以RESTful API提供接口服务,所有对象资源的增删改查和监听操作都交给APIServer处理后再提交给Etcd存储。

kube-controller-manager

处理集群中常规后台任务,一个资源对应一个控制器 ,而ControllerManager就是负责管理这些控制器的

kube-scheduler

根据调度算法为新创建的Pod选择一个Node节点,可以任意部署,可以部署在同一个节点上,也可以部署在不同的节点上。

Etcd

分布式键值存储系统。用于保存集群状态数据,比如Pod、Service等对象信息。

  • K8s的Node组件

Kubelet

kubelet是Master在Node节点上的Agent,管理本机运行容器的生命周期,比如创建容器、Pod挂载数据卷、下载secret. 获取容器和节点状态等工作。kubelet将每个Pod转换成一组容器。

kube-proxy

在Node节点上实现Pod网络代理,维护网络规则和四层负载均衡工作。

docker或rocket

容器引擎,运行容器。

4 安装步骤

4.1 准备环境

注意:以下步骤各节点统一执行

  • 关闭交换分区:
[root@localhost ~]#swapoff -a && sysctl -w vm.swappiness=0
  • 注释掉开机启动交换分区:
[root@localhost ~]sed -i 's/.*swap.*/#&/g' /etc/fstab
  • 关闭防火墙:
[root@localhost ~]systemctl stop firewalld 
[root@localhost ~] systemctl disable firewalld
  • 禁用Selinux:
[root@localhost ~]# setenforce 0
[root@localhost ~]# sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/sysconfig/selinux
  • 设置透明网桥:
[root@localhost ~]#cat > /etc/sysctl.d/k8s.conf << EOF
net.ipv4.ip_forward = 1
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
EOF
modprobe br_netfilter
sysctl -p /etc/sysctl.d/k8s.conf
  • 安装Docker:
[root@localhost ~]# yum -y install yum-utils 
[root@localhost ~]# yum-config-manager --add-repo \
https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo 
[root@localhost ~]#yum install docker-ce
[root@localhost ~]#curl -sSL https://get.daocloud.io/daotools/set_mirror.sh | sh -s http://bc437cce.m.daocloud.io
[root@localhost ~]# systemctl enable docker
[root@localhost ~]#systemctl start docker
  • 同步时间:
[root@localshot  ~]# yum -y install ntp
[root@localhost  ~]# vi /etc/ntp.conf
修改server ntp1.aliyun.com iburst 
[root@localhost  ~]# systemctl restart ntpd
[root@localhost  ~]# timedatectl set-timezone Asia/Shanghai
[root@localhost  ~]#cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
  • 修改系统打开文件最大数量:
[root@localhost  ~]# vi /etc/security/limits.conf
* soft nofile 65535
* hard nofile 65535

4.2 部署Etcd集群

  • 下载cfssl工具并生成证书:

下载cfssl工具

[root@k8s-master ~]#wget https://pkg.cfssl.org/R1.2/cfssl_linux-amd64
[root@k8s-master ~]#wget https://pkg.cfssl.org/R1.2/cfssljson_linux-amd64
[root@k8s-master ~]#wget https://pkg.cfssl.org/R1.2/cfssl-certinfo_linux-amd64
[root@k8s-master ~]#chmod +x cfssl_linux-amd64 cfssljson_linux-amd64 cfssl-certinfo_linux-amd64
[root@k8s-master ~]#mv cfssl_linux-amd64 /usr/local/bin/cfssl
[root@k8s-master ~]#mv cfssljson_linux-amd64 /usr/local/bin/cfssljson
[root@k8s-master ~]#mv cfssl-certinfo_linux-amd64 /usr/bin/cfssl-certinfo

创建以下三个文件:

[root@k8s-master ~]#vim ca-config.json
{
  "signing": {
    "default": {
      "expiry": "87600h"
    },
    "profiles": {
      "www": {
         "expiry": "87600h",
         "usages": [
            "signing",
            "key encipherment",
            "server auth",
            "client auth"
        ]
      }
    }
  }
}
[root@k8s-master ~]#vim ca-csr.json
{
    "CN": "etcd CA",
    "key": {
        "algo": "rsa",
        "size": 2048
    },
    "names": [
        {
            "C": "CN",
            "L": "Beijing",
            "ST": "Beijing"
        }
    ]
} 
[root@k8s-master ~]#vim server-csr.json
{
    "CN": "etcd",
    "hosts": [
    "192.168.4.154",
"192.168.4.155",
"192.168.4.156"
],
    "key": {
        "algo": "rsa",
        "size": 2048
    },
    "names": [
        {
            "C": "CN",
            "L": "BeiJing",
            "ST": "BeiJing"
        }
    ]
} 

生成证书

[root@k8s-master ~]# cfssl gencert -initca ca-csr.json | cfssljson -bare ca -
[root@k8s-master ~]# cfssl gencert -ca=ca.pem -ca-key=ca-key.pem -config=ca-config.json -profile=www server-csr.json | cfssljson -bare server
[root@k8s-master ~]# ls *pem
ca-key.pem  ca.pem  server-key.pem  server.pem
  • 安装Etcd3:

创建文件夹

[root@k8s-master ~]# mkdir /opt/etcd/{bin,cfg,ssl} -p

下载etcd相关包

[root@k8s-master ~]#wget https://github.com/etcd-io/etcd/releases/download/v3.2.12/etcd-v3.2.12-linux-amd64.tar.gz 
[root@k8s-master ~]#tar zxvf etcd-v3.2.12-linux-amd64.tar.gz 
[root@k8s-master ~]#mv etcd-v3.2.12-linux-amd64/{etcd,etcdctl} /opt/etcd/bin/

创建etcd配置⽂件

[root@k8s-master ~]#vim /opt/etcd/cfg/etcd
#[Member]
ETCD_NAME="etcd01"
ETCD_DATA_DIR="/var/lib/etcd/default.etcd"
ETCD_LISTEN_PEER_URLS="https://192.168.4.154:2380"
ETCD_LISTEN_CLIENT_URLS="https://192.168.4.154:2379"
#[Clustering]
ETCD_INITIAL_ADVERTISE_PEER_URLS="https://192.168.4.154:2380"
ETCD_ADVERTISE_CLIENT_URLS="https://192.168.4.154:2379"
ETCD_INITIAL_CLUSTER="etcd01=https://192.168.4.154:2380,etcd02=https://192.168.4.155:2380,etcd03=https://192.168.4.156:2380"
ETCD_INITIAL_CLUSTER_TOKEN="etcd-cluster"
ETCD_INITIAL_CLUSTER_STATE="new"
  • ETCD_NAME 节点名称
  • ETCD_DATA_DIR 数据⽬录
  • ETCD_LISTEN_PEER_URLS 集群通信监听地址
  • ETCD_LISTEN_CLIENT_URLS 客户端访问监听地址
  • ETCD_INITIAL_ADVERTISE_PEER_URLS 集群通告地址
  • ETCD_ADVERTISE_CLIENT_URLS 客户端通告地址
  • ETCD_INITIAL_CLUSTER 集群节点地址
  • ETCD_INITIAL_CLUSTER_TOKEN 集群Token
  • ETCD_INITIAL_CLUSTER_STATE 加⼊集群的当前状态,new是新集群,existing表⽰加⼊已有集群

修改etcd开机启动

[root@k8s-master ~]# vim  /usr/lib/systemd/system/etcd.service 
[Unit]
Description=Etcd Server
After=network.target
After=network-online.target
Wants=network-online.target

[Service]
Type=notify
EnvironmentFile=/opt/etcd/cfg/etcd
ExecStart=/opt/etcd/bin/etcd \
--name=${ETCD_NAME} \
--data-dir=${ETCD_DATA_DIR} \
--listen-peer-urls=${ETCD_LISTEN_PEER_URLS} \
--listen-client-urls=${ETCD_LISTEN_CLIENT_URLS},http://127.0.0.1:2379 \
--advertise-client-urls=${ETCD_ADVERTISE_CLIENT_URLS} \
--initial-advertise-peer-urls=${ETCD_INITIAL_ADVERTISE_PEER_URLS} \
--initial-cluster=${ETCD_INITIAL_CLUSTER} \
--initial-cluster-token=${ETCD_INITIAL_CLUSTER_TOKEN} \
--initial-cluster-state=new \
--cert-file=/opt/etcd/ssl/server.pem \
--key-file=/opt/etcd/ssl/server-key.pem \
--peer-cert-file=/opt/etcd/ssl/server.pem \
--peer-key-file=/opt/etcd/ssl/server-key.pem \
--trusted-ca-file=/opt/etcd/ssl/ca.pem \
--peer-trusted-ca-file=/opt/etcd/ssl/ca.pem
Restart=on-failure
LimitNOFILE=65536

[Install]
WantedBy=multi-user.target

把刚才生成的证书拷贝到配置文件中的位置:

[root@k8s-master ~]# cp ca*pem server*pem /opt/etcd/ssl

启动etcd并设置开机启动:

[root@k8s-master ~]# systemctl enable etcd
[root@k8s-master ~]# systemctl start etcd

注:三台机器的etcd要同时启动,否则会失败。

检查etcd集群状态:

[root@k8s-master ~]# /opt/etcd/bin/etcdctl \
--ca-file=/opt/etcd/ssl/ca.pem --cert-file=/opt/etcd/ssl/server.pem  \
--key-file=/opt/etcd/ssl/server-key.pem  \
--endpoints="https://192.168.4.154:2379,https://192.168.4.155:2379,https://192.168.4.156:2379"  \
cluster-health

4.3 安装运行Master节点组件

  • 下载组件:
[root@ k8s-master ~]#wget https://dl.k8s.io/v1.18.8/kubernetes-server-linux-amd64.tar.gz
  • 解压组件包:
[root@k8s-master ~]# tar zxvf kubernetes-server-linux-amd64.tar.gz
[root@k8s-master ~]#mkdir /opt/kubernetes/{bin,cfg,ssl,logs}  -p
[root@k8s-master ~]#cp kubernetes/server/bin/{kube-apiserver,kube-scheduler,kube-controller-manager,kubectl,kubelet}  /opt/kubernetes/bin
  • 生成证书

创建CA证书:

[root@k8s-master ~]# vim  ca-config.json                 
{
  "signing": {
    "default": {
      "expiry": "87600h"
    },
    "profiles": {
      "kubernetes": {
         "expiry": "87600h",
         "usages": [
            "signing",
            "key encipherment",
            "server auth",
            "client auth"
        ]
      }
    }
  }
}

[root@k8s-master ~]#vim ca-csr.json 
{
    "CN": "kubernetes",
    "key": {
        "algo": "rsa",
        "size": 2048
    },
    "names": [
        {
            "C": "CN",
            "L": "Beijing",
            "ST": "Beijing",
            "O": "k8s",
            "OU": "System"
        }
    ]
}
[root@k8s-master ~]#cfssl gencert -initca ca-csr.json | cfssljson -bare ca –

生成apiserver证书:

[root@k8s-master ~]#vim server-csr.json
{
    "CN": "kubernetes",
    "hosts": [
      "10.0.0.1",//这是后面dns要使用的虚拟网络的网关,不用改,就用这个 切忌(删除这行)
      "127.0.0.1",
      "192.168.4.154",
      "192.168.4.155",
      "192.168.4.156",
      "kubernetes",
      "kubernetes.default",
      "kubernetes.default.svc",
      "kubernetes.default.svc.cluster",
      "kubernetes.default.svc.cluster.local"
    ],
    "key": {
        "algo": "rsa",
        "size": 2048
    },
    "names": [
        {
            "C": "CN",
            "L": "BeiJing",
            "ST": "BeiJing",
            "O": "k8s",
            "OU": "System"
        }
    ]
}
[root@k8s-master ~]#cfssl gencert -ca=ca.pem -ca-key=ca-key.pem -config=ca-config.json -profile=kubernetes server-csr.json | cfssljson -bare server

生成kube-proxy证书:

[root@k8s-master ~]#vim  kube-proxy-csr.json 
{
  "CN": "system:kube-proxy",
  "hosts": [],
  "key": {
    "algo": "rsa",
    "size": 2048
  },
  "names": [
    {
      "C": "CN",
      "L": "BeiJing",
      "ST": "BeiJing",
      "O": "k8s",
      "OU": "System"
    }
  ]
}
[root@k8s-master ~]#cfssl gencert -ca=ca.pem -ca-key=ca-key.pem -config=ca-config.json -profile=kubernetes kube-proxy-csr.json | cfssljson -bare kube-proxy

最终生成以下证书文件:

[root@k8s-master ~]## ls *pem
ca-key.pem  ca.pem  kube-proxy-key.pem  kube-proxy.pem  server-key.pem  server.pem

如果有多个master,需要将证书拷贝到所有的 master节点

[root@k8s-master ~]#scp server.pem  server-key.pem ca.pem ca-key.pem k8s-master2:/opt/kubernetes/ssl/

创建token文件

#生成随机token
[root@k8s-master ~]#head -c 16 /dev/urandom | od -An -t x | tr -d ' '
[root@k8s-master ~]#cat << EOF >/opt/kubernetes/cfg/token.csv 
79d370bf4b3e1bda79087504d34b9e5d,kubelet-bootstrap,10001,"system:kubelet-bootstrap"
EOF
第一列:随机字符串,自己可生成,第二列:用户名,第三列:UID,第四列:用户组
  • 配置apiserver

创建配置文件:

[root@k8s-master~]# vim  /opt/kubernetes/cfg/kube-apiserver 
KUBE_APISERVER_OPTS="--logtostderr=true \
--v=4 \
--log-dir=/opt/kubernetes/logs \
--etcd-servers=https://192.168.4.154:2379,https://192.168.4.155:2379,https://192.168.4.156:2379 \
--bind-address=192.168.4.154 \
--secure-port=6443 \
--advertise-address=192.168.4.154 \
--allow-privileged=true \
--service-cluster-ip-range=10.0.0.0/24 \
--enable-admission-plugins=NamespaceLifecycle,LimitRanger,ServiceAccount,ResourceQuota,NodeRestriction \
--authorization-mode=RBAC,Node \
--enable-bootstrap-token-auth \
--token-auth-file=/opt/kubernetes/cfg/token.csv \
--service-node-port-range=30000-50000 \
--tls-cert-file=/opt/kubernetes/ssl/server.pem  \
--tls-private-key-file=/opt/kubernetes/ssl/server-key.pem \
--client-ca-file=/opt/kubernetes/ssl/ca.pem \
--service-account-key-file=/opt/kubernetes/ssl/ca-key.pem \
--etcd-cafile=/opt/etcd/ssl/ca.pem \
--etcd-certfile=/opt/etcd/ssl/server.pem \
--etcd-keyfile=/opt/etcd/ssl/server-key.pem"


配置好前面生成的证书,确保能连接etcd。
参数说明:
* --logtostderr 启用日志
* --v 日志等级
* --etcd-servers etcd集群地址
* --bind-address 监听地址
* --secure-port https安全端口
* --advertise-address 集群通告地址
* --allow-privileged 启用授权
* --service-cluster-ip-range Service虚拟IP地址段
* --enable-admission-plugins 准入控制模块
* --authorization-mode 认证授权,启用RBAC授权和节点自管理
* --enable-bootstrap-token-auth 启用TLS bootstrap功能,后面会讲到
* --token-auth-file token文件
* --service-node-port-range Service Node类型默认分配端口范围

创建systemd服务文件:

[root@k8s-master~]#vim  /usr/lib/systemd/system/kube-apiserver.service 
[Unit]
Description=Kubernetes API Server
Documentation=https://github.com/kubernetes/kubernetes

[Service]
EnvironmentFile=-/opt/kubernetes/cfg/kube-apiserver
ExecStart=/opt/kubernetes/bin/kube-apiserver $KUBE_APISERVER_OPTS
Restart=on-failure

[Install]
WantedBy=multi-user.target

启动服务,并设置开机启动:

[root@k8s-master~]#systemctl daemon-reload
[root@k8s-master~]#systemctl enable kube-apiserver
[root@k8s-master~]#systemctl restart kube-apiserver

注意:apiserver默认支持etcd3,如果是etcd2,需启动时指定版本选项–storage-backend=etcd2

  • 配置scheduler

创建配置文件:

[root@k8s-master~]#cat <<  EOF >/opt/kubernetes/cfg/kube-scheduler 
KUBE_SCHEDULER_OPTS="--logtostderr=true \
--v=4 \
--log-dir=/opt/kubernetes/logs \
--master=127.0.0.1:8080 \
--leader-elect"
EOF

参数说明:
* --master 连接本地apiserver
* --leader-elect 当该组件启动多个时,自动选举(HA)

创建systemd服务文件:

[root@k8s-master~]#vim /usr/lib/systemd/system/kube-scheduler.service 
[Unit]
Description=Kubernetes Scheduler
Documentation=https://github.com/kubernetes/kubernetes

[Service]
EnvironmentFile=-/opt/kubernetes/cfg/kube-scheduler
ExecStart=/opt/kubernetes/bin/kube-scheduler $KUBE_SCHEDULER_OPTS
Restart=on-failure

[Install]
WantedBy=multi-user.target

启动服务,并设置开机启动:

[root@k8s-master~]#systemctl daemon-reload
[root@k8s-master~]#systemctl enable kube-scheduler
[root@k8s-master~]#systemctl restart kube-scheduler
  • 配置controller-manager

创建配置文件:

[root@k8s-master~]# vim  /opt/kubernetes/cfg/kube-controller-manager 
KUBE_CONTROLLER_MANAGER_OPTS="--logtostderr=true \
--v=4 \
--log-dir=/opt/kubernetes/logs \
--master=127.0.0.1:8080 \
--leader-elect=true \
--address=127.0.0.1 \
--service-cluster-ip-range=10.0.0.0/24 \
--cluster-name=kubernetes \
--cluster-signing-cert-file=/opt/kubernetes/ssl/ca.pem \
--cluster-signing-key-file=/opt/kubernetes/ssl/ca-key.pem  \
--root-ca-file=/opt/kubernetes/ssl/ca.pem \
--service-account-private-key-file=/opt/kubernetes/ssl/ca-key.pem"

创建systemd服务文件:

[root@k8s-master~]#vim /usr/lib/systemd/system/kube-controller-manager.service 
[Unit]
Description=Kubernetes Controller Manager
Documentation=https://github.com/kubernetes/kubernetes

[Service]
EnvironmentFile=-/opt/kubernetes/cfg/kube-controller-manager
ExecStart=/opt/kubernetes/bin/kube-controller-manager $KUBE_CONTROLLER_MANAGER_OPTS
Restart=on-failure

[Install]
WantedBy=multi-user.target

启动服务,并设置开机启动:

[root@k8s-master~]#systemctl daemon-reload
[root@k8s-master~]#systemctl enable kube-controller-manager
[root@k8s-master~]#systemctl restart kube-controller-manager

注意:几个组件启动顺序有依赖,需要先启动etcd,再启动apiserver,其他组件无顺序要求

所有组件都已经启动成功,通过kubectl工具查看当前集群组件状态:

[root@k8s-master~]# ln -s  /opt/kubernetes/bin/kubectl  /usr/bin/
[root@k8s-master~]# kubectl get cs
NAME                 STATUS    MESSAGE             ERROR
scheduler            Healthy   ok                  
etcd-0               Healthy   {"health":"true"}   
etcd-2               Healthy   {"health":"true"}   
etcd-1               Healthy   {"health":"true"}   
controller-manager   Healthy   ok
如上输出说明组件都正常。
  • 查看启动日志的方法
[root@k8s-master~]# journalctl -u kube-apiserver

将kubelet-bootstrap用户绑定到系统集群角色

[root@k8s-master~]#/opt/kubernetes/bin/kubectl create clusterrolebinding kubelet-bootstrap \
  --clusterrole=system:node-bootstrapper \
  --user=kubelet-bootstrap

创建kubeconfig文件:

在生成kubernetes证书的目录下执行以下命令生成kubeconfig文件:

指定apiserver 地址(如果apiserver做了负载均衡,则填写负载均衡地址)
KUBE_APISERVER="https://192.168.4.154:6443"
BOOTSTRAP_TOKEN=79d370bf4b3e1bda79087504d34b9e5d

设置集群参数

[root@k8s-master~] #/opt/kubernetes/bin/kubectl config set-cluster kubernetes \
--certificate-authority=./ca.pem \
--embed-certs=true \
--server=${KUBE_APISERVER} \
--kubeconfig=bootstrap.kubeconfig

设置客户端认证参数

[root@k8s-master~]#/opt/kubernetes/bin/kubectl config set-credentials kubelet-bootstrap \
  --token=${BOOTSTRAP_TOKEN} \
  --kubeconfig=bootstrap.kubeconfig

设置上下文参数

[root@k8s-master~]#/opt/kubernetes/bin/kubectl config set-context default \
  --cluster=kubernetes \
  --user=kubelet-bootstrap \
  --kubeconfig=bootstrap.kubeconfig

设置默认上下文

[root@k8s-master~]#/opt/kubernetes/bin/kubectl config use-context default --kubeconfig=bootstrap.kubeconfig

创建kube-proxy kubeconfig文件

[root@k8s-master~]#/opt/kubernetes/bin/kubectl config set-cluster kubernetes \
  --certificate-authority=./ca.pem \
  --embed-certs=true \
  --server=${KUBE_APISERVER} \
  --kubeconfig=kube-proxy.kubeconfig

[root@k8s-master~]#/opt/kubernetes/bin/kubectl config set-credentials kube-proxy \
  --client-certificate=./kube-proxy.pem \
  --client-key=./kube-proxy-key.pem \
  --embed-certs=true \
  --kubeconfig=kube-proxy.kubeconfig

[root@k8s-master~]#/opt/kubernetes/bin/kubectl config set-context default \
  --cluster=kubernetes \
  --user=kube-proxy \
  --kubeconfig=kube-proxy.kubeconfig

[root@k8s-master~]#/opt/kubernetes/bin/kubectl config use-context default --kubeconfig=kube-proxy.kubeconfig

[root@k8s-master~]# ls
bootstrap.kubeconfig  kube-proxy.kubeconfig

注:将这两个文件拷贝到Node节点/opt/kubernetes/cfg目录下。

4.4 安装运行Node节点组件

  • 下载组件
[root@k8s-node01 ~]#wget https://dl.k8s.io/v1.18.8/kubernetes-client-linux-amd64.tar.gz
  • 解压组件包:
[root@k8s-node01 ~]#tar zxvf kubernetes-client-linux-amd64.tar.gz
[root@k8s-node01 ~]#cp  kubernetes/client/bin/kubectl   /opt/kubernetes/bin/
[root@k8s-node01 ~]#mkdir -p /opt/kubernetes/{bin,cfg,ssl}
[root@k8s-node01 ~]#scp root@192.168.4.154:/root/kubernetes/server/bin/{kubelet,kube-proxy} /opt/kubernetes/bin/
  • 配置kubelet

创建kubelet配置文件:

[root@k8s-node01 ~]# cat << EOF >/opt/kubernetes/cfg/kubelet 
KUBELET_OPTS="--logtostderr=true \
--v=4 \
--log-dir=/opt/kubernetes/logs \
--hostname-override=192.168.4.155 \
--kubeconfig=/opt/kubernetes/cfg/kubelet.kubeconfig \
--bootstrap-kubeconfig=/opt/kubernetes/cfg/bootstrap.kubeconfig \
--config=/opt/kubernetes/cfg/kubelet.config \
--cert-dir=/opt/kubernetes/ssl  \
--network-plugin=cni \
--pod-infra-container-image=registry.cn-hangzhou.aliyuncs.com/google-containers/pause-amd64:3.0"
EOF

参数说明:
* --hostname-override 在集群中显示的主机名
* --kubeconfig 指定kubeconfig文件位置,会自动生成
* --bootstrap-kubeconfig 指定刚才生成的bootstrap.kubeconfig文件
* --cert-dir 颁发证书存放位置
* --pod-infra-container-image 管理Pod网络的镜像

创建kube.config配置文件:

[root@ k8s-node01 ~]# cat << EOF > /opt/kubernetes/cfg/kubelet.config  
kind: KubeletConfiguration
apiVersion: kubelet.config.k8s.io/v1beta1
address: 192.168.4.155
port: 10250
readOnlyPort: 10255
cgroupDriver: cgroupfs
clusterDNS: ["10.0.0.2"]
clusterDomain: cluster.local.
failSwapOn: false
authentication:
  anonymous:
    enabled: true 
  webhook:
    enabled: false
EOF

创建systemd服务文件:

[root@k8s-node01 ~]#vim /usr/lib/systemd/system/kubelet.service  
[Unit]
Description=Kubernetes Kubelet
After=docker.service
Requires=docker.service

[Service]
EnvironmentFile=/opt/kubernetes/cfg/kubelet
ExecStart=/opt/kubernetes/bin/kubelet $KUBELET_OPTS
Restart=on-failure
KillMode=process

[Install]
WantedBy=multi-user.target

启动服务,并设置开机启动:

[root@k8s-node01 ~]#systemctl daemon-reload
[root@k8s-node01 ~]#systemctl enable kubelet 
[root@k8s-node01 ~]#systemctl restart kubelet

在Master审批Node加入集群:

启动后还没加入到集群中,需要手动允许该节点才可以。在Master节点查看请求签名的Node:

[root@k8s-master~]# /opt/kubernetes/bin/kubectl get csr
[root@k8s-master~]#/opt/kubernetes/bin/kubectl certificate approve XXXXID
[root@k8s-master~]#/opt/kubernetes/bin/kubectl get node
  • 配置kube-proxy

创建kube-proxy配置文件:

[root@k8s-node01 ~]#vim /opt/kubernetes/cfg/kube-proxy 
KUBE_PROXY_OPTS="--logtostderr=true \
--v=4 \
--log-dir=/opt/kubernetes/logs \
--hostname-override=192.168.4.155 \
--cluster-cidr=10.0.0.0/24 \           //不要改,就是这个ip
--kubeconfig=/opt/kubernetes/cfg/kube-proxy.kubeconfig"

创建systemd服务文件:

[root@k8s-node01 ~]# vim /usr/lib/systemd/system/kube-proxy.service 
[Unit]
Description=Kubernetes Proxy
After=network.target

[Service]
EnvironmentFile=-/opt/kubernetes/cfg/kube-proxy
ExecStart=/opt/kubernetes/bin/kube-proxy $KUBE_PROXY_OPTS
Restart=on-failure

[Install]
WantedBy=multi-user.target

启动服务,并设置开机启动:

[root@k8s-node01 ~]#systemctl daemon-reload
[root@k8s-node01 ~]#systemctl enable kube-proxy
[root@k8s-node01 ~]#systemctl restart kube-proxy

注意:其他节点加入集群与k8s-node01方式相同,但需修改kubelet的–address和–hostname-override选项为本机IP。

查看集群状态

[root@k8s-master~]# /opt/kubernetes/bin/kubectl get node
[root@k8s-master~]# /opt/kubernetes/bin/kubectl get cs

查看启动日志的方法

[root@k8s-master~]# journalctl -u kubelet

4.5 部署Flannel网络

图2: Flannel原理架构图
  • 下载组件并定义网段

flannel要用etcd存储自身一个子网信息,所以要保证能成功连接etcd,写入预定义子网段:

[root@k8s-master ~]#wget https://github.com/coreos/flannel/releases/download/v0.12.0/flannel-v0.12.0-linux-amd64.tar.gz
[root@k8s-master ~]#/opt/etcd/bin/etcdctl \
--ca-file=/opt/etcd/ssl/ca.pem --cert-file=/opt/etcd/ssl/server.pem --key-file=/opt/etcd/ssl/server-key.pem \
--endpoints="https://192.168.4.154:2379,https://192.168.4.155:2379,https://192.168.4.156:2379" \
set /coreos.com/network/config  '{ "Network": "172.17.0.0/16", "Backend": {"Type": "vxlan"}}'

以下部署步骤在每个node节点都操作

  • 下载二进制包:
#wget https://github.com/coreos/flannel/releases/download/v0.12.0/flannel-v0.12.0-linux-amd64.tar.gz
mkdir -pv /opt/kubernetes/bin
tar -zxvf flannel-v0.12.0-linux-amd64.tar.gz
mv flanneld mk-docker-opts.sh /opt/kubernetes/bin
  • 配置Flannel:
# mkdir -p /opt/kubernetes/cfg/
# vim /opt/kubernetes/cfg/flanneld
FLANNEL_OPTIONS="--etcd-endpoints=https://192.168.4.154:2379,https://192.168.4.155:2379, https://192.168.4.156:2379 \
 --etcd-cafile=/opt/etcd/ssl/ca.pem \
--etcd-certfile=/opt/etcd/ssl/server.pem \
--etcd-keyfile=/opt/etcd/ssl/server-key.pem  \
--log-dir=/opt/kubernetes/logs "
  • systemd管理Flannel:
# vi /usr/lib/systemd/system/flanneld.service
[Unit]
Description=Flanneld overlay address etcd agent
After=network-online.target network.target
Before=docker.service

[Service]
Type=notify
EnvironmentFile=/opt/kubernetes/cfg/flanneld
ExecStart=/opt/kubernetes/bin/flannel  $FLANNEL_OPTIONS --ip-masq=true --etcd-prefix=/coreos.com/network
ExecStartPost=/opt/kubernetes/bin/mk-docker-opts.sh -k DOCKER_NETWORK_OPTIONS -d /run/flannel/subnet.env
Restart=on-failure

[Install]
WantedBy=multi-user.target
  • 配置Docker启动指定子网段:
#vi /usr/lib/systemd/system/docker.service 
[Unit]
Description=Docker Application Container Engine
Documentation=https://docs.docker.com
After=network-online.target firewalld.service
Wants=network-online.target

[Service]
Type=notify
EnvironmentFile=/run/flannel/subnet.env
ExecStart=/usr/bin/dockerd $DOCKER_NETWORK_OPTIONS
ExecReload=/bin/kill -s HUP $MAINPID
LimitNOFILE=infinity
LimitNPROC=infinity
LimitCORE=infinity
TimeoutStartSec=0
Delegate=yes
KillMode=process
Restart=on-failure
StartLimitBurst=3
StartLimitInterval=60s

[Install]
WantedBy=multi-user.target
  • 从其他节点拷贝证书文件到node1和node2上:flanel需要证书
scp /opt/etcd/ssl/*  k8s-node1:/opt/etcd/ssl/
  • 重启flannel和docker:
systemctl daemon-reload
systemctl restart flanneld
systemctl enable flanneld
systemctl restart docker
  • 检查是否生效:
#ps -ef |grep docker
root     20941     1  1 Jun28 ?        09:15:34 /usr/bin/dockerd --bip=172.17.34.1/24 --ip-masq=false --mtu=1450
#ip addr
3607: flannel.1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1450 qdisc noqueue state UNKNOWN 
    link/ether 8a:2e:3d:09:dd:82 brd ff:ff:ff:ff:ff:ff
    inet 172.17.34.0/32 scope global flannel.1
       valid_lft forever preferred_lft forever
3608: docker0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1450 qdisc noqueue state UP 
    link/ether 02:42:31:8f:d3:02 brd ff:ff:ff:ff:ff:ff
    inet 172.17.34.1/24 brd 172.17.34.255 scope global docker0
       valid_lft forever preferred_lft forever
    inet6 fe80::42:31ff:fe8f:d302/64 scope link 
       valid_lft forever preferred_lft forever

确保docker0与flannel.1在同一网段。

测试不同节点互通,在当前节点访问另一个Node节点docker0 IP:

[root@k8s-master ~]## ping 172.17.58.1
PING 172.17.58.1 (172.17.58.1) 56(84) bytes of data.
64 bytes from 172.17.58.1: icmp_seq=1 ttl=64 time=0.263 ms
64 bytes from 172.17.58.1: icmp_seq=2 ttl=64 time=0.204 ms
如果能通说明Flannel部署成功。如果不通检查下日志:journalctl -u flannel

4.6 部署Calico网络

  • 关闭Flannel服务(在各node节点)
[root@k8s-node1 ~]# systemctl stop flanneld
[root@k8s-node1 ~]#systemctl disable flanneld
[root@k8s-node1 ~]# systemctl status flanneld
  • 重启所有节点
  • 下载官方yaml文件(在Master节点操作)
# wget https://docs.projectcalico.org/manifests/calico-etcd.yaml
# mv calico-etcd.yaml calico.yaml
  • 配置calico
calico# vim calico.yaml
data:
  # Configure this with the location of your etcd cluster.
  etcd_endpoints: " https://192.168.4.154:2379,https://192.168.4.155:2379,https://192.168.4.156:2379"
  
  # If you're using TLS enabled etcd uncomment the following.
  # You must also populate the Secret below with these files.  
  etcd_ca: "/calico-secrets/etcd-ca"   #取消原来的注释即可
  etcd_cert: "/calico-secrets/etcd-cert"
  etcd_key: "/calico-secrets/etcd-key"
  
  apiVersion: v1
kind: Secret
type: Opaque
metadata:
  name: calico-etcd-secrets
  namespace: kube-system
data:  
 etcd-key: (cat /etc/kubernetes/ssl/etcd-key.pem | base64 | tr -d '\n') #将输出结果填写在这里
  etcd-cert: (cat /etc/kubernetes/ssl/etcd.pem | base64 | tr -d '\n') #将输出结果填写在这里
  etcd-ca: (cat /etc/kubernetes/ssl/ca.pem | base64 | tr -d '\n') #将输出结果填写在这里
   #如果etcd没用启用tls则为null 
  #上面是必须要修改的参数,文件中有一个参数是设置pod network地址的,根据实际情况做修改:
   - name: CALICO_IPV4POOL_CIDR
value: "10.37.0.0/16"
  • 修改kubelet配置

设置各node上Kubelet服务的启动参数: –network-plugin=cni,

设置 master上的kube-apiserver服务的启动参数: –allow-privileged=true (因为calico-node需要以特权模式运行在各node上)

设置好后,重新启动kubelet。

这样通过calico就完成了Node间容器网络的设置 ,在后续的pod创建过程中,Kubelet将通过CNI接口调用 calico进行Pod的网络设置包括IP地址,路由规则,Iptables规则

  • 验证各Node间网络联通性:

kubelet启动后主机上就生成了一个tunl0接口。

#第一台Node查看:

[root@k8s-node1 ~]#ip route
172.16.169.128/26 via 192.168.4.156 dev tunl0 proto bird onlink

#第二台Node查看:

[root@k8s-node1 ~]#ip route
172.16.36.64/26 via 192.168.4.155 dev tunl0 proto bird onlink

#每台node上都自动设置了到其它node上pod网络的路由,去往其它节点的路都是通过tunl0接口,这就是IPIP模式。

如果设置CALICO_IPV4POOL_IPIP=”off” ,即不使用IPIP模式,则Calico将不会创建tunl0网络接口,路由规则直接使用物理机网卡作为路由器转发。

4.7 部署WebUI

  • 下载官方的yaml文件
[root@k8s-master~]#wget https://raw.githubusercontent.com/kubernetes/dashboard/v2.0.3/aio/deploy/recommended.yaml 
  • 修改recommended.yaml

修改Service的NodePort便于我们从集群外使用浏览器访问dashboard
service段配置更改如下:(NodePort: 30001可以省略,缺省则为随机端口)

  • 执行安装
[root@k8s-master~]# kubectl create -f recommended.yaml 
  • 创建 serviceaccount
[root@k8s-master~]# vi  dashboard-sa.yaml
apiVersion: v1
kind: ServiceAccount
metadata:
  name: dashboard-admin
  namespace: kubernetes-dashboard
  • 执行安装
[root@k8s-master~]# kubectl create -f dashboard-sa.yaml
  • 创建clusterrolebinding为dashboard sa授权集群权限cluster-admin
[root@k8s-master~]# vi dashboard-clusterrolebinding
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
  name: dashboard-admin
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: ClusterRole
  name: cluster-admin
subjects:
- kind: ServiceAccount
  name: dashboard-admin
  namespace: kubernetes-dashboard
  • 执行安装
[root@k8s-master~]# kubectl create -f dashboard-clusterrolebinding
  • 获取token
[root@k8s-master~]# kubectl -n kubernetes-dashboard describe secret $(kubectl -n kubernetes-dashboard get secret | grep admin-user | awk '{print $1}')
  • 查看NodePort端口

如果按上面在NodePort配置成固定端口,就直接用固定端口访问即可

  • 访问页面

5 结果验证

运行一个测试示例,创建一个Nginx Web,判断集群是否正常工作:

  • 创建nginx.yaml
[root@k8s-master~]#vi nginx.yaml 
# API 版本号
apiVersion: apps/v1
# 类型,如:Pod/ReplicationController/Deployment/Service/Ingress
kind: Deployment
metadata:
  # Kind 的名称
  name: nginx-app
spec:
  selector:
    matchLabels:
      # 容器标签的名字,发布 Service 时,selector 需要和这里对应
      app: nginx
  # 部署的实例数量
  replicas: 2
  template:
    metadata:
      labels:
        app: nginx
    spec:
      # 配置容器,数组类型,说明可以配置多个容器
      containers:
      # 容器名称
      - name: nginx
        # 容器镜像
        image: nginx:1.17
        # 只有镜像不存在时,才会进行镜像拉取
        imagePullPolicy: IfNotPresent
        ports:
        # Pod 端口
        - containerPort: 80
  • 创建pods:
[root@k8s-master~]#kubectl  apply -f nginx.yaml
  • 查看pod详细信息:
[root@k8s-master~]# kubectl get pods
[root@k8s-master~]# kubectl get deployment
  • 暴露服务:
[root@k8s-master~]# kubectl expose deployment nginx-app --port=80 --type=LoadBalancer
  • 查看服务状态(查看对外的端口):
[root@k8s-master~]# kubectl get services
  • 浏览器校验
  • 删除pods

先删除pod

再删除对应的deployment

6 参考资料

如有其它问题,请填写右侧需求表单联系我们。www.asterfusion.com

OpenStack Heat部署方案

OpenStack Heat部署方案

1 目标与物理网络拓扑

本文主要描述在现有OpenStack(stein版)平台上如何扩展安装Heat功能组件,实验应用程序的编排服务。
涉及物理拓扑,如图1所示:

物理网络拓扑(OpenStack)
图1:物理网络拓扑

部署过程中所涉及到的设备、接口及管理网口的IP地址如下表所示:

设备名称接口IP地址备注
Switch-A管理口192.168.0.254三层交换机
Switch-B管理口192.168.4.1二层交换机
Switch-C管理口192.168.5.1二层交换机
Server-1管理口192.168.4.144/
Server-2管理口192.168.5.145/

表1:设备管理口列表

2 硬件与软件环境

部署环境中涉及到的硬件和软件如表2和表3所示:

名称型号硬件指标数量备注
服务器1、至少8G内存
2、磁盘不少于500G

2
Server-1 计算节点+存储节点
Server-2 控制节点+网络节点

表2:硬件环境

名称型号硬件指标数量备注
服务器1、至少8G内存
2、磁盘不少于500G

2
Server-1 计算节点+存储节点
Server-2 控制节点+网络节点

表3:软件环境

3 Heat简介

Heat是OpenStack提供的自动编排功能的组件,基于描述性的模板,来编排复合云应用程序。

Heat向开发人员和系统管理员提供了一种简便地创建和管理一批相关的OpenStack资源的方法,并通过有序且可预测的方式对其进行资源配置和更新。

用户可以使用Heat的示例模板或自己创建模板来描述OpenStack资源以及应用程序运行时所需的任何相关依赖项或运行时参数。

当设置完成后,可通过按授权控制、可预测的方式修改和更新OpenStack资源。

用户可以通过OpenStack管理控制台、Heat命令行工具或 API对模板及其相关的资源集进行设置和更新。

引入Heat的两个原因:

  • 更快更有效的管理OpenStack的资源

云平台系统在相对比较稳定的情况下,管理成本逐渐变成首要的解决问题。云上自动化能力是一个云平台的刚需,可以有效降低维护难度。

OpenStack原生提供命令行和 Horizon 来供用户管理资源。然而命令行和在浏览器中的点击,费时费力,不利于用户使用 Openstack 来进行大批量的管理以支撑 IT 应用。 Heat在这种情况下应运而生。
Heat 采用了模板方式来设计或者定义编排。为方便用户使用,Heat 还提供了大量的模板例子,使用户能够方便地得到想要的编排。

  • 更小的研发成本

引入Heat,对于不了解OpenStack的研发者来说,可以更快的接入现有的业务系统。开发者更关心的是授权认证和对虚拟资源的增删改,而对于底层的状态并不用太多了解。

下面是Heat的架构组成:

Heat架构图
图2: Heat架构图

主要概念:

  • heat command-line client

CLI通过与heat-api通信,来调用API实现相关功能。终端开发者可以直接使用编排REST API。

  • heat-api

一个OpenStack本地REST API,通过RPC,把发送来的API请求在发给heat-engine。

heat-api,提供了原生restful API对外使用。用户对API的调用,由heat-api处理之后,最终通过RPC传递给Heat-engine来进一步处理。

  • heat-api-cfn

组件提供了Amazon style 的查询 API,可以完全兼容于Amazon的CloudFormation,对于API的请求同heat-api类似,处理之后,通过RPC传递给heat-engine进一步处理。

  • heat-engine

heat-engine是heat中的核心模块,处理主要的逻辑业务。

此模块提供heat最主要的功能,执行模板内容,最终完成应用系统的创建和部署,并把执行结果返回给API调用者。 当 heat engine拿到请求后,会把请求解析为各种类型的资源,每种资源都对应OpenStack其它的服务客户端,然后通过发送 REST 的请求给其它服务。通过如此的解析和协作,最终完成请求的处理。

  • heat-cfntools

独立于heat组件的一个的工具,需要单独下载。这个工具用来完成虚拟机实例内部的操作配置任务。在创建虚拟机镜像时,需要在镜像中安装heat-cfntools工具。

4 安装步骤

[root@controller ~] 表示在控制节点上执行
[root@compute ~] 表示在计算节点上执行

4.1 创建数据库

  • 创建数据库并授权:
[root@controller ~]# mysql -uroot -p
MariaDB [(none)]> CREATE DATABASE heat;
MariaDB [(none)]> GRANT ALL PRIVILEGES ON heat.* TO ‘heat’@'localhost' \
  IDENTIFIED BY 'HEAT_PASS';
MariaDB [(none)]> GRANT ALL PRIVILEGES ON heat.* TO ‘heat’@'%' \
  IDENTIFIED BY 'HEAT_PASS';

注:帐号密码根据自己的情况修改

4.2 创建openstack用户、服务凭据、API端点:

在安装和配置Heat之前,必须创建用户、服务凭据和API端点:

[root@controller ~]# . admin-openrc
[root@controller ~]# openstack user create --domain default --password-prompt heat
[root@controller ~]# openstack role add --project service --user heat admin
[root@controller ~]# openstack service create --name heat \
  --description "Orchestration" orchestration
[root@controller ~]# openstack service create --name heat-cfn \
  --description "Orchestration"  cloudformation 
[root@controller ~]#openstack endpoint create --region RegionOne \
  orchestration public http://controller:8004/v1/%\(tenant_id\)s
[root@controller ~]#openstack endpoint create --region RegionOne \
  orchestration internal http://controller:8004/v1/%\(tenant_id\)s 
[root@controller ~]# openstack endpoint create --region RegionOne \
  orchestration admin http://controller:8004/v1/%\(tenant_id\)s

为了管理栈,在认证服务中Orchestration需要更多信息。为了添加这些信息,完成下面的步骤

  • 创建 heat域
[root@controller ~]#openstack domain create --description "Stack projects and users" heat
  • 在heat域中创建heat_domain_admin用户
[root@controller ~]# openstack user create --domain heat --password-prompt heat_domain_admin
  • 添加admin角色到heat域中的heat_domain_admin用户:
[root@controller ~]# openstack role add --domain heat --user heat_domain_admin admin
  • 创建 heat_stack_owner角色:
[root@controller ~]# openstack role create heat_stack_owner

添加heat_stack_owner角色到demo项目和用户:

[root@controller ~]# openstack role add --project demo --user demo heat_stack_owner
  • 创建 heat_stack_user 角色:
[root@controller ~]# openstack role create heat_stack_user

4.3 在controller节点上安装Heat服务

  • 安装软件包:
[root@controller ~]# yum install openstack-heat-api openstack-heat-api-cfn \
  openstack-heat-engine python-heatclient
  • 编辑配置文件 /etc/heat/heat.conf
[root@controller ~]#vi /etc/heat/heat.conf
[DEFAULT]
transport_url = rabbit://openstack:tera123@controller
heat_metadata_server_url = http://controller:8000
heat_waitcondition_server_url = http://controller:8000/v1/waitcondition
stack_domain_admin = heat_domain_admin
stack_domain_admin_password = heat_domain_admin
stack_user_domain_name = heat
verbose = False
[oslo_messaging_rabbit]
rabbit_host = controller
rabbit_userid = openstack
rabbit_password = tera123
[database]
connection = mysql+pymysql://heat:HEAT_PASS@controller/heat
[keystone_authtoken]
auth_uri = http://controller:5000
auth_url = http://controller:5000
auth_plugin = password
project_domain_id = default
user_domain_id = default
project_name = service
username = heat
password = heat
[trustee]
auth_plugin = password
auth_url = http://controller:5000
username = heat
password = heat
user_domain_id = default
[clients_keystone]
auth_uri = http://controller:5000
[ec2authtoken]
auth_uri = http://controller:5000/v3
  • 同步数据库
[root@controller ~]# su -s /bin/sh -c "heat-manage db_sync" heat
  • 启动 Orchestration 服务并将其设置为随系统启动
[root@controller ~]# systemctl enable openstack-heat-api.service \
  openstack-heat-api-cfn.service openstack-heat-engine.service
[root@controller ~]# systemctl start openstack-heat-api.service \
  openstack-heat-api-cfn.service openstack-heat-engine.service

5 结果验证

  • 列出服务组件,以验证是否成功启动并注册了每个进程

[root@controller ~]#source admin-openrc.sh
[root@controller ~]#heat service-list

6 参考资料

https://docs.openstack.org/heat/stein/install/install-rdo.html

如有其它问题,请填写右侧需求表单联系我们。www.asterfusion.com

YUM源服务器搭建

YUM源服务器搭建

1 YUM源服务器使用场景

  • 服务器处于无网环境
  • 缓解公司网络带宽压力
  • 加快服务器软件安装部署

2 YUM源服务器必备条件

  • YUM源服务器能够自动定期的更新yum源
  • 使用CentOS官方标准源保持更新
  • Linux客户端可以直接使用yum源

3 YUM源服务器配置

主机系统IP地址软件
yum repoCentos7.4192.168.4.188Nginx+createrepo

服务器具体配置要求如下:

  • 至少2G内存
  • 至少2核CPU
  • 至少100G硬盘

4 环境准备

4.1 关闭SELinux

SELinux不关闭的情况下无法实现,会限制客户机和YUM源服务器的通信。

[root@yum~]# setenforce 0
[root@yum ~]# sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/sysconfig/selinux

4.2 关闭防火墙

防止安装时出现各个组件的端口不能访问的问题。

[root@yum ~]# systemctl stop firewalld && systemctl disable firewalld                          

5 部署YUM源服务器

部署YUM源的必要服务,并且修改相关服务的配置文件。

5.1 部署Nginx服务

我们使用Nginx配置YUM源服务器。

[root@yum ~]# yum -y install nginx
[root@yum ~]# vi /etc/nginx/nginx.conf
user nginx;
worker_processes auto;
error_log /var/log/nginx/error.log;
pid /run/nginx.pid;
include /usr/share/nginx/modules/*.conf;
events {
    worker_connections 1024;
}
http {
    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';
    access_log  /var/log/nginx/access.log  main;
    sendfile            on;
    tcp_nopush          on;
    tcp_nodelay         on;
    keepalive_timeout   65;
    types_hash_max_size 2048;
    include             /etc/nginx/mime.types;
    default_type        application/octet-stream;
    # Load modular configuration files from the /etc/nginx/conf.d directory.
    # See http://nginx.org/en/docs/ngx_core_module.html#include
    # for more information.
    include /etc/nginx/conf.d/*.conf;
    server {
        listen       80 default_server;
        listen       [::]:80 default_server;
        server_name  _;
        root         /usr/share/nginx/html;
        # Load configuration files for the default server block.
        include /etc/nginx/default.d/*.conf;
        location / {
        }
	    autoindex on;
	autoindex_exact_size on;
 	    autoindex_localtime on;
        error_page 404 /404.html;
        location = /404.html {
        }
        error_page 500 502 503 504 /50x.html;
        location = /50x.html {
        }
    }
} 
[root@yum ~]# systemctl start nginx
[root@yum ~]# systemctl enable nginx

5.2 在Nginx建立目录

创建yum源目录。

[root@yum ~]# cd /usr/share/nginx/html
[root@yum html]# mkdir -p centos/asterfusion/7/7.4/x86_64
[root@yum html]# tree
├── html
│   ├── 404.html
│   ├── 50x.html
│   ├── centos
│   │   └── asterfusion
│   │       └── 7
│   │           ├── 7.4
│   │               ├── x86
│   │               └── x86_64

5.3 修改Nginx HTML

自定义yum源页面。

[root@yum ~]# cat /usr/share/nginx/html/index.html
        <h1>Welcome to <strong>Asterfusion</strong> on Internet!</h1>
    <div class="content">
    <a href="http://192.168.4.188/centos/asterfusion">Asterfusion Yum Repo</a><br/>
    <br/>
   </div
[root@yum ~]# systemctl restart nginx

5.4 验证yum源

使用服务器IP访问浏览器。

5.5 同步官方yum源

同步官方CentOS7源到本地,如果出现同步后没有对应的文件和目录的情况,检查本地的repo文件是否有错误。

[root@yum x86_64]# pwd
/usr/share/nginx/html/centos/asterfusion/7/7.4/x86_64
[root@yum x86_64]# yum -y install yum-utils createrepo
[root@yum x86_64]# reposync --repoid base  -p ./
[root@yum x86_64]# reposync --repoid epel  -p ./
[root@yum x86_64]# reposync --repoid extras  -p ./
[root@yum x86_64]# reposync --repoid updates  -p ./
[root@yum x86_64]# createrepo -p /usr/share/nginx/html/centos/asterfusion/7/7.4/x86_64/base
[root@yum x86_64]# createrepo -p /usr/share/nginx/html/centos/asterfusion/7/7.4/x86_64/epel
[root@yum x86_64]# createrepo -p /usr/share/nginx/html/centos/asterfusion/7/7.4/x86_64/extras
[root@yum x86_64]# createrepo -p \
/usr/share/nginx/html/centos/asterfusion/7/7.4/x86_64/updates

5.6 创建yum repo

部署优先级控制工具,可以控制客户端优先使用优先级较高的yum源,创建yum源repo文件。\

[root@yum x86_64]# yum install yum-plugin-priorities -y 
[root@yum x86_64]# cd /etc/yum.repos.d/
[root@yum yum.repos.d]# mkdir bak
[root@yum yum.repos.d]# mv ./* bak
[root@yum yum.repos.d]# vi Asterfusion.repo
[Asterfusion-base]
name=asterfusion-base
baseurl=http://192.168.4.188/centos/asterfusion/7/7.4/x86_64/base
gpgcheck=0
enable=1
priority=1
[Asterfusion-epel]
name=asterfusion-epel
baseurl=http://192.168.4.188/centos/asterfusion/7/7.4/x86_64/epel
gpgcheck=0
enable=1
priority=1
[Asterfusion-extras]
name=asterfusion-extras
baseurl=http://192.168.4.188/centos/asterfusion/7/7.4/x86_64/extras
gpgcheck=0
enable=1
priority=1
[Asterfusion-updates]
name=asterfusion-updates
baseurl=http://192.168.4.188/centos/asterfusion/7/7.4/x86_64/updates
gpgcheck=0
enable=1
priority=1

部署优先级控制工具,可以控制客户端优先使用优先级较高的yum源,创建yum源repo文件。

[root@yum x86_64]# yum install yum-plugin-priorities -y 
[root@yum x86_64]# cd /etc/yum.repos.d/
[root@yum yum.repos.d]# mkdir bak
[root@yum yum.repos.d]# mv ./* bak
[root@yum yum.repos.d]# vi Asterfusion.repo
[Asterfusion-base]
name=asterfusion-base
baseurl=http://192.168.4.188/centos/asterfusion/7/7.4/x86_64/base
gpgcheck=0
enable=1
priority=1
[Asterfusion-epel]
name=asterfusion-epel
baseurl=http://192.168.4.188/centos/asterfusion/7/7.4/x86_64/epel
gpgcheck=0
enable=1
priority=1
[Asterfusion-extras]
name=asterfusion-extras
baseurl=http://192.168.4.188/centos/asterfusion/7/7.4/x86_64/extras
gpgcheck=0
enable=1
priority=1
[Asterfusion-updates]
name=asterfusion-updates
baseurl=http://192.168.4.188/centos/asterfusion/7/7.4/x86_64/updates
gpgcheck=0
enable=1
priority=1

5.7 重新建立缓存

清除本地缓存和重新建立缓存,检查yum源中的软件包。

[root@yum ~]# yum clean all
[root@yum ~]# yum makecache
[root@yum ~]# yum repolist

5.8 测试安装速度

使用本地源安装mariadb数据库,安装速度大大加快。

[root@yum ~]# yum install -y mariadb-server

5.9 配置yum源自动更新

在计划任务中加入yum源更新脚本,每周六18:30自动更新CentOS7.4 yum源。

[root@yum home]# vi updateyumrepo.sh
#!/bin/bash
reposync -n --repoid=extras --repoid=updates --repoid=base --repoid=epel -p \
/usr/share/nginx/html/centos/asterfusion/7/7.4/x86_64/
[root@yum home]# crontab -e
30 18 * * 6 /bin/bash /home/updateyurepo.sh
[root@yum home]# crontab -l
30 18 * * 6 /bin/bash /home/updateyurepo.sh

如有其它问题,请填写右侧需求表单联系我们。www.asterfusion.com

对星融元产品感兴趣?

立即联系!

返回顶部

© 星融元数据技术(苏州)有限公司 苏ICP备17070048号-2