重新启动k8s模拟器-minikube

节后上班第一天,发现阿里云上的minikube无法启动:

发现是没有切换到普通账号

su xxx到普通用户,重新启动minikube即可

如果要切换到root用户,输入多条命令,可以使用

sudo -i

The sudo -i command in Linux is used to open a new shell session with superuser privileges, also known as the root user. Here’s what it does:

sudo: This command is used to execute another command with superuser (or root) privileges, assuming the user running the sudo command has the necessary permissions. It’s often used to perform administrative tasks without needing to log in as the root user.

-i: This option, when used with sudo, opens a new shell session as the root user. It stands for "interactive" and is typically used when you need to perform multiple commands as the root user in an interactive shell. An interactive shell allows you to work as if you were logged in directly as the root user, with access to the root user’s environment and settings.

端口的行规

下面的文章,解决了多年的一个疑惑,端口号的命名,真的有规律吗?

De Facto Ports

Most applications communicate over a TCP or UDP port. Ports 0-1023 are usually privileged and require administrator or superuser access to bind a network socket to an IP with the corresponding port. But anything over 1024 is up for grabs. IANA (Internet Assigned Numbers Authority) can “reserve” ports for specific applications — but this is only a formality; users and applications are free to use whatever port they wish.

So a look at some port numbers (1024+) and how they are used as default ports today, in 2023. There are many lists out there, but this aims to capture a list of protocols actually used in production (and leaves off many one-off ports used for specific games).

Some interesting patterns observed:

Odd-numbered and easy-to-remember ports are usually used for development servers. 3000, 5000, and 9000 are common in all-in-one web frameworks. Applications that have a related privileged application port (e.g., SMTP, DNS) sometimes use a repeated string (e.g., 5353 for Multicast DNS, 3535 for SMTP, or 8080 for a web server). Other than that, it seems like the strategy is to pick a number with low entropy (e.g., Jupyter on 8888) or a completely random one unlikely to cause conflicts (e.g., 25565 for Minecraft).

Odd-numbered and easy-to-remember ports are usually used for development servers. 3000, 5000, and 9000 are common in all-in-one web frameworks. Applications that have a related privileged application port (e.g., SMTP, DNS) sometimes use a repeated string (e.g., 5353 for Multicast DNS, 3535 for SMTP, or 8080 for a web server). Other than that, it seems like the strategy is to pick a number with low entropy (e.g., Jupyter on 8888) or a completely random one unlikely to cause conflicts (e.g., 25565 for Minecraft).

1080 — SOCK Proxy
2049 — Network File System (NFS)
2181 — Apache ZooKeeper
2375 — Docker REST API (HTTP)
2376 — Docker REST API (HTTPS)
3000 — “The Development Framework Port.” Ruby on Rails uses port 3000 as the default development port for its web server. Node frameworks use this port (e.g., Express.js, Meteor, Create React App, NextJS, SvelteJS, Astro, Remix).

3306 — MySQL

3478 — STUN, TURN (NAT Traversal)

4000 — Phoenix, Jekyll

4001 — etcd

4200 — AngularJS

4567 — Sinatra

5000 — “The Other Development Framework Port.” Flask (Python) uses 5000 as the default development port. As does ASP.NET Core.

5222 — XMPP (Extensible Messaging and Presence Protocol)

5349 — STUN, TURN over TLS

5353 — Multicast DNS — Follows the same pattern as SMTP, occasionally being run on port 3535. Duplicates the privileged port (DNS uses 53).

5432 — PostgreSQL

5900 — VNC (using a remote frame buffer, RFB)

6000 — X11 (over the network). Common to take the display number and add it to 6000 (e.g., DISPLAY 6 would be served over 6006).

6379 — Redis

6660 — IRC (Internet Relay Chat)

6881 — BitTorrent

8000 — “Python Development Framework Port.” Includes Django and Python 3’s http.server.

8080 — “The HTTP web server port.” Like 5353 (Multicast DNS) and 3535 (SMTP), an unprivileged port to run an HTTP webserver.

8333 — Bitcoin

8888 — Jupyter Notebook,

8983 — Apache Solr

9000 — Used by various applications, but no central theme or extremely well-known application.

25565 — Minecraft

27017 — MongoDB

51820 — WireGuard

CIDR与子网掩码

CIDR表示法

