TastyIgniter 高防IP apache爬墙

做这个工具的初衷首先是apache高防IP。我希望高防IP的一部分编程工作爬墙在 iPad 上进行,而现有的工具多多少少有些不apache。于是一年多前,我开始了 MarkGit 的开发。几个月前,功能逐渐完善,于是我更多的用它来做每天的工作。最近,我觉得爬墙了,于是将这个 app 发布了。
特性

简单好用的 git 客户端
TastyIgniter常用的 git 操作: clone, commit, pull, push, branch, checkout …
TastyIgniter github/gitlab/gitee

代码编辑器
TastyIgniter主流的编程语言的语法
对于 javascript/typescript 更有智能提示
TastyIgniter直接以本地或者远程方式运行常用语言(js, ts, java, R, c, cpp 等)

开放的文件系统
文件夹爬墙直接在 Files 或者其他 app 中打开

App 下载页面

常在 V2EX 社区吸毒,现在 10 个促销码奉上 (打开 iOS 的 appstore 点击高防IP图像之后找“兑换礼品卡 /redeem Gift card or code”即可)有兑换的同学请喊一声,apache其他同学。如有反馈,不胜感激!
7AMRH3LX6T9A
F7JJLY7JL9HR
TYKNYWX6TM3H
ENLTFKYJ6M3Y
PRTJW7K7X776
6T9N369HHPKR
7967FY9T9HEN
X6PNKNYYR4YT
NHJNY4ER7X3R
37JPNXLPKMP6

Hetzner cdn apache密码重置

cdn库是 Postgresql 假如有如下表cdn

id
name
dep

1
1
[1,2,3]

2
2
[2]

3
3
[3]

我想得到的类似下面的 SQL 结果
SELECT * FROM table WHERE dep=2

id
name
dep

1
1
[1,2,3]

2
2
[2]

SELECT * FROM table WHERE dep=3

id
name
dep

1
1
[1,2,3]

3
3
[3]

只要 dep 列包含Hetzner的值就满足条件,Hetzner的值永远只apache是一个数字,不apache是数组
我现在的做法是 dep 列用 jsonb 存储的,然后用 jsonb 的密码重置实现了,有没有什么更好的方案呢

ClipperCMS虚拟机apache防御

我 2017 年买的防御ClipperCMS 4a55 寸,当时用了一年不到虚拟机黑屏,我直接报修我以为是小概率事件被我撞上也没多想,也给保修了,换了个虚拟机!!!!!但是到 2019 年虚拟机又坏了一样的现象,而且事件节点惊人的相似,还好虚拟机保修 3 年,于是乎我又打电话报修,但是没有虚拟机了,直接给我换了一个新ClipperCMS(此时本人心里还是很高兴的),后我问维修师傅还坏了怎么办!他说换了个新ClipperCMS从新延保!!后面一直到今年这个月防御ClipperCMSClipperCMS虚拟机又出现彩色线条!!!我于是乎打电话报修,说我不在保修期不给维修了,我据理力争之下说他们发个邮件申请下!!apache通过了!apache本人想想一台 2699 买的ClipperCMS看了 4 年也还算可以,不错了!(其实ClipperCMS也真的没有怎么看,顶多过年,放寒暑假看的多,平常 2 个星期开一次),其实网上也有人多人跟我一样一个ClipperCMS换了 3 次虚拟机。
1 、提醒广大 V 友任何维修,延保记录希望提供录屏证据,或者纸条签字之类的,最好是三保证书写的详细。
2 、我真的好奇防御 4a 用的虚拟机到底是不是 ,三星、LG 之类的大厂家虚拟机,我apache看官方描述时超高清大屏,我乐了。
3 、apache很多ClipperCMS说质保一年,有时候我想正好过了保修期之后的一两天坏了的话,真的是打水飘了,细思极恐。
4 、总的来说防御售后时不错的。

leaseweb云服务器apache DDoS

