诗词收集
收集一些自己平时见到的诗句:
Update 2018-12-24
邻人焉有许多鸡,乞丐何曾有二妻。当时尚有周天子,何事纷纷说魏齐。
算不尽芸芸众生微贱命,回头看五味杂陈奈何天。
何时杖策相随去,任性逍遥不学禅。
百无一用是情深,万般奈何为情困。
桃李春风一杯酒,江湖夜雨十年灯。
杀人放火金腰带,修桥补路无尸骸。
残雪凝辉冷画屏,落梅横笛已三更,更无人处月胧明。我是人间惆怅客,知君何事泪纵横,断肠声里忆平生。 纳兰性德《浣溪沙·残雪凝辉冷画屏》
曾经沧海难为水,除却巫山不是云。取次花丛懒回顾,半缘修道半缘君。
人生到处应何似,应似飞鸿踏雪泥。
山有木兮木有枝,心悦君兮君不知。
嫦娥应悔偷灵药,碧海青天夜夜心。
满堂花醉三千客,一剑霜寒十四州。
早岁读书无甚解,晚年省事有奇功。
车遥遥,马憧憧。君游东山东复东,安得奋飞逐西风。愿我如星君如月,夜夜流光相皎洁。月暂晦,星常明。留明待月复,三五共盈盈。 范成大《车遥遥篇》
一身诗意千寻瀑,万古流芳四月天。
未曾相逢先一笑,初会便已许平生。
三千年读史不过功名利禄,九万里悟道终归诗酒田园。
君埋泉下泥销骨,我寄人间雪满头。
伤心桥下春波绿,曾是惊鸿照影来。
醉后不知天在水,满船清梦压星河。
秋风吹尽旧庭柯,黄叶丹枫客里过。一点禅灯半轮月,今宵寒较昨宵多。
细雨生寒未有霜,庭前木叶半青黄。小春此去无多日,何处梅花一绽香。
岁久人无千日好,春深花有几时红。是非入耳君须忍,半作痴呆半作聋。
清风不识字,何故乱翻书。
三过平山堂下,半生弹指声中。十年不见老仙翁,壁上龙蛇飞动。欲吊文章太守,仍歌杨柳春风。休言万事转头空,未转头时皆梦。
山月不知心里事,水风空落眼前花。
未若锦囊收艳骨,一抔冷土掩风流。
莫言下岭便无难,赚得行人空喜欢。正入万山圈子里,一山放过一山拦。
有美一人兮婉如清扬,识曲别音兮令姿煌煌。绣袂捧琴兮登君子堂,如彼萱草兮使我忧忘。欲赠之以紫玉尺,白银珰,久不见之兮湘水茫茫。
生如逆旅,一苇以航。
Update 2023-01-09
回头万里,故人长绝。易水萧萧西风冷,满座衣冠似雪。《贺新郎·别茂嘉十二弟》辛弃疾
洛阳城里春光好,洛阳才子他乡老。《菩萨蛮·洛阳城里春光好》韦庄
伤心桥下春波绿,曾是惊鸿照影来。《沈园二首·其一》陆游
谁见幽人独往来,缥缈孤鸿影。《卜算子·黄州定慧院寓居作》苏轼
琵琶弦上说相思。当时明月在,曾照彩云归。《临江仙·梦后楼台高锁》晏几道
此后锦书休寄,画楼云雨无凭。《清平乐·留人不住》晏几道
美人自刎乌江岸,战火曾烧赤壁山,将军空老玉门关。
食肉何曾尽虎头,卅年书剑海天秋。文章幸未逢黄祖,襆被今犹窘马周。自是汝才难用世,岂真吾相不当侯。须知少日拏云志,曾许人间第一流。 清代吴庆坻《题三十计小象》
时人不识凌云木,直待凌云始道高。
总有千古,横有八荒,前途似海,来日方长。
鹏北海,风朝阳,又携书剑路茫茫。明年此日青云去,却笑人间举子忙。
Update 2023-03-01 派克直播间飞花令
不是逢人苦誉君,亦狂亦侠亦温文。照人胆似秦时月,送我情如岭上云。
一生一代一双人,争教两处销魂。相思相望不相亲,天为谁春?
也信美人终作土,不堪幽梦太匆匆。
银字笙调。心字香烧。料芳悰、乍整还凋。待将春恨,都付春潮。过窈娘堤,秋娘渡,泰娘桥。
中心藏之,何日忘之!
Update 2023-03-05 派克直播间飞花令
钓鱼台,十年不上野鸥猜。白云来往青山在,对酒开怀。欠伊周济世才,犯刘阮贪杯戒,还李杜吟诗债。酸斋笑我,我笑酸斋。晚归来,西湖山上野猿哀。二十年多少风流怪,花落花开。望云霄拜将台。袖星斗安邦策,破烟月迷魂寨。酸斋笑我,我笑酸斋。
知君用心如日月,事夫誓拟同生死。还君明珠双泪垂,恨不相逢未嫁时。
千古风流八咏楼,江山留与后人愁。水通南国三千里,气压江城十四州。
问余何意栖碧山,笑而不答心自闲。桃花流水窅然去,别有天地非人间。
德也狂生耳。偶然间,缁尘京国,乌衣门第。有酒惟浇赵州土,谁会成生此意。不信道、竟逢知己。青眼高歌俱未老,向尊前、拭尽英雄泪。君不见,月如水。共君此夜须沉醉。且由他,蛾眉谣诼,古今同忌。身世悠悠何足问,冷笑置之而已。寻思起、从头翻悔。一日心期千劫在,后身缘、恐结他生里。然诺重,君须记。 纳兰性德《金缕曲·赠梁汾》
恨君不似江楼月,南北东西,南北东西,只有相随无别离。恨君却似江楼月,暂满还亏,暂满还亏,待得团圆是几时? 吕本中《采桑子·恨君不似江楼月》
自君之出矣,不复理残机。思君如满月,夜夜减清辉。 张九龄《赋得自君之出矣》
Update 2023-03-08 派克直播间飞花令, “江” 字飞花令
江东子弟今虽在,肯与君王卷土来? 王安石《叠题乌江亭》
江雨霏霏江草齐,六朝如梦鸟空啼。 韦庄《台城》
残灯无焰影幢幢,此夕闻君谪九江。垂死病中惊坐起,暗风吹雨入寒窗。元稹《闻乐天授江州司马》
少年听雨歌楼上,红烛昏罗帐。壮年听雨客舟中,江阔云低、断雁叫西风。而今听雨僧庐下,鬓已星星也。悲欢离合总无情,一任阶前、点滴到天明。 蒋捷《虞美人·听雨》
杀尽江南百万兵,腰间宝剑血犹腥!老僧不识英雄汉,只管哓哓问姓名。 朱元璋 《不惹庵示僧》
Update 2023-08-11 历史记录
缺月挂疏桐,漏断人初静。谁见幽人独往来,缥缈孤鸿影。惊起却回头,有恨无人省。拣尽寒枝不肯栖,寂寞沙洲冷。 ——《卜算子·黄州定会院寓居作》
制作一个可用的malloc image
写一个melloc的C程序#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <signal.h>
#include <unistd.h>
#define SIGTERM_MSG "SIGTERM received.\n"
void sig_term_handler(int signum, siginfo_t *info, void *ptr)
{
write(STDERR_FILENO, SIGTERM_MSG, sizeof(SIGTERM_MSG));
}
void catch_sigterm()
{
static struct sigaction _sigact;
memset(&_sigact, 0, sizeof(_sigact));
_sigact.sa_sigaction = sig_term_handler;
_sigact.sa_flags = SA_SIGINFO;
sigaction(SIGTERM, &_sigact, NULL);
}
int main(int argc, char *argv[])
{
if ( argc != 2 )
{
printf("ERROR ELEMENT COUNTS.");
return 1;
}
// printf ("%ld\n", atol(argv[1]));
int *p;
long n = atol(argv[1]) * 1024 * 1024;
// printf ("%ld\n", n);
printf("Allocate Memory Size: %ld MB.\n", atol(argv[1]));
// Allocate Memory.
p = (int *)malloc(n);
if (p != NULL)
printf("SUCCESS.");
else
printf("FAILED.");
memset(p, 0, n);
catch_sigterm();
free(p);
sleep(3000);
return 0;
}
写一个DockerfileFROM alpine
RUN apk add build-base
COPY mem.c .
RUN gcc -o mem mem.c
# or RUN gcc -static -o mem mem.c
FROM alpine
COPY --from=0 ./mem .
ENTRYPOINT [ "/mem" ]
进行一个很新的测试Build Image.
dive build -t liarlee-malloc:latest .
OR
docker build -t liarlee-malloc:latest .
Docker RUN.docker run --name malloc --rm -dt liarlee-malloc:latest 200
# docker run --name malloc --rm -dt liarlee-malloc:latest [MemorySize(MB)]
Kubernetes Deployment RUN.---
apiVersion: apps/v1
kind: Deployment
metadata:
name: liarlee-malloc
spec:
selector:
matchLabels:
app: malloc
replicas: 1
template:
metadata:
labels:
app: malloc
spec:
containers:
- name: malloc
image: liarlee-malloc:latest
args: [ "200" ]
Nginx性能调整(不一定对
Nginx 性能优化看了不少的文档和说明, 尝试调整一下Nginx,看看与默认的设置性能表现能有多大的差距,顺便记录一下步骤,不记录的话自己会忘记的。
Sysctl 参数~]$ cat /etc/sysctl.d/99-hayden.cof
net.ipv4.tcp_wmem = 8192 4194304 8388608
net.ipv4.tcp_rmem = 8192 4194304 8388608
net.core.somaxconn = 262144
net.core.default_qdisc=fq
net.ipv4.tcp_congestion_control=bbr
Nginx Config~]$ cat /etc/nginx/nginx.conf
user nginx;
worker_processes 1;
worker_cpu_affinity 10;
# error_log /var/log/nginx/error.log;
pid /run/nginx.pid;
# Load dynamic modules. See /usr/share/doc/nginx/README.dynamic.
include /usr/share/nginx/modules/*.conf;
events {
worker_connections 10240;
}
...# 后面的都是默认值。
Systemd Nginx Service~]$ systemctl cat nginx
# /usr/lib/systemd/system/nginx.service
[Unit]
Description=The nginx HTTP and reverse proxy server
After=network-online.target remote-fs.target nss-lookup.target
Wants=network-online.target
[Service]
Type=forking
PIDFile=/run/nginx.pid
# Nginx will fail to start if /run/nginx.pid already exists but has the wrong
# SELinux context. This might happen when running `nginx -t` from the cmdline.
# https://bugzilla.redhat.com/show_bug.cgi?id=1268621
ExecStartPre=/usr/bin/rm -f /run/nginx.pid
ExecStartPre=/usr/sbin/nginx -t
ExecStart=/usr/sbin/nginx
ExecReload=/usr/sbin/nginx -s reload
KillSignal=SIGQUIT
TimeoutStopSec=5
KillMode=process
PrivateTmp=true
LimitAS=infinity
LimitRSS=infinity
LimitCORE=infinity
LimitNOFILE=65536
LimitNPROC=65535
Nice=-20
[Install]
WantedBy=multi-user.target
CPU Isolate~]$ cat /etc/default/grub
GRUB_CMDLINE_LINUX_DEFAULT="console=tty0 console=ttyS0,115200n8 net.ifnames=0 biosdevname=0 nvme_core.io_timeout=4294967295 rd.emergency=poweroff rd.shell=0 isolcpus=1 nohz_full=1 rcu_nocbs=1"
GRUB_TIMEOUT=0
GRUB_DISABLE_RECOVERY="true"
GRUB_TERMINAL="ec2-console"
GRUB_X86_USE_32BIT="true"
调整中断~]$ cat /proc/interrupts
CPU0 CPU1
27: 0 845 PCI-MSI 81920-edge ena-mgmnt@pci:0000:00:05.0
28: 1455005 0 PCI-MSI 81921-edge eth0-Tx-Rx-0
29: 0 1870959 PCI-MSI 81922-edge eth0-Tx-Rx-1
LOC: 119785 15755 Local timer interrupts
~]$ echo 0 > /proc/irq/29/smp_affinity_list
~]$ echo 0 > /proc/irq/28/smp_affinity_list
~]$ echo 0 > /proc/irq/27/smp_affinity_list
关闭 Irqbalance~]$ sudo systemctl stop irqbalance.service
~]$ sudo systemctl disable irqbalance.service
Removed symlink /etc/systemd/system/multi-user.target.wants/irqbalance.service.
测试这些都做完之后,启动一个新的实例,安装nginx之后不做任何的动作, 使用ab命令测试默认页 index.html。 对比
调整后的实例结果如下使用命令: ab -c 3000 -n 50000 http://172.31.37.166:80/index.html
第一次Document Path: /index.html
Document Length: 732 bytes
Concurrency Level: 3000
Time taken for tests: 2.225 seconds
Complete requests: 50000
Failed requests: 0
Total transferred: 48250000 bytes
HTML transferred: 36600000 bytes
Requests per second: 22474.64 [#/sec] (mean)
Time per request: 133.484 [ms] (mean)
Time per request: 0.044 [ms] (mean, across all concurrent requests)
Transfer rate: 21179.71 [Kbytes/sec] received
Connection Times (ms)
min mean[+/-sd] median max
Connect: 0 67 139.7 47 1124
Processing: 25 63 16.1 61 274
Waiting: 0 47 13.7 46 254
Total: 57 130 143.2 106 1191
Percentage of the requests served within a certain time (ms)
50% 106
66% 125
75% 131
80% 135
90% 142
95% 149
98% 165
99% 1173
100% 1191 (longest request)
第二次Document Path: /index.html
Document Length: 732 bytes
Concurrency Level: 3000
Time taken for tests: 2.232 seconds
Complete requests: 50000
Failed requests: 0
Total transferred: 48250000 bytes
HTML transferred: 36600000 bytes
Requests per second: 22397.25 [#/sec] (mean)
Time per request: 133.945 [ms] (mean)
Time per request: 0.045 [ms] (mean, across all concurrent requests)
Transfer rate: 21106.78 [Kbytes/sec] received
Connection Times (ms)
min mean[+/-sd] median max
Connect: 0 67 141.3 47 1092
Processing: 22 63 15.8 60 106
Waiting: 0 47 13.5 46 84
Total: 60 130 143.5 108 1175
Percentage of the requests served within a certain time (ms)
50% 108
66% 122
75% 131
80% 134
90% 141
95% 149
98% 165
99% 1150
100% 1175 (longest request)
第三次Document Path: /index.html
Document Length: 732 bytes
Concurrency Level: 3000
Time taken for tests: 2.220 seconds
Complete requests: 50000
Failed requests: 0
Total transferred: 48250000 bytes
HTML transferred: 36600000 bytes
Requests per second: 22526.08 [#/sec] (mean)
Time per request: 133.179 [ms] (mean)
Time per request: 0.044 [ms] (mean, across all concurrent requests)
Transfer rate: 21228.19 [Kbytes/sec] received
Connection ...
Docker/Containerd/Harbor 配置代理
记录一下 Docker Daemon / Containerd 配置代理的步骤,尽管能用的时候不太多。
Update - 2023-07-10 Add Harbor.
Docker创建文件]$ mkdir -pv /etc/systemd/system/docker.service.d
]$ touch /etc/systemd/system/docker.service.d/proxy.conf
写入内容[Service]
Environment="HTTP_PROXY=socks5://<-->:<-->/"
Environment="HTTPS_PROXY=socks5://<-->:<-->/"
Environment="NO_PROXY=localhost,127.0.0.1"
重启DockerDaemon]$ sudo systemctl daemon-reload && sudo systemctl restart docker
Containerd创建环境变量文件]$ mkdir -pv /etc/systemd/system/containerd.service.d
]$ touch /etc/systemd/system/containerd.service.d/proxy.conf
写入内容[Service]
Environment="HTTP_PROXY=socks5://<-->:<-->/"
Environment="HTTPS_PROXY=socks5://<-->:<-->/"
Environment="NO_PROXY=localhost,127.0.0.1"
重启 Containerd]$ sudo systemctl daemon-reload && sudo systemctl restart docker
Harbor 仓库加代理另一个方法是直接给harbor仓库添加代理, 让Harbor来进行代理访问 ,帮忙pull镜像, 集群直接指向这个仓库即可。
harbor我是直接使用docker-compose 的方式部署的, 这样简单一些。
我的软件安装目录是在: /opt/harbor
找到harbor 的配置文件: /opt/harbor/harbor.yml
配置文件部分如下:
189 # Global proxy
190 # Config http proxy for components, e.g. http://my.proxy.com:3128
191 # Components doesn't need to connect to each others via http proxy.
192 # Remove component from `components` array if want disable proxy
193 # for it. If you want use proxy for replication, MUST enable proxy
194 # for core and jobservice, and set `http_proxy` and `https_proxy`.
195 # Add domain to the `no_proxy` field, when you want disable proxy
196 # for some special registry.
197 proxy:
198 http_proxy: socks5://ip:port
199 https_proxy: socks5://ip:port
200 no_proxy:
201 components:
202 - core
203 - jobservice
204 - trivy
启动服务之后进入容器进行确认:
core]$ dc exec -it core bash
harbor [ /harbor ]$ env | grep -i proxy
PERMITTED_REGISTRY_TYPES_FOR_PROXY_CACHE=docker-hub,harbor,azure-acr,aws-ecr,google-gcr,quay,docker-registry,github-ghcr
NO_PROXY=redis,chartmuseum,portal,db,.internal,.local,127.0.0.1,localhost,core,trivy-adapter,nginx,postgresql,registryctl,log,jobservice,registry,notary-server,notary-signer,exporter
HTTPS_PROXY=socks5://ip:port
HTTP_PROXY=socks5://ip:port
环境变量已经生效了, 然后直接在控制台创建项目, 创建新的仓库缓存代理。
我创建的仓库如下,除了列出的其他留空:
提供者
目标名
目标URL
Quay
registry.k8s.io
https://registry.k8s.io
GtihubGHCR
ghcr.io
https://ghcr.io
Quay
k8s.gcr.io (Archived)
https://k8s.gcr.io
Quay
gcr.io
https://gcr.io
Quay
quay.io
https://quay.io
Docker Hub
docker.io
https://hub.docker.com
DockerRegistry
public.ecr.aws
https://public.ecr.aws
所有仓库的健康检查是通过的, 然后去创建项目, 就行了。
创建完成项目之后, 就可以通过当前这个仓库的项目地址来pull 镜像了。
docker pull reg.liarlee.site/docker.io/library/nginx:latest
docker pull reg.liarlee.site/registry.k8s.io/metrics-server/metrics-server@sha256:1ab8d2722ce57979eb05ec0594cb9173e07ace16a253c747bb94c31b138a07dc
docker pull reg.liarlee.site/public.ecr.aws/amazonlinux/amazonlinux:minimal
docker pull reg.liarlee.site/quay.io/prometheus/prometheus
docker pull reg.liarlee.site/quay.io/argoproj/argocd
docker pull reg.liarlee.site/ghcr.io/dexidp/dex
完全隔离CPU的方法
完全隔离CPU, 并排空CPU所有的进程,分配指定的任务到CPU上。
当前的情况下, 我有CPU 0 - 3, 我希望隔离出CPU3 来进行指定的任务运行(方法是传递内核参数并重启)
vim /etc/default/grub
GRUB_CMDLINE_LINUX='................isolcpu=3 nohz_full=3'
grub2-mkconfig -o /boot/grub2/grub.cfg
sync && systemctl reboot
重启之后,CPU3 就已经从CFS的调度列表上面拿掉了, 可以通过如下的参数证明。
# 查看设置是否已经正确的生效, 分离的CPU会表示为序号, 一般是: 0-2 , 3 。 这两种表示方式。
cat /sys/devices/system/cpu/isolated
3
cat /sys/devices/system/cpu/nohz_full
3
关于nohz_full这个参数, 需要编译内核的时候就启用这个功能。
# 需要启用的参数如下:
CONFIG_NO_HZ_COMMON=y
CONFIG_NO_HZ_FULL=y
CONFIG_NO_HZ=y
这部分的内容还包括的Kernel的Tickless等等知识, 这个部分的内容我在Redhat的文档中有看到。但是文档比较旧了, 这个设置是基于Redhat 7 版本的说明, 可能现在有更好的方法,我不太确定。
重启之后, CPU3上面已经完全不会有用户空间的进程被调度上去了,同时, 由于已经配置了NOHZ的参数,CPU3 上面也不会有Kernel Timer Interrept触发,因此也少了一部分中断。
Redhat的文档中定义了如下的方式进行验证, 我直接抄下面的内容了。
关于如何验证Cpu隔离的文档: https://access.redhat.com/solutions/3875421配置隔离CPU的方法已经确认功能是否激活的方法:https://access.redhat.com/documentation/en-us/red_hat_enterprise_linux/8/html/monitoring_and_managing_system_status_and_performance/index
perf stat -C 1 -e irq_vectors:local_timer_entry taskset -c 3 sleep 3
先记录这么多吧, 这个功能用到的地方实在是有限,基本上不怎么需要。并且需要知道是现在已经不怎么需要使用这个工具进行调优了, Redhat有 Tuned 守护进程, 可以通过默认的profile对OS进行调优。
Cilium 踩坑总结
测试环境
KVM - hayden@HaydenArchDesktop ~> virsh version
Compiled against library: libvirt 8.6.0 Using library: libvirt 8.6.0 Using API: QEMU 8.6.0 Running hypervisor: QEMU 7.0.0
VM OS: root@fedora ~# cat /etc/os-release
NAME=”Fedora Linux” VERSION=”36 (Thirty Six)” ID=fedora VERSION_ID=36
KVM 虚拟机两台
Master: hostname: fedora
Node: hostname: knode1
kubernetes 版本: v1.24.3
kubernetes 安装方式: kubeadm
docker版本: docker://20.10.17
NOTE: (尝试使用Containerd, 但是翻车了, 控制平面的Pod启动不了, 所以放弃了,遂使用CRI-Dockerd,配置了Docker runtime, Containerd使用默认的参数无法正常的启动, 看起来即使真的升级到了1.24 迁移还是一个问题)
Kernel Version: 5.17.5-300.fc36.x86_64
Helm参数如果是在KVM启动的虚拟机,可以通过这个安装参数来开启更多功能,但是受限于我的KVM虚拟网卡驱动不能attach xdp 程序, 所以。。。。xdp 加速无法启用,但是其他的高级特性均可开启, 集群状态正常。
helm upgrade -i cilium cilium/cilium \
--namespace kube-system \
--set tunnel=disabled \
--set autoDirectNodeRoutes=true \
--set loadBalancer.mode=dsr \
--set kubeProxyReplacement=strict \
--set enableIPv4Masquerade=false \
--set loadBalancer.algorithm=maglev \
--set devices=enp1s0 \
--set k8sServiceHost=192.168.31.100 \
--set k8sServicePort=6443 \
--set hubble.relay.enabled=true \
--set hubble.ui.enabled=true
Cilium Clitouch ./install_cilium_cli.sh
CILIUM_CLI_VERSION=$(curl -s https://raw.githubusercontent.com/cilium/cilium-cli/main/stable.txt)
CLI_ARCH=amd64
if [ "$(uname -m)" = "aarch64" ]; then CLI_ARCH=arm64; fi
curl -L --fail --remote-name-all https://github.com/cilium/cilium-cli/releases/download/${CILIUM_CLI_VERSION}/cilium-linux-${CLI_ARCH}.tar.gz{,.sha256sum}
sha256sum --check cilium-linux-${CLI_ARCH}.tar.gz.sha256sum
sudo tar xzvfC cilium-linux-${CLI_ARCH}.tar.gz /usr/local/bin
rm cilium-linux-${CLI_ARCH}.tar.gz{,.sha256sum}
Hubble Clitouch ./install_hubble_client.sh
HUBBLE_VERSION=$(curl -s https://raw.githubusercontent.com/cilium/hubble/master/stable.txt)
HUBBLE_ARCH=amd64
if [ "$(uname -m)" = "aarch64" ]; then HUBBLE_ARCH=arm64; fi
curl -L --fail --remote-name-all https://github.com/cilium/hubble/releases/download/$HUBBLE_VERSION/hubble-linux-${HUBBLE_ARCH}.tar.gz{,.sha256sum}
sha256sum --check hubble-linux-${HUBBLE_ARCH}.tar.gz.sha256sum
sudo tar xzvfC hubble-linux-${HUBBLE_ARCH}.tar.gz /usr/local/bin
rm hubble-linux-${HUBBLE_ARCH}.tar.gz{,.sha256sum}
Cilium Cli 安装插件命令cilium upgrade # 原地升级
# 安装并直接替换kubeproxy
cilium install --version 1.14.1 --set kubeProxyReplacement=true --set=ipam.operator.clusterPoolIPv4PodCIDRList="10.42.0.0/16" --set k8sServiceHost=kube3s.liarlee.site --set k8sServicePort=6443
# 升级
hayden@arch ~> cilium upgrade
🔮 Auto-detected Kubernetes kind: K3s
ℹ️ Using Cilium version 1.14.2
🔮 Auto-detected cluster name: default
# 看状态
cilium status
# 使用hubble
cilium hubble port-forward &
cilium hubble enable --ui
hubble observe --since=1m -t l7 -
特性以及状态检查默认的安装完成之后开启特性如下:
Kubeproxy Bypass
Iptables Bypass
LoadBalancer 算法: Meglav
LoadBalancer 特性: DSR
报文Masquerade 封装: Disabled
Hubble : Enable
隧道封包: Disabled
下面是 CIlium Status的命令返回结果:
root@fedora ~# cilium status
/¯¯\
/¯¯\__/¯¯\ Cilium: OK
\__/¯¯\__/ Operator: OK
/¯¯\__/¯¯\ Hubble: OK
\__/¯¯\__/ ClusterMesh: disabled
\__/
Deployment cilium-operator Desired: 2, Ready: 2/2, Available: 2/2
Deployment hubble-relay Desired: 1, Ready: 1/1, Available: 1/1
DaemonSet cilium Desired: 2, Ready: 2/2, Available: 2/2
Deployment hubble-ui Desired: 1, Ready: 1/1, Available: 1/1
Containers: hubble-relay Running: 1
hubble-ui Running: 1
cilium Running: 2
cilium-operator Running: 2
Cluster Pods: 14/14 managed by Cilium
Image versions hubble-ui quay.io/cilium/hubble-ui:v0.9.0@sha256:0ef04e9a29212925da6bdfd0ba5b581765e41a01f1cc30563cef9b30b457fea0: 1
hubble-ui quay.io/cilium/hubble-ui-backend:v0.9.0@sha256:000df6b76719f607a9edefb9af94dfd1811a6f1b6a8a9c537cba90bf12df474b: 1
cilium quay.io/cilium/cilium:v1.12.0@sha256:079baa4fa1b9fe638f96084f4e0297c84dd4fb215d29d2321dcbe54273f63ade: 2
cilium-operator quay.io/cilium/operator-generic:v1.12.0@sha256:bb2a42eda766e5d4a87ee8a5433f089db81b72dd04acf6b59fcbb445a95f9410: 2
hubble-relay quay.io/cilium/hubble-relay:v1.12.0@sha256:ca8033ea8a3112d838f958862fa76c8d895e3c8d0f5590de849b91745af5ac4d: 1
ds/cilium 中的命令返回结果:
root@fedora:/home/cilium# cilium status
KVStore: Ok Disabled
Kubernetes: Ok 1.24 (v1.24.3) [linux/amd64]
Kubernetes APIs: ["cilium/v2::CiliumClusterwideNetworkPolicy", "cilium/v2::CiliumEndpoint", "cilium/v2::CiliumNetworkPolicy", "cilium/v2::CiliumNode", "core/v1::Namespace", "core/v1::Node", "core/v1::Pods", "core/ ...
如何配置kubelet的节点自动回收资源
配置Node节点按照磁盘阈值回收空间
https://aws.amazon.com/cn/premiumsupport/knowledge-center/eks-worker-nodes-image-cache/
修改Kubelet参数
Kubelet默认提供了GC的参数 --image-gc-high-threshold 参数用于定义触发映像垃圾收集的磁盘使用百分比。默认值为 85%。
--image-gc-low-threshold 参数用于定义映像垃圾收集尝试释放的磁盘使用百分比。默认值为 80%。
如果是自己管理的Node,最好的方式是直接配置kubelet命令行的参数,将上面的参数指定需要的阈值,然后重启kubelet即可。配置文件一般在 : /etc/kubernetes/kubelet.config"imageGCHighThresholdPercent": 70,
"imageGCLowThresholdPercent": 50,
由 CPU Steal Time 指标解释
观察vmstat命令输出的内容, 或者 top 命令 最上面输出的内容。可以看到Stealtime增加,大部分时候都是因为虚拟机的超卖, 总结来说st指示了vCPU的繁忙程度。
进程相关参数的说明https://www.kernel.org/doc/html/latest/scheduler/sched-stats.html
schedstats also adds a new /proc//schedstat file to include some of the same information on a per-process level. There are three fields in this file correlating for that process to:1 time spent on the cpu2 time spent waiting on a runqueue3 # of timeslices run on this cpu
执行命令的输出结果hayden@VM-16-6-ubuntu /p/3720475> cat schedstat
2236062 223986 22
命令中的三个数值说明:
2236062 进程在CPU的时间
223986 进程在CPU调度上面等待的时间
22 在这个CPU运行的时间片数量NOTE: 有一个博客写这个是 上下文交换的次数 , 和sched 文件中的 nr_switches 数量相同, 不能确定是否正确。
Epoll vs select vs poll vs io_uring
select方式:使用fd_set结构体告诉内核同时监控那些文件句柄,使用逐个排查方式去检查是否有文件句柄就绪或者超时。该方式有以下缺点:文件句柄数量是有上限的,逐个检查吞吐量低,每次调用都要重复初始化fd_set。
poll方式:该方式主要解决了select方式的2个缺点,文件句柄上限问题(链表方式存储)以及重复初始化问题(不同字段标注关注事件和发生事件),但是逐个去检查文件句柄是否就绪的问题仍然没有解决。
epoll方式:该方式可以说是C10K问题的killer,他不去轮询监听所有文件句柄是否已经就绪。epoll只对发生变化的文件句柄感兴趣。其工作机制是,使用”事件”的就绪通知方式,通过epoll_ctl注册文件描述符fd,一旦该fd就绪,内核就会采用类似callback的回调机制来激活该fd, epoll_wait便可以收到通知, 并通知应用程序。而且epoll使用一个文件描述符管理多个描述符,将用户进程的文件描述符的事件存放到内核的一个事件表中, 这样数据只需要从内核缓存空间拷贝一次到用户进程地址空间。而且epoll是通过内核与用户空间共享内存方式来实现事件就绪消息传递的,其效率非常高。但是epoll是依赖系统的(Linux)。
异步I/O以及Windows,该方式在windows上支持很好,这里就不具体介绍啦。
io_uring 其实是内核5.10之后引进的一种方式,目前还没有应用是使用这个模式的, 但是这个方式大大的减少了应用程序的系统调用次数。 性能有增长。现在有了, 比如 amazon的一些agent类别的软件。
关于内核Config中的参数 CONFIG_NO_HZ
关于Tick, Tickless的研究。
https://www.kernel.org/doc/html/latest/timers/no_hz.html
这几个参数的最终意义都和 Jitter 相关, 设置的参数含义是 : CPU时钟中断的周期, 如果是 100HZ , 那么1s的时间内CPU会中断100次。目前最新的内核支持 NOHZ , 也就是在没有任务的时候处于节能的考虑不进行中断。当有需要运行的业务时还是会正常的触发CPU中断。NOHZ主要的功能时省电, 调整这个参数的意义就是让CPU处在合理的中断次数。过多的中断会导致相关的任务被打断。
git://git.kernel.org/pub/scm/linux/kernel/git/frederic/dynticks-testing.git