Shawn's Blog

一个伪程序员的伪技术博客

0X00 🛡️叠buff

  • 我是个 Kubernetes 纯新手,并不懂很多原理和概念,可能会有误导;
  • 我只是将自己遇到过的问题列出来,如果你想找「权威」请看官方文档;
  • 每个人的基础环境不同,Kubernetes 版本也不同,参考应该学会变通;
  • 此处记录的仅为个人部署过程中遇到的问题记录,并非「教程」或「指南」;

0X01 正文

注意交换分区

部署 Kubernetes 的节点是不允许使用交换分区的,临时禁用可以 swapoff -a。然后在 /etc/fstab 中将交换分区的自动挂载给注释掉就可以了。

k8s_swap

不使用 docker

Kubernetes 已经不建议使用 docker 作为容器运行时了,可以考虑使用 containerd 或者 CRI-O。注意这里提到的 Dockershim 已经移除并不意味着不能再用 Docker 了,而是说 Kubernetes 并不会原生支持 Docker 了,以后 Docker 的地位和其他运行时的地位相同了。

k8s-container-runtime

Containerd 的默认配置

如果使用 Containerd 作为容器运行时的话,安装好 Containerd 之后要检查一下配置文件 /etc/containerd/config.toml。如果没有的话需要手动创建一个默认配置

1
2
mkdir /etc/containerd
containerd config default > /etc/containerd/config.toml

kubelet 疯狂重启

如果你还没有搞定 kubeadm init 的话,kubelet 疯狂重启是正常行为,它在等待 kubeadm。

需要 AppArmor

我之前手贱把 AppArmor 给卸掉了,自以为是得认为它会影响到 Kubernetes 的运行。其实它确实会影响,因为 Kubernetes 的运行时需要它的,所以后来看日志在报错就又装回来了。

正确配置 cni 网络插件

如果你是使用 Containerd 的话,可以参考 https://github.com/containerd/containerd/blob/main/script/setup/install-cni

容器运行时的冲突

如果要用 Containerd 的话就记得先把 docker 卸载干净,否则可能会导致一些冲突和不兼容的状况。

正确加载内核模块和内核参数

我当时使用的是 Ubuntu 22.04,默认没加载 br_netfilter 模块,所以需要使用 modprobe br_netfilter 临时加载,并且使用 echo br_netfilter >> /etc/modules 持久化加载,保证其重启后也是被加载的。可以使用 lsmod | br_netfilter 的方式检查是否已经加载了该模块。

然后就是内核参数,首先可以通过 sysctl -a | grep xxx 的方式检查当前参数是否设置正确了。如果没设置正确的话需要在 /etc/sysctl.conf 中进行修改。改好之后 sysctl --system 可以使改动生效。

1
2
3
net.ipv4.ip_forward=1
net.bridge.bridge-nf-call-iptables=1
net.bridge.bridge-nf-call-ip6tables=1

使用 crictl 命令

如果你想使用 crictl 命令查看容器/镜像,则需要修改其配置文件让它能够连接到你的容器运行时,配置文件在 /etc/crictl.yaml。如果你用的是 Containerd 的话配置文件可以写成

1
2
3
4
runtime-endpoint: unix:///run/containerd/containerd.sock
image-endpoint: unix:///run/containerd/containerd.sock
timeout: 10
debug: true

关于认证文件

kubeadm init 成功之后,记得关注一下它打出来的内容,里面包含了你该如何让其他节点加入,还包含了如何从其他机器上管理 Kubernetes 集群。

kubeadm_init

get nodes

当使用 kubectl get nodes 命令查看到的所有节点都处于 Ready 并且过一两分钟也没有异常状态时,也就意味着你的 Kubernetes 集群已经部署完成了🎉

关于 dashboard

刚刚部署了一个 kubenetes-dashboard 结果 401/403/40x 了?可以尝试使用端口转发的方案:https://github.com/kubernetes/dashboard/issues/5542#issuecomment-706395744

dashboard 打开了,但是没有 Token 登陆不了?那就创建一个 token 喽 https://github.com/kubernetes/dashboard/blob/master/docs/user/access-control/creating-sample-user.md

0X00 为嘛用 kind

