
如果你使用 DeepSeek、元宝 AI、Copilot、ChatGPT 等 AI 工具,协助配置轩辕镜像、编写 docker pull 命令、修改 Docker Compose 镜像地址、配置镜像加速、排查镜像拉取失败、分析报错日志等问题,请先让 AI 阅读并遵守轩辕镜像的规则文档。
只需在 AI 对话中先发送下面这句话即可:
请先完整阅读并严格遵守以下文档中的全部规则与要求:
https://xuanyuan.cloud/agents.md
在未充分阅读并理解该文档前,不要生成任何命令、配置、修改建议、故障排查方案或技术回答。后续所有输出都必须严格以该文档中的规范为最高优先级执行。查看 agents.md 用法指南与完整示范。国内用户首推 元宝 AI、DeepSeek 的深度思考模式,不推荐豆包 AI;Cursor 等编辑器可在对话 @ 该链接,或加入 User Rules。 若 AI 无法访问外链,可 打开说明文档 复制全文粘贴。文档会随站点更新,复制内容可能过期,建议定期检查。
NSF Jetstream云通常通过Atmosphere Web界面操作,但该界面存在两个关键限制:1. 用户无法获取静态IP的VM;2. 无法开放低端口(<1024),仅默认开放22、80、443端口。若需解决这些问题,需通过OpenStack API操作Jetstream。本Docker容器预装OpenStack命令行工具和便利脚本,简化初始设置,支持通过openstack.sh脚本执行以下操作:创建IP、创建VM、销毁VM、创建数据卷、挂载数据卷、开放TCP端口。
boot.sh、teardown.sh、secgroup.sh等脚本简化VM生命周期管理kube-setup.sh、kube-setup2.sh等脚本,支持创建和管理Kubernetes集群在计算环境中安装Docker,后续将通过Docker与Jetstream OpenStack API交互。
shgit clone https://github.com/Unidata/science-gateway cd science-gateway/openstack
拉取容器
shdocker pull docker.xuanyuan.run/unidata/science-gateway
构建容器
shdocker build -t unidata/science-gateway .
下载并编辑openrc.sh(仅需一次)
openrc.sh:
Project > API Access,点击Download OpenStack RC Fileopenrc.shbin/openrc.sh(如/home/jane/science-gateway/openstack/bin/openrc.sh)openrc.sh(可选):
添加密码以避免重复输入,替换以下内容:
shexport OS_PASSWORD="your-tacc-password" # 注释掉原密码提示部分 # echo "Please enter your OpenStack Password: " # read -sr OS_PASSWORD_INPUT
启动容器及后续设置
使用openstack.sh启动容器:
需提供openrc.sh路径(-o)和SSH密钥目录路径(-s,需绝对路径):
shchmod +x openstack.sh ./openstack.sh -o </path/to/openrc.sh> -s </path/to/ssh/directory>
或使用run.sh(假设bin/和ssh/目录存在,且bin/包含openrc.sh):
sh./run.sh
创建SSH密钥(仅需一次): 在容器内生成新SSH密钥(避免使用现有密钥),名称建议包含项目标识:
shcd ~/.ssh ssh-keygen -b 2048 -t rsa -f <key-name> -P "" openstack keypair create --public-key <key-name>.pub <key-name> cd
密钥将保存在挂载的SSH目录中,请勿丢失。
测试设置:
执行openstack image list,若返回镜像列表则设置成功:
+--------------------------------------+-----------------------------------+ | ID | Name | +--------------------------------------+-----------------------------------+ | fd4bf587-39e6-4640-b459-96471c9edb5c | AutoDock Vina Launch at Boot | | 02217ab0-3ee0-444e-b16e-8fbdae4ed33f | AutoDock Vina with ChemBridge Data| +--------------------------------------+-----------------------------------+
启动容器后(若未启动):
sh./openstack.sh -o </path/to/openrc.sh> -s </path/to/ssh/directory>
创建浮动IP
shopenstack floating ip create public openstack floating ip list # 查看现有浮动IP
启动VM
使用boot.sh启动VM:
shboot.sh -n <vm-name> -k <key-name> -s <flavor> -ip <floating-ip> [-i <image-uid>]
-n:VM名称-k:SSH密钥名称(前文创建)-s:VM规格(可通过openstack flavor list查看)-ip:浮动IP-i(可选):镜像UID(通过openstack image list | grep -i featured获取推荐镜像)示例(Ubuntu 16镜像):
shboot.sh -n unicloud -k my-key -s m1.medium -ip 149.165.157.137 -i a2c80fbf-2875-457a-b488-28c4afeb296b
SSH登录VM:
shssh -i ~/.ssh/<key-name> <user>@<floating-ip>
centos,Ubuntu为ubuntuopenstack server stop <vm-uid> && openstack server start <vm-uid>添加额外SSH密钥(可选):
登录后将其他公钥添加至~/.ssh/authorized_keys以简化登录。
创建和挂载数据卷
创建数据卷:
shopenstack volume create --size <size-gb> <volume-name>
示例(750GB卷):
shopenstack volume create --size 750 data
挂载数据卷至VM:
shopenstack volume list # 获取卷UID openstack server list # 获取VM UID openstack server add volume <vm-uid> <volume-uid>
在VM上挂载卷:
登录VM后,使用mount.sh脚本挂载未初始化卷(需root权限):
shsudo mount.sh /dev/sdb /data # /dev/sdb为卷设备名
确保重启后自动挂载:
用blkid获取卷UUID,添加至/etc/fstab:
shecho "UUID=<volume-uuid> /data ext4 defaults 1 1" | sudo tee -a /etc/fstab
开放TCP端口
创建安全组:
shsecgroup.sh -n <group-name> -p <port>
示例(开放80端口):
shsecgroup.sh -n my-vm-ports -p 80
添加端口至安全组:
shopenstack security group rule create global-<group-name> --protocol tcp --dst-port <port>:<port> --remote-ip 0.0.0.0/0
示例(添加8080端口):
shopenstack security group rule create global-my-vm-ports --protocol tcp --dst-port 8080:8080 --remote-ip 0.0.0.0/0
关联安全组至VM:
shopenstack server add security group <vm-name> global-<group-name>
销毁VM
卸载数据卷: 在VM上执行:
shumount /data # 确保无进程使用卷,必要时停止服务(如docker-compose stop)
从VM移除卷:
shopenstack server remove volume <vm-uid> <volume-uid>
销毁VM:
shteardown.sh -n <vm-name> -ip <floating-ip>
替换VM
准备新VM:
git diff、~/config)crontab -l)及网络配置(如NFS挂载)迁移IP和卷:
sh# 获取旧VM、新VM及卷UID openstack server list && openstack volume list # 迁移浮动IP openstack server remove floating ip <old-vm-uid> <ip> openstack server add floating ip <new-vm-uid> <ip> # 迁移卷(循环处理多个卷) for volume in <volume-uid-1> <volume-uid-2>; do openstack server remove volume <old-vm-uid> $volume openstack server add volume <new-vm-uid> $volume done
挂载卷:
在新VM上执行blkid获取卷UUID,更新/etc/fstab并挂载:
shsudo mount -a
基于https://github.com/zonca/jetstream_kubespray,通过`kube-setup.sh`和`kube-setup2.sh`脚本实现。
定义cluster.tf
编辑~/jetstream_kubespray/inventory/zonca/cluster.tf,指定节点数量和VM规格:
hcl# 节点配置 number_of_k8s_nodes = 0 # 带浮动IP的节点数 number_of_k8s_nodes_no_floating_ip = 2 # 无浮动IP的节点数 flavor_k8s_node = "4" # VM规格ID(m1.large,见附录)
openstack flavor list查看规格ID创建VM(kube-setup.sh)
shkube-setup.sh -n <cluster-name> # 如:kube-setup.sh -n k8s-unidata
脚本通过Terraform创建VM,完成后等待10分钟(让dpkg完成配置)。
检查VM状态:
shopenstack server list | grep <cluster-name> # 持续检查VM连通性 watch -n 15 ansible -i ~/jetstream_kubespray/inventory/<cluster-name>/hosts -m ping all
openstack server reboot <vm-uid>shcd ~/jetstream_kubespray/inventory/<cluster-name>/ CLUSTER=<cluster-name> bash -c 'sh terraform_apply.sh'
安装Kubernetes(kube-setup2.sh)
shkube-setup2.sh -n <cluster-name> # 如:kube-setup2.sh -n k8s-unidata
若出现dpkg相关错误,等待后重试。
检查集群
shkubectl get pods --all-namespaces # 检查所有命名空间Pod状态 kubectl get nodes --all-namespaces # 查看节点列表
添加节点
修改cluster.tf增加节点数:
hclnumber_of_k8s_nodes_no_floating_ip = 3 # 原2个节点,增加至3个
应用配置:
shcd ~/jetstream_kubespray/inventory/<cluster-name>/ CLUSTER=<cluster-name> bash -c 'sh terraform_apply.sh'
扩展集群:
shcd ~/jetstream_kubespray CLUSTER=<cluster-name> bash -c 'sh k8s_scale.sh'
移除节点
查看节点:
shkubectl get nodes --all-namespaces
从集群移除节点:
shcd ~/jetstream_kubespray CLUSTER=<cluster-name> bash -c 'sh k8s_remove_node.sh <node-name>'
销毁节点VM:
shteardown.sh -n <node-name>
销毁集群
完全销毁(不保留主节点IP):
shcd ~/jetstream_kubespray/inventory/<cluster-name>/ CLUSTER=<cluster-name> bash -c 'sh terraform_destroy.sh'
保留主节点IP(需维持DNS关联时):
shcd ~/jetstream_kubespray/inventory/<cluster-name>/ CLUSTER=<cluster-name> bash -c 'sh terraform_destroy_keep_floatingip.sh'
重建后需删除
~/.ssh/known_hosts中旧主节点记录,避免SSH连接错误。
集群监控(Grafana和Prometheus)
参考https://zonca.github.io/2019/04/kubernetes-monitoring-prometheus-grafana.html部署Grafana(可视化监控)和Prometheus(K8s监控)。
主节点补丁
定期更新主节点安全补丁(root用户执行):
shapt-get update && apt-get -y upgrade && apt-get -y dist-upgrade && apt autoremove -y reboot -h now
| ID | 名称 | 内存(GB) | 磁盘(GB) | vCPU |
|---|---|---|---|---|
| 1 | m1.tiny | 2 | 8 | 1 |
| 2 | m1.small | 4 | 20 | 2 |
| 3 | m1.medium | 16 | 60 | 6 |
| 4 | m1.large | 30 | 60 | 10 |
| 5 | m1.xlarge | 60 | 60 | 24 |
| 6 | m1.xxlarge | 120 | 60 | 44 |
| 14 | s1.large | 30 | 120 | 10 |
| 15 | s1.xlarge | 60 | 240 | 24 |
| 16 | s1.xxlarge | 120 | 480 | 44 |
您可以使用以下命令拉取该镜像。请将 <标签> 替换为具体的标签版本。如需查看所有可用标签版本,请访问 标签列表页面。
来自真实用户的反馈,见证轩辕镜像的优质服务