czp杂记

一些乱七八糟的东西

笔记本安装U

  1. 制作启动盘:下载好一个Ubuntu镜像,用rufus工具写到U盘

  2. bios,U盘启动,安装…

    可以自定义一下分区,以下都设置为主分区,主分区(4)不够再设置逻辑分区

    • 根分区/:可以大点
    • swap:选择类型交换分区,一般大小为内存的两倍
    • /home
    • /boot:ext4,给500MB就好啦
    • /boot/efi:选择EFI System分区类型,500MB就好了

如果要登录root账号,可以用:

1
2
3
sudo passwd root
# 输入当前用户的密码
# 输入新的root密码

不然为了安全着想,每次重启root都是不同的随机密码

U安装openssh-server

1
2
sudo apt-get install openssh-server
sudo /etc/init.d/ssh start

U安装xrdp+xubuntu-desktop

搬运自 https://blog.csdn.net/NeoZng/article/details/123505127

怕博文没了,所以cv一下

--1941508951@qq.com

1
由于Ubuntu自带的屏幕分享软件是VNC,而VNC在远程连接的时候,是实时截屏将一帧帧图片传输到控制端,显然效率非常低下,即使使用千兆路由器桥接甚至直接连接网线,延迟都还是很大。RDP对于视频解码的支持更加友好,本文将介绍利用xrdp连接Ubuntu远程桌面。配置好之后,可以无须屏幕直接连接,而且也不会触发显卡休眠出现连接黑屏的情况
1
2022/07/07更新: 虽然xrdp的分辨率是最高的,但是压缩后的码率还是有些高,导致帧率只有十几二十帧。NoMachine是一款远程桌面连接软件,还支持局域网内自动搜索ip,强烈推荐使用!虽然画质略有一点点点点的损失但是在1920x1080分辨率下还可以达到50-60fps的程度(网络好的情况下)。配置起来也非常非常简单,装好基本就能用。调试的时候有需要还可以直接将你的电脑用网线和目标电脑进行连接。

官网链接:https://www.nomachine.com

xrdp不太兼容Ubuntu默认的gnome桌面,所以我们需要安装xubuntu-desktop

安装xubuntu-desktop

1
2
sudo apt install xubuntu-desktop
# 碰到需要选择的地方直接回车

安装xubuntu-desktop 如果失败,那么可以选择换源

换源方法如下:

Ubuntu清华源地址 选择合适的Ubuntu版本

Ubuntu 的软件源配置文件是 /etc/apt/sources.list

1
2
3
4
5
6
7
# 先备份原始文件:
sudo cp /etc/apt/sources.list /etc/apt/sources.list.backup
# 打开软件源配置文件,把软件源配置文件中的内容换成其他源:
sudo gedit /etc/apt/sources.list
# 随后更新源:
sudo apt-get update
#当然也可以直接在 软件与更新 中切换安装源。

安装和配置xrdp

1
2
3
sudo apt install xrdp
# 验证是否安装成功
sudo systemctl status xrdp

