5G核心网手把手教你将Open5gs托管到k8s(KubeSphere)

Posted 从善若水

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了5G核心网手把手教你将Open5gs托管到k8s(KubeSphere)相关的知识,希望对你有一定的参考价值。

博主未授权任何人或组织机构转载博主任何原创文章,感谢各位对原创的支持!
博主链接

本人就职于国际知名终端厂商,负责modem芯片研发。
在5G早期负责终端数据业务层、核心网相关的开发工作,目前牵头6G算力网络技术标准研究。


博客内容主要围绕:
       5G/6G协议讲解
       算力网络讲解(云计算,边缘计算,端计算)
       高级C语言讲解
       Rust语言讲解



open5gs托管到k8s(KubeSphere)


演示环境准备

我们总共需要使用三个Ubuntu20.04虚拟机,每个虚拟机至少要有40G的磁盘空间,其中一个作为主节点,另外两个作为工作节点。同时我们这边并没有直接使用k8s,而是使用一个开源的基于k8s开发的管理编排软件kubesphere来托管open5gs。

主机名角色网口名(必须是eth0,否则需要修改open5gs Helm项目)
mastercontrol plane, etcdeth0
node1workereth0
node2workereth0

修改Ubuntu虚拟机网卡名字

sudo vim /etc/default/grub

在GRUB_CMDLINE_LINUX添加 “net.ifnames=0 biosdevname=0”。保存退出后,执行下面的命令

sudo update-grup
reboot

kubesphere官网链接

我们使用的open5gs镜像来自Docker Hub

Docker Hub官网链接

使用的open5gs镜像如下图:


我们这边没有去自己写open5gs的k8s配置文件,我使用了OpenVerso开源项目,这里包含整个open5gs每个网元的配置文件,整个项目是基于Helm构建。

项目传送门


搭建NFs持久化存储

master节点执行下面的命令,

sudo apt-get install nfs-server -y
sudo mkdir /open5gs
sudo chmod 777 /open5gs/

配置nfs参数,执行下面的命令,

sudo vim /etc/exports

添加下面的命令,

# /etc/exports: the access control list for filesystems which may be exported
#               to NFS clients.  See exports(5).
#
# Example for NFSv2 and NFSv3:
# /srv/homes       hostname1(rw,sync,no_subtree_check) hostname2(ro,sync,no_subtree_check)
#
# Example for NFSv4:
# /srv/nfs4        gss/krb5i(rw,sync,fsid=0,crossmnt,no_subtree_check)
# /srv/nfs4/homes  gss/krb5i(rw,sync,no_subtree_check)
#

/open5gs *(rw,sync,no_root_squash,no_subtree_check)

重启nfs-server

sudo systemctl restart nfs-server.service 

我们在Slave1上执行下面的命令,看看我们的NFS是否创建成功,

showmount -e 192.168.21.137

如果创建成功就会看到下面的内容(我们创建的NFS路径为/open5gs),


如果上面的命令执行失败,则安装下面的库之后重新执行,

sudo apt install nfs-common

重启后,将我们NFS挂载到其它节点上,在slave1slave2上分别执行下面的命令,

sudo apt install nfs-common
sudo mkdir /open5gs
sudo mount 192.168.21.137:/open5gs /open5gs/

安装Kubesphere

首先我们需要保证我们三台Ubuntu虚拟机可以通过SSH相互访问,下面是我三台Ubuntu虚拟机的IP地址信息:

虚拟机nameIP地址
master192.168.21.137
slave1192.168.21.139
slave2192.168.21.141

我尝试ssh访问slave1发现被拒了,

这个问题在于我们没有在工作节点上安装ssh服务,分别在slave1和slave2上执行下面的命令安装ssh server,

sudo apt-get install openssh-server -y

安装完成之后master可以ssh连接到slave1,

之后我们还需要在三台Ubuntu上安装一些依赖库,执行下面的命令,

sudo apt-get install curl openssl tar socat conntrack ebtables ipset -y

现在我们正式开始安装kubesphere,首先我们在master节点上下载kubesphere的命令工具kubekey

export KKZONE=cn
curl -sfL https://get-kk.kubesphere.io | VERSION=v2.2.2 sh -

然后在master节点上生成一个默认配置文件,

./kk create config --with-kubernetes --with-kubesphere  -f open5gs.yaml

使用vim命令打开open5gs.yaml配置文件,修改文件内容,

apiVersion: kubekey.kubesphere.io/v1alpha2
kind: Cluster
metadata:
  name: sample
