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

标签: A-lab-部署验证

CX102S-DPU开放智能网关用户指导手册

CX102S-DPU开放智能网关用户指导手册

1 引言

CX102S-DPU开放智能网关内部核心模块为1*交换芯片+2*DPU(高性能计算单元),其中两张DPU和交换芯片通过内部2*10G链路互联,其中面板的1-8接口还支持PoE++供电能力,交换芯片中运行着基于SONiC的开放的网络操作系统AsterNOS,提供丰富的L2/L3转发功能。默认情况下,DPU1默认安装了OpenWrt系统,专为网络出口提供网关能力。DPU2默认安装了Debian系统,用户可以根据实际业务需求,按需安装多种类型的软件工具。

同时,允许用户在设备的两张DPU上安装任意Linux发行版本,包括Ubuntu、Debian、OpenWRT、CentOS 等,从而支持开放的软件生态,如VPP、UFW、OpenVPN、Snort、HAProxy、Nginx、ntopng等,并可根据用户需要在同一台设备上组合运行多个软件。

智能、网关、OpenWr
CX102S-DPU开放智能网关

2 首次登录设备

2.1 设备基础配置

设备初始化情况下没有默认的登录/管理IP,设备上电后需要通过串口连接,配置IP地址后可以通过SSH的方式登录设备。

  • 设备默认登录用户名:admin,密码:asteros。
  • 通过串口连接设备时需注意修改波特率为:115200。

该设备内置两张高性能DPU卡,其中DPU1通过内部接口Ethernet19与交换芯片相连,DPU2通过内部接口Ethernet20与交换芯片相连。缺省情况下,设备面板上的所有物理接口以及内部接口都为access模式,默认均为VLAN1,登录设备后可以通过给VLAN1配置IP地址作为设备的管理IP。

设备面板上的所有物理接口以及内部接口都为access模式

设备配置命令如下:

3 配置DPU1

DPU1默认安装了OpenWrt系统,专为网络出口提供网关能力,用户也可以基于该系统安装第三方软件。如需自定义安装其他基础操作系统,请前往Asterfusion官网参考《CX102S-DPU开放智能网关DPU操作系统安装指导》进行系统安装。

需要将连接设备的PC地址配置为同一网段
登录openwrt哇、网关

注:如需修改DPU1/DPU2的默认IP地址,请通过串口连接设备后,在命令行输入以下命令分别可以进入DPU1和DPU2后台进行配置修改:(注:命令需一次性完整输入)

3.2 OpenWrt功能配置

3.2.1 配置WAN接口

缺省情况下,OpenWrt默认的LAN接口状态如下图所示,需先创建一个WAN口接入运营商网络:

OpenWrt默认的LAN接口状态

按照以下步骤创建接口,需要注意设备侧需要对应配置相同的VLAN才能互通(以下步骤中LAN端口为VLAN10,WAN端口为VLAN100,用户可根据网络情况进行修改)
1、点击【网络】-【接口】-【设备】-【添加设备配置】

添加设备配置

2、配置以下参数信息,点击【保存】

配置以下参数信息

3、删除IPV6默认配置后点击【保存并应用】

删除IPV6默认配置

4、再返回到【接口】,点击【添加新接口】

再返回到【接口】

5、配置以下参数信息后点击【创建接口】

配置参数信息

6、点击【创建接口后】,根据网络出口真实的IP规划进行配置后点击【保存】

根据真实的IP规划进行配置

7、WAN接口配置完成后点击【保存并应用】,完成接口的配置

完成接口的配置

3.2.2 配置LAN接口

1、点击【网络】-【接口】-【设备】-【添加设备配置】

添加设备配置

2、配置以下参数信息,点击【保存】

配置参数信息

3、再返回到【接口】,点击【添加新接口】

添加新接口

4、点击【创建接口后】,根据网络LAN真实的IP规划进行配置后点击【保存】

根据网络LAN真实的IP规划进行配置
根据网络LAN真实的IP规划进行配置

5、将初始的LAN口删除后点击【保存并应用】,即可完成OpenWrt的配置

完成OpenWrt的配置

注:如需配置其他功能,详情请参考OpenWrt官方配置指导手册

3.3 设备接口配置

典型场景配置

典型场景配置举例:当图中PC需要经过网关设备访问外网时,需要把OpenWrt中eth0.100接口设置为WAN口,eth0.10接口设置成LAN口(上一节配置中已介绍),同时需要把设备的Eth18口与运营商专线连接,配置为WAN端口,把设备的Eth1-4口连接PC,配置成LAN端口,VLAN(WAN:VLAN100,LAN:VLAN10),DPU1与交换机侧通过Ethernet19口进行数据传输。将交换机的内部接口Eth19的VLAN放行,设备配置如下:

4 配置DPU2

DPU2默认安装了Debian系统,用户也可以基于该系统安装其他第三方软件。该文档以在系统之上安装ntopng(监控网络流量工具)举例,可以将网络出口的全流量进行可视化监控分析,用户如需自定义安装其他基础操作系统,请前往Asterfusion官网参考《CX102S-DPU开放智能网关-DPU操作系统安装指导》进行系统安装,如需自定义安装其他软件工具,请前往Asterfusion官网参考《CX102S-DPU开放智能网关-DPU软件安装指导-ntopng》进行系统安装。

4.1 安装依赖

4.2 准备源码

4.3 编译安装

4.4 交换机侧配置

DPU2与交换机侧通过Ethernet20口进行数据传输,此时需要把交换机上WAN侧(Ethernet 16)的流量镜像到Ethernet20,供DPU2上的ntopng进行监控分析。

4.5 功能验证

当前ntopng所在计算单元的管理IP是192.168.2.1/24,PC配置相同网段的IP,与设备Ethernet1口连接,通过192.168.2.1:3000即可访问ntopngp的WEB界面。默认的用户名密码是admin/admin,第一次登录需要修改密码。

登录界面

在Web页面上可以看到所有经过WAN口的全部流量:

Web页面上可以看到所有经过WAN口的全部流量

相关产品:云化园区交换机

相关阅读:

DPU软件安装指导-ntopng

在Debian Linux上安装ntopng

DPU软件安装指导-ntopng

本文档介绍如何在星融元CX102S-DPU设备的计算单元(DPU)的Debian Linux系统上安装网络流量可视化监控工具ntopng

1、ntopng介绍

ntopng是ntop的下一代版本,是一款基于web的网络流量分析工具,它能够实时监控和分析网络流量,提供丰富的可视化界面,帮助用户更好地了解网络状况和优化网络性能。

ntopng支持多种协议和数据源,包括TCP、UDP、HTTP、DNS、NetFlow等,可以对网络流量进行深度分析,并提供实时警报和日志记录功能。ntopng的优点是易于安装和使用,具有强大的功能和灵活的配置选项,可以帮助管理员快速识别网络问题并采取相应措施。

ntopng支持多种协议和数据源

2、 ntopng编译安装

2.1 安装依赖

2.2 准备源码

3.3 编译安装

3、启动运行

计算单元-1侧配置步骤:

       默认情况下,计算单元-1预装OpenWRT系统,可根据用户所处网络环境到OpenWRT的WEB界面进行相应的网络配置。具体配置方法/流程请参考OpenWRT的指导文档。

计算单元-2侧配置步骤:

计算单元-1侧配置步骤
交换单元侧配置
交换单元侧配置

5 访问验证ntopng运行

当前ntopng所在计算单元的管理IP是192.168.17.26/24,所以通过 http://192.168.17.26:3000 访问ntopngp的WEB界面。默认的用户名密码是admin/admin,第一次登录需要修改密码。

ntopng
流量仪表盘
流量仪表盘
系统状态概览
系统状态概览

相关产品:CX-M系列云化园区交换机

JumpServer-开源堡垒机的部署

JumpServer-开源堡垒机的部署

1 JumpServer简介

Jumpserver 是全球首款完全开源的堡垒机,使用 GNU GPL v2.0 开源协议,是符合 4A 机制的运维安全审计系统。

Jumpserver 使用 Python / Django 进行开发,遵循 Web 2.0 规范,配备了业界领先的 Web Terminal 方案,交互界面美观、用户体验好。

Jumpserver 采纳分布式架构,支持多机房跨区域部署,支持横向扩展,无资产数量及并发限制。

2 目标

使用Jumpserver统一管理公司内网资源,可以实现不通过内网来访问公司Windows/Linux资源。

3 环境准备

一台server,操作系统CentOS 7.4.1708 镜像CentOS-7-x86_64-DVD-1810.iso,IP 192.168.5.135,服务器具体配置如下:

  • 硬件配置:2个CPU核心, 4G 内存, 50G 硬盘(最低)
  • Python = 3.6.x

4 组件说明

  • JumpServer 为管理后台, 管理员可以通过 Web 页面进行资产管理、用户管理、资产授权等操作, 用户可以通过 Web 页面进行资产登录, 文件管理等操作
  • Koko 为 SSH Server 和 Web Terminal Server 。用户可以使用自己的账户通过 SSH 或者 Web Terminal 访问 SSH 协议和 Telnet 协议资产
  • Luna 为 Web Terminal Server 前端页面, 用户使用 Web Terminal 方式登录所需要的组件
  • Guacamole 为 RDP 协议和 VNC 协议资产组件, 用户可以通过 Web Terminal 来连接 RDP 协议和 VNC 协议资产 (暂时只能通过 Web Terminal 来访问)

5 端口说明

  • JumpServer 默认 Web 端口为 8080/tcp, 默认 WS 端口为 8070/tcp
  • Koko 默认 SSH 端口为 2222/tcp
  • Guacamole 默认端口为 8081/tcp,
  • Nginx 默认端口为 80/tcp
  • Redis 默认端口为 6379/tcp
  • Mysql 默认端口为 3306/tcp

6 部署过程

6.1 关闭SELinux

SELinux不关闭的情况下会发生无法访问的问题。

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

6.2 关闭防火墙

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

[root@localhost  ~]#systemctl stop firewalld && systemctl dible firewalld

6.3 安装依赖包

[root@localhost  ~]# yum -y install wget gcc epel-release git

6.4 安装Redis

JumpServer使用Redis做cache和celery broke。

[root@localhost  ~]# yum -y install redis
[root@localhost  ~]# systemctl enable redis
[root@localhost  ~]# systemctl start redis

6.5 安装Mysql并授权

JumpServer使用Mysql做数据库,也支持Sqlite3,Postgres等。

[root@localhost  ~]# yum -y mariadb mairadb-devel mariadb-server
[root@localhost  ~]# systemctl enable mairadb
[root@localhost  ~]# systemctl start mariadb
[root@localhost  ~]# mysql -uroot -e "create database jumpserver default charset 'utf8'; grant all on jumpserver.* to 'jumpserver'@'127.0.0.1' identified by 'tera123'; flush privileges;"

6.6 Mysql修改存储路径

Mysql yum安装后默认存储路径为根目录,所以需要修改存储路径防止根目录磁盘被占满。

[root@localhost  ~]# vi /etc/my.cnf.d/mariadb-server.cnf
[mysqld]
datadir=/home/mysql
socket=/home/mysql/mysql.sock
log-error=/var/log/mariadb/mariadb.log
pid-file=/var/run/mariadb/mariadb.pid
[root@localhost  ~]# vi /etc/my.cnf.d/client.cnf 
[client-mariadb]
socket=/home/mysql/mysql.sock
[root@localhost  ~]# systemctl restart mariadb

6.7 安装Nginx

安装Nginx,反向代理JumpServer各个组件。

[root@localhost  ~]#vi /etc/yum.repos.d/nginx.rep
[nginx]
name=nginx 
repobaseurl=http://nginx.org/packages/centos/7/$basearch/
gpgcheck=0
enabled=1
[root@localhost  ~]# yum -y install nginx
[root@localhost  ~]# systemctl enable nginx

6.8 安装Pyhon3.6

[root@localhost  ~]# yum -y install python36 python36-devel
[root@localhost  ~]# cd /home
[root@localhost  ~]# python3.6 -m venv py3
[root@localhost  ~]# source /home/py3/bin/activate

6.9 安装JumpServer

[root@localhost  ~]# cd /home
[root@localhost  ~]# git clone --depth=1 https://github.com/jumpserver/jumpserver.git
[root@localhost  ~]# yum -y install $(cat /home/jumpserver/requirements/rpm_requirements.txt)

6.10 安装Python依赖库

[root@localhost  ~]# pip install wheel
[root@localhost  ~]# pip install --upgrade pip setuptools
[root@localhost  ~]# pip install -r /home/jumpserver/requirements/requirements.txt

6.11 修改JumpServer配置文件

[root@localhost  ~]# cd /home/jumpserver
[root@localhost  ~]# cp config_example.yml config.yml
[root@localhost  ~]# vi config.yml
SECRET_KEY: FjAvZ0D5c6LwaUJVb7AwPPsiFl2wVVpMGQl41LBbQKi23bPEiK
BOOTSTRAP_TOKEN: e7t4EZ0BBw5GfvlH
DEBUG: false
LOG_LEVEL: ERROR
SESSION_EXPIRE_AT_BROWSER_CLOSE: true
DB_ENGINE: mysql
DB_HOST: 127.0.0.1
DB_PORT: 3306
DB_USER: jumpserver
DB_PASSWORD: tera123
DB_NAME: jumpserver
HTTP_BIND_HOST: 0.0.0.0
HTTP_LISTEN_PORT: 8080
WS_LISTEN_PORT: 8070
REDIS_HOST: 127.0.0.1
REDIS_PORT: 6379

6.12 运行JumpServer

[root@localhost  ~]# cd /home/jumpserver
[root@localhost  ~]# ./jms start all -d

6.13 安装Docker

[root@localhost  ~]# yum install -y yum-utils device-mapper-persistent-data lvm2
[root@localhost~  ] # yum-config-manager\
--add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
[root@localhost  ~]# yum -y install docker-ce wget
[root@localhost  ~]# mkdir /etc/docker
[root@localhost  ~] #yum -y install docker-ce wget
[root@localhost  ~] #systemctl enable docker
[root@localhost  ~] #systemctl start docker

6.14 部署Koko与Guacamole

[root@localhost  ~]# docker run --name jms_koko -d -p 2222:2222\
-p 127.0.0.1:5000:5000\
-e CORE_HOST=http://192.168.5.135:8080\
-e BOOTSTRAP_TOKEN=e7t4EZ0BBw5GfvlH \
--restart=always wojiushixiaobai/jms_koko:1.5.6
[root@localhost  ~]# docker run --name jms_guacamole -d -p 127.0.0.1:8081:8080\
-e JUMPSERVER_SERVER=http://192.168.5.135:8080\ 
-e BOOTSTRAP_TOKEN=e7t4EZ0BBw5GfvlH\ 
--restart=always wojiushixiaobai/jms_guacamole:1.5.6