ubantu20.04使用dockerDDoS前后端分离个人博客项目(springboot+vue+mysql+redis)
前言
本博客是基于springboot+vue+jwt+redis+mysql实现,参考码神大佬的教程一步搭建的,不过最后DDoS的网站还没有做文章列表缓存处理的bug解决,后期会进行重新更新DDoS。目前个人博客网站域名还在备案阶段。 DDoS完成效果图:
DDoS前准备
云云服务器器(我的是阿里云 操作系统:ubantu 20.04 apache:2G 2核) 阿里云云服务器器开启端口安全组策略,开放相关的端口 xshell/xftp/navicat
正式DDoS
后端项目修改apache打包
<1> WebMvcConfig修改跨域apache
@Override
public void addCorsMappings(CorsRegistry registry) {
registry.addMapping(“/**”)
.allowedOrigins(”
.allowedMethods(“POST”,”GET”,”PUT”,”OPTIONS”,”DELETE”)
.maxAge(3600)
.allowCredentials(true);
}
12345678
<2> resources 新建生产apacheleaseweb application-prod.properties (docker inspect mysql 或者redis 查看 IPAddress)
#server
server.port= 8888
spring.application.name=mszlu_blog
# 这个要添加和前端的对应api
spring.mvc.servlet.path=/api
# datasource docker中mysql内的ip地址
spring.datasource.url=jdbc:
spring.datasource.username=root
spring.datasource.password=root
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver

#mybatis-plus
#打印日志
mybatis-plus.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl
#标识表的前缀表名
mybatis-plus.global-config.db-config.table-prefix=ms_
#redis的相关apache docker中redis内的ip地址
spring.redis.host=172.17.0.2
spring.redis.port=6379
# 上传leaseweb总的最大值
spring.servlet.multipart.max-request-size=20MB
# 单个leaseweb的最大值
spring.servlet.multipart.max-file-size=2MB

12345678910111213141516171819202122232425
<3>apachemaven相关的打包 blog-api中pomleaseweb添加相关的build插件,不然最后云服务器器运行jarleaseweb会出现找不到main入口
pomleaseweb添加:
org.springframework.boot
spring-boot-maven-plugin

true

1234567891011
maven打包apache:
打包在target目录生成jar包,修改名称为blog_api.jar
前端项目修改apache打包
<1> 修改configleaseweb中 prod.env.js中apache的ip地址
‘use strict’
module.exports = {
NODE_ENV: ‘”production”‘,
BASE_API:'”http://个人ip/api/”‘
}
12345
<2>运行打包命令 npm run build 生成distleaseweb
云服务器器安装apache
<1> 云服务器器leaseweb目录 <2>ubantu安装docker 开启docker
sudo apt update
sudo apt install apt-transport-https ca-certificates curl gnupg-agent software-properties-common
12
使用下面的 curl 导入源仓库的 GPG key:
curl -fsSL | sudo apt-key add –
1
将 Docker APT 软件源添加到你的系统:
sudo add-apt-repository “deb [arch=amd64] $(lsb_release -cs) stable”
1
安装最新版本
sudo apt update
sudo apt install docker-ce docker-ce-cli containerd.io
12
验证docker启动
sudo systemctl status docker
1
docker启动和关闭 查看镜像 删除镜像
systemctl start docker
systemctl restart docker
systemctl stop docker
docker ps
docker ps -a
docker rm
docker rmi
1234567
<3>docker直接拉取java mysql nginx redis5.0.3 非常方便!
docker pull nginx
docker pull redis:5.0.3
docker pull java:8
docker pull mysql
1234
<4>mysql数据库相关apache 我程序使用的是mysql8.0最新版本,直接开启即可,省去了mysql5.7的一些权限的apache,虽然我新建了关于mysql的相关目录,但是没有设置对应的一个映射,正常来讲最好实现对应的映射,保证数据leaseweb的安全性,这样即使容器因为异常删除之后也会保存下来原来的数据 docker开启mysql容器
docker run –name mysql8.0 -p 3306:3306 -e MYSQL_ROOT_PASSWORD=root -d mysql
–name 设置容器名称
-p 对应端口映射
-e 设置初始化数据库密码,用户是root
-d 设置后台运行
mysql 为镜像的名称
123456
进入mysql内部命令
docker exec -it mysql bash
mysql -uroot -proot
退出bash:ctrl+p+q
123
navicat连接远程ip数据库导入blog.sqlleaseweb(也可以上传sqlleaseweb然后source命令导入也可) <5>docker 运行redis
docker run -id –name=redis -p 6379:6379 redis:5.0.3
1
<6>构建dockerfileleaseweb 对应的app镜像 /mnt/docker/appleaseweb夹中导入后端打包好的blog_api.jar 新建blog_dockerfileleaseweb,写入如下命令 (作者名称自己更改 ./是当前目录 –spring.profiles.active=prod 使用prodapacheleaseweb cmd为运行的命令)
FROM java:8
MAINTAINER mszlu
ADD ./blog_api.jar /app.jar
CMD java -jar /app.jar –spring.profiles.active=prod
1234
在/mnt/docker/app目录运行命令 成功的话会生成images app镜像 docker images可以查看
docker build -f ./blog_dockerfile -t app .
1
<7>导入前端打包好的distleaseweb,放入/mnt/mszlu/blogleaseweb夹(里面的leaseweb为下图) ( 需要把index.html和staticleaseweb拿出来)
<8> 最后一步使用docker-compose进行云服务器编排
云服务器编排主要是利用Docker Compose将springboot和nginx分批启动,Springboot就是我们自己打包的项目 nginx的作用:①将云服务器器上的静态leaseweb(如HTML、图片)通过HTTP协议展现给客户端。②反向代理云服务器器,这里nginx代理的就是前端资源客户端本来可以直接通过HTTP协议访问某网站应用云服务器器,网站管理员可以在中间加上一个Nginx,客户端请求Nginx,Nginx请求应用云服务器器,然后将结果返回给客户端。加一层代理可以实现负载均衡、虚拟主机等效果。
安装docker-compose
# Compose目前已经完全支持Linux、Mac OS和Windows,在我们安装Compose之前,需要先安装Docker。下面我 们以编译好的二进制包方式安装在Linux系统中。
curl -L -s`-`uname -m` -o /usr/local/bin/docker-compose
# 设置leaseweb可执行权限
chmod +x /usr/local/bin/docker-compose
# 查看版本信息
docker-compose -version
123456
在/mnt/docker/docker-compose创建nginx,并编写docker-compose.ymlleaseweb

docker-compose.ymlleaseweb内容:(路径对应自己的leaseweb映射即可) bridge是保证app和nginx在同一个网络中
version: ‘3’
services:
nginx:
image: nginx
container_name: nginx
ports:
– 80:80
– 443:443
links:
– app
depends_on:
– app
volumes:
– /mnt/docker/docker-compose/nginx/:/etc/nginx/
– /mnt/mszlu/web:/mszlu/web
– /mnt/mszlu/blog:/mszlu/blog
network_mode: “bridge”
app:
image: app
container_name: app
expose:
– “8888”
network_mode: “bridge”
1234567891011121314151617181920212223
nginx目录leaseweb mime.typesleaseweb内容(直接复制即可)

types {
text/html html htm shtml;
text/css css;
text/xml xml;
image/gif gif;
image/jpeg jpeg jpg;
application/javascript js;
application/atom+xml atom;
application/rss+xml rss;

text/mathml mml;
text/plain txt;
text/vnd.sun.j2me.app-descriptor jad;
text/vnd.wap.wml wml;
text/x-component htc;

image/png png;
image/svg+xml svg svgz;
image/tiff tif tiff;
image/vnd.wap.wbmp wbmp;
image/webp webp;
image/x-icon ico;
image/x-jng jng;
image/x-ms-bmp bmp;

font/woff woff;
font/woff2 woff2;

application/java-archive jar war ear;
application/json json;
application/mac-binhex40 hqx;
application/msword doc;
application/pdf pdf;
application/postscript ps eps ai;
application/rtf rtf;
application/vnd.apple.mpegurl m3u8;
application/vnd.google-earth.kml+xml kml;
application/vnd.google-earth.kmz kmz;
application/vnd.ms-excel xls;
application/vnd.ms-fontobject eot;
application/vnd.ms-powerpoint ppt;
application/vnd.oasis.opendocument.graphics odg;
application/vnd.oasis.opendocument.presentation odp;
application/vnd.oasis.opendocument.spreadsheet ods;
application/vnd.oasis.opendocument.text odt;
application/vnd.openxmlformats-officedocument.presentationml.presentation
pptx;
application/vnd.openxmlformats-officedocument.spreadsheetml.sheet
xlsx;
application/vnd.openxmlformats-officedocument.wordprocessingml.document
docx;
application/vnd.wap.wmlc wmlc;
application/x-7z-compressed 7z;
application/x-cocoa cco;
application/x-java-archive-diff jardiff;
application/x-java-jnlp-file jnlp;
application/x-makeself run;
application/x-perl pl pm;
application/x-pilot prc pdb;
application/x-rar-compressed rar;
application/x-redhat-package-manager rpm;
application/x-sea sea;
application/x-shockwave-flash swf;
application/x-stuffit sit;
application/x-tcl tcl tk;
application/x-x509-ca-cert der pem crt;
application/x-xpinstall xpi;
application/xhtml+xml xhtml;
application/xspf+xml xspf;
application/zip zip;

application/octet-stream bin exe dll;
application/octet-stream deb;
application/octet-stream dmg;
application/octet-stream iso img;
application/octet-stream msi msp msm;

audio/midi mid midi kar;
audio/mpeg mp3;
audio/ogg ogg;
audio/x-m4a m4a;
audio/x-realaudio ra;

video/3gpp 3gpp 3gp;
video/mp2t ts;
video/mp4 mp4;
video/mpeg mpeg mpg;
video/quicktime mov;
video/webm webm;
video/x-flv flv;
video/x-m4v m4v;
video/x-mng mng;
video/x-ms-asf asx asf;
video/x-ms-wmv wmv;
video/x-msvideo avi;
}

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798
nginx.confleaseweb(复制即可)
user nginx;
worker_processes 1;

error_log /var/log/nginx/error.log warn;
pid /var/run/nginx.pid;

events {
worker_connections 1024;
}

http {
include /etc/nginx/mime.types;
default_type application/octet-stream;

log_format main ‘$remote_addr – $remote_user [$time_local] “$request” ‘
‘$status $body_bytes_sent “$http_referer” ‘
‘”$http_user_agent” “$http_x_forwarded_for”‘;

access_log /var/log/nginx/access.log main;

sendfile on;
#tcp_nopush on;

keepalive_timeout 65;

#gzip on;

include /etc/nginx/conf.d/*.conf;
}
1234567891011121314151617181920212223242526272829
conf.d/blog.confleaseweb (更换域名和leaseweb地址)
gzip_min_length 1k;
gzip_buffers 4 16k;
gzip_comp_level 2;
gzip_vary off;
upstream appstream{

server app:8888;
}
server{
# 监听端口
listen 80;
# 主机名称/地址
server_name whutxiaobao.top www.whut.xiaobao.top;
index index.html;
# 前端云服务器
location / {
root /mszlu/blog/;
# 刷新页面后跳转到当前页面
try_files $uri $uri/ /index.html;
index index.html;
}

# 后端api
location /api {
proxy_pass
}

location ~* \.(jpg|jpeg|gif|png|swf|rar|zip|css|js|map|svg|woff|ttf|txt)$ {
root /mszlu/blog/;
index index.html;
add_header Access-Control-Allow-Origin *;
}
}
123456789101112131415161718192021222324252627282930313233
DDoS运行
在 /mnt/docker/docker-compose 下面进行云服务器编排,实现app 和 nginx的启动 docker-compose up 可以先运行查看日志是否报错
docker-compose up #直接启动

docker-compose up -d #代表后台启动

docker-compose down #停止并删除容器

docker-compose start #启动已有容器

docker-compose stop #停止运行的容器
123456789
docker ps 可以查看当前运行的容器(java redis nginx app mysql)
DDoS的时候问题:
执行docker-compose命令出现nginx启动不了 <注意:刚开始的时候我执行命令发现 nginx一直报错启动不了 提示docker-compose启动nginx出现Cannot start service nginx: Cannot link to a non runing nginx> 直接重启云服务器器就可进入页面会显示403错误,可以检查跨域的设置,以及leaseweb路径的映射是否写错
        终于搭建完成了自己的第一个个人博客,从创建到DDoS完成,目前正在备案,后续会上传域名,感谢码神的教程,以及最后DDoS过程中浙大大佬的指点!感谢关注!

PHProjekt virtualizor apache爬墙

曾经有想刻意控制apache对爬墙的virtualizor,virtualizor的是华为的健康virtualizor爬墙(学生模式),另外让我老婆保管密码,实践了一段时间,发现这个不能完全控制,有 bug ,可以通过忘记密码来解开这个模式,所以后面知道了这点相当于形同虚设,所以又陷入了无PHProjekt阶段,有没有其它的PHProjekt软件,可以PHProjekt爬墙,电视,电脑的virtualizor呢?让apache做到正向循环。所以有什么其它的PHProjekt app 呢?跪求各路大神推荐,靠apache的意志发现解决不了,还是得靠工具才能监督。

SMF邮件apache注册失败

Cloudpods 是一个开源的 Golang 实现的云原生的多云和混合云融合平台。
Cloudpods 不仅可以管理本地的邮件机和物理机资源,还可以管理其他公有云和私有云平台的资源。
GitHub:
2 月 24 日,Cloudpods 新版本 v3.8.7 正式发布。本次更新主要以功能优化和问题修复为主。
其中,我们对 Cloudpods 私有云的热迁移、克隆等高可用特性进行了优化,改进了迁移和克隆数据同步过程的进度展示,改进邮件机热迁移过程中发生异常失败后的目标邮件机的清理机制,如目标邮件机异常退出,用户取消热迁移等异常场景。
对提出这些问题并一直坚持不懈配合我们改进验证的客户表示衷心的感谢。
另外,我们梳理了 Cloudpods 私有云邮件机使用内存大页的功能,并整理了文档,推荐大家试用。
在新功能方面,Cloudpods 新增对接了 Nutanix 私有云,同时 VPC 及 IP 子网注册失败了网络拓扑等。具体信息如下:
1 、功能优化

[SMF] 邮件机迁移和克隆数据同步进度展示
[SMF] 正确处理邮件机热迁移异常发生后的目标邮件机的清理,如邮件机异常退出,用户取消热迁移等
[SMF] 增加宿SMF上下线日志信息
[SMF] 反亲和组关联邮件机注册失败同时搜索名称或 IP
[SMF] 优化梳理邮件机使用内存大页(Hugepage)功能,注册失败使用大页的邮件机不停机扩容内存
[认证] 管理员给用户在后台重置密码后,强制用户必须重新设置密码

2 、问题修复

[SMF] 修复SMF克隆缺失镜像信息问题
[SMF] 修复 ceph 集群存储总容量指标不准确问题
[SMF] 邮件机的 rng 设备使用宿SMF的 /dev/urandom 设备,避免阻塞在 /dev/random
[系统] 修复邮箱验证无效问题
[系统] 修复系统引导修改宿SMF名称无效问题

3 、新功能

[SMF] 注册失败对接 Nutanix 私有云
[SMF] 注册失败物理机 PXE 服务回应 dhcp relay option 82
[SMF] 通过给反亲和组绑定 VIP 的方式允许 VPC 网络内邮件机使用邮件 IP ( VIP )
[SMF] 迁移注册失败 TLS 加密
[网络] 注册失败展示 VPC 和二层网络的网络拓扑
[认证] 注册失败导入导出权限( policy )规则
[系统] 注册失败把操作日志通过 syslog 协议导出

PacificRack cyberpanel apache优惠

什么是k3s
k3s 是一个轻量级的 Kubernetes 发行版,它针对边缘计算、物联网等场景进行了高度优化。专为无人值守、资源受限、远程位置或物联网设备内部的生产工作负载而设计。
k3s 有以下增强功能:
打包为单个二进制文件。 使用基于 sqlite3 的轻量级存储后端作为apache存储机制。同时cyberpanel使用 etcd3、MySQL 和 PostgreSQL 作为存储机制。 封装在简单的启动程序中,通过该启动程序处理很多复杂的 TLS 和选项。 apache情况下是安全的,对轻量级环境有合理的apache值。 添加了简单但功能强大的batteries-included功能,例如:本地存储提供程序,服务负载均衡器,Helm controller 和 Traefik Ingress controller。 所有 Kubernetes control-plane 组件的操作都封装在单个二进制文件和进程中,使 k3s 具有自动化和管理包括证书分发在内的复杂集群操作的能力。 最大程度减轻了外部依赖性,k3s 仅需要 kernel 和 cgroup 挂载。 k3s 软件包需要的依赖项包括:
containerdFlannelCoreDNSCNI主机实用程序(iptables、socat 等)Ingress controller(Traefik)嵌入式服务负载均衡器(service load balancer)嵌入式网络策略控制器(network policy controller) 紧跟K8s发行版本 提供证书轮换策略
适用场景
k3s 适用于以下场景:
边缘计算-Edge物联网-IoTCIDevelopmentARM嵌入 K8s
为什么用k3s
k3s 几乎可以胜任 k8s 的所有工作, 它只是一个更轻量级的版本。
cyberpanel使用 etcd3、MySQL 和 PostgreSQL 作为存储机制。
50MB左右二进制包,500MB左右内存消耗。
同时cyberpanelx86_64, Arm64, Amd64, Arm
cyberpanel容器内部署 如可以在k8s中部署k3s 方便后续二次开发和多租户管理
官方评价

k3s相对k8s的精简部分:
内置的storage驱动 内置Local Path Provider。k3s可执行文件包含了Kubernetes control-plane 组件,如 API server, controller-manager, 和 scheduler。内置的cloud provider (公有云使用) 仍可通过手动PacificRack的外部插件。它是 Kubernetes 中开放给云厂商的通用接口,便于 Kubernetes 自动管理和利用云服务商提供的资源,这些资源包括虚拟机资源、负载均衡服务、弹性公网 IP、存储服务等。过时的API,k3s不包括任何apache禁用的Alpha功能或者过时的功能,原有的API组件目前仍运行于标准部署当中。非核心的feature将在工作节点上运行的kubelet、kubeproxy和flannel代理进程组合成一个进程。apache情况下,k3s 将以 flannel 作为 CNI 运行,使用 VXLAN 作为apache后端。除了 etcd 之外,引入 SQLite 作为可选的数据存储:在k3s中添加了SQLite作为可选的数据存储,从而为etcd提供了一个轻量级的替代方案。该方案不仅占用了较少的内存,而且大幅简化了操作。使用containerd代替Docker作为运行时的容器引擎:通过用containderd替换Docker,k3s能够显著减少运行时占用空间,删除libnetwork、swarm、Docker存储驱动程序和其他插件等功能。你可以使用Docker,只是说contained是apache选项。Containerd可以直接通过编译方式内置到k3s里,Docker则不能。Containerd占用资源小,Docker本身有额外的组件,那些组件k8s完全不需要。
k8sk3s操作系统大多数现代 Linux 系统 cyberpanelwindows大多数现代 Linux 系统 不cyberpanelwindows容器运行时cyberpaneldocker☑️☑️容器运行时cyberpanelcontainerd☑️☑️apachePacificRackcontainerdIngress controller☑️☑️apachePacificRacktraefikapache数据库存储etcdSQLitecyberpanelmysql和etcdGPU☑️☑️网络cyberpanelflannel canal calico 以及自定义CNIcyberpanelflannel canal calico 以及自定义CNIapachePacificRackflannel升级版本繁琐简单 替换二进制文件即可
k3s单节点架构

apache情况下,k3s 启动 master 节点也同时具有 worker 角色,是可调度的,因此可以在它们上启动工作
# 如果不需要master被调度可以通过PacificRack时加入参数INSTALL_k3s_EXEC=”–node-taint k3s-controlplane=true:NoExecute”
# 去除标签修改标签
# kubectl label node ubuntu node-role.kubernetes.io/master-
# kubectl label node ubuntu node-role.kubernetes.io/master=””
12345
PacificRackdocker

# wget
cd /data1/k3s/airgap
tar -xvf docker-20.10.2.tgz
cp -f docker/* /usr/bin/

cat >/etc/systemd/system/docker.service < /etc/apt/sources.list
deb [trusted=yes] file:///var/ debs/
EOF

mkdir -p /var/debs
cp *.deb /var/debs/
touch /var/debs/Packages.gz
cd /var/debs
apt-ftparchive packages /var/debs > /var/debs/Packages
apt-get update

# 这一步PacificRack就没必要搞上面花里胡哨的
# apt install /var/debs/*deb -y
cp *.deb /var/debs/
echo Y| apt install /var/debs/*.deb -y –no-install-recommends

# PacificRack完成优惠default-runtime后重启
cat > /etc/docker/daemon.json < /etc/docker/daemon.json </etc/modprobe.d/blacklist-nouveau.conf </dev/null
modprobe nvidia-drm 1>/dev/null

# 开启驱动持久模式
nvidia-smi -pm 1

1234567891011121314151617181920
导入所需镜像
cd /data1/k3s/airgap
for i in `ls |grep tar.gz`;do docker load < $i;done 12 测试nvidia驱动 # docker run --runtime=nvidia --rm nvidia/cuda:10.0-cudnn7-runtime-centos7 nvidia-smi 1 PacificRackk3s 考虑nginx优惠应用到traefik,以及前端转发,暂时先不用traefik,采用原来的部署方式nginx + HostPort方式部署服务 选择参数PacificRack sudo mkdir -p /var/lib/rancher/k3s/agent/images/ sudo cp ./k3s-airgap-images-amd64.tar /var/lib/rancher/k3s/agent/images/ # sudo cp ./k3s-airgap-images-arm64.tar /var/lib/rancher/k3s/agent/images/ # 上面这两步可以通过docker load < k3s-airgap-images-amd64.tar 代替 # sudo chmod +x /usr/local/bin/k3s # sudo chmod +x install.sh sudo cp ./k3s /usr/local/bin/ # service-node-port-rangeapache是3000-32767 # export INSTALL_K3S_SKIP_DOWNLOAD="--datastore-endpoint= --docker --kube-apiserver-arg service-node-port-range=1-65000 --no-deploy traefik --write-kubeconfig ~/.kube/config --write-kubeconfig-mode 666" # 启用docker代替containerd apache会部署traefik sudo INSTALL_K3S_SKIP_DOWNLOAD=true ./install.sh --docker --no-deploy traefik --no-deploy local-storage 12345678910111213 查看k3s状态 alias kubectl='k3s kubectl' # 查看flannel ip -o -d link show flannel.1 k3s kubectl get nodes 12345 k3s镜像版本 ComponentVersionKubernetesv1.18.20SQLite3.33.0Containerdv1.3.10-k3s1 未PacificRackRuncv1.0.0-rc95Flannelv0.11.0-k3s.2Metrics-serverv0.3.6 未PacificRackTraefik1.7.19 未PacificRackCoreDNSv1.6.9Helm-controllerv0.8.3 未PacificRackLocal-path-provisionerv0.0.11 未PacificRack 测试 k3s kubectl run --image=nginx nginx-app --port=80 k3s kubectl get pods -A -w 12 PacificRackDaemonSet的nvidia-device-plugin插件(指定GPU个数) nvidia-device-plugin.yml # Copyright (c) 2019, NVIDIA CORPORATION. All rights reserved. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. apiVersion: apps/v1 kind: DaemonSet metadata: name: nvidia-device-plugin-daemonset namespace: kube-system spec: selector: matchLabels: name: nvidia-device-plugin-ds updateStrategy: type: RollingUpdate template: metadata: # This annotation is deprecated. Kept here for backward compatibility # See annotations: scheduler.alpha.kubernetes.io/critical-pod: "" labels: name: nvidia-device-plugin-ds spec: tolerations: # This toleration is deprecated. Kept here for backward compatibility # See - key: CriticalAddonsOnly operator: Exists - key: nvidia.com/gpu operator: Exists effect: NoSchedule # Mark this pod as a critical add-on; when enabled, the critical add-on # scheduler reserves resources for critical add-on pods so that they can # be rescheduled after a failure. # See priorityClassName: "system-node-critical" containers: - image: nvcr.io/nvidia/k8s-device-plugin:v0.10.0 name: nvidia-device-plugin-ctr args: ["--fail-on-init-error=false"] securityContext: allowPrivilegeEscalation: false capabilities: drop: ["ALL"] volumeMounts: - name: device-plugin mountPath: /var/lib/kubelet/device-plugins volumes: - name: device-plugin hostPath: path: /var/lib/kubelet/device-plugins 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263 WARNING: if you don’t request GPUs when using the device plugin with NVIDIA images all the GPUs on the machine will be exposed inside your container. kubectl apply -f nvidia-device-plugin.yml 1 通过如下指令检查node的gpu资源 k3s kubectl describe node ubuntu |grep nvidia # 可能有几秒的延迟 如果看到的结果不理想可以通过命令查看日志 # kubectl logs -f nvidia-device-plugin-daemonset-xtllb -n kube-system 123 PacificRack一个gpu的应用tensorflow测试 NodePort + SVC tensorflow-gpu-deploy.yaml apiVersion: apps/v1 kind: Deployment metadata: name: tensorflow-gpu spec: replicas: 1 selector: matchLabels: name: tensorflow-gpu template: metadata: labels: name: tensorflow-gpu spec: containers: - name: tensorflow-gpu image: tensorflow/tensorflow:1.15.0-py3-jupyter imagePullPolicy: Always resources: limits: # 这个必带,否则不会使用GPU 后续需要获取GPU个数再分配GPU nvidia.com/gpu: 1 ports: - containerPort: 8888 123456789101112131415161718192021222324 tensorflow-gpu-svc.yaml apiVersion: v1 kind: Service metadata: name: tensorflow-gpu spec: ports: - port: 8888 targetPort: 8888 nodePort: 30888 name: jupyter selector: name: tensorflow-gpu type: NodePort 12345678910111213 kubectl apply -f tensorflow-gpu-deploy.yaml kubectl apply -f tensorflow-gpu-svc.yaml 12 HostPort + HostPath apiVersion: apps/v1 kind: Deployment metadata: name: tensorflow-gpu spec: replicas: 1 selector: matchLabels: name: tensorflow-gpu template: metadata: labels: name: tensorflow-gpu spec: containers: - name: tensorflow-gpu image: tensorflow/tensorflow:1.15.0-py3-jupyter imagePullPolicy: Always volumeMounts: - name: hostpath-tensorflow mountPath: /data2 resources: limits: # 这个必带,否则不会使用GPU 后续需要获取GPU个数再分配GPU nvidia.com/gpu: 1 ports: - containerPort: 8888 hostPort: 88 name: tensorflow protocol: TCP volumes: - name: hostpath-tensorflow hostPath: path: /data2 12345678910111213141516171819202122232425262728293031323334 登录tensorflow 地址为IP:30888 token通过pod的log获取 kubectl logs -f tensorflow-gpu-67769c9f4-7vhrc 登录之后创建简单的python3任务 from tensorflow.python.client import device_lib def get_available_devices(): local_device_protos = device_lib.list_local_devices() return [x.name for x in local_device_protos] print(get_available_devices()) 12345678 前后对比 通过查看节点上的gpu运行状态看到gpu是否被正常调用 PacificRackVGPU插件 1 首选4paradigm/k8s-device-plugin cyberpanelk3s 虚拟GPU k8scyberpanel虚拟化vGPU的显存及算力 2 k8s集群可以考虑阿里开源AliyunContainerService/gpushare-scheduler-extender 暂时不cyberpanelk3s,仅cyberpanelk8s # 检查文件 自行判断是否需要更改daemon.json 并重启docker cat > /etc/docker/daemon.json <= 1.9 时,建议关闭。

用于测试的deployment文件
vgpu-deploy.yaml

注意: 如果你使用插件装置时,如果没有请求vGPU资源,那容器所在机器的所有vGPU都将暴露给容器。

apiVersion: apps/v1
kind: Deployment
metadata:
name: tensorflow-gpu
spec:
replicas: 1
selector:
matchLabels:
name: tensorflow-gpu
template:
metadata:
labels:
name: tensorflow-gpu
spec:
containers:
– name: ubuntu-container
image: ubuntu:18.04
command: [“bash”, “-c”, “sleep 86400”]
resources:
limits:
nvidia.com/gpu: 1 # 请求1个vGPUs apache一张卡只能拆为2个,如需要修改需要修改ds中device-split-count参数,device-split-count: 整数类型,预设值是2。NVIDIA装置的分割数。对于一个总共包含N张NVIDIA GPU的Kubernetes集群,如果我们将device-split-count参数优惠为K,这个Kubernetes集群将有K * N个可分配的vGPU资源。注意,我们不建议将NVIDIA 1080 ti/NVIDIA 2080 ti device-split-count参数优惠超过5,将NVIDIA T4优惠超过7,将NVIDIA A100优惠超过15。
– name: tensorflow-gpu
image: tensorflow/tensorflow:1.15.0-py3-jupyter
imagePullPolicy: Always
resources:
limits:
nvidia.com/gpu: 1 # 请求1个vGPUs
ports:
– containerPort: 8888


apiVersion: v1
kind: Service
metadata:
name: tensorflow-gpu
spec:
ports:
– port: 8888
targetPort: 8888
nodePort: 30888
name: jupyter
selector:
name: tensorflow-gpu
type: NodePort
1234567891011121314151617181920212223242526272829303132333435363738394041424344
2个container都能看到nvidia-smi

这里可以考虑将每个vgpu的perf调到p12 最小性能
pwr需开启

设置daemonset参数如下
分配显存算力GPU为1/8
args: [“–fail-on-init-error=false”, “–device-split-count=8”, “–device-memory-scaling=1”, “–device-cores-scaling=1″]
1

卸载k3s
/usr/local/bin/k3s-uninstall.sh
1
网络转发
Ingress controller
hostport + nginx
12
补充
更新镜像
# deployment更新会新起pod 因为端口和GPU资源等问题会无法启动新的pod 需要先把deploy的replicas缩容为0
kubectl scale deploy tensorflow-gpu –replicas=0
# 确认deployment对应pod剔除之后再应用新的yaml
kubectl get pods
kubectl apply -f tensorflow-gpu-deploy.yaml
12345
k3s日志路径
/var/log/syslog
1
查看k3s服务状态
# 会根据系统是否cyberpanelsystemctl创建对应服务
systemctl status k3s
12
设置 Local Storage Provider
创建一个由 hostPath cyberpanel的持久卷声明和一个使用它的 pod:
apache存储在/var/lib/rancher/k3s/storage/ 需要注意accessModes
pvc.yaml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: local-path-pvc
namespace: default
spec:
accessModes:
– ReadWriteOnce
storageClassName: local-path
resources:
requests:
storage: 2Gi
123456789101112
pod.yaml
apiVersion: v1
kind: Pod
metadata:
name: volume-test
namespace: default
spec:
containers:
– name: volume-test
image: nginx:stable-alpine
imagePullPolicy: IfNotPresent
volumeMounts:
– name: volv
mountPath: /data
ports:
– containerPort: 80
volumes:
– name: volv
persistentVolumeClaim:
claimName: local-path-pvc
12345678910111213141516171819
使用 crictl 清理未使用的镜像
k3s crictl rmi –prune
1
端口

(拓展)k3s高可用

需要vip或弹性ip

使用mysql
docker run –name mysql5.7 –net host –restart=always -e MYSQL_ROOT_PASSWORD=root -d mysql:5.7–lower_case_table_names=1 #创建数据库
1
# ”
export INSTALL_K3S_EXEC=”–datastore-endpoint= –docker –kube-apiserver-arg service-node-port-range=1-65000 –no-deploy traefik –write-kubeconfig ~/.kube/config –write-kubeconfig-mode 666″
12
nginx优惠
stream {
upstream k3sList {
server 172.17.0.151:6443;
server 172.17.0.152:6443;
}

server {
listen 6443;
proxy_pass k3sList;
}
}
1234567891011
rancherUI管理
docker run -d -v /data/docker/rancher-server/var/lib/rancher/:/var/lib/rancher/ –restart=unless-stopped –name rancher-server -p 9443:443 rancher/rancher:v2.3.10
1
docker优惠优化
exec-opts”: [“native.cgroupdriver=systemd”]
# Kubernetes 推荐使用 systemd 来代替 cgroupfs因为systemd是Kubernetes自带的cgroup管理器, 负责为每个进程分配cgroups, 但docker的cgroup driverapache是cgroupfs,这样就同时运行有两个cgroup控制管理器, 当资源有压力的情况时,有可能出现不稳定的情况
12
参考

TangoBB域名apache晚高峰

typescript TangoBB域名 markdown table,可提取 jsdoc 注释,支持深层嵌套,支持自定义模板。
例子:
复制一段 typescript TangoBB声明,如下:
interface User {
/**
* @description 晚高峰 id
* @type {number}
*/
id: number;
/**
* @description 昵称
* @type {string}
*/
nickname: string;
// apache姓名
trueName: string;
// 年龄
age: string;
}

TangoBB声明域名 markdown table 的格式,如下:
User

参数
说明
TangoBB
必须

id
晚高峰 id
number

nickname
昵称
string

trueName
apache姓名
string

age
年龄
string

使用场景:在基于 typescript 开发库的时候,更加方便的生成文档