分类目录归档:DevOps

Kubernetes基础


Kubernetes

Kubernetes是由Google开源的,用于自动部署、扩展和管理容器化应用程序的开源系统。 它将组成应用程序的容器组合成逻辑单元,以便于管理和服务发现。 通常我们会叫它:k8s,这是因为它用8代替8个字符“ubernete”而组成的缩写。Kubernetes的目标是让部署容器化的应用简单并且高效(powerful) 下文将以k8s来代替kubernetes。

背景知识

要了解k8s,首先需要弄清楚几个概念:

  1. 虚拟机
  2. 容器
  3. Docker、rkt

虚拟机

虚拟机(Virtual Machine)指通过软件模拟的具有完整硬件系统功能的、运行在一个完全隔离环境中的完...

Read more

对稳定性工作的一些思考 - 什么是SRE


什么是SRE

最早接触SRE这个名词还是在跟CloudFlare进行一些业务合作的时候,当时他们有一个专门的SRE团队来负责整个CDN系统的稳定性。 本着好奇的心态去了解,发现SRE的全称是(Site Reliability Engineering,aka:站点可靠性/稳定性工程师)成为一名合格的SRE需要同时具备研发(Dev)和运维(OP)的能力。同时它又不仅仅是2个职能的叠加,而是一种对系统稳定性、可用性、团队持续迭代喝持续建设的体系化解决方案。

如何做一名SRE

研发和SRE的区别

那些跟我一样从研发开始接触稳定性工作的选手在刚开始时可能会有类似的问题那就是对于稳定性相关的工作不知...

Read more

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


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

1. Logstash
2. Filebeat

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

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

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

方案选择

在kube...

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

搭建主从复制的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

MySQL忘记ROOT密码怎么办


背景

最近有一个网站使用了MySQL作为数据库,但是由于是很久之前部署的数据库,结果忘记了admin的密码。 经过一番折腾,发现可以通过修改mysql的配置来绕过权限验证,之后再修改mysql root用户的密码,所以记录一下,方便后续查阅。 具体流程如下:

流程

1. 修改my.conf

在[mysqld]的section中加上一行配置: skip-grant-tables 例如:

[mysqld]
    datadir=/var/lib/mysql
    socket=/var/lib/mysql/mysql.sock
    skip-name-resolve
    skip...

Read more

K8S-CheatSheet


kubernetes 常用操作

查看帮助和集群基本信息

kubectl --help                                 ## 查看帮助
kubectl --version                            ## 查看k8s版本信息
kubectl cluster-info                       ## 查看k8s集群信息,master和服务地址
kubectl cluster-info dump            ## 将集群状态信息输出到stdout
kubectl cluster-info dump --out...

Read more