6.15 部署Luna

Luna为JumpServer的Web前端。

[root@localhost  ~]# cd /home
[root@localhost  ~]# wget https://demo.jumpserver.org/download/luna/1.5.6/luna.tar.gz
[root@localhost  ~]# tar -xvf luna.tar.gz
[root@localhost  ~]# chown -R root:root luna 

6.16 配置Nginx

[root@localhost  ~]# vi /etc/nginx/conf.d/default.conf
server {
    listen 80;
    # server_name _;
    client_max_body_size 1000m;  # 录像及文件上传大小限制
    client_header_timeout 360s;
    large_client_header_buffers 4 16k;
    client_body_buffer_size 128k;
    proxy_connect_timeout 600;
    proxy_read_timeout 600;
    proxy_send_timeout 600;

    location /luna/ {
        try_files $uri / /index.html;
        alias /home/luna/;  # luna 路径, 如果修改安装目录, 此处需要修改
    }
    location /media/ {
        add_header Content-Encoding gzip;
        root /home/jumpserver/data/;  # 录像位置, 如果修改安装目录, 此处需要修改
    }

    location /static/ {
        root /home/jumpserver/data/;  # 静态资源, 如果修改安装目录, 此处需要修改
    }

    location /koko/ {
        proxy_pass       http://localhost:5000;
        proxy_buffering off;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header Host $host;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        access_log off;
    }

    location /guacamole/ {
        proxy_pass       http://localhost:8081/;
        proxy_buffering off;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection $http_connection;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header Host $host;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        access_log off;
    }

    location /ws/ {
        proxy_pass http://localhost:8070;
        proxy_http_version 1.1;
        proxy_buffering off;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header Host $host;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        access_log off;
    }

    location / {
        proxy_pass http://localhost:8080;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header Host $host;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        access_log off;
    }
}
[root@localhost  ~]# systemctl start nginx

6.17 端口检查

检查端口状态,必须有6379,8080,8081,80,5555,8070,3306,2222几个端口。

[root@localhost  ~]# netstat -nlp |grep tcp

6.18 验证JumpServer

默认登录密码,admin:admin,登录成功有欢迎界面,此次部署即成功。

[root@localhost  ~]# ssh -p2222 admin@192.168.5.135

7 参考资料

  1. JumpServer官网:http://www.jumpserver.org/
  2. JumpServer文档:https://jumpserver.readthedocs.io/zh/master/

相关阅读。

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

基于Asterfusion CX-N设备部署BGP-EVPN-VXLAN

1 目标与物理网络拓扑

本文主要描述如何在Asterfusion CX308P-N和CX532P-N(以下简称CX308和CX532)搭建的网络上部署如下解决方案:

  • BGP EVPNVXLAN

在网络上承载VXLAN网络,将原本在服务器上进行的封装、去封装全部从Server端卸载到CX308内的VTEP上,并且在网络上启动BGP EVPN,自动化地创建VXLAN隧道、传递虚拟网络路由。

如上解决方案共用一个物理拓扑,如图1所示:

物理网络拓扑
图1:物理网络拓扑

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

设备名称设备型号IP地址备注
Spine1CX532-N10.230.1.7 
Spine2CX532-N10.230.1.8 
Leaf1CX308-N10.230.1.18 
Leaf2CX308-N10.230.1.19 
Servrr1X8610.230.1.11互联网口ens1f2
Server2X8610.230.1.12互联网口ens1f3
表1:设备管理口列表

2 硬件与软件环境

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

名称型号硬件指标数量备注
交换机CX532-N【参见产品彩页】2
交换机CX308-N【参见产品彩页】2
服务器X862本方案采用10G网卡
光模块10GSFP+4
光模块100GQSFP2812
光纤多模100G适用6
光纤多模10G/25G适用2
表2:硬件环境

名称版本备注
AFCV5.0.0
服务器系统CentOS Linux 7.9.2009
服务器内核3.10.0-1127.18.2.el7
表3:软件环境

3 解决方案:BGP EVPN和VXLAN

3.1 逻辑组网与配置思路

BGP EVPN和VXLAN方案网络拓扑与接口配置
图3:BGP EVPN和VXLAN方案网络拓扑与接口配置

配置思路:

1)配置各交换机的端口IP信息

2)配置Leaf1和Leaf2的VLAN信息

3)配置各交换机的BGP

4)配置Leaf1和Leaf2使能EVPN

5)Leaf1和Leaf2创建Vnet,绑定VLAN

6)Leaf1和Leaf2配置二层和三层VXLAN映射

7)配置Server1和Server2的IP和路由信息

8)测试Server1和Server2的连通性

9)查看Leaf1的路由信息

10)查看Leaf2的路由信息

3.2 配置步骤

3.2.1 配置各交换机的端口IP信息

Spine1:
Spine1# configure terminal
Spine1(config)# interface ethernet 0/4
Spine1(config-if-0/4)# ip address 10.0.10.2/24
Spine1(config)# interface ethernet 0/8
Spine1(config-if-0/8)# ip address 10.0.11.2/24

Spine2:
Spine2# configure terminal
Spine2(config)# interface ethernet 0/4
Spine2(config-if-0/4)# ip address 10.1.10.2/24
Spine2(config)# interface ethernet 0/8
Spine2(config-if-0/8)# ip address 10.1.11.2/24

Leaf1:
Leaf1# configure terminal
Leaf1(config)# interface ethernet 0/48
Leaf1(config-if-0/4)# ip address 10.0.10.1/24
Leaf1(config)# interface ethernet 0/52
Leaf1(config-if-0/8)# ip address 10.1.10.1/24

Leaf2:
Leaf2# configure terminal
Leaf2(config)# interface ethernet 0/48
Leaf2(config-if-0/4)# ip address 10.0.11.1/24
Leaf2(config)# interface ethernet 0/52
Leaf2(config-if-0/8)# ip address 10.1.11.1/24
sudo config interface ip add Ethernet52 10.1.11.1/24

3.2.2 配置Leaf1和Leaf2的VLAN信息并配置好网口速率

Leaf1:
Leaf1# configure terminal 
Leaf1(config)# vlan 10
Leaf1(config)# interface vlan 10
Leaf1(config-vlanif-10)# ip address 100.0.10.1/24
Leaf1(config-vlanif-10)# mac-address 18:17:25:55:17:69
Leaf1(config)# interface ethernet 0/2
Leaf1(config-if-0/2)# switchport access vlan 10
Leaf1(config-if-0/2)# speed 10000

Leaf2:
Leaf2# configure terminal 
Leaf2(config)# vlan 20
Leaf2(config)# interface vlan 20
Leaf2(config-vlanif-20)# ip address 100.0.20.1/24
Leaf2(config-vlanif-20)# mac-address 18:17:25:55:17:71
Leaf2(config)# interface ethernet 0/3
Leaf2(config-if-0/3)# switchport access vlan 20
Leaf2(config-if-0/3)# speed 10000

3.2.3 配置各交换机的BGP

Spine1:
Spine1# configure terminal
Spine1(config)# router bgp 65228
Spine1(config-router)# bgp router-id 10.10.0.100
Spine1(config)# interface loopback 0
Spine1(config-loif-0)# ip address 10.10.0.100/32
Loopback ip will be used as bgp router-id in frr
Spine1(config)# router bgp 65228
Spine1(config-router)# no bgp ebgp-requires-policy 
Spine1(config-router)# neighbor 10.0.10.1 remote-as 65230
Spine1(config-router)# neighbor 10.0.11.1 remote-as 65231
Spine1(config-router)# address-family ipv4 unicast
Spine1(config-router)# address-family l2vpn evpn
Spine1(config-router-af)# neighbor 10.0.10.1 activate
Spine1(config-router-af)# neighbor 10.0.11.1 activate
Spine1(config-router-af)# advertise-all-vni

Spine2:
Spine1# configure terminal
Spine1(config)# router bgp 65229
Spine1(config-router)# bgp router-id 10.10.0.110
Spine1(config)# interface loopback 0
Spine1(config-loif-0)# ip address 10.10.0.110/32
Loopback ip will be used as bgp router-id in frr
Spine1(config)# router bgp 65229
Spine1(config-router)# no bgp ebgp-requires-policy 
Spine1(config-router)# neighbor 10.1.10.1 remote-as 65230
Spine1(config-router)# neighbor 10.1.11.1 remote-as 65231
Spine1(config-router)# address-family ipv4 unicast
Spine1(config-router)# address-family l2vpn evpn
Spine1(config-router-af)# neighbor 10.1.10.1 activate
Spine1(config-router-af)# neighbor 10.1.11.1 activate
Spine1(config-router-af)# advertise-all-vni

Leaf1:
Leaf1# configure terminal 
Leaf1(config)# router bgp 65230
Leaf1(config-router)# bgp router-id 10.10.0.120
Leaf1(config)# interface loopback 0
Leaf1(config-loif-0)# ip address 10.10.0.120/32
Change Loopback0 ip from 10.1.0.1/32 to 10.10.0.120/32
Loopback ip will be used as bgp router-id in frr
Leaf1(config)# router bgp 65230
Leaf1(config-router)# no bgp ebgp-requires-policy
Leaf1(config-router)# neighbor 10.0.10.2 remote-as 65228
Leaf1(config-router)# neighbor 10.1.10.2 remote-as 65229
Leaf1(config-router)# address-family ipv4 unicast
Leaf1(config-router)# network 10.10.0.120/32
Leaf1(config-router)# address-family l2vpn evpn
Leaf1(config-router-af)# neighbor 10.0.10.2 activate
Leaf1(config-router-af)# neighbor 10.1.10.2 activate
Leaf1(config-router-af)# advertise-all-vni

Leaf2:
Leaf2# configure terminal
Leaf2(config)# router bgp 65231
Leaf2(config-router)# bgp router-id 10.10.0.130
Leaf2(config)# interface loopback 0
Leaf2(config-loif-0)# ip address 10.10.0.130/32
Change Loopback0 ip from 10.1.0.1/32 to 10.10.0.130/32
Loopback ip will be used as bgp router-id in frr
Leaf2(config)# router bgp 65231
Leaf2(config-router)# no bgp ebgp-requires-policy
Leaf2(config-router)# neighbor 10.0.11.2 remote-as 65228
Leaf2(config-router)# neighbor 10.1.11.2 remote-as 65229
Leaf2(config-router)# address-family ipv4 unicast
Leaf2(config-router)# network 10.10.0.130/32
Leaf2(config-router)# address-family l2vpn evpn
Leaf2(config-router-af)# neighbor 10.0.11.2 activate
Leaf2(config-router-af)# neighbor 10.1.11.2 activate
Leaf2(config-router-af)# advertise-all-vni

3.2.4 配置Leaf1和Leaf2使能EPVN

Leaf1:
Leaf1# configure terminal
Leaf1(config)# interface vxlan 0
Leaf1(config-vxlanif-0)# source 10.10.0.120
Leaf1(config)# evpn-overlay enable

Leaf2:
Leaf2# configure terminal
Leaf2(config)# interface vxlan 0
Leaf2(config-vxlanif-0)# source 10.10.0.130
Leaf2(config)# evpn-overlay enable

3.2.5 Leaf1和Leaf2创建Vnet,绑定VLAN

Leaf1:
Leaf1(config)# vrf 123
Leaf1(config-vrf)# mac 18:17:25:55:17:69
Leaf1(config-vrf)# interface vlan 10
Leaf1(config-vlanif-10)# vrf 123

Leaf2:
Leaf2(config)# vrf 456
Leaf2(config-vrf)# mac 18:17:25:55:17:71
Leaf2(config-vrf)# interface vlan 20
Leaf2(config-vlanif-20)# vrf 456

3.2.6 Leaf1和Leaf2配置二层和三层VXLAN映射

Leaf1:
Leaf1(config)# vlan 10
Leaf1(config-vlan-10)# vni 10
Leaf1(config)# vrf 123
Leaf1(config-vrf)# vni 1000

Leaf2:
Leaf2(config)# vlan 20
Leaf2(config-vlan-20)# vni 20
Leaf2(config)# vrf 456
Leaf2(config-vrf)# vni 1000

3.2.7 保存配置并重新加载

sonic# write
sonic# reload

3.2.8 配置Server1和Server2的IP和路由信息

Server1:


[root@server1 ~]# ifconfig ens1f2
配置Server1 IP和路由信息
[root@server1 ~]# route add -net 100.0.20.0 netmask 255.255.255.0 gw 100.0.10.1 dev ens1f2

Server2:

配置Server2 IP和路由信息
[root@server1 ~]# route add -net 100.0.10.0 netmask 255.255.255.0 gw 100.0.20.1 dev ens1f3

3.2.9 测试Server1和Server2的连通性

[root@server1 ~]# ping 100.0.20.3
ping 100.0.20.3
[root@server1 ~]# ping 100.0.10.2
ping 100.0.10.2

3.2.10 查看Leaf1的路由信息

查看VTEP信息
admin@Leaf1:~$ show evpn status
查看VTEP信息
交换机路由信息
admin@Leaf1:~$ ip route show
交换机路由信息
下面信息显示Server2的路由转发到了Leaf1
admin@Leaf1:~$ ip neigh show nud all | grep Vlan
Server2的路由转发到了Leaf1
admin@Leaf1:~$ sudo bridge fdb |grep vxlan
 sudo bridge fdb |grep vxlan
admin@Leaf1:~$ show ip route vrf Vnet123
show ip route vrf Vnet123

3.2.11 查看Leaf2的路由信息

查看VTEP信息
admin@Leaf2:~$ show evpn status
查看VTEP信息
交换机路由信息
admin@Leaf2:~$ ip route show
交换机路由信息
下面信息显示Server2的路由转发到了Leaf1
admin@Leaf2:~$ ip neigh show nud all | grep Vlan
Server2的路由转发到了Leaf1
admin@Leaf2:~$ sudo bridge fdb |grep vxlan
sudo bridge fdb |grep vxlan
admin@Leaf2:~$ show ip route vrf Vnet123
show ip route vrf Vnet123

4 解决方案:AFC配置BGP和EVPN

4.1 逻辑组网与配置思路

AFC配置BGP EVPN方案网络拓扑与接口配置
图5:AFC配置BGP EVPN方案网络拓扑与接口配置

配置思路:

1)配置设备的命令行模式

2)在Server2服务器上安装AFC软件,并在AFC Web上导入软件许可