"10.0.0.0/26" 是使用CIDR(无类别域间路由/Classless Inter-Domain Routing)表示法来表示一个IP地址范围的方式。在CIDR表示法中,IP地址范围由一个IP地址后跟一个正斜杠和一个数字组成,该数字指定了网络前缀中的位数。下面解释一下 "10.0.0.0/26" 的含义:

IP地址:"10.0.0.0" 是该范围的基本IP地址。它是地址范围的起点。

/26:"/26" 表示子网掩码或网络前缀中的位数。在这种情况下,它表示IP地址中左边的26位用于表示网络,而剩下的6位用于表示网络内的各个主机地址。

现在,让我们更详细地解释 "10.0.0.0/26":

网络地址:"10.0.0.0" 是网络地址,表示整个网络或子网。

可用IP地址:在/26子网中,有2^6 = 64个可能的IP地址。然而,通常情况下,范围中的第一个和最后一个地址被保留用于网络标识和广播,因此在网络内有62个可用的IP地址供主机使用。

可用IP地址范围:"10.0.0.1" 到 "10.0.0.62"
子网掩码:与"/26"相关联的子网掩码以标准点分十进制格式表示为 "255.255.255.192"。以二进制表示,它是 "11111111.11111111.11111111.11000000",其中前26位被设置为 "1" 以表示网络部分,后6位被设置为 "0" 以表示主机地址。

总之,"10.0.0.0/26" 定义了一个具有64个IP地址的子网范围,从 "10.0.0.1" 到 "10.0.0.62"。这通常用于为网络段内的设备或主机分配IP地址,同时保留了网络和广播地址。

子网掩码、网络地址范围和CIDR

子网掩码、网络地址范围和CIDR(Classless Inter-Domain Routing)之间有密切的关系,它们都用于定义和描述计算机网络中的子网和网络分割。

  1. 子网掩码(Subnet Mask)

    • 子网掩码是一个32位的二进制数,用于划分IP地址中的网络部分和主机部分。它由连续的1位(网络位)和连续的0位(主机位)组成。
    • 子网掩码定义了一个IP地址的哪部分用于网络地址,哪部分用于主机地址。
    • 例如,子网掩码 255.255.255.0 表示前24位用于网络地址,后8位用于主机地址。
  2. 网络地址范围

    • 网络地址范围指的是特定子网的IP地址范围,其中包括网络地址和广播地址以及可分配的主机地址。
    • 网络地址是子网中的第一个IP地址,通常是所有主机位都为0。广播地址是子网中的最后一个IP地址,通常是所有主机位都为1。
    • 例如,对于子网掩码 255.255.255.0,网络地址范围可以是 192.168.1.0192.168.1.255。同样的,网络地址范围也可以是’172.1.1.0′ ‘172.1.1.255’
  3. CIDR(Classless Inter-Domain Routing)

    • CIDR是一种表示IP地址和子网掩码的标准方法,以便更精确地描述网络的子网划分。
    • CIDR表示法包括IP地址,后跟斜杠和网络前缀长度。网络前缀长度指定了网络位的数量,而不是使用具体的子网掩码。
    • 例如,CIDR表示法 192.168.1.0/24 表示网络前缀长度为24位,即前24位用于网络地址,后8位用于主机地址(32-24=8,2^8=256)。

关系:

  • 子网掩码用于明确指定IP地址的哪些位是网络位和哪些位是主机位。
  • 网络地址范围定义了一个子网的IP地址范围,包括网络地址、广播地址和可分配的主机地址。
  • CIDR表示法则是一种更灵活和精确的方法,使用网络前缀长度来表示网络位的数量,而不是具体的子网掩码。CIDR表示法提供了更多的灵活性,可以用于描述各种不同大小的子网,而无需使用不同的子网掩码。

举一个例子(在子网掩码为255.255.240.0时,基础网络地址为172.19.224.0)

