昨天看了一天论文,好多都是使用OSM这个框架作为上层解析意图的,ONOS作为下层部署的,先试一试吧,能不能搭建成功,这次就是边写边搭建了

OSM平台搭建

简介

OSM的官网如下:

https://osm.etsi.org/

OSM is developing an open source Management and Orchestration (MANO) stack aligned with ETSI NFV Information Models. As a community-led project, OSM delivers a production-quality MANO stack that meets operators’ requirements for commercial NFV deployments.

搭建前的准备

整一个虚拟机

按照官方的意思,是用的Ubuntu22.04版本,推荐的配置为4 个 CPU、16 GB 内存、80 GB 磁盘和一个可上网的接口

Ubuntu22.04镜像下载地址:

https://releases.ubuntu.com/22.04/

安装好后先换源

https://blog.csdn.net/kfepiza/article/details/127781336

然后安装一下vm-tools(如果没用自动安装的话),这个很关键

https://blog.csdn.net/dengjin20104042056/article/details/131737193

配置一下网络,否则下载会很慢。这个不做教程,自行搜索,我的端口号是7897

export http_proxy=http://127.0.0.1:7897
export https_proxy=http://127.0.0.1:7897
# 验证是否通了
curl -I https://osm-download.etsi.org

安装net-tools

sudo apt install net-tools

安装Docker

sudo apt install docker.io

然后换源一下

<<-'EOF' 告诉 shell 接下来的所有内容会被传递到命令 tee,直到遇到标记 EOF 为止,用于将多行内容作为输入传递给命令。所以不需要担心输入一行之后系统就开始执行命令 此外,若daemon.json文件不存在,直接使用tee命令不会报错,而是会创建名为daemon.json的文件

sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": [
"https://docker.m.daocloud.io",
"https://docker.imgdb.de",
"https://docker-0.unsee.tech",
"https://docker.hlmirror.com",
"https://docker.1ms.run",
"https://func.ink",
"https://lispy.org",
"https://docker.xiaogenban1993.com"
]
}
EOF

重启Docker环境

sudo systemctl daemon-reload && sudo systemctl restart docker

安装SSH,方便用Xshell操作

sudo apt install openssh-server

关闭防火墙,避免一些神秘的问题

sudo ufw disable
# 查看防火墙状态
sudo ufw status
# 开启防火墙(仅记录)
sudo ufw enable

预先安装几个 OSM 安装过程中常用的工具

sudo apt update
sudo apt install -y lsb-release
sudo apt install -y curl wget gnupg2 software-properties-common apt-transport-https
sudo apt install -y snapd
sudo snap install kustomize

关闭Swap

sudo swapoff -a
sudo sed -i '/ swap / s/^/#/' /etc/fstab

检查DNS是否有环路,查看DNS,若看到nameserver 127.0.0.53,说明是DNS的问题

cat /etc/resolv.conf

修改DNS

# 停用 systemd-resolved 的 DNS 代理行为
sudo systemctl disable systemd-resolved
sudo systemctl stop systemd-resolved
# 删除并替换 resolv.conf
sudo rm /etc/resolv.conf
echo "nameserver 8.8.8.8" | sudo tee /etc/resolv.conf
# 确认生效
cat /etc/resolv.conf
# 重启 CoreDNS
kubectl -n kube-system delete pod -l k8s-app=kube-dns
# 稍等几秒后,运行,如果都是running,就成功了
kubectl get pods -A

正式搭建

首先找到OSM的官方文档

https://osm.etsi.org/docs/user-guide/latest/

运行命令

wget https://osm-download.etsi.org/ftp/osm-17.0-seventeen/install_osm.sh
chmod +x install_osm.sh
# 有日志记录安装情况
./install_osm.sh 2>&1 | tee osm_install_log.txt
./install_osm.sh -p http://127.0.0.1:7897
./install_osm.sh -p http://127.0.0.1:7897 2>&1 | tee osm_install_log.txt

注意一点,安装时不能是root的使用者以及不要有安装过kubernetes,有安装过kubernetes的话有机会出现安装失败的问题。

大概率是一次成功不了的,就有什么错解决什么错吧,好像是网络问题导致下面的kubernetes等软件都没安装成功

