使用filebeat收集k8s集群中的应用日志


最近有一个新的k8s集群上线,在日志收集组件上有2个选择:

1. Logstash
2. Filebeat

logstash是之前用过的日志收集工具,同时logstash的生态也很丰富,大量的插件可以保证它在大部分的场景下都能游刃有余。但是logstash也有它的问题,典型的问题就是性能比较差以及对资源的使用较多;

filebeat则是组内同事推荐,相比于logstash,filebeat很年轻,所以功能比较单一。但是也因为功能单一,所以它相对很健壮,同时对于资源的使用也比较小。

最后考虑到新的集群硬件资源有限,所以决定选择filebeat作为该集群的日志收集组件。

方案选择

在kube...

Read more

做一个既"慢"又"懒"的研发


我们组有一条principle是: slow is fast(慢就是快)

最近在给组里的一些新同学review代码的时候发现他们在工作时有一些很明显的优缺点:

  • 优点是他们学习、编码的能力都很不错,对于每一个新的需求都能快速快成;
  • 缺点是经常会在他的代码中发现一些非常低级又很小的错误,比如单词拼写错误、又或者忘记了核心逻辑中的异常处理等等;

每次看到这样的问题,我都会跟他们说,你要学着让自己"慢"下来。众所周知,在软件工程中,有一个名词叫做:PONC(Price of Nonconformance)是指由于没有第一次做对而造成财物的额外浪费。简称:质量成本。对应到一个功能,在不同的阶段...

Read more

记录由于redis启动失败导致Harbor服务崩溃的问题


背景

最近服务运行在k8s集群,为了省事儿,也把Harbor以及Harbor需要用到的组件也放到了k8s中。在最近的一次上线中发现节点不能更新镜像了。查看pod的状态时,发现Harbor需要用到的Redis服务的master节点状态异常(Error or Crash)。查看日志,发现有相应的报错信息:

Bad file format reading the append only file: make a backup of your AOF file, then use ./redis-check-aof --fix <filename>

原来是因为Redis在将aof文件...

Read more

记录非root用户使用docker时提示没有权限的问题


背景

之前部署的K8S环境在root用户下,这样的部署方式虽然用起来没有什么问题,但是直接使用root权限操作线上机器也依然存在着安全隐患。因此决定使用非root用户(比如work用户)来进行日常升级操作。 对于K8S和Helm来说,从root用户迁移到work用户下比较简单,只需要将 /root/.kube/config 拷贝到/home/work/.kube/config即可。 但是当使用work用户操作docker时会报错,报错信息为:

permission denied

错误原因

Docker报错的原因是这样: 在Linux中,Docker使用了一个Unix Domain Soc...

Read more

k8s同步pod的时区


背景

最近在开发时发现由于RD在打镜像时没有注意时区问题,有一些镜像的时区不是东八区,导致业务逻辑出现异常(登录token失效、数据库创建时间不正常)。因此需要同步k8s pod的时区。

解决办法

有2个办法可以解决这个问题:

  1. 修改打镜像的Dockerfile,正确处理时区问题
  2. 部署应用时,单独读取主机的“/etc/localtime”文件,即创建pod时同步时区。

方案1的好处是,不需要修改集群的配置,一劳永逸的解决问题。但是缺点是需要修改Dockerfile,需要重新打镜像。

方案2的好处是,不需要重新打镜像,pod直接读取宿主机的时区。但是缺点是每个pod都要设置。(老的pod...

Read more

使用Python Coverage获取测试覆盖率


Coverage

当我们完成测试用例的编写之后,需要知道测试用例对整个代码的测试覆盖情况。此时可以使用Coverage工具运行测试用例并统计扫描结果。 在Python中,使用Coverage.py作为Coverage工具。Coverage可以执行测试用例,并生成HTML或者XML格式的报告。

安装

在控制台执行python -m coverage,如果有类似输出:

Code coverage for Python. Use 'coverage help' for help.

说明已经安装过。如果没有安装的话,可以执行: pip install coverage

就可以完成coverag...

Read more

那个熟悉的罗马不见了


一转眼,这个赛季的意甲又要结束了。罗马在经历了一个赛季的动荡之后,最终排名第六,无缘下赛季的欧冠联赛。然而,相比于无缘欧冠,大师兄的离队对于我来说,是一段青春的结束,只能剩下追忆了。

第一次与罗马结缘还是在01年的夏天,当时站在一堆球衣前犹豫好久不知道买哪个。最后还是小伙伴推荐说买罗马的吧,刚拿了冠军,特别厉害。从那个夏天开始,我最喜欢的球队这个问题有了一个新的答案,就是罗马队。虽然它不是第一个答案,却是到目前为止的唯一一个。如果不出意外,也应该是最后一个了。这么多年来,经历了老森西对罗马的爱,也经历了因为拮据不得不卖掉葵花的伤感;见证了村长的一人一城,也等到了大师兄的最后一场比赛。曾经...

Read more

使用Python的unittest框架编写测试用例


unittest是Python语言中的xUnit测试框架实现。也是在开发中最常用的用来写单元测试的框架。本文将介绍一下什么是unittest以及如何使用unittest开发单元测试。

找到需要测试的目标

要写测试用例,首先需要知道我们要测试的目标是什么,在本文中,我们以一个简单的乘法函数作为待测试对象,这个函数的实现如下:

def multiply(x, y):
    """
    将2个给定的参数相乘,并返回结果

    Args:
        :param x: 乘法算子x
        :param y: 乘法算子y
    Returns:
        x * y...

Read more

搭建主从复制的PostgreSQL集群


背景

由于项目需要使用PostgreSQL作为持久化数据库,但是在公司内部并没有一个稳定公共的PostgreSQL数据库集群服务来用,因此需要自己搭建一套高可用的PostgreSQL服务。 在这里将搭建的过程记录下来,方便后续查阅。

安装

资源

操作系统

本文中安装Postgres数据库的操作系统为CentOS7.2

机器和IP地址

本文是在2台CentOS7.2的机器上部署主从复制的PostgreSQL,这2台机器的IP为:

主节点: 192.168.0.2
复制节点: 192.168.0.3

数据库用户名和密码

user: xxx
password: xxx

数据目录

/data/p...

Read more

搭建基于spiped代理的加密Redis Master/Slave服务


背景

由于业务的需求,线上的Redis服务需要部署到公网上。考虑到数据的敏感性,因此不希望数据在公网上是明文传输的。

所以需要引入SSL/TLS来加密传输的数据,从而保证数据在一定程度上的安全性。

鉴于目前的Redis并没有官方支持的ssl/tls通信功能。所以只能通过SSL代理来实现。在这里选择了Spiped作为SSL的代理工具。

Spiped的项目地址是:https://github.com/Tarsnap/spiped

官方地址是:http://www.tarsnap.com/spiped.html

部署

Redis2台机器,IP、端口分别为:

1. 192.168.1.100:3...

Read more