当使用CIDR(Classless Inter-Domain Routing)表示法时,IP地址和子网掩码结合在一起,以一种更精确和紧凑的方式来表示网络的子网划分。让我详细解释为什么子网掩码 255.255.240.0 可以用CIDR表示法表示为 172.19.224.0/20

  1. 子网掩码 255.255.240.0 的二进制表示

    • 子网掩码 255.255.240.0 在二进制中是 11111111.11111111.11110000.00000000
    • 这表示前20位用于网络地址,后12位用于主机地址。
  2. IP地址 172.19.224.0 的二进制表示

    • IP地址 172.19.224.0 在二进制中是 10101100.00010011.11100000.00000000
    • 这是网络地址部分,这时候如果考虑上面的子网掩码的规定,则只有12位作为主机地址,也就是从0000.00000000开始的地址,也就是在c网段只有224~240可以作为主机网段,因为241是11110001,已经无法作为网段了。
  3. CIDR表示法的网络前缀长度

    • 为了使用CIDR表示法,我们需要确定网络位的数量,即前面有多少位用于网络地址。
    • 在这个例子中,有前20位用于网络地址。
  4. CIDR表示法的格式

    • CIDR表示法包括IP地址,后跟斜杠和网络前缀长度,例如 IP地址/网络前缀长度
  5. CIDR表示法的组合

    • 将上述的网络地址 172.19.224.0 与网络前缀长度 20 组合在一起,即 172.19.224.0/20

综上所述,CIDR表示法 172.19.224.0/20 表示网络地址 172.19.224.0 和子网掩码 255.255.240.0 结合在一起,指定了网络地址的前20位是网络位,后12位是主机位。这使得CIDR表示法成为一种更灵活、紧凑和精确的方式,用于描述网络的子网划分,而无需使用特定的子网掩码。

如何确定master nodes究竟在哪几台服务器上

k8s配合容器化技术,高度抽象了底层硬件,因此有时候我们想了解master node的具体位置,还有点困难。

第一步,先找到master nodes的名字

[root@172-20-26-79 ~]# kubectl get nodes | grep master
ks-control-1         Ready    control-plane,master   5d23h   v1.21.11
ks-control-2         Ready    control-plane,master   5d23h   v1.21.11
ks-control-3         Ready    control-plane,master   5d23h   v1.21.11

第二步,使用describe来获取内部ip的地址,从而判断是否在一台主机上(综合server的组网情况)

[root@172-20-26-79 ~]# kubectl describe nodes ks-control-3 | grep InternalIP
  InternalIP:  172.20.26.28
[root@172-20-26-79 ~]# kubectl describe nodes ks-control-2 | grep InternalIP
  InternalIP:  172.20.26.89
[root@172-20-26-79 ~]# kubectl describe nodes ks-control-1 | grep InternalIP
  InternalIP:  172.20.26.86

解决跳板机问题

公司的IDC,需要通过堡垒机登录,有两种方式

  1. 使用web shell,这个非常简单,在公司的opencloud页面上就可以使用,而且省去了输入ssh用户名和密码。
  2. 使用ssh终端,总是失败,请教了运维同事,他也不清楚,还好有chatgpt的神助攻,画了1小时解决了。

失败信息

on my mac :# ssh username@jump.server.com
Unable to negotiate with X.X.X.X port 22: no matching host key type found. Their offer: ssh-rsa

chat gpt给出的建议

It appears that you’re trying to SSH from your Mac to the server at jump.server.com, and you’re encountering the "no matching host key type found" error with an offer of "ssh-rsa." This error typically occurs when the SSH client and server cannot agree on a suitable host key algorithm.

To resolve this issue, you can use the -o option to specify the host key algorithm explicitly in your SSH command. For example, you can use the -o option to force the use of the "ssh-rsa" host key algorithm like this:

ssh -o HostKeyAlgorithms=+ssh-rsa username@jump.server.com

This command tells the SSH client to use the "ssh-rsa" host key algorithm when connecting to the server.

However, it’s worth noting that "ssh-rsa" is considered less secure than modern alternatives like "ssh-ed25519" or "ecdsa-sha2-nistp256." If possible, you should encourage the server administrator to update the SSH server’s host key algorithm configuration to use a more secure option.

Additionally, ensure that your SSH client is up to date, as older versions may not support some of the newer host key algorithms.

利用docker建立一个文件服务器

Create a Dockerfile

Ensure you have your OpenVPN client profile files (e.g., .oxxxx files) ready on your server,在同一目录下,新建一个Dockerfile,同时把*.oxxxx 拷贝到这个目录下。

vi Dockerfile

文件内容如下

# Use an official Nginx runtime as a parent image
FROM nginx:alpine