image-20250611160335019

打开魔法试一下

image-20250611160650702

开始安装了,有戏…

image-20250611160902852

挣扎了快一个点,又问了一下G老师,说是 kube-system 命名空间下 pods 一直卡在 0/1 ContainerCreating这个过程,最终提示 “K8S CLUSTER IS BROKEN”,说明 k3s 启动成功但基础服务没有正常运行。恰巧看到一篇博客提到这个的

https://ithelp.ithome.com.tw/m/articles/10280369

上面说,此时将别的版本的image并且取代掉原本要使用的docker image,最后删除pod让他重启就没问题了

sudo docker pull omio/gcr.io.kubernetes-helm.tiller:v2.16.1
sudo docker tag 1f92aa902d73 gcr.io/kubernetes-helm/tiller:v2.15.2
kubectl delete pod metrics-server-54fd9b65b-cpdg5 -n kube-system

执行最后一条出错了

image-20250611174012951

本来打算看看怎么解决,没想到过了几小时后,好像跳过这个问题了

image-20250611215157696

这次看看能不能一次装成…好的,又报错了

image-20250611220117391

问了一下G老师,好像最后也和kubernetes有关,好像是K3s Kubernetes Pods 无法正常启动,可以排查一下(注:metrics-server-54fd9b65b-cpdg5应该改成自己的)

kubectl -n kube-system describe pod metrics-server-54fd9b65b-cpdg5

image-20250611230113374

果然有问题,拉取镜像 rancher/mirrored-pause:3.6 失败,导致 pod sandbox 无法创建,试试G老师的解决方案

# 使用阿里云 pause 镜像(或 DaoCloud 也行)
sudo docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/pause:3.6

# 给它打 tag
sudo docker tag registry.cn-hangzhou.aliyuncs.com/google_containers/pause:3.6 rancher/mirrored-pause:3.6

image-20250611230256213

不报错了!在检测一下日志

kubectl -n kube-system logs metrics-server-54fd9b65b-cpdg5

image-20250611231700884

没数据,我还没部署完呢,应该是正常的

然后G老师强烈建议关闭一下swap

sudo swapoff -a
sudo sed -i '/ swap / s/^/#/' /etc/fstab

再安装一次试试!

image-20250611233309743

又报错啦!!!第二天早晨跑了一下还是寄的,问题报错更靠前了

试一下G老师说是我的 /usr/local/bin/kubectl 二进制文件已彻底损坏或与系统完全不兼容,试试他的建议吧

# 先清理旧的
sudo rm -f /usr/local/bin/kubectl
# 然后重新下载官方最新稳定版本
curl -LO "https://dl.k8s.io/release/v1.28.0/bin/linux/amd64/kubectl"
chmod +x kubectl
sudo mv kubectl /usr/local/bin/

image-20250612103247468

再试一下,又报错了,好消息是kubernetes好像没问题了

image-20250612105238045

万能的G老师说: Helm 试图安装一个名为 gitea 的 release,但:这个 Helm release 名字已经存在于当前 Kubernetes 集群中!试一下解决方案

# 确认是否存在旧的 release
helm list -n gitea
# 删除它(清理旧的残留)
helm uninstall gitea -n gitea
kubectl delete ns gitea

继续重新运行一下安装脚本

image-20250612110345729

目前是问题是,Gitea 已经正常部署,但初始化脚本并没有成功创建 admin token 或写入 token 文件

可以直接手动触发初始化脚本,它会重新尝试创建 admin 用户及生成 token:

首先上官网注册一下

http://git.192.168.88.134.nip.io/

然后找到这个路径,写入对应信息

cd /usr/share/osm-devops/installers/mgmt-cluster/gitea
# 下面用你自己的信息
export GITEA_ADMIN_USERNAME=ruvik
export GITEA_ADMIN_PASSWORD='123321'
export GITEA_ADMIN_EMAIL=ruviklord@gmail.com
# 确认是否写入
echo $GITEA_ADMIN_USERNAME
echo $GITEA_ADMIN_PASSWORD
echo $GITEA_ADMIN_EMAIL

再手动创建Token