作为一个纯新手想要学习 Linux、MySQL、Python… 的第一步往往都是先装一个来看看,当然 Kubernetes 也不例外。装 Linux 也许跟着教程在虚拟机里一会儿就装好了,尤其是现在很多发行版本都有图形化安装界面了,但是 Kubernetes 就不一样了,如果你去部署一套 K8S 集群的话极有可能会遇到一系列问题,包括但不限于:

  • 交换分区没关,导致服务异常
  • 搞不清楚 CRI-O/docker/containerd 之间的关系
  • 刚装好的 kubelet 服务疯狂重启
  • cni 网络插件搞不明白,导致 kubeadm init 一直不成功
  • 缺少内核模块导致的集群初始化异常
  • 缺少内核参数导致的集群初始化异常
  • 想用 crictl 却怎么都看不到 container 状态

这些在熟手眼里可能根本不是问题,但是对于第一次接触的人来说还是挺麻烦的。所以我们需要一种简单的方式来快速部署一个 Kubernetes 来看一看试一试,而不是上来就先部署一套三四个节点的真正意义上的集群。

Kubernetes 官方推荐了几种单节点/单机部署的方式,kind 就是其中一种。它是基于 docker 的部署方式,如果你还不熟悉 docker 的话建议先把 docker 学一学再开始 Kubernetes 的学习。如果你已经了解 docker 并能简单的使用它了,那接下来就开始安装 Kubernetes 吧~

tips: 建议在虚拟机中安装,分配 2C4G 然后随便装一个比较新比较常用的 Linux 发行版本就可以

阅读全文 »

0X00 这是一个描述

下面介绍几个我自己常用的小技巧,均可以在日常工作中给自己带来一些小小的便利🤪

0X01 临时 web 服务器

如果你电脑上装了 Python3 则可以使用 python3 -m http.server --bind 0.0.0.0 2333 这个命令在当前目录启动一个简单的 web 服务,监听在 0.0.0.0:2333 上。这样一来别人就可以访问你的 ip 来下载当前目录下的文件了。不过使用这个方法的时候要注意自己当前的工作目录哈,不要傻乎乎的在自己的 $HOME 下面用这个命令,小心别人下载你的隐私数据喔。

不过如果你搞不懂什么是「监听、0.0.0.0、端口」的话,还是先去搞一下计算机网络吧。
python_http

0X02 使用 pdb/ipdb 调试脚本

我们都知道用 pdb 模块可以逐行调试 Python 脚本,只需要在脚本里 import pdb 然后在需要打断点的地方加上 pdb.set_trace() 就可以了。但其实 Python 还有一个三方库叫做 ipdbpdb 的升级版,应该各位也都知道吧,通过简单的 pip install 就可以装好。不论是 pdb 还是 ipdb 其实都有这个用法:不修改脚本内容,仅通过 python3 -m ipdb script_filename.py 来从头调试脚本。并且会在每次脚本结束之后从头开始,直到手动退出为止。

tips: pdb/ipdb 运行时可以使用 b line_number 来在指定行打上断点,然后再 c 跳到下一个断点处从而方便调试。

0X03 指定版本

我们都知道可以用 virtualenv 之类的东西处理 Python 的虚拟环境,但是还有这么一种简单粗犷的方式也可以凑合一用(尤其是同时存在 Python 2.7/3.7/3.8/3.9… 的这种环境)。

使用 python2.7 -m pip install requests 或者 python3.9 -m pip install xxx 可以指定具体的 Python 版本,如果你有多个虚拟环境也可以直接指定到 Python 的二进制文件,再通过 -m pip 的方式将所需的库安装到正确的位置~

0X04 一行流

这个「一行流」比较骚气,相当于把 Python 当成普通命令来用,简单的说就是 python -c "xxxxx" 可以在一行命令里执行一个 Python 脚本。例如有下面这些用法(其实就是把脚本写成一行)

比如说使用 python3 -c "import json; print(json.dumps(json.load(open('data.json')), indent=4))" 这样的方法可以直接将 json 文件格式化输出。(当然了这个需求其实有 jq 命令可以做的更好,只是这里举个例子而已)

one_liner

