编写安全健壮的shell脚本
编写 shell 脚本容易出现的问题:比如变量为空的时候,管道报错等,容易引起一系列问题甚至灾难性的结果。可以借助工具https://www.shellcheck.net/来检查脚本里面可以改进的地方。 脚本里使用 set建议使用 set -oset -o 可以查看 shell 的选项开关,比如常用的 pipefail pipefail 是指在一个管道命令中,任意一个命令执行失败就认为命令报错(但是可以继续执行,想让它报错退出需要再加上 set -e) 可以在 shell 脚本开头加上 set -o pipefail,我们来看一个例子: set -eset -e 是指任意一条命令返回值不是 0,脚本就退出不继续执行了。 如果有些程序想要人为的忽略报错,可以在命令开始前加上 set +e,命令结束的时候再 set -e,如: set -u将未设置的参数或者变量视为错误并退出脚本。 这个时候只会执行 echo 111,因为 ${123}不存在,脚本就报错退出了。 set -x调试模式,会把每一个 shell 命令执行的结果都打印出来,效果等同于 bash -x t...
Nginx之server_name匹配和listen匹配
nginx 可以通过 listen 的 ip 和端口来匹配请求应该由哪个配置文件来处理,也可以通过 server_name 来匹配,抽空理了理这个匹配的规则和优先级,参考文档: 基于域名的虚拟主机默认是先匹配 listen 的 ip 和端口,匹配到了再检查 server_name,如果没有匹配的 server_name,则由第一个来处理,除非添加 default_server 测试一下: 在这个配置中,nginx 仅仅检查请求的“Host”头以决定该请求应由哪个虚拟主机来处理。如果 Host 头没有匹配任意一个虚拟主机,或者请求中根本没有包含 Host 头,那 nginx 会将请求分发到定义在此端口上的默认虚拟主机。在以上配置中,第一个被列出的虚拟主机即 nginx 的默认虚拟主机——这是 nginx 的默认行为。而且,可以显式地设置某个主机为默认虚拟主机,即在 “listen” 指令中设置 “default_server” 参数: 如果同样的 listen 配置了两个 default_server 则会报错 nginx: [emerg] a duplicate defa...
使用vscode来写hugo博客并处理图片插入问题
如果对 typora 情有独钟的同学可以参考https://zahui.fan/posts/b4cf69c3/,不过我用来用去还是发现 vscode 好,哪怕不写代码,仅仅写文章也挺不错的。不过直接用的话有很多问题,我们还需要借助 vscode 强大的插件系统。 插入到 static 目录插入图片问题我们在写博客的时候,有时会有一些插入图片的需求,之前的做法是 – 截图保存到 static/images 目录,然后文章里面添加 ,操作很繁琐,或者也可以使用图床,不过也挺麻烦的。我们可以用一款叫 paste image 的插件来简化我们的插入图片的操作。 假设你的博客图片放在仓库根目录的 static/images 目录下,博客文章在其他地方,需要修改 图片存放的位置: 图片的基础路径: 即在 markdown 文件里面不显示 static 了,只从 images 开始显示 路径的前缀: 如果不加的话,路径是类似于 ,建议使用 GPT 分区表。如果是小磁盘,只要机器不是太老,也建议使用 GPT 分区表。mbr 该被淘汰了。 创建分区 primary:主分区(GPT 分区表可省略)ext4:文件系统类型,可选 ext4, xfs, ntfs 等1MiB 50GiB:起始位置和结束位置 查看分区表 其他常用操作 格式化与手动挂载 配置自动挂载使用UUID挂载(推荐)使用设备路径挂载 vim /etc/fstab 参数解释 vim /etc/fstab 测试自动挂载
Kafka + Zookeeper集群搭建
新版本的 kafka 可以不依赖 zookeeper,不过目前处于测试阶段,且不支持 zookeeper 迁移到新本,所以在生产环境还是建议等一等。本文使用的是 kafka_2.13-2.8.1.tgz zookeeper 相关的文档可以参考https://zookeeper.apache.org/doc/r3.8.0/zookeeperStarted.html 安装规划 说明 目录 kafka 程序目录 /data/src/kafka_2.13-2.8.1 kafka 数据目录 /data/kafka-logs zookeeper 数据目录 /data/zookeeper_data 准备首先需要安装 java 环境Ubuntu和DebianCentOS和Fedora 创建目录 配置 zookeeper修改 zookeeper 配置vim config/zookeeper.properties 创建数据目录和集群 ID myid 集群内不能重复的,每台机器设置成不一样的。...
Filebeat输出日志格式处理
使用 filebeat 可以在收集过程中进行一些简单的处理,如丢弃日志等,给后面的 kafka 等减少压力 普通文本日志格式原始日志格式: 这里的原始日志是指要收集的日志文件的格式,上面的这个日志是被 Kubernetes 处理过的,真正程序输出的日志应该是 log 字段。 对应的 filebeat 配置文件如下: 经过 filebeat 处理后输出的内容:所以回过头来看上面的配置文件,drop_event regexp 下面 针对 json.log 做正则匹配,包含指定字符就丢弃。 针对 json 格式日志处理原始日志: 某一行包含 xx 就丢弃比如我想丢弃所有 request_uri 为 /actuator/info 或 http_user_agent 为 Go-http-client/2.0 的日志 filebeat.yml 配置文件如下: 因为日志本身就是个 json,经过 filebeat 后又会包装一个 json,所以我们需要对日志做二级解析。
Kubernetes之master高可用方案
之前一直用使用的负载方案是搭建一台负载均衡器,可以是 haproxy 或 nginx 或 lvs,来将多个 master 节点的 6443 端口做个负载均衡,但是考虑到负载均衡也需要高可用,所以会引入类似 keepalived 的方案来解决问题。偶然看到了 kubeasz 这个开源项目,宣称解决了 master 高可用问题,部署了一遍发现并没有额外搭建负载均衡器,研究了一下,发现了另一种思路。 使用额外的负载均衡来做高可用这种就是比较容易想到的一种方案,比如 3 个 master 节点,前面有一台负载均衡(nginx、haproxy、lvs)等,但是负载均衡本身就是一个单点故障,所以一般来说还需要另一台负载均衡,通过 keepalived 来实现 VIP 的切换使用Keepalived来实现Nginx高可用 使用Nginx做负载均衡使用HAproxy做负载均衡使用LVS做负载均衡vim nginx.conf 在文件最后添加 然后 vim /etc/nginx/stream.conf 因为我们用 nginx 四层负载 ingress,需要监听 80 端口,与 nginx ...
Kubernetes使用NFS作为存储
我们玩单机的容器,如果需要持久化的话,需要将容器目录映射到主机,但是在 K8S 环境下容器是可能会被调度到任意节点的,所以需要使用远程服务存储数据。在云平台上都会提供自己的云盘存储,但是自己搭建的 Kubernetes 没有办法使用云盘做存储,所以需要用自己搭建的存储,NFS 是比较常见的一种,其他还有 glusterfs、ceph 等。 关于 NFS 搭建教程,可以查看https://zahui.fan/posts/4b677f68/容器镜像开源地址https://github.com/kubernetes-sigs/nfs-subdir-external-provisioner 安装 NFS client 工具所有的 worker 节点上都需要安装 NFS client Ubuntu CentOS rbac 授权rbac.yml 部署插件deployment.yaml 创建 storageclassstorageclass.yml 测试 NFSnginx.yml 然后在 NFS 服务器上可以看到对应的目录,进去...
Kubernetes之ingress-nginx安装配置
部署 ingress-nginx ingress-nginx 官方文档 https://kubernetes.github.io/ingress-nginx/deploy/#bare-metal-clusters自建的 Kubernetes 可以参数 bare-metal 安装 部署成功后修改 NodePort,把里面 30xxx 的端口换成你想要的端口 也可以 wget https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-v1.1.2/deploy/static/provider/baremetal/deploy.yaml 再编辑 在 当然也可以不做以上修改,不修改的话会自动在 30000~32767 自动生成一个,需要把自动生成的端口配置到负载均衡器上。 通过 daemonset 方式安装通过 daemonset 安装一般来说都是以 hostnetwork 方式来,直接监听 node 节点上的 80、443 端口将上述 yaml 中 deployment 的部分换成 ...
Hugo博客批量更换url结构
之前修改过 hugo 的 url 结构,config.toml 内容如下: 生成的 URL 类似于:https://zahui.fan/a7c8660c/ 不过这样随着文件越来越多,发布用的仓库根目录文件夹也越来越多,不好看,再加上域名后加上光秃秃的无意义的字符串也不优雅,所以决定改成https://zahui.fan/posts/a7c8660c/这样的域名结构。 修改 config.toml我们需要修改 config.toml,改变默认的 url 结构 这样重新生成博客,url 路径就会变成新的了 配置自动跳转这样配置的话,之前的 url 连接就会全部 404 了,对于做了 SEO 的同学来说就是个灾难,所以我们需要做个跳转 在 frontmatter 添加 aliases: 这样每次访问https://zahui.fan/a7c8660c/就会自动跳转到https://zahui.fan/posts/a7c8660c/ 自动替换脚本写了个脚本可以批量给 md 文件添加 aliases:,脚本和 md 文件放在一起