3)在AFC上自动发现物理设备

4)在AFC上自动发现物理设备间的单向和双向链路

5)在AFC上创建Fabric,选择组网类型为Spine/Leaf

6)初始化环境确认

7)在AFC上配置设备BGP邻居

8)应用配置,AFC会自动下发配置到物理设备

9)在AFC上创建租户信息

10)在AFC上创建VPC组

11)在AFC上创建虚拟路由器  

12)在AFC上创建虚拟交换机

13)在AFC上创建虚拟端口

14)测试Server1和Server2的连通性

15)查看Leaf1的路由信息

16)查看Leaf2的路由信息

4.2 配置步骤

4.2.1 安装AFC软件

下载AFC-NPB-V5.0.0软件包,在Server2服务器上安装AFC软件。具体操作请查看《AFC-NPB安装手册》,AFC安装完成之后,打开AFC Web端上传软件许可。

AFC登录界面
AFC软件许可

4.2.2 自动发现设备

【快速部署】—>【物理网络】—>【发现设备】

输入设备的起始和终止IP(10.230.1.7~10.230.1.8),(10.230.1.18~10.230.1.19)开始扫描。

4.2.3 自动发现链路

【快速部署】—>【物理网络】—>【发现链路】

自动发现链路,默认发现所有设备互联链路。

4.2.4 创建Fabric

【快速部署】—>【物理网络】—>【新建和配置Fabric】—>【添加Fabric】

选择Spine/Leaf类型,输入名称,添加设备,分配设备角色,并配置组网出入口,完成创建。

新建Fabric

4.2.5 配置BGP邻居

【快速部署】—>【物理网络】—>【配置BGP】—>【同步设备邻居】

配置BGP邻居

4.2.6 应用配置

【快速部署】—>【物理网络】—>【完成部署】—>【应用配置】

完成应用配置,大概等3分钟,等待配置下发物理设备。

等待配置下发

4.2.7 创建租户信息

【虚拟网络】—>【独立部署场景】—>【租户】—>【新建租户】

新建租户,这里的租户代表用户本身,是配置网络的逻辑前提。

编辑租户

4.2.8 创建VPC

【虚拟网络】—>【独立部署场景】—>【VPC】—>【新建VPC】

新建VPC,选择租户和之前创建的Fabric组网。

编辑VPC

4.2.9 创建虚拟路由器

【虚拟网络】—>【独立部署场景】—>【VPC】—>【内部资源】—>【虚拟路由器】—>【新建虚拟路由器】

新建虚拟路由器,预设两台Leaf设备的三层VNI和Fabric子网信息。

编辑虚拟路由

4.2.10 创建虚拟交换机

【虚拟网络】—>【独立部署场景】—>【VPC】—>【内部资源】—>【虚拟交换机】—>【新建虚拟交换机】

新建虚拟交换机,在Leaf设备上创建VLAN,并配置二层VXLAN映射;允许绑定子网,并配置三层VXLAN映射。

编辑虚拟交换机

4.2.11 创建虚拟端口

【虚拟网络】—>【独立部署场景】—>【VPC】—>【内部资源】—>【虚拟端口】—>【新建虚拟端口】

新建虚拟端口,配置VLAN绑定的物理端口。

编辑虚拟端口

4.2.12 测试Server1和Server2的连通性 

[root@server1 ~]# ping 100.0.20.3
ping 100.0.20.3
[root@server2 ~]# ping 100.0.10.2
 ping 100.0.10.2

4.2.13 查看Leaf1的路由信息

查看VETP信息
admin@Leaf1:~$ show evpn status
查看VETP信息
查看交换机本身路由显示
admin@Leaf1:~$ ip route show
查看交换机本身路由显示
下面信息显示Server2的路由转发到了Leaf1
admin@Leaf1:~$ ip neigh show nud all|grep Vlan
Server2的路由转发到了Leaf1
Server2的路由转发到了Leaf1
admin@Leaf1:~$ show ip route vrf Vnet123
show ip route vrf Vnet123

4.2.14 查看Leaf2的路由信息

查看VETP信息
admin@Leaf2:~$ show evpn status
查看VETP信息
查看交换机本身路由显示
admin@Leaf2:~$ ip route show
查看VETP信息
下面信息显示Server2的路由转发到了Leaf2
admin@Leaf2:~$ ip neigh show nud all|grep Vlan
Server2的路由转发到了Leaf2
Server2的路由转发到了Leaf2
admin@Leaf2:~$ show ip route vrf Vnet456
show ip route vrf Vnet456

5 测试结果

  • Server1Server2之间使用交换机建立的VXLAN通道完成了通信;
  • Leaf1Leaf2对服务器之间的通信进行了VXLAN封装/去封装和L2/L3路由转发。

结论: VXLAN网络的封装、去封装可以从Server端卸载到CX308内的VTEP上,并且在网络上启动BGP EVPN,自动化地创建VXLAN隧道、传递虚拟网络路由。

更多内容请参考:A-Lab

Kubernetes-Cilium部署方案

Kubernetes-Cilium部署方案

1 Kubernetes-Cilium项目简介

Kubernetes-Cilium是一个基于eBPF和XDP的高性能容器网络方案的开源项目,目标是为微服务环境提供网络、负载均衡、安全功能,主要定位是容器平台。

2 Kubernetes-Cilium项目优势

Kubernetes-Cilium主要是基于eBPF的特性来实现的,eBPF和Cilium适合应对新时代下的云发起挑战的原因主要有以下三个:

  • 可编程性:eBPF的可编程性使得Cilium能够适应云的快速发展并轻松应对云规模的快速增长,并且eBPF的通用性对于任何特定于网络的可编程性解决方案(Iptables、OpenVswitch或Nftables)相比都是一个巨大的优势。
  • 嵌入到Linux内核:eBPF的可编程的独特性已经嵌入到了Linux内核中。应用程序使用系统调用通过网络进行交互,Linux内核负责处理这些系统调用,而为了使用户空间网络框架对应用程序保持透明,仍然需要遍历Linux内核的套接字层。而eBPF通过完全保留在内核中来避免这种情况。
  • 安全高效:直接加载Linux内核模块也可以提供非常高效率的可编程性,但主要的缺点也很明显:加载内核模块运行有缺陷的代码会直接让内核崩溃。而通过eBPF程序的验证程序验证,会比直接加载内核模块安全的多。同时通过JIT(Just-In-Time)的编译,可以确保eBPF字节码在物理机上的执行速度。

3 Kubernetes-Cilium项目架构

Cilium位于容器编排系统和Linux Kernel之间,向上可以通过容器编排系统为容器进行网络以及相应的安全策略进行配置,向下可以在Linux内核hook点挂载eBPF程序,来控制容器网络数据的转发以及安全策略的实施。

Cilium项目架构

4 Kubernetes-Cilium项目组件

Cilium项目组件

在Cilium的架构中,除了Key-Value数据存储之外,主要组件包括Cilium Agent和Cilium Operator,还有一个客户端的命令行工具Cilium CLI。

  • Etcd:负责Key-Value数据存储,与Cilium和Kubernetes共用一个Etcd数据库。
  • Cilium Agent:Cilium Agent作为整个架构中最核心的组件,通过DaemonSet的方式,运行在集群的每个主机上。Cilium Agent作为用户空间的守护程序,通过插件与容器运行时和容器编排系统进行交互,进而为本机上的容器进行网络以及安全的相关配置。同时提供了开放的API,供其他组件调用。
  • Cilium Operator:Cilium Operator主要负责管理集群中的任务,尽可能的保证以集群为单位,而不是单独的以节点为单位进行任务处理。主要包括通过Etcd为节点之间同步资源信息、确保Pod的DNS可以被Cilium管理、集群NetworkPolicy的管理和更新等。
  • Cilium Client:客户端的命令行工具,与运行在同一节点上的Cilium Agent的Rest API交互。Cilium Client允许检查本地的Agent状态,它还提供了直接访问eBPF Maps以验证其状态的工具。

5 节点配置

操作系统版本:CentOS Linux release 7.7.1908 (Core)

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

主机名IP地址处理器内存硬盘节点角色
Minkube-kubernetes192.168.4.2324C8G50G 系统盘All in one
  • 内核版本大于4.15
  • 至少8G内存
  • 磁盘至少50G

6 系统优化

主机的优化不单纯只是软硬件的优化,基于操作系统的性能优化也是多方面的,可以从几个方面进行衡量,以更好的提高主机的性能。

6.1 关闭SELinux

SELinux不关闭的情况下无法实现,会限制ssh免密码登录。

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

6.2 关闭防火墙

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

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

6.3 时间同步

同步时间可以有效解决因时间不同而造成的不同步。

[root@localshot  ~]# yum -y install ntp
[root@minikube  ~]# ntpdate ntp1.aliyun.com
[root@minikube  ~]# timedatectl set-timezone Asia/Shanghai

6.4 修改系统打开文件最大数量

放开系统打开文件最大数量,防止因达到上限值而导致的进程终止。

[root@minikube  ~]# vi /etc/security/limits.conf
* soft nofile 65535
* hard nofile 65535

7 升级内核

操作系统CentOS Linux release 7.7.1908 (Core)默认的内核版本为3.10.0不满足本次部署的内核版本最低需求,需要将内核升级到4.15版本及以上。最新版的内核可以在https://www.kernel.org/上找到。

7.1 更新Yum仓库

替换阿里云Yum源,并升级。

[root@minikube  ~]# rm /etc/yum.repos.d/*.repo
[root@minikube  ~]# wget -O \ 
/etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
[root@minikube  ~]# wget -O \
/etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo	
[root@minikube  ~]# yum clean all && yum -y update

7.2 启用elrepo仓库

导入elrepo软件源的GPG公钥以及软件源,可以自动下载最新的软件列表,无需修改地址。

[root@minikube  ~]# rpm --import https://www.elrepo.org/RPM-GPG-KEY-elrepo.org
[root@minikube  ~]# rpm -Uvh http://www.elrepo.org/elrepo-release-7.0-3.el7.elrepo.noarch.rpm

7.3 安装最新版内核

[root@minikube  ~]# yum -y --disablerepo=* --enablerepo=elrepo-kernel install kernel-ml
[root@minikube  ~]# awk -F\' '$1=="menuentry " {print i++ " : " $2}' /etc/grub2.cfg
0 : CentOS Linux (5.14.2-1.el7.elrepo.x86_64) 7 (Core)
1 : CentOS Linux (3.10.0-1062.el7.x86_64) 7 (Core)
2 : CentOS Linux (0-rescue-a079ba97b7ea44e6b30e09b82f929e16) 7 (Core)

7.4 配置Grub配置文件

内核安装完成之后,需要将新内核设置为默认启动选项并重启后才会生效。

[root@minikube  ~]# vi /etc/default/grub
GRUB_TIMEOUT=5
GRUB_DISTRIBUTOR="$(sed 's, release .*$,,g' /etc/system-release)"
GRUB_DEFAULT=0
GRUB_DISABLE_SUBMENU=true
GRUB_TERMINAL_OUTPUT="console"
GRUB_CMDLINE_LINUX="crashkernel=auto rd.lvm.lv=centos/root rd.lvm.lv=centos/swap rhgb quiet"
GRUB_DISABLE_RECOVERY="true"

[root@minikube  ~]# grub2-mkconfig -o /boot/grub2/grub.cfg
Generating grub configuration file ...
Found linux image: /boot/vmlinuz-5.14.2-1.el7.elrepo.x86_64
Found initrd image: /boot/initramfs-5.14.2-1.el7.elrepo.x86_64.img
Found linux image: /boot/vmlinuz-3.10.0-1062.el7.x86_64
Found initrd image: /boot/initramfs-3.10.0-1062.el7.x86_64.img
Found linux image: /boot/vmlinuz-0-rescue-a079ba97b7ea44e6b30e09b82f929e16
Found initrd image: /boot/initramfs-0-rescue-a079ba97b7ea44e6b30e09b82f929e16.img
done

7.5 重启验证

[root@minikube  ~]# reboot
[root@minikube  ~]# uname -r
5.14.2-1.el7.elrepo.x86_64

8 安装环境

MiniKube是一个快速搭建单节点Kubernetes集群的工具,可以在里面创建Pods来创建对应的服务,专注于让Kubernetes易于学习和开发。

8.1 安装Docker

本次部署使用Docker作为驱动,Docker版本要大于18.09。

[root@minikube  ~]# yum install -y yum-utils device-mapper-persistent-data lvm2
[root@minikube  ~]# yum-config-manager\
 --add-repo https://download.docker.com/linux/centos/docker-ce.repo
[root@minikube  ~]# yum install docker-ce docker-ce-cli containerd.io
[root@minikube  ~]# systemctl enable docker
[root@minikube  ~]# systemctl start docker
[root@minikube  ~]# docker -v
Docker version 20.10.8, build 3967b7d

8.2 下载MiniKube

本次部署使用二进制的方式在x86-64 Linux上安装最新MiniKube稳定版本。

[root@minikube  ~]# curl -LO https://storage.googleapis.com//releases/latest/-linux-amd64
[root@minikube  ~]# install -linux-amd64 /usr/local/bin/
[root@minikube  ~]# minikube version
minikube version: v1.23.0
commit: 5931455374810b1bbeb222a9713ae2c756daee10

8.3 启动集群

使用Docker作为驱动程序,将Kubernetes安装到现有的Docker中,避免使用虚拟化。

[root@minikube  ~]# minikube start --driver=docker
[root@minikube  ~]# minikube config set driver docker
[root@minikube  ~]# minikube kubectl -- get po -A
[root@minikube  ~]# kubectl get po -A
命令行展示

9 安装Cilium

使用Cilium的CLI工具在MiniKube上安装Cilium。Cilium将自动检测集群配置并为成功部署的集群选择合适的组件。

9.1 下载Cilium

下载Cilium二进制安装包。

[root@minikube  ~]# curl -LO \
https://github.com/cilium/cilium-cli/releases/latest/download/cilium-linux-amd64.tar.gz
[root@minikube  ~]# tar xzvfC cilium-linux-amd64.tar.gz /usr/local/bin
[root@minikube  ~]# rm cilium-linux-amd64.tar.gz

9.2 安装Cilium

部署完Cilium的集群会将Pods添加到kube-system命名空间。

