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

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

A-lab-云网络, A-lab-部署验证

对星融元产品感兴趣?

立即联系!

返回顶部

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