kubectl exec -n gitea statefulset/gitea -c gitea -- \
su git -c "/usr/local/bin/gitea admin user generate-access-token --username ruvik --token-name osm-install-token --raw"
# 得到Token:76046c9988692eb18d25eefbb0ba4b5063a577eb

然后用这个Token创建仓库

kubectl exec -n gitea statefulset/gitea -c gitea -- \
curl -X POST http://git.192.168.88.134.nip.io/api/v1/user/repos \
-H "Authorization: token 76046c9988692eb18d25eefbb0ba4b5063a577eb" \
-H "Content-Type: application/json" \
-d '{"name": "fleet-osm", "default_branch": "main", "private": false}'

image-20250612114346675

然后继续安装试试,理论上应该会跳过这个步骤

image-20250612152029929

绷不住了,好像还是k8s的问题

# 删除原来的 kubectl
sudo rm /usr/local/bin/kubectl
# 重新下载稳定版本
curl -LO "https://dl.k8s.io/release/v1.28.5/bin/linux/amd64/kubectl"
chmod +x kubectl
sudo mv kubectl /usr/local/bin/
# 验证效果
kubectl get pods -A

image-20250612153913459

又报了相同的错误了,我得换一个方法安装了

在油管上找到这个的安装教程了

https://www.youtube.com/watch?v=DJhtjnWdfi8

这里的人加上了代理的地址,我也试试

export http_proxy=http://127.0.0.1:7897
export https_proxy=http://127.0.0.1:7897
./install_osm.sh -p http://127.0.0.1:7897
# 验证是否通了
curl -I https://osm-download.etsi.org

刚刚和G老师讨论了一下,要换一个质量好的代理,因为刚刚安装过程中又拉取失败了

image-20250612161957753

但是又报错了,之前是卡在gitea安装的部分了,之前是他没安装成功,我自己安装了一下。现在是安装和现有版本冲突了,那就先清理一下旧的吧…

helm uninstall gitea -n gitea

再跑一次试试

image-20250612164215350

这次还可以,比之前进度跑的又靠前了一点

这次中断的原因是:脚本尝试创建名为 osm-developerGitea 用户,但这个用户已经存在,因此整个安装流程被中断。

# 删除osm-developer用户
kubectl exec -n gitea statefulset/gitea -c gitea -- \
su git -c "/usr/local/bin/gitea admin user delete --username osm-developer --config /data/gitea/conf/app.ini"
# 确认删除掉
kubectl exec -n gitea statefulset/gitea -c gitea -- \
su git -c "/usr/local/bin/gitea admin user list --config /data/gitea/conf/app.ini"
# 然后把旧的删除,刚刚跑了一遍又卡在这了
helm uninstall gitea -n gitea

重新运行一下安装脚本

image-20250612171704005

天呐,刚刚那个砍跨过去了!!!!MD流量用完了给我,要不可能就安装完了,重新跑的时候还得清理一下gitea,好像他这个破脚本跳过不了有些已经配置好的

helm uninstall gitea -n gitea
kubectl delete namespace gitea

image-20250612200419400

又报错了,好像是没有正确生成Token,导致后面API报错

# 生成Token
kubectl exec -n gitea statefulset/gitea -c gitea -- \
su git -c "/usr/local/bin/gitea admin user generate-access-token --username osm-developer --token-name developer-token --raw --config /data/gitea/conf/app.ini"
# 更新 Gitea 的 gitea-tokens Secret
kubectl create secret generic gitea-tokens \
-n gitea \
--from-literal=GITEA_STD_TOKEN=e8bd35e3ec6dd4751d4a2437b7535606b6bff9e8 \
--from-literal=GITEA_STD_TOKEN_NAME=developer-token \
--from-literal=GITEA_ADMINISTRATOR_TOKEN="" \
--from-literal=GITEA_ADMINISTRATOR_TOKEN_NAME=admin-token \
--dry-run=client -o yaml | kubectl apply -f -
# 根据刚刚的经验,可能还得再跑一遍这些命令
# 删除osm-developer用户
kubectl exec -n gitea statefulset/gitea -c gitea -- \
su git -c "/usr/local/bin/gitea admin user delete --username osm-developer --config /data/gitea/conf/app.ini"
# 确认删除掉
kubectl exec -n gitea statefulset/gitea -c gitea -- \
su git -c "/usr/local/bin/gitea admin user list --config /data/gitea/conf/app.ini"
# 然后把旧的删除,刚刚跑了一遍又卡在这了
helm uninstall gitea -n gitea