# Copy your client profile files to the container
COPY *.oxxx /usr/share/nginx/html/

# Expose port 80
EXPOSE 80

Build the Docker Image

In the directory containing your Dockerfile, build the Docker image using the docker build command:

docker build -t openxxxx-web-server .

Run the Docker Container:**

Start a Docker container based on the image you just built:

docker run -d -p 80:80 --name openxxx-web-server openxxx-web-server

Access Your Client Profiles:**

Your Openxxx client profile files should now be accessible via HTTP on your server’s IP address or domain name. You can access them using a URL like this:

http://your-server-ip-or-domain/client-profile.oxxx

新机器安装docker和python3

安装docker

root@instance-20230906-1618:~# docker --version
Command 'docker' not found, but can be installed with:
snap install docker         # version 20.10.24, or
apt  install podman-docker  # version 3.4.4+ds1-1ubuntu1.22.04.2
apt  install docker.io      # version 24.0.5-0ubuntu1~22.04.1
See 'snap info docker' for additional versions.

服务器的版本是

root@instance-20230906-1618:~# lsb_release -a
No LSB modules are available.
Distributor ID: Ubuntu
Description:    Ubuntu 22.04.3 LTS
Release:        22.04
Codename:       jammy

安装完成后,少了一点空间

267 MB of additional disk space will be used

安装python3的container

其实我可以使用python3的虚拟机,但是因为最近使用docker比较顺手,所以打算尝试下

  • 希望在这个容器里,安装与llm有关的插件、向量数据库等等
  • 或者在这台机器上安装其他的容器,例如关系数据库、向量数据库或者其他组件,实现一个简单的微服务价格,最好也可以用k8s管理

安装python最新版本,python:3

docker pull python:3

启动docker,而且进入交互(i)和终端模式(t),这里有个小问题,启动容器后会自动进入终端模式,我不是很喜欢这样,所以应该去掉t这个参数

docker run -it --name python3-container python:3

进入docker,使用terminal编写执行脚本,可以看到容器里的python和宿主机的python,版本是不一致的。

root@instance-20230906-1618:~# docker exec -it python3-container /bin/bash
root@e6d7fd5c9e79:/# python --version
Python 3.11.5
root@e6d7fd5c9e79:/# pip --version
pip 23.2.1 from /usr/local/lib/python3.11/site-packages/pip (python 3.11)
root@e6d7fd5c9e79:/# exit
exit
root@instance-20230906-1618:~# python3 --version
Python 3.10.12
root@instance-20230906-1618:~# pip --version
Command 'pip' not found, but can be installed with:
apt install python3-pip

LangChain初探

需求来源与问题提出

大模型,特别是公有云的超大参数模型,例如70B、130B的模型,往往不会针对特定的领域知识进行微调,原因既有模型自身训练成本的问题,也和把控领域数据的客户有关,他们不愿意共享自己的数据;

私有化部署的大模型,是否就不存在这样的问题呢?不尽然,虽然私有化部署避免了数据回流的安全问题,但是目前阶段,没有那个客户会接受一次训练的成本(软件、硬件和调优服务),何况所谓训练数据的标注也是一个漫长、昂贵的过程。

最近我参与的若干政府项目就遇到了类似难题。

而langchain、向量数据库就能形成一套很好的方案。

原来的问题是:大模型不太行,回答不了我提出的问题;
现在的问题是:你的问题有点烂,没有利用好大模型。

方案的基本思路

专业问题+外挂领域知识库+通用大模型=专业问题+领域大模型

  1. 一个简单的例子
请问XXX
  1. 一个复杂的例子
请问XXX

LangChain介绍

在oracle免费云上部署wordpress

据说只要5-10分钟就可以实现wordpress+mysql,而且是容器部署形式,不过我等了10分钟不止,响应界面已经吊死了。

帮助文档介绍可以使用terraform这个管理工具,参考链接如下:
Create your own web presence with Oracle Cloud Infrastructure using WordPress

Oracle Cloud solution is really simple architectures which is show belowed picture.

Oracle免费云服务-永远免费

云服务现状-ARM与x86

目前提供ARM架构云服务器的厂商,只有amzaon和oracle,谷歌和微软暂时没有计划

  • amazon的AWS采用Graviton处理器
  • oracle cloud采用Ampere架构处理器