具体这个一行流的用法有多强,那就要看各位的脑洞了,唯一一个需要提示的就是 Python 其实是允许使用分号来终止一个语句的,类似 C 那样,所以才使得一行流可以实现~

0X00 正文

这篇内容可能是目前为止我所有博客内容里最特别的一篇了,今天不想写什么技术类文章,只是想发发牢骚,说说自己想说但一直没啥机会吐槽的事情。不知道各位有没有那种情况,其实自己是很乐观很开心的一个人,但就是偶尔会突然觉得很累,很烦,很焦虑。这些事情说大可能并不大,只是打个游戏可能某一关打不过去而已;说小可能也不小,甚至跟全国乃至全球数以亿计人口的健康相关。那接下来我就要开始吐槽了,也许会有些负能量,但把自己的「负能量」一股脑输出出来没准就能让自己变得更好呢
hhhhh

tips: 这些内容不分前后顺序、没有主次关系、不一定符合你的看法、甚至你觉得我就是在胡说八道,但我不在乎~

我就想随随便便看个综艺

本来我很早就看今晚80后脱口秀的,虽然我并不是 80
后。也挺喜欢听他们说脱口秀的,不管是现在已经转行的王自健还是后面一直在说的蛋蛋建国什么的。后来 80
后脱口秀就不播了,我也就没再关注过脱口秀了。知道某天偶然间发现了脱口秀大会这么个节目,还挺喜欢看的,就每次看到在更新了就会跑过去看。我一直会给自己的时间安排上学习、娱乐什么的,但是这个节目因为我看起来确实非常快乐,所以只要它更新了我基本上就会把当天的学习计划或者游戏计划都延期,来专门看这个节目。

但是现在这个第五季,就经常在网上看到有人评论说「李诞人不行,就知道复活自己公司的人」「一天到晚就知道说内部梗,不利于脱口秀发展」「比赛有黑幕」这些那些的。我就一个工作学习累了的小小程序员,就想躺在沙发上听听脱口秀,谁
TM 关心李诞复活谁了?谁 TM 关心脱口秀发展了?脱口秀发展的好了我是能多赚钱吗?还是说脱口秀发展不好了会让我爱情事业双受挫?

我就是一个纯纯路人观众,我就想听听好笑的东西让自己笑一笑,虽然我也会想让自己喜欢的演员晋级,但说真的我并不在乎他能拿到什么大王不大王的,只是说晋级了就还能至少再听一场他的演出而已。真不理解这些人一天天的怎么就这么无聊,到处盯着别人的各种细节去看,还要吧儿吧儿的说你。跟你说「脱口秀大会这么黑幕,你居然还看得下去?」「难道只有我一个人觉得这个节目无聊?」。你
TM 看不下去就不看嘛,来逼逼啥;你 TM
觉得无聊就去找点有趣的事情做嘛,管我干啥。我就想在累了的时候笑一笑,结果还要被这种人突然恶心一下。

我就想随随便便打个游戏

本来说我一个从来不玩手游的人,想看看最近的手游都发展的怎么样了,就下载了几个比较火的手游试了试。结果呢,有些游戏一打开就把我当个弱智,整个屏幕都是灰色的,就只高亮一个按钮,旁边写一大堆字,告诉我应该点这里。点了之后又告诉我该点那里、点那里、再点那里。一路点下来我发现已经完成了「新手教学」任务,给了我吧啦吧啦吧啦一大堆东西,但此时的我就是机械的点完了这些按钮,完全不知道他们是干啥的,甚至不知道自己干了啥。。。要不然就是一些竞技类游戏,自己发挥好了可能会被队友坑,自己没发挥好可能会被队友骂,有可能自己和队友都发挥好了但是敌人太强最后还是输了,结果搞得垂头丧气。。。还有些就是整一大堆「日常任务」和「周常任务」,说真的我白天对着工作的
TODO LIST 逐个清理完,晚上回家再对着游戏里的 TODO LIST 逐个清理,就觉得自己很蠢,完全不知道自己为什么这么折磨自己。

我就只是想找个游戏放松放松,目前发现除了主机游戏和部分单机手游之外,想要图一乐就只能是王者这种游戏的纯匹配模式,自己和队友都不在乎输赢而且也没有什么乱七八糟的任务。