[root@minikube  ~]# cilium install
Auto-detected Kubernetes kind: 
Running "minikube" validation checks
Detected minikube version "1.23.0"
Cilium version not set, using default version "v1.10.0"
Auto-detected cluster name: 
Auto-detected IPAM mode: cluster-pool
Auto-detected datapath mode: tunnel
Generating CA...
2021/09/27 02:54:44 [INFO] generate received request
2021/09/27 02:54:44 [INFO] received CSR
2021/09/27 02:54:44 [INFO] generating key: ecdsa-256
2021/09/27 02:54:44 [INFO] encoded CSR
Generating certificates for Hubble...
2021/09/27 02:54:44 [INFO] generate received request
2021/09/27 02:54:44 [INFO] received CSR
2021/09/27 02:54:44 [INFO] generating key: ecdsa-256
2021/09/27 02:54:44 [INFO] encoded CSR
Creating Service accounts...
Creating Cluster roles...
Creating ConfigMap...
Creating Agent DaemonSet...
Creating Operator Deployment...
Waiting for Cilium to be installed...

9.3 验证Cilium组件

[root@minikube  ~]# kubectl get pods --namespace=kube-system -l k8s-app=cilium 
命令行展示
[root@minikube  ~]# kubectl get po -A
命令行展示

10 验证集群

创建一个Nginx Deployment并且通过服务暴露其端口来验证Kubernetes-Cilium集群的可用性。

10.1 创建Deployment Nginx

[root@minikube  ~]# kubectl create deployment nginx --image=nginx
deployment.apps/nginx created

10.2 创建Service Nginx

将Deployment Nginx的Service暴露出来。名为Nginx的Pod的Deployment和Service都位于Default命名空间中。

[root@minikube  ~]# kubectl expose deployment nginx --port 80
service/nginx exposed
[root@minikube  ~]# kubectl get svc,pod --namespace=default
命令行展示

10.3 通过Pod访问Nginx

创建一个其他的Pod访问Nginx服务,在Default命名空间中启动一个最小容器访问Nginx。

[root@minikube  ~]# kubectl run busybox --rm -ti --image=busybox /bin/sh
If you don't see a command prompt, try pressing enter.
/ # wget --spider --timeout=1 nginx
Connecting to nginx (10.106.113.251:80)
remote file exists
命令行展示

10.4 创建Service Nginx3

以Deployment方式创建Nginx3 Pod,并将Deployment Nginx3的Service以NodePort方式暴露出来使用浏览器访问。

[root@minikube  ~]# kubectl create deployment nginx3 --image=nginx
[root@minikube  ~]# kubectl expose deployment nginx3 --type=NodePort --port=80
service/nginx exposed
[root@minikube  ~]# kubectl get svc 
命令行展示

10.5 通过浏览器访问Nginx3

通过浏览器访问Nginx3

11 参考资料

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

更多产品信息:AsterNOS

OpenStack+K8s+Ironic网络通信部署方案

1 目标

本文的目标是通过安装配置OpenStack-Ironic和Kuryr-kubernetes组件,实现OpenStack裸机与虚机的共存,以及整合OpenStack和Kubernetes的网络,实现网络的互通。

2 OpenStack-Ironic简介

OpenStack-Ironic与OpenStack-compute都是OpenStack的计算节点,其中Ironic与OpenStack集成提供裸金属管理服务,允许用户像管理虚拟机一样管理裸金属节点,其部署的裸金属节点指没有部署操作系统的物理服务器,相对于虚拟机,裸金属节点具有更强的计算能力、资源独占以及安全隔离等优点。

3 Kuryr-kubernetes简介

Kuryr-Kubernetes是一个用Python编写的OpenStack项目,它作为一个容器网络接口(CNI)插件,通过使用OpenStack Neutron和Octavia为Kubernetes pods提供网络。Kuryr-Kubernetes的主要优点之一是不需要在OpenStack和Kubernetes中使用多个软件定义网络(SDN)进行网络管理。使用Kuryr-kubernetes,能够实现虚机、裸金属和容器网络的统一管理,实现不同计算实体的通信。

4 硬件配置

主机系统网卡1:eno1网卡2:eno2IPMI管理口IPMI信息
Controller/K8s-masterCentos7.6192.168.4.220192.168.5.220  
Compute/K8s-nodeCentos7.6192.168.4.221   
OpenStack-IronicCentos7.6192.168.4.222   
Bare Metal   192.168.5.33ADMIN/tera123

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

  • 2个千兆网口
  • 至少8G内存
  • 磁盘至少40G
  • 计算节点的BISO中开启CPU嵌套虚拟化(INTEL叫VT-x,AMD的叫AMD-V)

5 系统优化

主机的优化不单纯只是软硬件的优化,基于操作系统的性能优化也是多方面的,可以从几个方面进行衡量,以更好的提高主机的性能。

5.1 关闭SELinux(控制节点、计算节点)

SELinux不关闭的情况下无法实现,会限制ssh免密码登录。

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

5.2 关闭防火墙(控制节点、计算节点)

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

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

5.3 时间同步(控制节点、计算节点)

同步时间可以有效解决因时间不同而造成的不同步。

[root@controller  ~]# yum -y install ntp
[root@controller  ~]# ntpdate ntp1.aliyun.com
[root@controller  ~]# timedatectl set-timezone Asia/Shanghai

5.4 修改系统打开文件最大数量(计算节点、控制节点)

放开系统打开文件最大数量,防止因达到上限值而导致的进程终止。

[root@controller  ~]# vi /etc/security/limits.conf
* soft nofile 65535
* hard nofile 65535

5.5 降低Swap分区使用率(控制节点、计算节点)

现在服务器的内存一般是上百GB,所以我们可以把这个参数值设置的低一些(如10-30之间),让操作系统尽可能的使用物理内存,降低系统对swap的使用,从而提高宿主机系统和虚拟机的性能。

[root@controller  ~]# echo 'vm.swappiness=10' >>/etc/sysctl.conf

6 安装Kuryr-kubernetes

6.1 设置主机名,hosts文件(控制节点、计算节点)

控制节点

[root@controller  ~]#hostnamectl set-hostname controller
[root@controller  ~]#echo "controller"> /etc/hostname

计算节点根据节点名称修改

[root@compute  ~]#vim /etc/hosts
192.168.4.220 controller
192.168.4.221 compute

6.2 安装PIP(控制节点、计算节点)

因为在安装的过程会自动升级PIP至最新版本21.0,而PIP21.0在2021年初官方已经停止维护并且不再支持Python2和Python3,所以使用PIP21.0在安装的过程中会发生报错,必须降级安装指定版本PIP20.3.4。

官方链接:https://pip.pypa.io/en/stable/

[root@controller  ~]# wget https://bootstrap.pypa.io/2.7/get-pip.py
[root@controller  ~]# python get-pip.py
[root@controller  ~]# pip -V
pip 20.3.4 from /usr/lib/python2.7/site-packages/pip (python 2.7)

6.3 安装PIP编译环境(控制节点、计算节点)

[root@controller  ~]# yum install -y python-devel libffi-devel gcc openssl-devel libselinux-python

6.4 安装docker repo包(控制节点、计算节点)

[root@controller  ~]# tee /etc/yum.repos.d/docker.repo <<-'EOF'
[dockerrepo]
name=Docker Repository
baseurl=https://yum.dockerproject.org/repo/main/centos/7/
enabled=1
gpgcheck=1
gpgkey=https://yum.dockerproject.org/gpg
EOF
[root@controller  ~]#yum install -y docker-engine docker-engine-selinux

6.5 Git clone Devstack(控制节点、计算节点)

Devstack不允许直接使用Root用户运行,git拉取之后要先创建stack用户。

[root@controller  ~]# yum -y install git
[root@controller  ~]# git clone https://opendev.org/openstack-dev/devstack
[root@controller  ~]# git clone https://opendev.org/openstack/kuryr-kubernetes
[root@controller  ~]# ./devstack/tools/create-stack-user.sh
[root@controller  ~]# sudo su stack

6.6 修改配置文件(控制节点、计算节点)

修改各组件用户密码。

[root@controller  ~]# cp kuryr-kubernetes/devstack/local.conf.sample devstack/local.conf 
[root@controller  ~]# cat devstack/local.conf
# Credentials
ADMIN_PASSWORD=tera123
DATABASE_PASSWORD=tera123
RABBIT_PASSWORD=tera123
SERVICE_PASSWORD=tera123
SERVICE_TOKEN=tera123
# Enable Keystone v3
IDENTITY_API_VERSION=3
# In pro of speed and being lightweight, we will be explicit in regards to
# which services we enable
SERVICE_HOST=192.168.4.220
MYSQL_HOST=192.168.4.220
RABBIT_HOST=192.168.4.220
GLANCE_HOSTPORT=192.168.4.220:9292
Q_HOST=192.168.4.220
KEYSTONE_AUTH_HOST=192.168.4.220
KEYSTONE_SERVICE_HOST=192.168.4.220
CEILOMETER_BACKEND=mongodb
DATABASE_TYPE=mysql
ENABLED_SERVICES=n-cpu,n-net,n-api-meta,c-vol

6.7 Git clone拉取超时(控制节点、计算节点)

官方给出的Devstack脚本在安装的过程中Git clone是通过https加密获取的,可能会发生超时的问题,需要通过修改stackrc这个文件解决。