ARM是什么

ARM,全称为Advanced RISC Machine,是英国Acorn有限公司设计的一款低功耗、低成本RISC微处理器。1983年ARM架构问世,成本低、功耗小,是轻型便携设备‌理想选择,如手机、笔记本和平板等。

ARM vs x86

X86是Intel研发的一种微处理器体系结构的泛称,它采用的是CISC(全称是Complex Instruction Set Computers,即复杂指令集计算机),以增加处理器本身复杂度作为代价,去换取更高的性能,但集成的指令集数量越来越多,给硬件带来的负荷也就越来越大,无形中增加了功耗和设计难度。

于是,RISC(全称Reduced Instruction Set Computers,即精简指令集计算机)诞生了,其设计初衷便是通过精简指令系统减少硬件设计的复杂程度,提高指令执行速度。在RISC中,无论简单还是复杂的操作,均由简单指令的程序块完成,因此在性能上RISC可能有所不如,但在功耗上RISC却比CISC低很多。

所以,可以这样通俗的理解,CISC的代表为X86架构,而RISC的代表则为ARM架构,ARM与X86的区别就是RISC与CISC的区别。

Ampere A1机型优势

Ampere A1提供每CPU80核的Ampere Altra处理器,所有的核都能够以3.0GHz的最高频率稳定运行,每个核都有自己的64KB L1 指令高速缓存、64KB L1数据高速缓存和高达1MB L2 数据高速缓存,并提供可预测的性能

在基于行业标准的SPECrate2017 Benchmark测试中,Ampere A1实例的性价比是其他ARM服务器实例的2.5倍,而比较起基于x86的英特尔Skylake或AMD Naples实例来说,Ampere A1实例的性价比更是其4倍以上。与OCI的高性能云架构相结合,基于Ampere Altra处理器的Ampere A1在云中提供了最好的性价比。

灵活的CPU和内存配比

OCI为客户提供三种基于ARM的计算选择:灵活虚机、强大裸金属以及专用区域Cloud@Customer,分别适用于有不同需求的客户。

OCI独有的、灵活的CPU和内存配比方式,能支持企业选择任意数量的CPU核数(1-80核)和内存(1-512GB)来满足企业的工作负载需求,而不再局限于选择具有4个、8个或16个核以及每个核的静态内存比率的固定虚机(VM)大小。这种灵活性使客户能够构建更好地匹配工作负载需求的VM,从而在优化成本的同时获得最佳性能。

线性可伸缩性和可预测的性能

性能对于云端的工作负载至关重要。Ampere Altra处理器旨在云中所需的规模下提供可预测的性能,其处理器的单线程核则能确保任何时候资源都不会被抢占。因此,对于特定的云端工作负载,这些基于ARM的CPU并不依赖通过超频来实现更高的性能,其能持续3.0GHz的最大频率并提供可预测的性能。同时,Altra的单线程内核和缓存设计还确保了随着内核数量的增加,性能几乎呈线性增长。这尤其有利于计算密集型工作负载,如媒体编码、加密、AI推断和HPC

永远免费的OCI

All Oracle Cloud Infrastructure accounts (whether free or paid) have a set of resources that are free of charge for the life of the account. These resources display the Always Free label in the Console (for Ampere A1 Compute shapes, see Compute).

Using the Always Free resources, you can provision a virtual machine (VM) instance, an Oracle Autonomous Database, and the networking, load balancing, and storage resources needed to support the applications that you want to build. With these resources, you can do things like run small-scale applications or perform proof-of-concept testing.

选择合适的os镜像和cpu数量/型号

远程无法ping通是被墙了吗

这时候发现直接ping公网地址,是无法ping通的,不管从阿里云还是本地使用vpn的笔记本,这是由于安全列表里没有开通icmp的权限,如下操作后就可以ping通了,不过稍后要删除这条规则。

使用密钥登陆服务器

首先进入私钥存储的目录,修改文件权限为只读

chmod 400 <private_key_file>

然手使用ssh -i命令登陆远程服务器,由于使用了ubuntu的镜像文件,这里的用户名就是ubuntu,如果没有和私钥在同一目录下,也需要把目录地址一起带上

ssh -i <private_key_file> <username>@<public-ip-address>

参考信息
腾讯
Oracle官网
墨天轮介绍OCPU实例开通