0X00 🛡️叠buff * 我是个 Kubernetes 纯新手,并不懂很多原理和概念,可能会有误导; * 我只是将自己遇到过的问题列出来,如果你想找「权威」请看官方文档; * 每个人的基础环境不同,Kubernetes 版本也不同,参考应该学会变通; * 此处记录的仅为个人部署过程中遇到的问题记录,并非「教程」或「指南」; 0X01 正文 注意交换分区 部署 Kubernetes 的节点是不允许使用交换分区的,临时禁用可以 swapoff -a。然后在 /etc/fstab 中将交换分区的自动挂载给注释掉就可以了。 不使用 docker Kubernetes 已经不建议使用 docker 作为容器运行时了,可以考虑使用 containerd 或者 CRI-O。注意这里提到的 Dockershim 已经移除并不意味着不能再用 Docker 了,而是说 Kubernetes 并不会原生支持 Docker 了,以后 Docker 的地位和其他运行时的地位相同了。 Containerd 的默认配置 如果使用 Containerd 作为容器运行时的话,安装好 Containerd…
0X00 为嘛用 kind 作为一个纯新手想要学习 Linux、MySQL、Python... 的第一步往往都是先装一个来看看,当然 Kubernetes 也不例外。装 Linux 也许跟着教程在虚拟机里一会儿就装好了,尤其是现在很多发行版本都有图形化安装界面了,但是 Kubernetes 就不一样了,如果你去部署一套 K8S 集群的话极有可能会遇到一系列问题,包括但不限于: * 交换分区没关,导致服务异常 * 搞不清楚 CRI-O/docker/containerd 之间的关系 * 刚装好的 kubelet 服务疯狂重启 * cni 网络插件搞不明白,导致 kubeadm init 一直不成功 * 缺少内核模块导致的集群初始化异常 * 缺少内核参数导致的集群初始化异常 * 想用 crictl 却怎么都看不到 container 状态 这些在熟手眼里可能根本不是问题,但是对于第一次接触的人来说还是挺麻烦的。所以我们需要一种简单的方式来快速部署一个 Kubernetes 来看一看试一试,而不是上来就先部署一套三四个节点的真正意义上的集群。 Kubernetes…
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、端口」的话,还是先去搞一下计算机网络吧。 0X02 使用 pdb/ipdb 调试脚本 我们都知道用 pdb 模块可以逐行调试 Python 脚本,只需要在脚本里 import pdb 然后在需要打断点的地方加上 pdb.set_trace() 就可以了。但其实 Python 还有一个三方库叫做 ipdb 是 pdb 的升级版,应该各位也都知道吧,通过简单的 pip install 就可以装好。不论是…
0X00 正文 这篇内容可能是目前为止我所有博客内容里最特别的一篇了,今天不想写什么技术类文章,只是想发发牢骚,说说自己想说但一直没啥机会吐槽的事情。不知道各位有没有那种情况,其实自己是很乐观很开心的一个人,但就是偶尔会突然觉得很累,很烦,很焦虑。这些事情说大可能并不大,只是打个游戏可能某一关打不过去而已;说小可能也不小,甚至跟全国乃至全球数以亿计人口的健康相关。那接下来我就要开始吐槽了,也许会有些负能量,但把自己的「负能量」一股脑输出出来没准就能让自己变得更好呢 hhhhh tips: 这些内容不分前后顺序、没有主次关系、不一定符合你的看法、甚至你觉得我就是在胡说八道,但我不在乎~ 我就想随随便便看个综艺 本来我很早就看 _今晚80后脱口秀_ 的,虽然我并不是 80 后。也挺喜欢听他们说脱口秀的,不管是现在已经转行的王自健还是后面一直在说的蛋蛋建国什么的。后来 80 后脱口秀就不播了,我也就没再关注过脱口秀了。知道某天偶然间发现了 _脱口秀大会_…
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…
0X00 前言 设计一个系统,不论是 Web 还是其他的什么形式,通过用户名和密码认证也是一个再正常不过的事情了。但是如何保存密码却是一个值得讨论的问题,相信各位最开始的一个有用户名和密码的程序多半也是用明文存储的密码吧 🤓 这里总结了六种比较常用于密码存储的方式,接下来可以逐一进行简单的分析以帮助我们更好的保护用户的密码 一清二白:明文存储密码,直接存 password 掩耳盗铃:使用 BASE64 之类的编码,存储为 cGFzc3dvcmQ= 盘古之法:使用早已不再安全的 md5 之类的摘要算法,存储为 5f4dcc3b5aa765d61d8327deb882cf99 祖宗之法:使用也已经不再安全的 sha-1 之类的摘要算法,存储为 5baa61e4c9b93f3f0682250b6cf8331b7ee68fd8 凑合能用:使用现代的安全的例如 sha-256 之类额算法,存储为 5e884898da28047151d0e56f8dc6292773603d0d6aabbdd62a11ef721d1542d8 现代手段:采用系统化的多次迭代的加盐哈希方式加密,例如常见的…
0X00 前言 本篇文章是这篇「使用 git stash save 将暂存区命名」的重置版。因为根据 Google 的统计数据我得知某些问题的关键词搜索出来之后我的博客排行会比较靠前,所以把最容易被各位点击到的文章做了个重置计划,改进之前的一些不足,争取能够说的更清楚一些,也能节省各位一点点时间,希望能真正的帮助到从搜索引擎点进来的各位~ 0X01 极度精炼的使用说明 可以使用 git stash save "message" 的方式为 stash 起来的变动命名,方便后面再次使用。 stash 起来过后可以使用 git stash list 来查看已经被 stash 的列表,这里可以看到已经有两条了,值得注意的是 stash 的 id 每次都在更新,最近 stash 的是 0,1 就是上次 stash 的,以此类推 如果需要从新应用某个 stash 的改动,可以使用 git stash apply STASH_ID 的方式,例如使用 git stash apply 1 就可以重新应用 id 为 1 的这个 stash。如果要丢弃掉某个 stash 的话使用 git stash…
0X00 换个方式定义函数 本篇内容不严格区分 function 与 method 🥹 我们都知道在 Python 中如何定义一个函数,只需要 def foo(arg_1, arg_2, args, *kwargs) 就足够了。知道的稍微多一些呢可能知道「Python 中万物皆对象,所以函数的调用也只是调用了函数对象中的 __call__ 方法」,所以我们可以尝试用这种方式调用一个函数 既然可以这样调用了,我们也就可以用类似的方法来定义一个假的 function,可以发现我们自定义了随便一个类,但是只要它实现了 __call__ 方法就可以被当做函数一样调用 0X01 callable 根据上面的方法可知我们可以用 hasattr(obj, '__call__') 来判断某个对象是不是函数,事实上我也确实在同事的代码里看到过这样用的。其实 Python 内置了一个名为 callable 的函数可以用,不过跟 hasattr(obj, '__call__') 并不完全一致 测试代码的第一行 Foo 类因为没有实现 __call__ 方法所以 hasattr 返回的是…
0X00 可以被强制转换的自定义类 但凡写过 Python 的人应该都用过int()这个函数了,而且也都知道这个是将其他类型转换成int类型的内置方法,稍微用的多一点的还会知道这个方法如果传入不能被强制转换的数据时会抛出TypeError的异常。那你知道如何让自己定义的类可以被强制转换吗? 而且按照官方文档来说的话,如果你的class定义了__int__()方法,则int(your_obj)则会返回__int__()的值,如果定义了__index__()则会返回__index__(),如果定义了__trunc__()也会返回__trunc__()。当然是有优先级的,优先级`int index > trunc`,可以使用如下代码分别注释这些方法测试一下 0X01 int 的第二个参数 那你知道它其实还能接收第二个参数吗?其实 int() 方法可以接受第二个参数的,也就是用于进制转换的参数。换言说就是可以用内置的int()方法将其他进制的字符串数据转换成10进制 0X02 hex、 bin 等其他转换方法…
0X00 最常见的持久化方式:挂载出来 相信各位学习使用 Docker 的时候都会出现过好不容易用 Docker 启动了个数据库容器,然后发现只要容器消失之后数据也就一起消失了的情况。然后通常来说会使用这么一个方法来解决问题:将宿主机的某个目录挂载到容器里,这样一来那个数据库容器就可以将数据内容和配置持久化地存储下来了。一般会使用这么一个方法将某个目录挂载到容器内部 docker run -dit --name new_container --mount type=bind,source=/Users/shawn/Downloads/test/test_dir,target=/test_dir alpine 。 下面图中首先创建了一个名为 this_container 的容器,并将其 /test_dir 目录和宿主机的 /Users/shawn/Downloads/test/test_dir 目录绑定到一起了。然后在容器里向 /test_dir…