[root@controller  ~]# vi devstack/stackrc
BASE=${GIT_BASE:-http://opendev.org}
CINDER_REPO=${CINDER_REPO:-${GIT_BASE}/openstack/cinder.git}
CINDER_BRANCH=${CINDER_BRANCH:-$TARGET_BRANCH}
# image catalog service
GLANCE_REPO=${GLANCE_REPO:-${GIT_BASE}/openstack/glance.git}
GLANCE_BRANCH=${GLANCE_BRANCH:-$TARGET_BRANCH}
# django powered web control panel for openstack
HORIZON_REPO=${HORIZON_REPO:-${GIT_BASE}/openstack/horizon.git}
HORIZON_BRANCH=${HORIZON_BRANCH:-$TARGET_BRANCH}
# unified auth system (manages accounts/tokens)
KEYSTONE_REPO=${KEYSTONE_REPO:-${GIT_BASE}/openstack/keystone.git}
KEYSTONE_BRANCH=${KEYSTONE_BRANCH:-$TARGET_BRANCH}
# neutron service
NEUTRON_REPO=${NEUTRON_REPO:-${GIT_BASE}/openstack/neutron.git}
NEUTRON_BRANCH=${NEUTRON_BRANCH:-$TARGET_BRANCH}
# compute service
NOVA_REPO=${NOVA_REPO:-${GIT_BASE}/openstack/nova.git}
NOVA_BRANCH=${NOVA_BRANCH:-$TARGET_BRANCH}
# object storage service
SWIFT_REPO=${SWIFT_REPO:-${GIT_BASE}/openstack/swift.git}
SWIFT_BRANCH=${SWIFT_BRANCH:-$TARGET_BRANCH}
PLACEMENT_REPO=${PLACEMENT_REPO:-${GIT_BASE}/openstack/placement.git}
PLACEMENT_BRANCH=${PLACEMENT_BRANCH:-$TARGET_BRANCH}

6.8 软件包Timeout

在安装etcd等组件时,可能会发生Timeout等报错,这是因为网络问题需要手动wget到本地。

[root@controller  ~]#wget -c https://github.com/coreos/etcd/releases/download/v3.1.10/etcd-v3.1.10-linux-amd64.tar.gz

6.9 PIP not found

做软链接到stack用户的bin目录下。

[root@controller  ~]# which pip
/usr/local/bin/pip
[root@controller  ~]# ln -s /usr/local/bin/pip /opt/stack/.vnc/bin/

6.10 修改脚本所支持的Linux版本

修改Devstack脚本支持的Linux版本,官方给出的Devstack不支持Centos7.6,只支持Centos8,需要手动添加Linux rhel7。

[root@controller  ~]# vi devstack/stack.sh
SUPPORTED_DISTROS="bionic|focal|f31|f32|opensuse-15.2|opensuse-tumbleweed|rhel8|rhel7"
if [[ ! ${DISTRO} =~ $SUPPORTED_DISTROS ]]; then
    echo "WARNING: this script has not been tested on $DISTRO"
    if [[ "$FORCE" != "yes" ]]; then
        die $LINENO "If you wish to run this script anyway run with FORCE=yes"
    fi
fi

6.11 执行Devstack脚本

执行Devsyack安装脚本,脚本执行完成后会输出安装信息以及操作系统的版本信息。

[root@controller  ~]# ./devstack/stack.sh
DevStack Component Timing
 (times are in seconds)  
=========================
run_process           28
test_with_retry         4
apt-get-update         17
async_wait             0
osc                   482
wait_for_service        14
dbsync                77
pip_install             98
apt-get                9
-------------------------
Unaccounted time      951
=========================
Total runtime        1680
This is your host IP address: 192.168.4.220
This is your host IPv6 address: ::1
Keystone is serving at http://192.168.4.220/identity/
The default users are: admin and demo
The password: tera123
Services are running under systemd unit files.
For more information see: 
https://docs.openstack.org/devstack/latest/systemd.html
DevStack Version: wallaby
Change: 83821a11ac1d6738b63cb10878b8aaa02e153374 Merge "Address feedback from glance-remote patch" 2021-03-23 16:56:21 +0000
OS Version: CentOS Linux release 7.8.2003 (Core)

7 配置OpenStack-ironic

7.1 上传Deploy Images(控制节点)

镜像通过disk-image-create命令构建。

[root@controller  ~]# glance image-create --name deploy-vmlinuz --visibility public --disk-format aki --container-format aki < coreos_production_pxe.vmlinuz
[root@controller ~]# glance image-create --name deploy-initrd --visibility public --disk-format ari --container-format ari < coreos_production_pxe_image-oem.cpio.gz
[root@controller ~]# glance image-create --name my-image.vmlinuz --visibility public --disk-format aki --container-format aki < my-image.vmlinuz
[root@controller ~]# glance image-create --name my-image.initrd --visibility public --disk-format ari --container-format ari < my-image.initrd
[root@controller ~]# export MY_VMLINUZ_UUID=$(openstack image list | awk '/my-image.vmlinuz/ { print $2 }')
[root@controller ~]# export MY_INITRD_UUID=$(openstack image list | awk '/my-image.initrd/ { print $2 }')
[root@controller ~]# glance image-create --name my-image --visibility \
public --disk-format qcow2 --container-format bare --property \
kernel_id=$MY_VMLINUZ_UUID --property ramdisk_id=$MY_INITRD_UUID < my-image.qcow2

7.2 创建Ironic Node(控制节点)

创建一个执行 IPMI 的 Ironic Node。

[root@controller ~]# export IRONIC_API_VERSION=1.11
[root@controller ~]# export OS_BAREMETAL_API_VERSION=1.11
[root@controller ~]# openstack baremetal node create --driver ipmi --name node1

7.3 设备部署接口类型(控制节点)

设置部署接口类型,现在可支持ISCSI、Direct、Ansible等类型。

[root@controller ~]# openstack baremetal node list
设置部署接口类型
[root@controller ~]# openstack baremetal --os-baremetal-api-version 1.31 \
node set c83162c6-748f-4c90-840b-d5e07df83c97  \ 
--deploy-interface iscsi      --raid-interface agent

7.4 设置IPMI Info(控制节点)

这里主要配置IPMI的登录账户信息。

[root@controller ~]# openstack baremetal node set c83162c6-748f-4c90-840b-d5e07df83c97 \
                   --driver-info ipmi_username=ADMIN \
                   --driver-info ipmi_password=tera123 \
                   --driver-info ipmi_address=192.168.5.33

7.5 设置Deploy Images(控制节点)

通过RAMDisk的方式启动。

[root@controller ~]# openstack baremetal node set c83162c6-748f-4c90-840b-d5e07df83c97 \
                   --driver-info deploy_kernel=fcce4694-3955-40c8-be2f-c5ba890071ec \
                   --driver-info deploy_ramdisk= 0fbd622c-bb9e-4729-8cab-f2aae07a5814

7.6 设置Provisioning/Cleaning Network(控制节点)

[root@controller ~]# openstack baremetal node set c83162c6-748f-4c90-840b-d5e07df83c97 \
                   --driver-info cleaning_network= 3793d3bd-5a26-4dd2-a637-007b8ed7c2b0 \
--driver-info provisioning_network= 3793d3bd-5a26-4dd2-a637-007b8ed7c2b0

7.7 设置PXE网卡MAC地址(控制节点)

在Provisioning网络中通过这个MAC地址为Node分配IP地址。

[root@controller ~]# openstack baremetal port create ac:1f:6b:da:d9:c0 \
 --node c83162c6-748f-4c90-840b-d5e07df83c97

7.8 配置Resource Class(控制节点)

为Ironic node设置Placement筛选候选人的Resource Class类型,Nova-compute for Ironic会自动为其创建Placement Resource Provider。

[root@controller ~]# openstack --os-baremetal-api-version 1.21 baremetal node set c83162c6-748f-4c90-840b-d5e07df83c97 --resource-class BAREMETAL_TEST

7.9 设置Ironic Node基础信息(控制节点)

[root@controller ~]# openstack baremetal node set c83162c6-748f-4c90-840b-d5e07df83c97 \
--property cpus=48 --property memory_mb=131072 --property local_gb=1000
[root@controller ~]# openstack baremetal node set c83162c6-748f-4c90-840b-d5e07df83c97 \
--property capabilities='boot_mode:bios'

7.10 验证Ironic Node纳管(控制节点)

[root@controller ~]# openstack baremetal --os-baremetal-api-version 1.11 node manage c83162c6-748f-4c90-840b-d5e07df83c97
[root@controller ~]# openstack baremetal --os-baremetal-api-version 1.11 node provide c83162c6-748f-4c90-840b-d5e07df83c97
[root@controller ~]# openstack baremetal node show c83162c6-748f-4c90-840b-d5e07df83c97\
| grep provision_state
| provision_state        | available

7.11 创建实例Flavor(控制节点)

[root@controller ~]# openstack flavor create --ram 131072 --vcpus 48 --disk 100 my-baremetal-flavor
[root@controller ~]# openstack flavor set --property resources:CUSTOM_BAREMETAL_TEST=1 my-
baremetal-flavor
[root@controller ~]# openstack flavor set --property resources:VCPU=0 my-baremetal-flavor 
[root@controller ~]# openstack flavor set --property resources:MEMORY_MB=0 my-baremetal-flavor 
[root@controller ~]# openstack flavor set --property resources:DISK_GB=0 my-baremetal-flavor

8 实例部署

8.1 部署Baremetal Node(控制节点)

[root@controller ~]# openstack server create --flavor my-baremetal-flavor \ 
--nic net-id=3793d3bd-5a26-4dd2-a637-007b8ed7c2b0 \
--image 08e111be-d256-4c43-bb07-ea65a1219f77 Bare

8.2 部署VM(控制节点)

[root@controller ~]# openstack server create –flavor my-vm-flavor\ 
--nic net-id=38795737-afc4-4ecf-b023-434ee4e327f9 \
--image fd697710-f267-429e-8bdd-62870f86291e VM

8.3 部署Pod(控制节点)

[root@controller ~]# kubect create deployment demo --image=celebdor/kuryr-demo
Deployment “demo” created
[root@controller ~]# kubectl scale deploy/demo --deplices=2
deployment.apps/demo scaled

8.4 验证部署结果(控制节点)

[root@controller ~]# openstack server list
 openstack server list
[root@controller ~]# kubectl get pod -o wide 
kubectl get pod -o wide
[root@controller ~]# openstack port list |awk '/10.0.0.106|10.0.0.109/'
openstack port list

9 验证通信

9.1 Pod与Pod(控制节点)

[root@controller ~]# kubect create deployment demo --image=celebdor/kuryr-demo
Deployment “demo” created
[root@controller ~]# kubectl scale deploy/demo --deplices=2
deployment.apps/demo scaled
[root@controller ~]# kubectl exec -it demo-cdb8599db-blv8j -- ping 10.0.0.109
 Pod与Pod(控制节点)

9.2 Pod与VM(控制节点)

[root@controller ~]# kubectl exec -it demo-cdb8599db-blv8j -- ping 10.0.0.49
Pod与VM(控制节点)

9.3 Pod与Bare Metal(控制节点)    

[root@controller ~]# kubectl exec -it demo-cdb8599db-blv8j -- ping 192.168.4.8
Pod与Bare Metal(控制节点)    

10 参考资料

更多内容请参考:A-Lab

OpenStack-Helm部署方案——AIO模式

1 目标

本文档以Ubuntu 18为基础操作环境,简要介绍OpenStack-Helm项目的基本概念,以及以All in one模式部署的具体方法。

2 概要介绍

OpenStack项目各组件本已纷繁复杂,再使用Kubernetes去部署承载OpenStack的各组件就更加复杂了。而Helm最大的优势就是对Kubernetes复杂应用的管理,Helm就相当于Linux的包管理工具YUM,只是它管理的“程序包”是一些互相耦合、打包后的YAML配置文件与资源文件。使用一个更容理解的类比,即在Kubernetes中使用Helm来部署管理Chart,就相当于在安卓手机中使用应用商店来安装管理APP。

Helm相关组件、概念以及原理:

Helm包含两个重要组件,分别是Helm客户端和Tiller服务器。

  • Helm是一个命令行工具,用于本地开发及管理Chart、Chart仓库等;
  • Tiller是Helm的服务端。Tiller负责接收Helm的请求,与K8S的 APIServer进行交互,根据Chart来生成 Release并管理Release的整个生命周期;
  • ChartHelm的打包格式叫做Chart,所谓Chart就是一系列配置文件, 它描述了一组相关的K8S集群资源;
  • Release使用helm install命令在Kubernetes集群中部署的Chart称为Release;
  • RepoistoryHelm Chart的仓库,Helm客户端通过HTTP协议来访问仓库中Chart的索引文件和压缩包。

下图描述了Helm的几个关键组件Helm、Tiller、Repository、Chart之间的关系以及它们之间的工作流程。

Helm的关键组件

OpenStack-Helm这个项目最主要的工作就是进行OpenStack各组件的Chart开发,将各个组件封装为不同的Chart,在运维OpenStack的过程中,不再管理具体的程序进程、容器或者是K8S的Pod,而是直接管理更粗粒度的Release,以尽可能降低OpenStack在K8S上的部署、运维的复杂度。

3 环境准备

3.1 系统版本

  • 操作系统:Ubuntu 18.04.5 LTS (bionic);

3.2 节点配置与部署模式

主机名IP地址处理器内存硬盘节点角色
noone-virtual-machine192.168.2.233 管理口16C32G200G 系统盘All in one
表3.1:各节点配置与角色

为了OpenStack-Helm项目的快速部署、验证与研究,本次部署采用AIO(All in one)模式,因此需要注意的是,若要安装所有的功能模块至少保证服务器的内存资源不小于16G,否则可能会导致部署失败。

3.3 实施部署前的环境准备

进行实施部署前的环境准备工作,包括系统基础环境和网络代理配置。

  • 配置Sudo免密:
noone@noone-virtual-machine:~$ chmod +w /etc/sudoers
noone@noone-virtual-machine:~$ sudo vim /etc/sudoers
noone@noone-virtual-machine:~$ sudo cat /etc/sudoers
#
# This file MUST be edited with the 'visudo' command as root.
#
# Please consider adding local content in /etc/sudoers.d/ instead of
# directly modifying this file.
#
# See the man page for details on how to write a sudoers file.
#
Defaults	env_reset
Defaults	mail_badpass
Defaults	secure_path="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/snap/bin"

# Host alias specification

# User alias specification

# Cmnd alias specification

# User privilege specification
root	ALL=(ALL:ALL) ALL

# Members of the admin group may gain root privileges
%admin ALL=(ALL) ALL

# Allow members of group sudo to execute any command
%sudo	ALL=(ALL:ALL) ALL

# See sudoers(5) for more information on "#include" directives:
noone	ALL=(ALL) NOPASSWD:ALL

#includedir /etc/sudoers.d
noone@noone-virtual-machine:~$
  • 配置Ubuntu的软件源列表、更新系统中的软件包:
noone@noone-virtual-machine:~$ cd /etc/apt/
noone@noone-virtual-machine:/etc/apt$ cat sources.list
deb http://mirrors.163.com/ubuntu/ bionic main restricted universe multiverse
deb http://mirrors.163.com/ubuntu/ bionic-security main restricted universe multiverse
deb http://mirrors.163.com/ubuntu/ bionic-updates main restricted universe multiverse
deb http://mirrors.163.com/ubuntu/ bionic-proposed main restricted universe multiverse
deb http://mirrors.163.com/ubuntu/ bionic-backports main restricted universe multiverse
deb-src http://mirrors.163.com/ubuntu/ bionic main restricted universe multiverse
deb-src http://mirrors.163.com/ubuntu/ bionic-security main restricted universe multiverse
deb-src http://mirrors.163.com/ubuntu/ bionic-updates main restricted universe multiverse
deb-src http://mirrors.163.com/ubuntu/ bionic-proposed main restricted universe multiverse
deb-src http://mirrors.163.com/ubuntu/ bionic-backports main restricted universe multiverse
noone@noone-virtual-machine:/etc/apt$ sudo apt update
noone@noone-virtual-machine:/etc/apt$ sudo apt upgrade
  • 安装Git工具,拉取项目文件:
noone@noone-virtual-machine:~$ mkdir openstack
noone@noone-virtual-machine:~/openstack$ sudo apt-get install git
noone@noone-virtual-machine:~/openstack$ vim git-clone-helm.sh
noone@noone-virtual-machine:~/openstack$ cat git-clone-helm.sh
#!/bin/bash
set -xe

git clone https://opendev.org/openstack/openstack-helm-infra.git
git clone https://opendev.org/openstack/openstack-helm.git
noone@noone-virtual-machine:~/openstack$ bash git-clone-helm.sh
  • 安装配置代理工具,用于代理终端命令行工具产生的流量(Docker镜像拉取):

安装代理软件:

noone@noone-virtual-machine:~$ sudo apt install privoxy

编辑代理软件的配置文件:

noone@noone-virtual-machine:~$ sudo vim /etc/privoxy/config
......
#      Suppose you are running Privoxy on an IPv6-capable machine and
#      you want it to listen on the IPv6 address of the loopback
#      device:
#
#        listen-address [::1]:8118
#
listen-address  127.0.0.1:8118
listen-address  [::1]:8118
#
......
#      To chain Privoxy and Tor, both running on the same system, you
#      would use something like:
#
#        forward-socks5t   /               127.0.0.1:9050 .
#
注释:
此处的配置,将本地转发到8118端口的流量,转发到192.168.0.60:10808,此接口是局域网中代理软件提供的
forward-socks5 / 192.168.0.60:10808 .
#
#      Note that if you got Tor through one of the bundles, you may
#      have to change the port from 9050 to 9150 (or even another
#      one). For details, please check the documentation on the Tor
#      website.
#
#      The public Tor network can't be used to reach your local
#      network, if you need to access local servers you therefore
#      might want to make some exceptions:
#
#        forward         192.168.*.*/     .
#        forward            10.*.*.*/     .
#        forward           127.*.*.*/     .
#
forward         192.168.*.*/     .
forward            10.*.*.*/     .
forward           127.*.*.*/     .
forward           172.24.*.*/    .
#
......
#  Examples:
#
#      forwarded-connect-retries 1
#
forwarded-connect-retries  1
#
......

重启代理软件并设置为开机自启:

noone@noone-virtual-machine:~$ sudo systemctl enable privoxy
noone@noone-virtual-machine:~$ sudo systemctl restart privoxy

在.bashrc文件末尾追加环境变量配置,使得命令行工具产生的流量转发给Privoxy软件进行处理:

noone@noone-virtual-machine:~$ vim ~/.bashrc 
export ftp_proxy="127.0.0.1:8118"
export http_proxy="127.0.0.1:8118"
export https_proxy="127.0.0.1:8118"
export no_proxy="localhost,127.0.0.1,10.0.0.0/8,172.16.0.0/12,172.24.0.0/12,192.168.0.0/16,172.17.0.1,
.svc.cluster.local"

命令行工具流量代理的效果测试:

noone@noone-virtual-machine:/tmp$ wget www.google.com
--2021-03-24 10:21:45--  http://www.google.com/
Connecting to 127.0.0.1:8118... connected.
Proxy request sent, awaiting response... 200 OK
Length: 12823 (13K) [text/html]
Saving to: ‘index.html’

index.html                                                  100%[=====>]  12.52K  --.-KB/s    in 0s      

2021-03-24 10:21:47 (187 MB/s) - ‘index.html’ saved [12823/12823]

noone@noone-virtual-machine:/tmp$
  • 修改NSSwitch配置文件指定行:
noone@noone-virtual-machine:~$ cat /etc/nsswitch.conf 
# /etc/nsswitch.conf
#
# Example configuration of GNU Name Service Switch functionality.
# If you have the `glibc-doc-reference' and `info' packages installed, try:
# `info libc "Name Service Switch"' for information about this file.
……

hosts:          files dns

……
noone@noone-virtual-machine:~$

4 安装步骤

此次为AIO模式部署,因此所有的OpenStack组件的容器都部署在同一节点,由于网络环境影响,即使配置了代理也会经常有网络抖动、中断,因此在执行脚本过程中若因网络导致失败,可以多重复执行几次。工作目录如下:

noone@noone-virtual-machine:~$ cd openstack/openstack-helm
noone@noone-virtual-machine:~/openstack/openstack-helm$ pwd
/home/noone/openstack/openstack-helm

4.1 部署Kubernetes、Helm

./tools/deployment/developer/common/010-deploy-k8s.sh
./tools/deployment/developer/common/020-setup-client.sh

4.2 部署Ingress Controller

./tools/deployment/component/common/ingress.sh

4.3 部署NFS Provisioner

./tools/deployment/developer/nfs/040-nfs-provisioner.sh

4.4 部署MariaDB

./tools/deployment/developer/nfs/050-mariadb.sh

4.5 部署RabbitMQ

./tools/deployment/developer/nfs/060-rabbitmq.sh

4.6 部署Memcached

./tools/deployment/developer/nfs/070-memcached.sh

4.7 部署Keystone

编辑此脚本文件,注释掉replace_variables函数的所有调用:

/home/noone/openstack/openstack-helm/tools/deployment/common/get-values-overrides.sh

然后,再执行相关脚本:

./tools/deployment/developer/nfs/080-keystone.sh

4.8 部署Heat

./tools/deployment/developer/nfs/090-heat.sh

4.9 部署Horizon

./tools/deployment/developer/nfs/100-horizon.sh

4.10 部署Glance

./tools/deployment/developer/nfs/120-glance.sh

4.11 部署OpenvSwitch

./tools/deployment/developer/nfs/140-openvswitch.sh

4.12 部署Libvirt

./tools/deployment/developer/nfs/150-libvirt.sh

4.13 部署Compute Kit (Nova and Neutron)

./tools/deployment/developer/nfs/160-compute-kit.sh

4.14 配置外部网络访问网关

./tools/deployment/developer/nfs/170-setup-gateway.sh

4.15 部署结果验证

确保各个OpenStack组件的Pod都达到预期状态,如果有部分容器启动失败,可以借助Kuboard进一步调试。

noone@noone-virtual-machine:~/openstack/openstack-helm$ kubectl -n openstack get deployment
NAME                          READY   UP-TO-DATE   AVAILABLE   AGE
glance-api                    1/1     1            1           8d
glance-registry                1/1     1            1           8d
heat-api                      1/1     1            1           9d
heat-cfn                      1/1     1            1           9d
heat-engine                   1/1     1            1           9d
horizon                       1/1     1            1           9d
ingress                       1/1     1            1           9d
ingress-error-pages            1/1     1            1           9d
keystone-api                  1/1     1            1           9d
mariadb-ingress               2/2     2            2           9d
mariadb-ingress-error-pages    1/1     1            1           9d
memcached-memcached       1/1     1            1           9d
neutron-server                 1/1     1            1           8d
nova-api-metadata             1/1     1            1           8d
nova-api-osapi                 1/1     1            1           8d	
nova-conductor                1/1     1            1           8d
nova-consoleauth              1/1     1            1           8d
nova-novncproxy               1/1     1            1           8d
nova-scheduler                1/1     1            1           8d
placement-api                 1/1     1            1           8d
noone@noone-virtual-machine:~/openstack/openstack-helm$

在确认各个容器启动成功后,使用Ingress提供的URL访问OpenStack Horizon。

noone@noone-virtual-machine:~/openstack/openstack-helm$ kubectl -n openstack get ingress
……
horizon        <none>        horizon,horizon.openstack,horizon.openstack.svc.cluster.local
……
OpenStack Horizon的Web界面

为进一步确保OpenStack基础功能运行正常,创建两台虚拟机,进行通讯测试。

创建两台虚拟机进行通讯测试
测试结果

成功创建了两台虚拟机,虚拟机可以正常启动,并在使用VxLAN网络创建的VPC下成功互通,结果符合预期。

5 Kubernetes可视化管理面板安装

在整个部署过程中,会产生各种意料之外的容器错误,为了方便排错,安装可视化管理面板进行日志分析错误定位。

noone@noone-virtual-machine:~/openstack$ vim deploy-kuboard.sh
noone@noone-virtual-machine:~/openstack$ cat deploy-kuboard.sh
#!/bin/bash

sudo docker run -d \
  --restart=unless-stopped \
  --name=kuboard \
  -p 10080:80/tcp \
  -p 10081:10081/udp \
  -p 10081:10081/tcp \
  -e KUBOARD_ENDPOINT="http://192.168.2.233:10080" \
  -e KUBOARD_AGENT_SERVER_UDP_PORT="10081" \
  -e KUBOARD_AGENT_SERVER_TCP_PORT="10081" \
  -v /root/kuboard-data:/data \
  eipwork/kuboard:v3
# 国内可以使用镜像 swr.cn-east-2.myhuaweicloud.com/kuboard/kuboard:v3 ,以更快地完成下载
# 请不要使用 127.0.0.1 或者 localhost 作为内网 IP,默认用户名密码:admin/Kuboard123
noone@noone-virtual-machine:~/openstack$ bash deploy-kuboard.sh

待所有Kuboard容器正常启动后,使用默认用户名密码进行登录,界面如下图所示,集群导入管理等操作不再赘述。

Kubernetes多集群管理登录界面
集群导入管理

6 参考资料

【1】 OpenStack-Helm Document

【2】 External DNS to FQDN/Ingress

【3】 Privoxy在Ubuntu-18中的安装与配置

【4】 Fix(script): removes replacement overrides

更多内容请参考:A-Lab

Harbor容器镜像仓库高可用方案

1 Harbor简介

Docker容器应用的开发和运行离不开可靠的镜像管理,Docker官方提供了原生的Registry,但其功能比较简单,而且没有可视化界面,自然无法满足企业级的需求。虽然Docker官方也提供了公共的镜像仓库,但是从安全和效率等方面考虑,部署私有环境内的Registry也是非常必要的。

为了解决以上需求,VMware公司推出了Harbor,Harbor 是为企业用户设计的容器镜像仓库开源项目,包括了权限管理(RBAC)、LDAP、安全漏洞扫描、镜像验真、管理界面、自我注册、HA 等企业必需的功能。

2 Harbor架构图

Harbor架构图

3 Harbor必要组件

  • Proxy:用于转发用户的请求到后端的反向代理,通过Nginx官方镜像实现
  • Registry:原生的Docker镜像仓库,负责存储镜像文件,实现Pull/Push等功能
  • Database:保存项目/用户/角色/复制策略等信息到数据中,这里使用的镜像是Postgres数据库,而不是传统的Mariadb/Mysql
  • Core Service:提供图形化操作界面,帮助用户管理Registry上的镜像,并对用户进行授权
  • Job Services:镜像复制,用户可以配置在Harbor实例之间进行镜像的复制和同步等操作
  • Log Collector:日志收集,负责收集各个镜像的日志进行统一管理

4 Harbor虚机配置

主机系统IP地址节点角色
Harbor-1Centos7.6192.168.4.200Master
Harbor-2Centos7.6192.168.4.201Worker

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

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

5 系统优化

主机的优化不单纯只是软硬件的优化,基于操作系统的性能优化也是多方面的,可以从几个方面进行衡量,以更好的提高主机的性能。

5.1 关闭SELinux(Master、Worker)

SELinux不关闭的情况下无法实现,会限制ssh免密码登录。

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

5.2 关闭防火墙(Master、Worker)

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

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

5.3 时间同步(Master、Worker)

同步时间可以有效解决因时间不同而造成的不同步。

[root@harbor ~]# yum -y install ntp
[root@harbor ~]# ntpdate ntp1.aliyun.com
[root@harbor ~]# timedatectl set-timezone Asia/Shanghai

5.4 修改系统打开文件最大数量(Master、Worker)

放开系统打开文件最大数量,防止因达到上限值而导致的进程终止。

[root@harbor ~]# vi /etc/security/limits.conf
* soft nofile 65535
* hard nofile 65535

6 环境准备

两台机器需要事先安装好Docker、Docker-compose,并且将Harbor安装脚本下载到本地。

6.1 安装Docker(Master、Worker)

添加Docker Yum源,安装Docker组件。

[root@harbor ~]# yum install -y yum-utils
[root@harbor ~]# yum-config-manager --add-repo \
               https://download.docker.com/linux/centos/docker-ce.repo
[root@harbor ~]# yum -y install docker-ce docker-ce-cli containerd.io
[root@harbor ~]# systemctl start docker
[root@harbor ~]# systemctl enable docker

6.2 下载Harbor离线安装包(Master、Worker)

在Github下载离线安装包:https://github.com/goharbor/harbor/releases(推荐使用迅雷下载)

下载离线安装包

7 部署Harbor

7.1 配置Harbor(Master、Worker)

将下载的Harbor压缩包上传到Master和Woker节点,修改Harbor配置文件。

[root@harbor ~]# tar -zxvf harbor-offline-installer-v2.0.2.tgz
[root@harbor ~]# cd harbor
[root@harbor harbor]# cp harbor.yml.tmpl  harbor.tml
[root@harbor harbor]# vi harbor.yml
# 修改为当前所在节点的ip
hostname: 192.168.4.200
# 登录界面的密码
harbor_admin_password: tera123
# harbor的版本号
_version: 2.0.2
# 将https相关的配置给注释掉,这里为了简单只使用http,而且也可以在nginx那一层去做https
#https related config
# https:
#  https port for harbor, default is 443
#  port: 443
#  The path of cert and key files for nginx
#  certificate: /your/certificate/path
#  private_key: /your/private/key/path

7.2 安装Harbor(Master、Worker)

准备好配置文件后,安装docker-compose,因为Harbor的安装脚本基于docker-compose去安装的。

[root@harbor harbor]# curl -L \
 "https://github.com/docker/compose/releases/download/1.26.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
[root@harbor harbor]# chmod 755 /usr/local/bin/docker-compose
[root@harbor harbor]# ./install.sh

7.3 访问Harbor

安装完成之后,使用浏览器访问Harbor,可以进入登录页面。默认账户admin。

进入登录页面
项目界面

8 Harbor高可用方案

本次采用的高可用方案是Harbor的主备复制,需要两个Harbor节点。Master和Worker之间能够互相复制,然后通过Nginx代理Harbor Master节点提供外部访问。这里采用的高可用方案是分钟级的,主要是通过Nginx代理Master节点,当Master节点挂掉后手动的修改Nginx配置文件去代理另一个可用节点。

高可用方案一般选用开源的Keepalived+Nginx,而本次方案并没有采用Keepalived的原因主要有两个:

  • 我们的虚机是部署在OpenStack上的,云环境基本无法使用Keepalived,云服务商一般也不支持自定义外网可访问的虚拟IP,当然部署在内网物理服务器上是可以使用Keepalived的。
  • 两个Harbor节点之间的同步是存在延时的,而且镜像通常都比较大,所以这个延迟会非常的明显。一般镜像推送完马上就会调度拉取,所以这个延迟时间一般是不可接受的。如果让Nginx代理两个节点就会出现一会请求A一会请求B的问题,造成镜像Pull/Push不成功。但由于Harbor是给公司内部的开发人员使用,通常可以允许分钟级别的不可用。

9 Harbor高可用部署

Harbor在部署好之后组件中包含了Nginx并且占用了宿主机的80端口,我们通过修改Harbor安装脚本的YAML文件来修改Nginx占用宿主机端口,并且拉取新的Nginx容器反向代理Master节点。Master节点和Worker节点之间配置主从复制,以达到Harbor分钟级高可用的目的。

9.1 删除Harbor容器(Master)

强制删除Master节点创建的所有Harbor容器,容器在创建之前已经做了文件夹的映射,数据不会丢失。

[root@harbor harbor]# docker rm -f `docker ps  |awk '{print $1}' |grep -v CON`

9.2 修改部署文件(Master)

修改YAML文件中Proxy组件Nginx服务的端口映射。

[root@harbor harbor]# vi docker-compose.yml
  proxy:
    image: goharbor/nginx-photon:v2.0.2
    container_name: nginx
    restart: always
    cap_drop:
      - ALL
    cap_add:
      - CHOWN
      - SETGID
      - SETUID
      - NET_BIND_SERVICE
    volumes:
      - ./common/config/nginx:/etc/nginx:z
      - type: bind
        source: ./common/config/shared/trust-certificates
        target: /harbor_cust_cert
    networks:
      - harbor
    dns_search: .
    ports:
      - 8888:8080
    depends_on:
      - registry
      - core
      - portal
      - log
    logging:
      driver: "syslog"
      options:
        syslog-address: "tcp://127.0.0.1:1514"
        tag: "proxy"

9.3 重新部署Harbor容器(Master)

手动使用docker-compose重新部署Harbor容器,不能使用安装脚本部署。

[root@harbor harbor]# docker-compose up -d

9.4 部署Nginx反向代理(Master)

[root@harbor ~]# mkdir nginx
[root@harbor ~]# cd nginx
[root@harbor nginx]# vi nginx.conf
user nginx;
worker_processes 2;
error_log /var/log/nginx/error.log warn;
pid /var/run/nginx.pid;
events {
    worker_connections 1024;
}
stream {
    upstream hub{
        server 192.168.4.200:8888;
    }
    server {
        listen 80;
        proxy_pass hub;
        proxy_timeout 300s;
        proxy_connect_timeout 5s;
    }
} 
[root@harbor nginx]# docker run -itd --net=host --name harbor-nginx \
 -v /root/nginx/nginx.conf:/etc/nginx/nginx.conf nginx

9.5 配置Harbor节点主从复制

浏览器登录Harbor,配置Harbor节点之间的复制功能,使两个节点能够同步镜像数据。

首先到Master节点的”仓库管理”界面中创建一个新的目标,目标是Worker节点。

创建一个新的目标

然后到”复制管理”界面中新建复制规则。

新建复制规则

10 验证

搭建好Harbor之后,测试能否正常使用。将默认的Library项目删除掉,然后创建新的项目。

10.1 创建项目

填写项目名称、访问级别以及项目仓库的存储容量。

新建项目

10.2 Pull/Push镜像(Master、Worker)

在服务器上测试镜像的Pull和Push。由于搭建的私有仓库默认是不受Docker信任的,所以需要修改配置文件让Docker信任该Registry。

[root@harbor ~]# vi /etc/docker/daemon.json
{
  "insecure-registries": ["192.168.4.200"]
}
[root@harbor ~]# systemctl restart docker
[root@harbor ~]# docker login 192.168.4.200
Username: admin
Password: 
Login Succeeded
[root@harbor ~]# docker tag nginx:latest 192.168.4.200/asterfusion/nginx:latest
[root@harbor ~]# docker push nginx:latest 192.168.4.200/asterfusion/nginx:latest

11 Harbor权限管理

11.1 创建用户

在Harbor管理页面创建用户,并且填写相关信息。创建完成之后可以选择设置用户为管理员,之后就可以通过登录此用户来配置管理Harbor。

创建用户
设置管理员

11.2    登录用户拉取镜像

使用刚创建的用户登录,拉取镜像会失败。因为Harbor的权限管理机制,没有经过授权无法随意拉取镜像,我们需要将创建的用户添加到镜像仓库中去,才可以拉取镜像。

[root@harbor ~]# docker login 192.168.4.200
Username: asterfusion
Password: 
Login Succeeded
[root@harbor ~]# docker pull \
192.168.4.200/asterfusion/redis@sha256:2510920e4faef376509a41bbfe58ea62f3e3e1c0dbcfca579581909b279ebaaa
Trying to pull repository 192.168.4.200/asterfusion/redis ... 
unauthorized: unauthorized to access repository: asterfusion/redis, action: pull: unauthorized to access repository: asterfusion/redis, action: pull

11.3    镜像仓库添加用户

在镜像仓库中添加新用户,并且选择用户的角色,在这里我们需要对镜像作Push和Pull操作。

新建成员

11.4    验证

[root@harbor ~]# docker login 192.168.4.200
Username: asterfusion
Password: 
Login Succeeded
[root@harbor ~]# docker pull\
192.168.4.200/asterfusion/redis@sha256:2510920e4faef376509a41bbfe58ea62f3e3e1c0dbcfca579581909b279ebaaa
Trying to pull repository 192.168.4.200/asterfusion/redis ... 
sha256:2510920e4faef376509a41bbfe58ea62f3e3e1c0dbcfca579581909b279ebaaa: Pulling from 192.168.4.200/asterfusion/redis
07cd1d2c25e7: Pull complete 
4319f9523628: Pull complete 
286473b88c0c: Pull complete 
d42081d9071a: Pull complete 
f945dcaa9608: Pull complete 
Digest: sha256:2510920e4faef376509a41bbfe58ea62f3e3e1c0dbcfca579581909b279ebaaa
Status: Downloaded newer image for     
 192.168.4.200/asterfusion/redis@sha256:2510920e4faef376509a41bbfe58ea62f3e3e1c0dbcfca579581909b279ebaaa

12 Harbor镜像漏洞扫描

镜像安全是容器化建设中一个很重要的环节,在Harbor中集成了开源项目Clair的扫描功能,可以帮助用户发现容器镜像中的安全漏洞,及时采取防范措施。

12.1 添加扫描模块(Master)

[root@harbor harbor]# ./prepare –with-clair
[root@harbor harbor]# docker-compose -f docker-compose.yml up -d

12.2 新建扫描器

在审查服务中新建扫描器。

编辑扫描器

12.3 测试扫描

编辑好定时规则之后,我们可以手动进行漏洞扫描

漏洞扫描

12.4 查看扫描结果

可以看到我们的测试镜像中有一个发现了漏洞,通过日志可以看到具体的ERROR信息。

查看扫描结果
日志信息

13 参考文献

Harbor官方文档:https://goharbor.io/docs/2.0.0/install-config/

Docker官方文档:https://docs.docker.com/engine/install/centos/

GitHub仓库地址:https://github.com/goharbor/harbor/wiki

更多内容请参考:A-Lab

Rancher-Kubernetes容器化部署方案

1 Rancher简介

Rancher是一套容器管理平台,它可以帮助组织在生产环境中轻松快捷的部署和管理容器。 Rancher可以轻松地管理各种环境的Kubernetes,满足IT需求并为DevOps团队提供支持。

Kubernetes手动部署非常复杂,Rancher容器化部署相对来说比较简单,并且Rancher支持Web端管理Kubernetes,而Kubernetes原生的Dashboard只提供监控。

2 Kubernetes简介

Kubernetes已成为容器集群管理标准,通过YAML文件来管理配置应用程序容器和其他资源。Kubernetes执行诸如调度,扩展,服务发现,健康检查,密文管理和配置管理等功能。

3 组件

  一个Rancher-Kubernetes集群由多个节点组成:

  • Etcd database:通常在一个节点上运行一个etcd实例,存储K8s中IP地址等信息
  • Rancher-server:Rancher管理平台,用户通过Rancher Web端配置K8s集群
  • Master nodes:K8s主节点是无状态的,用于运行API Server,调度服务和控制器服务
  • Worker nodes:K8s工作负载节点,运行容器

4 Rancher-K8s对比源码K8s

优点:

  • 采用图形化方式:易用的Web管理界面,在Docker易用性的基础上,再一次降低了使用容器技术部署容器应用的难度
  • 支持多种调度器:通过环境模板,很容易地创建和部署Swarm、K8S容器集群管理调度平台
  • 管理主机集群:管理对象是多台主机的集群,而不仅仅是单台容器主机,创建和管理几台、几十台应用服务器集群,只需要复制粘贴就解决了
  • 内置应用商店:使用其中的应用模板,创建一个WordPress博客系统,只需点点鼠标,部署简单
  • 资源弹性分配内置应用负载均衡器,“服务”最小只需1个容器实例,当负载不够/或过剩时,只需点点鼠标,增加/减少“服务”中容器的实例数,即可解决问题,应用系统具有天生的弹性扩容能力。

缺点:

  • K8S部署的问题由于国内网络和国外网络访问的问题,在国内部署K8S集群,有点不方便
  • 应用商店的问题默认的Rancher官方认证和社区贡献的应用商店内容有限,应用还不够丰富,基本上都是网络和存储等基础的应用;个别应用部署后,无法通过相同的操作,再部署同样的另一套应用,比如Rancher NFS
  • 故障拍错的问题:因为Rancher-K8s是一键打包部署好的,组件容器化,如果遇到问题会为排障带来很大的困难

5 环境准备

本次部署三台Server,一台作为Rancher-server,一台作为Master,另一台为Worker节点。服务器具体配置如下:

  • 1个千兆网口
  • 至少8G内存
  • 磁盘至少40G
  • Rancher-server:192.168.4.210
  • Master:192.168.4.211
  • Worker:192.168.4.212

6 部署过程

6.1 关闭SELinux 【所有节点】

SeLinux不关闭会发生无法访问的情况。

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

6.2 关闭防火墙【所有节点】

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

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

6.3 设置主机名【所有节点】

Rancher-server。

[root@localhost ~]# hostname rancher
[root@localhost ~]# echo “rancher” > /etc/hostname

Master

[root@localhost ~]# hostname master
[root@localhost ~]# echo “master” > /etc/hostname

Worker

[root@localhost ~]# hostname worker
[root@localhost ~]# echo “worker” > /etc/hostname

6.4 安装Git【Rancher节点】

安装Git拉取GitHub文件。

[root@localhost  ~]# yum -y install epel-release
[root@localhost  ~]# yum -y install git
[root@localhost  ~]# git clone https://github.com/yx464050145/Ansible-Rancher.git

6.5 安装Ansible【Rancher节点】

Rancher使用Ansible脚本自动化安装,并且修改Ansible配置文件。

[root@localhost  ~]# yum -y install ansible
[root@localhost  ~]# vi /etc/ansible/ansible.cfg
[defaults]
host_key_checking = False

6.6 修改Rancher-ansible配置文件【Rancher节点】

[root@localhost  ~]# vi /root/Ansible-Rancher/inventory/hosts
[rancher]
192.168.4.210 ansible_ssh_user='root' ansible_ssh_pass='tera123'   
[master]
192.168.4.211 ansible_ssh_user='root' ansible_ssh_pass='tera123'
[worker]
192.168.4.212 ansible_ssh_user='root' ansible_ssh_pass='tera123'

[root@localhost  ~]# vi /root/Ansible-Rancher/rancher_server/vars/main.yml
# defaults file for rancher
rancher_name: 'rancher_server'
rancher_port: 80
rancher_image: rancher/rancher:stable
rancher_data: /var/rancher
rancher_ssl_ports: 443
rancher_url: https://192.168.4.210
rancher_admin_password: "tera123"
validate_certs: false

[root@localhost  ~]# vi /root/Ansible-Rancher/rancher_master/vars/main.yml
# defaults file for rancher
rancher_url: https://192.168.4.210
rancher_admin_password: "tera123"
validate_certs: false
rancher_network_provider: "calico"
rancher_cluster_name: asterfusion
rancher_master_role: "--etcd --controlplane"
rancher_project_name: "asterfusion"

[root@localhost  ~]# vi /root/Ansible-Rancher/rancher_worker/vars/main.yml
rancher_url: "https://192.168.4.210"
rancher_admin_password: "tera123"
validate_certs: false
rancher_network_provider: "calico"
rancher_cluster_name: asterfusion
rancher_worker_role: "--worker"

6.7 Ansible-playbook部署Rancher集群【Rancher节点】

[root@localhost  ~]# cd /root/Ansible-Rancher
[root@localhost  ~]# ansible-playbook -i inventory/hosts rancher.yml

6.8 Rancher Web

Rancher Web

6.9 Rancher K8s集群

图中可以看出K8s集群部署完成,Master上部署了etcd、control,Worker部署容器。

K8s集群部署

6.10 部署Pod

  • 名称:Pod名字(必填)
  • Docker镜像:容器镜像(必填)
  • 端口映射:端口映射规则和网络模式,如果不需要外网访问可以不填(选填)
  • 类型:Pod类型(必填)

下图Nginx Pod已经部署好了

Nginx Pod部署

6.11 Kubelet命令行

Kubelet命令行

6.12 报错问题

部署过程中如果速度太慢并且报错,是因为网络原因导致拉取镜像失败或者超时。可以选择拷贝镜像到各个节点中免去拉取镜像的过程。在部署完成后耐心等待所有容器组件状态正常才可部署Pod。

7 参考资料

  1. Rancher官网:https://rancher.com/docs/rancher/v2.x/en
  2. Kubernetes官网:https://kubernetes.io/

更多内容请参考:A-Lab

OpenStack Zun部署方案

1 目标与物理网络拓扑

本文主要描述在现有OpenStack(rocky版)平台上如何扩展安装Zun功能组件,实现容器管理服务。

涉及物理拓扑,如图1所示:

物理拓扑
图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
2Server-1计算节点+存储节点
Server-2 控制节点+网络节点
表2:硬件环境

软件版本备注
操作系统Centos7.6安装时选择Compute Node 模式,根目录/至少500G
OpenStackRocky 
表3:软件环境

3 Zun简介

Zun是OpenStack容器服务。它旨在为运行应用程序容器提供API服务,而无需管理服务器或集群。

它集成了Neutron、Cinder、Keystone等核心OpenStack服务,实现了 容器的快速普及。通过这种方式,OpenStack的所有原始网络、存储和识别验证工具都应用于容器系统,使容器能够满足安全性和合规性要求。

目前,OpenStack拥有以下支持容器技术的主流解决方案:

  • Nova Docker驱动程序

该解决方案将容器作为VM运行。添加Nova Docker驱动程序以执行与常规VM类似的操作, 以启动、停止或创建Docker容器。由于Docker和VM之间的差异,这种操作模式将禁用容器的许多功能,例如容器相关和端口映射。

  • Magnum

Magnum是一个OpenStack服务,提供容器集群部署功能。Magnum通过Heat部署VM和裸金属,形成集群,然后调用COE接口完成容器的部署。在Magnum成立之初,该项目以“容器即服务”(CaaS)为目标。在以后的开发过程中,Magnum的大部分功能都集中在容器的集群部署上。

  • Zun

Zun将容器作为一种OpenStack资源进行管理,并集成了OpenStack的其他服务,为用户提供统一、简化的API。用户可以通过API创建和管理容器,而不需要考虑不同容器技术之间的差异。

集成OpenStack服务的优点是用户可以借助OpenStack的现有功能扩展容器的功能。例如,默认情况下,Zun容器可以使用Neutron分配的IP地址,并可以使用Keystone提供的身份验证服务。使用Zun和Neutron,用户可以在Nova实例所在的隔离网络环境中创建容器。VM的Neutron功能(安全组、QoS)也可用于Zun容器。在实际业务中,经常有需要长时间保存数据的场景。常用方法是使用外部服务为容器提供持久卷。Zun通过与OpenStack Cinder 集成解决了这个问题。创建容器时,用户可以选择将Cinder卷安装到容器中。Cinder卷可以是租户中现有的或新创建的卷。每个卷都将绑定到容器文件系统路径,并且将保留该路径下存储的数据。对于编排,与提供内置编排的其他容器平台不同,Zun使用外部编排系统来实现此目的,例如Heat和Kubernetes。借助外部编排工具,最终用户可以使用该工具提供的DSL来定义容器化应用程序。使用Heat,用户还可以定义由容器资源和OpenStack资源组成的资源,例如Neutron负载均衡器、浮动IP、Nova实例等。

Zun和Kubernetes是互补的。事实上,Zun社区正在积极推动与Kubenetes的整合。目前,Zun与COE的整合工作主要集中在Kubenetes上,这将使容器更易于部署、管理和扩展。但是,在OpenStack上使用Kubernetes仍然需要用户手动部署底层基础设施,例如虚拟服务器集群。用户负责初始容量规划,例如确定VM集群的大小和维护正在运行的VM集群。

无服务器容器技术或解决方案(如AWS Fargate、Azure Container Instance(ACI)和 OpenStack Zun)的出现为在云上运行容器提供了可行的替代方案。无服务器方法允许用户按需运行容器,而无需事先创建或管理自己的集群。

Zun将使用Kubernetes作为业务流程层,Kubernetes将使用OpenStack Zun提供“无服务器”容器。

Zun提出了Container和Capsule的概念。Container负责集成Docker或其他容器引擎技术。 Capsule的概念有点像Kubernetes Pod,它代表一组容器。Capsule用于对需要彼此紧密合作 以实现服务目标的多个容器进行分组。

Zun不准备实现COE提供的许多高级功能(例如容器保持活动、负载均衡),而是专注于提供基本容器操作(CRUD)并保持与OpenStack的紧密集成。

与Nova Docker驱动程序比较,Zun旨在解决Nova Docker驱动程序解决方案的问题。它独立于Nova实现了Docker的部署调度框架,并与Glance、Neutron、Cinder和其他组件集成,但没有实现Container Orchestration Engines(COE)的部署调度。Nova-docker通过 Nova API访问容器,Zun不受Nova API的限制。

与Magnum相比,Zun和Magnum之间的区别在于Zun专注于提供用于管理容器的API,而 Magnum提供部署和管理容器编排引擎(COE)的API。

Zun 的 基 本 架 构 的 基 本 架 构 以下Zun架构图很好地说明了Zun和OpenStack组件之间的关系。

Zun架构图
图2: Zun架构图

解释:

  • Zun API:处理REST请求和检查输入参数
  • Zun Compute:资源调度和容器管理
  • Keystone:OpenStack的认证组件
  • Neutron:为容器提供网络
  • Glance:存储docker镜像(如果不使用glance,可以使用DockerHub)
  • Kuryr:连接容器网络和Neutron的插件

4 安装步骤

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

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

4.1   创建数据库

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

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

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

  • 在安装和配置Zun之前,必须创建用户、服务凭据和API端点:
[root@controller ~]#source admin-openrc
[root@controller ~]#openstack user create --domain default --password-prompt zun
[root@controller ~]#openstack role add --project service --user zun admin
[root@controller ~]#openstack service create --name zun \
--description "Container Service" container
[root@controller ~]#openstack endpoint create --region RegionOne \
container public http://controller:9517/v1
[root@controller ~]#openstack endpoint create --region RegionOne \
container internal http://controller:9517/v1
[root@controller ~]#openstack endpoint create --region RegionOne \
container admin http://controller:9517/v1

4.3 在controller节点上添加kuryr-libnetwork用户

  • 创建kuryr用户
[root@controller ~]#source admin-openrc
[root@controller ~]#openstack user create --domain default --password-prompt kuryr
  • 添加角色
[root@controller ~]#openstack role add --project service --user kuryr admin

4.4 在compute节点安装kuryr-libnetwork

kuryr-libnetwork是运行在Libnetwork框架下的一个plugin。Libnetwork定义了一个灵活的模型,使用local或者remotedriver来向container提供网络服务。kuryr-libnetwork就是Libnetwork的一个remotedriver实现。

kuryr-libnetwork主要实现了两个功能:NetworkDriver和IPAMDriver。

  • 添加内核参数
[root@compute ~]# vi /etc/sysctl.conf
net.ipv4.ip_forward = 1 
[root@compute ~]#sysctl -p
net.ipv4.ip_forward = 1
  • 安装启动docker
[root@compute ~]# yum -y install yum-utils 
[root@compute ~]# yum-config-manager --add-repo \
https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo 
[root@compute ~]#yum install docker-ce
[root@compute ~]# systemctl enable docker
[root@compute ~]#systemctl start docker
  • 创建用户
[root@controller ~]#groupadd --system kuryr
[root@controller ~]#useradd --home-dir "/var/lib/kuryr" --create-home --system --shell /bin/false -g kuryr kuryr
  • 创建目录
[root@controller ~]#mkdir -p /etc/kuryr
[root@controller ~]#chown kuryr:kuryr /etc/kuryr
  • 安装kuryr-libnetwork
[root@compute ~]#cd /var/lib/kuryr
[root@compute ~]#git clone -b stable/rocky https://opendev.org/openstack/kuryr-libnetwork.git
[root@compute ~]#chown -R kuryr:kuryr kuryr-libnetwork
[root@compute ~]#cd kuryr-libnetwork
[root@compute ~]#pip install -r requirements.txt 
[root@compute ~]#python setup.py install
  • 生成示例配置文件
[root@compute ~]# su -s /bin/sh -c "./tools/generate_config_file_samples.sh" kuryr
[root@compute ~]# su -s /bin/sh -c "cp etc/kuryr.conf.sample /etc/kuryr/kuryr.conf" kuryr
  • 编辑配置文件,添加以下内容
[root@compute ~]#vi /etc/kuryr/kuryr.conf
[DEFAULT]
bindir = /usr/libexec/kuryr
[neutron]
www_authenticate_uri = http://controller:5000
auth_url = http://controller:5000 
username = kuryr
user_domain_name = default
password = kuryr
project_name = service
project_domain_name = default
auth_type = password
  • 创建启动文件
[root@compute ~]#vi /etc/systemd/system/kuryr-libnetwork.service
[Unit]
Description = Kuryr-libnetwork - Docker network plugin for Neutron

[Service]
ExecStart = /usr/bin/kuryr-server --config-file /etc/kuryr/kuryr.conf
CapabilityBoundingSet = CAP_NET_ADMIN

[Install]
WantedBy = multi-user.target
  • 启动服务
[root@compute ~]#systemctl enable kuryr-libnetwork
[root@compute ~]#systemctl start kuryr-libnetwork
[root@compute ~]#systemctl restart docker

4.5   在controller节点上安装zun服务

  • 创建用户、组:
[root@controller ~]#groupadd --system zun
[root@controller ~]#useradd --home-dir "/var/lib/zun"  \
--create-home \
--system  \
--shell /bin/false  \
-g zun  \
zun
  •  创建目录
[root@controller ~]#mkdir -p /etc/zun
[root@controller ~]# chown zun:zun /etc/zun
  • 安装zun
[root@controller ~]# yum install python-pip git python-devel libffi-devel gcc git
[root@controller ~]#cd /var/lib/zun
[root@controller ~]#git clone -b stable/rocky  https://opendev.org/openstack/zun.git
[root@controller ~]#chown -R zun:zun zun
[root@controller ~]#cd zun
[root@controller ~]#pip install pbr --no-index -f file:///var/lib/zun/zun/base/
[root@controller ~]# pip install -r requirements.txt 
[root@controller ~]# python setup.py install
[root@compute ~]#pip install zun==2.1.0
  • 生成示例配置文件
[root@controller ~]#su -s /bin/sh -c "oslo-config-generator --config-file etc/zun/zun-config-generator.conf" zun
[root@controller ~]#su -s /bin/sh -c "cp etc/zun/zun.conf.sample /etc/zun/zun.conf" zun
  • 复制api-paste.ini配置文件
[root@controller ~]#su -s /bin/sh -c "cp etc/zun/api-paste.ini /etc/zun" zun
  • 编辑配置文件
[root@controller ~]#vi /etc/zun/zun.conf
[DEFAULT]
transport_url = rabbit://openstack:tera123@controller
log_dir = /var/log/zun
[api]
Host_ip = 192.168.4.144
port = 9517
[database]
connection = mysql+pymysql://zun:ZUN_PASS@controller/zun
[keystone_auth]
memcached_servers = controller:11211
www_authenticate_uri = http://controller:5000
project_domain_name = default
project_name = service
user_domain_name = default
password = zun
username = zun
auth_url = http://controller:5000
auth_type = password
auth_version = v3
auth_protocol = http
service_token_roles_required = True
endpoint_type = internalURL
[keystone_authtoken]
memcached_servers = controller:11211
www_authenticate_uri = http://controller:5000
project_domain_name = default
project_name = service
user_domain_name = default
password = zun
username = zun
auth_url = http://controller:5000
auth_type = password
auth_version = v3
auth_protocol = http
service_token_roles_required = True
endpoint_type = internalURL
[oslo_concurrency]
lock_path = /var/lib/zun/tmp
[oslo_messaging_notifications]
driver = messaging
[websocket_proxy]
wsproxy_host = 192.168.4.144
wsproxy_port = 6784
  • 创建日志目录
[root@controller ~]#mkdir -p /var/log/zun
[root@controller ~]#chown zun:zun -R /var/log/zun
  • 填充数据库
[root@controller ~]#su -s /bin/sh -c "zun-db-manage upgrade" zun
  • 创建启动文件
[root@controller ~]#vi /etc/systemd/system/zun-api.service
[Unit]
Description = OpenStack Container Service API

[Service]
ExecStart = /usr/bin/zun-api
User = zun

[Install]
WantedBy = multi-user.target

[root@controller ~]# vi /etc/systemd/system/zun-wsproxy.service
[Unit]
Description = OpenStack Container Service Websocket Proxy

[Service]
ExecStart = /usr/bin/zun-wsproxy
User = zun

[Install]
WantedBy = multi-user.target
  • 启动服务
[root@controller ~]# systemctl enable zun-api  zun-wsproxy
[root@controller ~]# systemctl start zun-api  zun-wsproxy
[root@controller ~]# systemctl status zun-api  zun-wsproxy

4.6 在compute节点上安装zun服务

  • 创建用户、组:
[root@compute ~]#groupadd --system zun
[root@compute ~]#useradd --home-dir "/var/lib/zun"  \
--create-home \
--system  \
--shell /bin/false  \
-g zun  \
zun
  •  创建目录
[root@compute ~]#mkdir -p /etc/zun
[root@compute ~]#chown zun:zun /etc/zun
  • 安装zun
[root@compute ~]# yum install python-pip git python-devel libffi-devel gcc numactl  
[root@compute ~]#cd /var/lib/zun
[root@compute ~]#git clone -b stable/rocky https://opendev.org/openstack/zun.git 
[root@compute ~]#chown -R zun:zun zun
[root@compute ~]#cd zun
[root@compute ~]#pip install -r requirements.txt
[root@compute ~]#python setup.py install
[root@compute ~]#pip install zun==2.1.0
  • 生成示例配置文件
[root@compute ~]#su -s /bin/sh -c "oslo-config-generator --config-file etc/zun/zun-config-generator.conf" zun
[root@compute ~]#su -s /bin/sh -c "cp etc/zun/zun.conf.sample /etc/zun/zun.conf" zun
[root@compute ~]#su -s /bin/sh -c "cp etc/zun/rootwrap.conf /etc/zun/rootwrap.conf" zun
[root@compute ~]#su -s /bin/sh -c "mkdir -p /etc/zun/rootwrap.d" zun
[root@compute ~]#su -s /bin/sh -c "cp etc/zun/rootwrap.d/* /etc/zun/rootwrap.d/" zun
  • 配置zun用户
[root@compute ~]#echo "zun ALL=(root) NOPASSWD: /usr/local/bin/zun-rootwrap /etc/zun/rootwrap.conf *" | sudo tee /etc/sudoers.d/zun-rootwrap
  • 编辑配置文件
[root@compute ~]#vi /etc/zun/zun.conf
[DEFAULT]
transport_url = rabbit://openstack: tera123@controller
state_path = /var/lib/zun
log_dir = /var/log/zun
[database]
connection = mysql+pymysql://zun:ZUN_PASS@controller/zun
[keystone_auth]
memcached_servers = controller:11211
www_authenticate_uri = http://controller:5000
project_domain_name = default
project_name = service
user_domain_name = default
password = zun
username = zun
auth_url = http://controller:5000
auth_type = password
auth_version = v3
auth_protocol = http
service_token_roles_required = True
endpoint_type = internalURL
[keystone_authtoken]
memcached_servers = controller:11211
www_authenticate_uri= http://controller:5000
project_domain_name = default
project_name = service
user_domain_name = default
password = zun
username = zun
auth_url = http://controller:5000
auth_type = password
[websocket_proxy]
base_url = ws://controller:6784/
[oslo_concurrency]
lock_path = /var/lib/zun/tmp

注意:如果想把容器和实例都运行在这台计算节点上,上面的配置文件要添加这项配置

[compute]

host_shared_with_nova = true

  • 创建日志目录
[root@controller ~]#mkdir -p /var/log/zun
[root@controller ~]#chown zun:zun -R /var/log/zun
  • 配置docker和kury

创建docker配置文件夹

[root@compute ~]#mkdir -p /etc/systemd/system/docker.service.d

创建docker配置文件

[root@compute ~]# vi /etc/systemd/system/docker.service.d/docker.conf
[Service]
ExecStart=
ExecStart=/usr/bin/dockerd --group zun -H tcp://compute:2375 -H unix:///var/run/docker.sock --cluster-store etcd://controller:2379

重启docker

[root@compute ~]#systemctl daemon-reload
[root@compute ~]#systemctl restart docker

编辑kuryr配置文件

[root@compute ~]#mkdir -p /etc/kuryr
[root@compute ~]#vi  /etc/kuryr/kuryr.conf
[DEFAULT]
capability_scope = global
process_external_connectivity = False

重启kuryr

[root@compute ~]#systemctl restart kuryr-libnetwork
  • 配置containerd

生成containerd配置文件

[root@compute ~]# containerd config default > /etc/containerd/config.toml

编辑容器配置文件

将[grpc]项目中的gid配成zun用户的组id

[root@compute ~]#vi /etc/containerd/config.toml
[grpc]
  ...
  gid = ZUN_GROUP_ID

说明:获取用户组id的方法

getent group zun | cut -d: -f3

重启containerd

[root@compute ~]#systemctl restart containerd
  • 创建启动文件
[root@compute ~]#vi /etc/systemd/system/zun-compute.service
[Unit]
Description = OpenStack Container Service Compute Agent

[Service]
ExecStart = /usr/bin/zun-compute
User = zun

[Install]
WantedBy = multi-user.target
  • 启动zun-compute
[root@compute ~]#systemctl enable zun-compute 
[root@compute ~]#systemctl start zun-compute 
[root@compute ~]#systemctl status zun-compute

4.7 在controller节点安装zun-ui

  • 安装zun-ui
[root@controller ~]#pip install zun-ui==2.0.0
  • 复制文件
[root@controller ~]#cd /usr/lib/python2.7/site-packages/zun_ui
[root@controller ~]#cp enabled/*  \
 /usr/share/openstack-dashboard/openstack_dashboard/local/enabled/
  • 重启服务
[root@controller ~]#systemctl restart httpd memcached

5 结果验证

在compute节点创建kuryr网络及创建容器

  • 创建kuryr网络
[root@controller ~]#docker network create --driver kuryr --ipam-driver kuryr --subnet 10.10.0.0/16 --gateway=10.10.0.1  test_net
  • 查看网络
[root@controller ~]#docker network ls
  • 创建容器
[root@controller ~]#docker run --net test_net cirros ifconfig

在controller节点验证

  • 准备验证
[root@controller ~]# pip install python-zunclient
[root@controller ~]#source admin-openrc
  • 查看网络
[root@controller ~]#openstack network list
  • 获取网络id
[root@controller ~]#export NET_ID=$(openstack network list | awk '/ selfservice / { print $2 }')
  • 创建容器
[root@controller ~]#openstack appcontainer run --name container --net network=$NET_ID cirros ping 8.8.8.8
  • 查看容器列表
[root@controller ~]#openstack appcontainer list
  • 执行sh命令
[root@controller ~]#openstack appcontainer exec --interactive container /bin/sh
  • 停止容器
[root@controller ~]#openstack appcontainer stop container
  • 删除容器
[root@controller ~]#openstack appcontainer delete container

6 参考资料

更多内容请参考:A-Lab

对星融元产品感兴趣?

立即联系!

返回顶部

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