我就想随随便便出去逛逛

当时刚开始实习和刚刚转正的时候并没有什么钱可以出去玩,现在虽然也没有啥钱,不过偶尔出去逛逛的预算还是有的。但是现在这个傻逼防疫政策整的,说真的比起疫情我更害怕防疫政策。现在出去玩一趟在不被隔离的情况下,需要首先查询离开当前城市的防疫政策、到达目的城市的防疫政策,然后做核酸检测,还要在核酸检测报告过期之前出发。到了目的地之后又要三天两检七天三检巴拉巴拉的。即使你完全符合了当地的防疫政策,还有可能会被「大数据赋码」给整成黄码。接下来就要到处去咨询和投诉,最后还不一定能解决(真实遭遇)。最后你的游玩结束了,要回到自己的城市,还要看出发和到达两地的防疫政策,回到了自己的城市之后第一时间就会收到短信威胁(真实遭遇),如果不进行三天两检或者七天三检啥的,就又会让你变成黄码。

那如果不出省不出市呢?即使上个班也要检查核酸报告,坐个地铁也要看核酸报告,吃个饭也要看核酸报告。身边也出现过几次因为核酸报告没有准时出来,结果背着包在楼下溜达了半个小时一个小时,等到了核酸报告才进楼上班的;也有出现过因为错过了核酸检测时间,导致第二天没有报告,然后不让进地铁站,最后只能打车十几二十公里去上班的。现在路上看到没啥人的核酸检测点都不由自主的过去排队,用同事的话说就是「巴普洛夫看了会沉默,巴普洛夫的狗看了会流泪」。

当然了最他妈扯淡的是进入餐饮场所不戴口罩还他妈不让你进。我是真的不理解我为什么要戴着口罩进餐厅。

好了我吐槽完了

真的吐槽完了?那肯定是没有的,只是现在已经晚上十一点半了,我打算睡觉了。毕竟如果一直吐槽的话,键盘被敲烂了可能都吐槽不完。

虽然我并不觉得会有人能从头看到这里,但是万一有的话,我祝你永远没有上面我的这种困扰,祝你幸福~

0X00 介绍

阅读并了解 LVM 需要了解:Linux 基本操作、分区概念、文件系统概念

首先 LVM 的全称是 Logical Volume Manager 逻辑卷管理。传统的方式是将一个磁盘分成类似于 sda1/sda2/sda3 的分区,然后再将这些分区格式化成类似于 ext4/xfs 这种文件系统,最后将文件系统挂载到某个目录上。但是这种方式下对磁盘空间进行重分配是比较麻烦的,将新安装的磁盘融入到现有系统中也是比较费力的,这就是 LVM 需要解决的问题。

总结下来 LVM 拥有这些功能

  1. LVM 可以方便的对现有逻辑卷进行压缩(初次分配多的空间不会浪费,可以压缩出来)
  2. 空闲的空间可以随时重新分配给逻辑卷(传统模式只能将空间分给最后一个分区,或者创建新分区)
  3. 新加入的磁盘也可以为其他逻辑卷扩容(传统模式并不方便为某个现有分区扩容)
  4. 可以将两块磁盘融合创建出一个更大的逻辑卷(两块 1T 磁盘可以创建出 2T 的分区)

特别需要注意的,RAID0 也可以将两个 1T 的磁盘合并为一个 2T 的,并且理论读写速度都会翻倍,但是这和 LVM 完全是两种不同的操作。

0X01 相关概念

开始使用 LVM 前需要先搞清楚它的几个基本概念

  • PV 是 Physical Volume 物理卷 — 从磁盘上分出来的物理分区
  • VG 是 Volume Group 卷组 — 多个 PV 组成的一个 Group
  • LV 是 Logical Volume 逻辑卷 — 从某个 VG 里创建出来的逻辑卷(可以格式化够挂载)
  • PE 是 Physical Extent 物理区域 — 是 PV 中最小的存储单元
  • LE 是 Logical Extent 逻辑区域 — 是 LV 中做小的存储单元

LVM Cropped

只是「简单用用」的话可以不管 PE/LE 这两个概念

阅读全文 »
0%