成功会出现类似如下内容,按q键退出

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
● xrdp.service - xrdp daemon
Loaded: loaded (/lib/systemd/system/xrdp.service; enabled; vendor preset: >
Active: active (running) since Tue 2022-03-15 14:05:08 CST; 41min ago
Docs: man:xrdp(8)
man:xrdp.ini(5)
Main PID: 810 (xrdp)
Tasks: 1 (limit: 18748)
Memory: 1.4M
CGroup: /system.slice/xrdp.service
└─810 /usr/sbin/xrdp

3月 15 14:05:07 zzy-ThinkPad-T490s xrdp[800]: (800)(139792143402816)[INFO ] add>
3月 15 14:05:07 zzy-ThinkPad-T490s xrdp[800]: (800)(139792143402816)[INFO ] lis>
3月 15 14:05:07 zzy-ThinkPad-T490s xrdp[800]: (800)(139792143402816)[INFO ] xrd>
3月 15 14:05:07 zzy-ThinkPad-T490s xrdp[800]: (800)(139792143402816)[DEBUG] Clo>
3月 15 14:05:07 zzy-ThinkPad-T490s systemd[1]: xrdp.service: Can't open PID fil>
3月 15 14:05:08 zzy-ThinkPad-T490s systemd[1]: Started xrdp daemon.
3月 15 14:05:09 zzy-ThinkPad-T490s xrdp[810]: (810)(139792143402816)[INFO ] sta>
3月 15 14:05:09 zzy-ThinkPad-T490s xrdp[810]: (810)(139792143402816)[INFO ] add>
3月 15 14:05:09 zzy-ThinkPad-T490s xrdp[810]: (810)(139792143402816)[INFO ] lis>
3月 15 14:05:09 zzy-ThinkPad-T490s xrdp[810]: (810)(139792143402816)[INFO ] xrd>
lines 1-21/21 (END)

xrdp 使用 /etc/ssl/private/ssl-cert-snakeoil.key

所以将xrdp添加到ssl-cert用户组中:

1
2
3
4
5
sudo adduser xrdp ssl-cert
# 不放心的话使用这个命令查看一下:
groups xrdp
# 正常会出现:
xrdp : xrdp ssl-cert

由于安装了xubuntu-desktop ,Ubuntu中存在多个桌面管理器,所以我们需要进行选择。

输入下面的命令将修改写入配置文件,

1
2
echo "xfce4-session" >~/.xsession
#选择xubuntu-desktop即可。

重启xrdp使配置生效:

1
sudo systemctl restart xrdp

配置防火墙

如果想从某个IP或者某个范围的IP访问xrdp,例如从192.168.1.77访问xrdp,使用如下命令:

1
sudo ufw allow from 192.168.1.77 to any port 3389 proto tcp

如果想从任何IP访问则:

1
xrdp sudo ufw allow 3389

连接

1
2
# 安装完成后,启动xrdp程序,并打开防火墙端口3389,这是RDP协议的默认端口
sudo systemctl enable --now xrdp

可能会遇到的问题

win remote连接闪退

同一账号不能同时在本地主机上登录和在远程主机上登录

远程桌面时出现蓝屏,电脑重启后鼠标键盘无法使用

首先重启时进入恢复模式获得root权限

输入:

1
2
sudo apt-get install xserver-xorg-input-all
# 完成再重启即可使用鼠标键盘

再使用如下命令,就应该可以解决蓝屏问题

sudo apt-get install xserver-xorg-core

sudo apt-get install xserver-xorg-input-all

sudo apt-get install xorgxrdp

远程桌面时多次出现要输入密码验证

最好是创建一个特定的用户,专门用来远程

1
adduser win

输入:

1
sudo gedit /etc/polkit-1/localauthority/50-local.d/45-allow-colord.pkla

把下面这段内容复制粘贴并保存

1
2
3
4
5
6
[Allow Colord all Users]
Identity=unix-user:*
Action=org.freedesktop.color-manager.create-device;org.freedesktop.color-manager.create-profile;org.freedesktop.color-manager.delete-device;org.freedesktop.color-manager.delete-profile;org.freedesktop.color-manager.modify-device;org.freedesktop.color-manager.modify-profile
ResultAny=no
ResultInactive=no
ResultActive=yes

再输入

1
sudo gedit /etc/polkit-1/localauthority/50-local.d/46-allow-packagekit.pkla

再把下面这段内容复制粘贴并保存

1
2
3
4
5
6
[Allow Package Management all Users]
Identity=unix-user:*
Action=org.freedesktop.packagekit.system-sources-refresh
ResultAny=yes
ResultInactive=yes
ResultActive=yes

即可完成配置。

优化配置

https://blog.csdn.net/wu_weijie/article/details/116158271

https://cloud.tencent.com/developer/article/2129798

概念

介绍

Kubernetes也成为k8s,是用于自动部署、扩缩容和管理容器化应用程序的开源系统。

– 将组成应用程序的容器组合成逻辑单元,以便于管理和服务发现。

前身是Google的borg,后捐赠给CNCF。

一些特性

自动化上线和回滚

Kubernetes 会分步骤地将针对应用或其配置的更改上线,同时监视应用程序运行状况以确保你不会同时终止所有实例。如果出现问题,Kubernetes 会为你回滚所作更改。你应该充分利用不断成长的部署方案生态系统。

服务发现与负载均衡

无需修改你的应用程序去使用陌生的服务发现机制。Kubernetes 为容器提供了自己的 IP 地址和一个 DNS 名称,并且可以在它们之间实现负载均衡。

自我修复

重新启动失败的容器,在节点死亡时替换并重新调度容器, 杀死不响应用户定义的健康检查的容器, 并且在它们准备好服务之前不会将它们公布给客户端。

存储编排

自动挂载所选存储系统,包括本地存储、诸如 AWSGCP 之类公有云提供商所提供的存储或者诸如 NFS、iSCSI、Ceph、Cinder 这类网络存储系统。

Secret 和配置管理

部署和更新 Secret 和应用程序的配置而不必重新构建容器镜像, 且不必将软件堆栈配置中的秘密信息暴露出来。

自动装箱

根据资源需求和其他限制自动放置容器,同时避免影响可用性。 将关键性的和尽力而为性质的工作负载进行混合放置,以提高资源利用率并节省更多资源。

批量执行

除了服务之外,Kubernetes 还可以管理你的批处理和 CI 工作负载,在期望时替换掉失效的容器。

IPv4/IPv6 双协议栈

为 Pod 和 Service 分配 IPv4 和 IPv6 地址

水平扩缩

使用一个简单的命令、一个 UI 或基于 CPU 使用情况自动对应用程序进行扩缩。

为扩展性设计

无需更改上游源码即可扩展你的 Kubernetes 集群。

一些实践

常用命令

1
2
3
4
5
6
7
8
9
10
11
12
13
# start k3s server
sudo nohup k3s server --docker &
# kill all
sh /usr/local/bin/k3s-killall.sh
# 进入容器
kubectl exec -it <pod_name> -c <container_name> -- <command>
k exec -it nginx-deployment-6d945c9c6b-b8b6z -c mynginx /bin/bash
# /bin/sh

# 在node节点上查看iptable配置
sudo iptables -L -v -n -t nat


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# 如定义了三个pod,一个service抽象
% k get pods -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
demo-deployment-866496cd-rnml9 1/1 Running 0 23m 10.42.0.11 zp-desktop <none> <none>
demo-deployment-866496cd-td9q9 1/1 Running 0 23m 10.42.0.10 zp-desktop <none> <none>
demo-deployment-866496cd-kxc6z 1/1 Running 0 23m 10.42.0.9 zp-desktop <none> <none>
% k get svc -o wide
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE SELECTOR
demo-service NodePort 10.43.217.37 <none> 30000:30001/TCP,30010:30011/TCP 21m app=demo-app
# iptables的chain如下
Chain KUBE-SVC-63XIDVX3FQTFCQ6L (2 references)
pkts bytes target prot opt in out source destination
0 0 KUBE-MARK-MASQ tcp -- * * !10.42.0.0/16 10.43.217.37 /* default/demo-service:spring-svc cluster IP */ tcp dpt:30000
0 0 KUBE-SEP-YJLR2SS2M4E7KIG7 all -- * * 0.0.0.0/0 0.0.0.0/0 /* default/demo-service:spring-svc -> 10.42.0.10:6000 */ statistic mode random probability 0.33333333349
0 0 KUBE-SEP-664WUM5UBXGPHS7X all -- * * 0.0.0.0/0 0.0.0.0/0 /* default/demo-service:spring-svc -> 10.42.0.11:6000 */ statistic mode random probability 0.50000000000
0 0 KUBE-SEP-2NKQLS73Z4PYUJBC all -- * * 0.0.0.0/0 0.0.0.0/0 /* default/demo-service:spring-svc -> 10.42.0.9:6000 */
# 后面跟着的小数表示:选择该pod的几率,按链条上的顺序一个个判断

wsl搭建k3s环境

https://www.guide2wsl.com/

或见另外的post

k3s集群搭建

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# 装好了master节点后
# 查看k3s token
sudo cat /var/lib/rancher/k3s/server/node-token
# 新节点执行如下命令
curl -sfL https://get.k3s.io | K3S_URL=https://myserver:6443 K3S_TOKEN=K10f0babbc6cac44560f6e3271aa0af817910b1b61712a1fbde9dee4811026fbaa8::server:157a7f73685391377e14699136b1a121 INSTALL_K3S_EXEC="--docker" sh -
# https://blog.csdn.net/weixin_43960618/article/details/108106020
sudo vim /etc/systemd/system/multi-user.target.wants/k3s-agent.service
# 修改ExecStart的值,加上 --docker启动参数
sudo systemctl daemon-reload
# restart
service k3s-agent restart
# 或者手动启动参考https://mmdjiji.com/2022/09/1201/
# 或许要开通防护墙,sudo ufw allow from 192.168.31.22 to any port 6443 proto tcp
k3s agent --server <K3s服务器地址>:<端口> --token <节点令牌>
sudo /usr/local/bin/k3s agent --server https://192.168.31.22:6443 --token K10f0babbc6cac44560f6e3271aa0af817910b1b61712a1fbde9dee4811026fbaa8::server:157a7f73685391377e14699136b1a121 --docker

yaml样例

Dockerfile

nginx

Dockerfile

1
2
3
4
5
6
7
8
# 使用官方的nginx镜像作为基础镜像
FROM nginx:latest
# 复制自定义的index.html文件到nginx的默认目录下
COPY ./index.html /usr/share/nginx/html/index.html
# 暴露80端口,用于接收HTTP请求
EXPOSE 80
# 启动nginx服务
CMD ["nginx", "-g", "daemon off;"]
1
2
3
4
5
<html>
<body>
<h1>Hello World!</h1>
</body>
</html>
1
2
# build image
docker build -t mynginx:v1 .
1
2
# run
docker run --name mynginx -p 8888:80 -d mynginx:v1

k8s

部署自己tag的nginx镜像,并挂载一个目录到node节点

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
spec:
replicas: 1
selector:
matchLabels:
app: demo-app
template:
metadata:
labels:
app: demo-app
spec:
containers:
- name: mynginx
image: mynginx:v1
#imagePullPolicy: Never
volumeMounts:
- name: demo-storage
mountPath: /var/log/myapp
volumes:
- name: demo-storage
hostPath: # 挂载到所在node节点
path: /var/log/myapp/nginx

遇到的一些问题

找不到docker image

咋回事呢,镜像名和tag都写错啊

1
2
3
4
5
6
7
302 ~/k3s  » k create -f deployment-demo.yaml
deployment.apps/demo-deployment created
306 ~/k3s » k get pods
NAME READY STATUS RESTARTS AGE
demo-deployment-fc474df9f-hcxfz 0/1 ErrImagePull 0 6s
demo-deployment-fc474df9f-z9tbq 0/1 ErrImagePull 0 6s
demo-deployment-fc474df9f-hzd6g 0/1 ErrImagePull 0 6s

指定仅从本地拉镜像,Failed

1
2
3
4
5
spec:
containers:
- name: <name>
image: <local-image-name>
imagePullPolicy: Never
1
2
3
313 ~/k3s  » k get pods
NAME READY STATUS RESTARTS AGE
demo-deployment-866496cd-whg25 0/1 ErrImageNeverPull 0 4s

指定docker镜像仓库,Success

根据我的搜索结果12,k3s 默认是使用 containerd 作为容器运行时,并从 docker.io 拉取镜像。

即启动k3s server时要这样子

1
2
# /usr/local/bin/k3s-killall.sh
sudo k3s server --docker &

或直接指定

1
2
3
4
5
6
# /etc/rancher/k3s/registries.yaml
mirrors:
docker.io:
endpoint:
- "http://localhost:5000" # docker默认端口是5000

现在是4/4 00:21了,写点东西,刷牙洗脸就睡觉..

打算不用微博了,自己博客也可以发动态,GitHub也可以当图床保存我的照片,感觉就没有必要继续在微博上更新了..


今天遇到一个特别无语的事情。晚上房东给我发这个月的房租账单,给她转钱的时候,发现自己银行卡居然被限额了。这就是‘有钱’的烦恼吗?😶


大概配置好了,明天开始可以在这里更新我的内容啦..

明天我会发什么呢?🤭

前言

目前需要什么?

  • 一个mock服务器 – 方便前端、客户端、trd服务端、甚至是cp接入接口

  • 约定俗成的api描述规范 – OpenApi就行

  • 一个因地制宜的便捷的api文档维护方式 – 谁也不想写文档,要尽量减少编写、维护文档的成本

  • 一致性测试,或者说接口集成测试 – 保证开发&上线之间的一致性

    https://microcks.io/documentation/using/tests/

为什么需要这些东西?

  • 是前后端沟通的媒介,也是个留档
  • 方便前后端并行开发
  • 方便进行一致性校验,如搞个actions测接口
  • 给客户端一些接口mock支持
  • 给cp一些接口mock支持

目前有什么现成的工具?

mock工具

  • wiremock:一个开源的测试工具,支持HTTP响应存根、请求验证、代理/拦截、记录和回放

  • PowerMock

  • TestableMock:2020 年 12 月开始开源,出自阿里云云效团队,主要想解决 Java 开发者在日常单元测试中经常遇到的痛点

    https://github.com/alibaba/testable-mock

API文档管理工具

注:swagger 和 YApi 可以相互辅助,利用 swagger 生成API文档元数据,再通过 YApi 进行集中管理

如果觉得不够方便,还可以自己打造一个中央文档系统,笔者的前东家唯品会就是这么做的,开发使用一条命令就可以生成API元数据并上传到中央文档系统中,使用更便捷。

一些有意思的问题

  1. 如何方便地从spring的controller里提取出接口,并且以OAS描述?
  2. 要搞自己的mock服务器么?这样子会增加运维成本哟

一些方案

1、分段式设计

各个段落应该保持独立,交流方式是固定的,合作伙伴是可变的

业务代码 → 单元测试 → OAS数据 → 数据中转平台 → 文档集中管理(权限管理) → mock服务器(权限管理) → 一致性测试(actions CI/CD)

可以写一套sdk,利用注解+反射实现OAS数据生成,其中可以用URL识别接口,以Hash值作为版本判断依据。

2、Apifox – 一个我需要的平台,但是它丫的不开源,要收钱

它的定位:Apifox = Postman + Swagger + Mock + JMeter

接口文档和接口开发调试使用同一个工具

做下自我介绍

Grafana

https://github.com/grafana/grafana

The open-source platform for monitoring and observability

  • 一个开源的数据可视化工具:将数据源中的数据转换成可视化图表
  • 支持多种数据源,包括Prometheus、InfluxDB、Elasticsearch、MySQL等
  • 另外就是Dashboard、Alert

Loki - Grafana

https://github.com/grafana/loki

Loki: like Prometheus, but for logs.

  • 开源,多租户,日志聚合系统
  • 受到Prometheus的启发
  • LogQL(跟PromQL很像,不过多了日志流处理)

Prometheus - CNCF

https://github.com/prometheus/prometheus

https://prometheus.io/docs/introduction/overview/

From metrics to insight

Power your metrics and alerting with the leading
open-source monitoring solution.

  • 一个开源的完整监控解决方案
  • PromQL
  • 2016年加入云原生计算基金会(CNCF),成为继Kubernetes之后的第二个托管项目

image-20230401092123696

Tempo - Grafana - CNCF

https://github.com/grafana/tempo

Grafana Tempo is an open source, easy-to-use and high-scale distributed tracing backend.

  • trace
  • TraceQL (受LogQL和PromQL的启发…)

一些概念

PromQL

允许用户实时选择和汇聚时间序列数据。表达式的结果可以在浏览器中显示为图形,也可以显示为表格数据,或者由外部系统通过 HTTP API 调用。

在 Prometheus 的表达式语言中,表达式或子表达式包括以下四种类型之一:

  • 瞬时向量(Instant vector) - 一组时间序列,每个时间序列包含单个样本,它们共享相同的时间戳。也就是说,表达式的返回值中只会包含该时间序列中的最新的一个样本值。而相应的这样的表达式称之为瞬时向量表达式
  • 区间向量(Range vector) - 一组时间序列,每个时间序列包含一段时间范围内的样本数据。
  • 标量(Scalar) - 一个浮点型的数据值。
  • 字符串(String) - 一个简单的字符串值。

其他说明

  • Metric:指标

  • Label:标签

  • Time Series:时间序列

  • 标量(scalar): 普通值,如1,2,3

  • 向量(vector):一时间序列数据,每时间序列数据都有一个指标名称和一组键值对label

    1
    2
    3
    4
    指标名称{label}
    http_requests_total{method="GET", handler="/api/comments"} 100
    http_requests_total{method="POST", handler="/api/comments"} 200
    http_requests_total{method="GET", handler="/api/posts"} 300
  • Function:接受一个或多个参数,并返回一个标量或向量

  • Range vector selector:选择一个时间范围内的所有时间序列

  • Instant vector selector:选择一个时间点上的所有时间序列

怎么查日志?

诞生之旅:PromQL >> LogQL >> TraceQL

PromQL文档:https://prometheus.fuckcloudnative.io/di-san-zhang-prometheus/di-4-jie-cha-xun/basics

查询思路

一些常用的语句

Set up

主题

官方主题列表

感觉还不错的

其他配置

一些问题

win 脚本执行

1
2
3
4
# 允许您在本地计算机上运行自己编写的脚本
Set-ExecutionPolicy RemoteSigned
# 将禁止在本地计算机上运行自己编写的脚本
Set-ExecutionPolicy Restricted

Github 连接问题

1
2
3
# 10809是v2rayN的代理端口
git config --global http.proxy http://127.0.0.1:10809
git config --global https.proxy http://127.0.0.1:10809