spec:
  hosts:
  - name: master, address: 192.168.21.137, internalAddress: 192.168.21.137, user: pu, password: "123"
  - name: node1, address: 192.168.21.139, internalAddress: 192.168.21.139, user: pu, password: "123"
  - name: node2, address: 192.168.21.141, internalAddress: 192.168.21.141, user: pu, password: "123"
  roleGroups:
    etcd:
    - master
    control-plane:
    - master
    worker:
    - node1
    - node2
  controlPlaneEndpoint:
    ## Internal loadbalancer for apiservers 
    # internalLoadbalancer: haproxy

    domain: lb.kubesphere.local
    address: ""
    port: 6443
  kubernetes:
    version: --with-kubesphere
    clusterName: cluster.local
    autoRenewCerts: true
    containerManager:
  etcd:
    type: kubekey
  network:
    plugin: calico
    kubePodsCIDR: 10.233.64.0/18
    kubeServiceCIDR: 10.233.0.0/18
    ## multus support. https://github.com/k8snetworkplumbingwg/multus-cni
    multusCNI:
      enabled: false
  registry:
    privateRegistry: ""
    namespaceOverride: ""
    registryMirrors: []
    insecureRegistries: []
  addons: 
  - name: nfs-client
    namespace: kube-system
    sources:
      chart:
        name: nfs-client-provisioner
        repo: https://charts.kubesphere.io/main
        values:
        - storageClass.defaultClass=false
        - nfs.server=192.168.21.137
        - nfs.path=/open5gs
  

👆关于上面的每个参数的含义:
hosts 中列出您的所有机器并添加详细信息

参数名字含义
name实例的主机名
address任务机和其他实例通过 SSH 相互连接所使用的 IP 地址。根据您的环境,可以是公有 IP 地址或私有 IP 地址。例如,一些云平台为每个实例提供一个公有 IP 地址,用于通过 SSH 访问。在这种情况下,您可以在该字段填入这个公有 IP 地址
internalAddress实例的私有 IP 地址

此外,您必须提供用于连接至每台实例的登录信息,以下示例供您参考:
使用密码登录示例:

hosts:
 #端口 22 是 SSH 的默认端口,因此您无需将它添加至该 YAML 文件中。否则,您需要在 IP 地址后添加对应端口号,如上所示。
 - name: master, address: 192.168.0.2, internalAddress: 192.168.0.2, port: 8022, user: ubuntu, password: Testing123

默认 root 用户示例:

hosts:
 - name: master, address: 192.168.0.2, internalAddress: 192.168.0.2, password: Testing123

使用 SSH 密钥的无密码登录示例:

hosts:
 - name: master, address: 192.168.0.2, internalAddress: 192.168.0.2, privateKeyPath: "~/.ssh/id_rsa"

在 ARM 设备上安装的示例:

hosts:
 - name: master, address: 192.168.0.2, internalAddress: 192.168.0.2, user: ubuntu, password: Testing123, arch: arm64

roleGroups

参数名字含义
etcdetcd 节点名称
control-plane主节点名称
worker工作节点名称

addons
您可以在 open5gs.yaml 的 addons 字段下指定存储,从而自定义持久化存储插件,例如 NFS 客户端、Ceph RBD、GlusterFS 等。
KubeSphere 会默认安装 OpenEBS,为开发和测试环境配置 LocalPV,方便新用户使用。在本多节点安装示例中,使用了默认存储类型(本地存储卷)。对于生产环境,您可以使用 Ceph/GlusterFS/CSI 或者商业存储产品作为持久化存储解决方案。
各种持久化配置参考方案示例

开始安装k8s、kubesphere以及构建集群,在master节点输入下面的命令,

./kk create cluster --with-kubesphere -f open5gs.yaml

安装时间大约10~20分钟。当显示下面的信息,则表示安装成功:

登录进来后选择平台管理集群管理节点集群节点

我们在Kubesphere上创建一个项目open5gs,之后将Helm项目安装在这里。点击平台管理集群管理项目下的创建:

点击确定完成创建,


安装open5gs-2.0.5

从git仓库下载open5gs 2.0.5 版本,点击下载

下载后进行解压和安装,

tar xvf open5gs-2.0.5.tgz
cd open5gs/
helm install ngc ./ -n open5gs

现在open5gs所有的网元已经都部署到kubesphere上了,如下图:

取决于网速和虚拟机能力,上面容器部署时间可能较长。

开放核心网数据库配置接口

我们都知道,open5gs有一个webui的子模块,用来注册用户信息。当前的项目中webui只能在本地节点访问,无法在部署节点外的节点访问,我们现在配置其可被外部节点访问。

点击平台管理集群管理项目open5gs服务ngc-webui,将显示下面的内容

点击更多操作编辑外部访问,设置访问模式为NodePort

修改之后我们会看到,新增了一个NodePort端口号,

我们查询一下当前webui所在的节点IP地址,

之后你就可以使用http://NodeIP:NodePort的方式访问核心网数据库了。效果如下,

因为这一节的内容是后加的,所以节点名和节点IP地址与上面的描述有一些差异。



以上是关于5G核心网手把手教你将Open5gs托管到k8s(KubeSphere)的主要内容,如果未能解决你的问题,请参考以下文章

5G核心网手把手教你将Open5gs托管到k8s(KubeSphere)

5GS开源5G核心网(Open5GS)架构详解

5GC开源5G核心网(Open5GS)架构详解

手把手教你将H5游戏打包为快游戏

手把手教你将项目迁移到Flutter2.0 空安全

智能设备远程运维 ,手把手教你将设备日志发送到远程服务器