image-20250612201937213

蚌埠住了,这个不会自动跳过已安装的吗

清理一下安装好的

kubectl delete ns minio-osm-tenant

还是卡在minio了,我remake一下,安装一下11.0的低版本试试吧

wget https://osm-download.etsi.org/ftp/osm-11.0-eleven/install_osm.sh
chmod +x install_osm.sh
./install_osm.sh 2>&1 | tee osm_install_log.txt

image-20250612221454572

检查一下日志

kubectl -n kube-system describe pod coredns-6799fbcd5-956cn
kubectl -n kube-system logs coredns-6799fbcd5-956cn

CoreDNS 在尝试解析 DNS 时陷入了循环请求自身,即 DNS 回环错误(loop plugin)

[FATAL] plugin/loop: Loop (127.0.0.1:58118 -> :53) detected for zone "."

查看DNS,若看到nameserver 127.0.0.53,说明是DNS的问题

cat /etc/resolv.conf

修改DNS

# 停用 systemd-resolved 的 DNS 代理行为
sudo systemctl disable systemd-resolved
sudo systemctl stop systemd-resolved
# 删除并替换 resolv.conf
sudo rm /etc/resolv.conf
echo "nameserver 8.8.8.8" | sudo tee /etc/resolv.conf
# 确认生效
cat /etc/resolv.conf
# 重启 CoreDNS
kubectl -n kube-system delete pod -l k8s-app=kube-dns
# 稍等几秒后,运行,如果都是running,就成功了
kubectl get pods -A

又跑了一遍,这次Gitea安装一次成功,但是Minio安装失败了

image-20250612225022844

这次换一个安装思路,让G老师把安装脚本拆分一下吧,已经成功的就不用再跑了,要不又会出现各种错误,下面是G老师帮我生成的还需要安装内容的脚本resume_failed_osm_parts.sh

#!/bin/bash

# 进入 osm-devops 安装目录
cd /usr/share/osm-devops/installers

echo "🔁 开始重新部署 MinIO Operator..."
./minio/01-deploy-minio-operator.sh || { echo "❌ 部署 MinIO Operator 失败"; exit 1; }

echo "🔁 开始重新部署 MinIO Tenant(ALL-IN-ONE)..."
./minio/ALL-IN-ONE-Minio-install.sh || { echo "❌ MinIO Tenant 安装失败"; exit 1; }

echo "🔁 开始重新部署辅助服务 provision-aux-svc..."
./01-provision-aux-svc.sh || { echo "❌ 辅助服务部署失败"; exit 1; }

echo "🔁 开始重新部署管理集群..."
./mgmt-cluster/install_mgmt_cluster.sh || { echo "❌ 管理集群安装失败"; exit 1; }

echo "✅ 所有失败部分已尝试重新部署完毕"

然后运行

chmod +x resume_failed_osm_parts.sh
./resume_failed_osm_parts.sh | tee resume_log.txt

也不行,刚刚解析了一下这个脚本,真正的安装是这样的,看来不好拆

$DEVOPS_PATH/installers/full_install_osm.sh -R $RELEASE -r $REPOSITORY ...

那只有一个办法了,疯狂的remake,因为安装好之后的,在运行脚本不会跳过只会报错,这次装了很多东西,但是卡在拉取opensourcemano/airflow:11这个docker镜像,脚本找不见对应的仓库,这样吧,我先再remake一下,然后跑一次最新的脚本试试

image-20250613102610261

卡在这里三回了,看来下次remake后,要提前把这个拉下来再跑那个安装脚本

sudo docker pull opensourcemano/airflow:releaseseventeen-daily
sudo docker tag opensourcemano/airflow:releaseseventeen-daily opensourcemano/airflow:17

然后remake后记得要重启,可能remake后环境还不干净

参考博客