极客进化岛
技术自由路

Prometheus 最新实战

itlaoxin阅读(245)

本文主题:

  • prometheus 介绍
  • prometheus安装部署
  • prometheus 监控本地服务器
  • prometheus监控远程服务器
  • prometheus监控mariadb

Prometheus 是什么?

Prometheus是一套开源的监控&报警&时间序列数据库的组合,起始是由SoundCloud公司开发的。随着发展,越来越多公司和组织接受采用Prometheus,社区也十分活跃,他们便将它独立成开源项目,并且有公司来运作。google SRE的书内也曾提到跟他们BorgMon监控系统相似的实现是Prometheus。现在最常见的Kubernetes容器管理系统中,通常会搭配Prometheus进行监控。

Prometheus 的优点

1. 配置灵活

使用过zabbix的同学应该都体验过安装时候的安装依赖包的痛苦,而premetheus核心部分只有一个单独的二进制文件,下载解压安装即可,没有依赖的第三方库。

2. 监控更多多样性

prometheus支持多种语言的的客户端,我们通过客户端方便对核心业务进行埋点,比如下单,添加购物车等流程。 而且prometheus已经有非常多的系统集成:比如

应用层面的监控:nginx,haproxy,mysql ,docker等

系统层面如: SNMP协议监控,主机监控,进程监控

容器云监控: docker,k8s openstack私有云

3. 非常高效的存储

平均一个采样数据占 ~3.5 bytes左右,320万的时间序列,每30秒采样,保持60天,消耗磁盘大概228G。

prometheus的架构

在这里插入图片描述 对照图中的每一部分进行介绍:

  • prometheus server 主要负责数据的采集和存储,提供PromQL查询语言支持 Retrieval:采样模块,prometheus的服务器在哪里拉取数据,检索拉取到的数据分发给 TSDB进行存储 TSDB:存储模块默认本地存储为TSDB HTTP server : 提供http接口查询和面板,默认端口为9090
  • short-lived jobs: 存在时间不足以被删除的短暂或批量业务,无法通过pull的方式拉取,需要使用push的方式,与pushgeteway结合使用
  • Service Discovery: 服务发现,prometheus支持多种服务发现机制: 文件,DNS,k8s,openstack,等,基于服务发现的过程,通过第三方接口,prometheus查询到需要监控的target列表,然后轮询这些target获取监控数据
  • 客户端SDK 官方提供的客户端类库有go,java,python,ruby
  • pushgateway 支持临时性的job主动推送指标的中间网关,prometheus默认通过pull方式从exporters拉取,但有些情况我们是不允许promethes与exporters直接进行通信的,这时候我们可以使用pushgateway由客户端主动push数据到pushgateway,在由prometheus拉取。很多时候我们需要自定义一些组件来采集
  • proDash 使用rails开发的dashboard,用于可视化指标数据
  • exporters 支持其他数据源的指标导入到prometheus,支持数据库,硬件,消息中间件,存储系统,http服务器,jmx等 负责收集目标对象的性能数据,并通过http接口供prometheus server获取 只要符合接口格式,就可以被采集
  • alertmanager 实验性组件,用来进行报警
  • prometheus_cli 命令行工具

prometheus的工作流程

  1. prometheus server 定期从配置好的jobs或者exporters中拉metrics.或者接受来自pushgateway发过来的metrics,或者从其他的prometheus server中拉取metrics
  2. prometheus server 在本地存储收集到的metrics,并运行已经定义好的arlt.rules,记录新的时间序列或者向alertmanager推送报警
  1. Alertmanager根据配置文件,对接受的警报进行处理,发出告警
  2. 在图形界面中,可视化采集数据,可以使用别人写好的grafana模板。

版本(官网提供版本)

image-20220517144009061

实验环境的检查:

[root@laoxin-06 ~]# cat /etc/redhat-release 
CentOS Linux release 7.7.1908 (Core)
[root@laoxin-06 ~]# free -m
              total        used        free      shared  buff/cache   available
Mem:           3770         887        1610          47        1273        2591
Swap:          2047           0        2047
[root@laoxin-06 ~]# ifconfig |grep inet |awk 'NR==1{print $2}'
192.168.3.71

prometheus 部署

下载地址:https://github.com/prometheus/prometheus/releases/

[root@zmedu-17 ~]# tar xf prometheus-2.7.1.linux-amd64.tar.gz 
[root@zmedu-17 ~]# mv prometheus-2.7.2.linux-amd64 /usr/local/prometheus
[root@zmedu-17 ~]# cd /usr/local/prometheus/
[root@zmedu-17 prometheus]# pwd
[root@zmedu-17 prometheus]# ls
console_libraries NOTICE         promtool
consoles           prometheus
LICENSE           prometheus.yml

[root@zmedu-17 prometheus]# ./prometheus --version
prometheus, version 2.7.2 (branch: HEAD, revision: 82f98c825a1437c0a24056eb4dc986d9a3fc7fae)
build user:       root@ab86c672c33a
build date:       20190302-14:57:04
go version:       go1.11.5
[root@zmedu-17 prometheus]#

后台启动普罗米修斯:

[root@zmedu-17 prometheus]# ./prometheus &
[1] 66474
​
如果出现:

ts=2022-05-17T06:54:41.844Z caller=main.go:897 level=info msg="Server is ready to receive web requests."

证明启动成功了

通过网址访问

通过后台执行http://192.168.1.17:9090 在这里插入图片描述

web端的基本使用及介绍

http:.//ip:9090

查看监控目标: 在这里插入图片描述

http://192.168.1.17:9090/metrics

img

可以看到系统默认监控了自己的主机信息,监控接口通过http://服务器IP:9090/metrics 可以直接看到监控数据,如下图:

在这里插入图片描述 第一张图中的localhost:9090/metrics中的localhost要改成自己的ip

这里面是prometheus开放的接口。

prometheus默认监控图像

process_cpu_seconds_total

在这里插入图片描述

在图1的位置输入process_cpu_seconds_total ,可以查看到cpu的总量。

[root@itlaoxin-17 ~]# curl localhost:9100/metrics |grep node_memory_MemFree

##查看第一个cpu的空闲状态

node_cpu_seconds_total{cpu="0",mode="idle"}

## 计算第一个cpu过去5分钟内的CPU使用速率(查询的数据为双精度浮点性)

irate(node_cpu_seconds_total{cpu="0",mode="idle"}[5m])

##第一个cpu的平均使用率

1- avg(irate(node_cpu_seconds_total{cpu="0",mode="idle"}[5m]))

案例: 监控远程linux主机

首先在远程linux上安装node_export组件,帮助prometheus来收集数据

从官网下载 node_exporter-1.3.1.linux-amd64.tar.gz

1. 上传并解压安装

[root@itlaoxin72 ~]# ls
\                                       公共  文档
anaconda-ks.cfg                         模板  下载
initial-setup-ks.cfg                    视频  音乐
node_exporter-1.3.1.linux-amd64.tar.gz  图片  桌面
[root@itlaoxin72 ~]# tar xf node_exporter-1.3.1.linux-amd64.tar.gz 
[root@itlaoxin72 ~]# mv node_exporter-1.3.1.linux-amd64 node_exporter
[root@itlaoxin72 ~]# pwd
/root
[root@itlaoxin72 ~]# cd node_exporter/
[root@itlaoxin72 node_exporter]# ls
LICENSE  node_exporter  NOTICE
[root@itlaoxin72 node_exporter]# 
​

2. 启动node_exporter来收集数据

[

[root@itlaoxin72 node_exporter]# ll -h
总用量 18M
-rw-r--r--. 1 3434 3434 12K 12月  5 19:15 LICENSE
-rwxr-xr-x. 1 3434 3434 18M 12月  5 19:10 node_exporter
-rw-r--r--. 1 3434 3434 463 12月  5 19:15 NOTICE
[root@itlaoxin72 node_exporter]# chmod +x node_exporter 
[root@itlaoxin72 node_exporter]# nohup ./node_exporter &

​
​

此处用nohup让程序一直运行下去,且在后台运行 备注: 关于nohup

nohup 是 Linux 的一个常用命令,当你想要在退出账户或者关闭终端后进程仍在运行时,就可以使用 nohup 命令。nohup 就是不挂断的意思(no hang up)。

3. 查看9100端口的占用情况

[root@xinsz08-20 ~]# lsof -i:9100
[root@itlaoxin72 ~]# lsof -i:9100
COMMAND    PID USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
node_expo 6231 root    3u  IPv6  61353      0t0  TCP *:jetdirect (LISTEN)

​

4. 查看监控的信息

http://192.168.1.18:9100/metrics

5. 配置prometheus server端可以拉取node信息

[root@itlaoxin-17 prometheus-2.26.0.linux-amd64]# vim prometheus.yml

/root/prometheus-2.16.0.linux-amd64/prometheus.yml

在文件最后添加内容

- job_name: 'agent'

  static_configs:
     - targets: ['192.168.1.18:9100']

添加完成后重新启动prometheus

[root@zmedu-17 prometheus-2.16.0.linux-amd64]# pkill prometheus
[root@zmedu-17 prometheus-2.16.0.linux-amd64]# ss -nltup | grep 9090
[root@zmedu-17 prometheus-2.16.0.linux-amd64]# ./prometheus &
[root@zmedu-17 prometheus-2.16.0.linux-amd64]# ss -naltp |grep 9090
LISTEN     0      128       [::]:9090                 [::]:*                   users:(("prometheus",pid=83351,fd=8))

6. 通过web端查看,是否成功

http://192.168.1.17:9090

可以看到增加了一台监控的信息

在这里插入图片描述
在这里插入图片描述

prometheus监控MySQL

熟悉了上面的两个部分后,我们进入今天的服务监控,以mariadb为例:

监控mysql需要在被监控机器安装mysql_exporter

mysql_exporter下载地址:https://prometheus.io/download/

在这里插入图片描述

1. 上传解压安装mysqld_exporter

[root@xinsz08-20 ~]# tar xf mysqld_exporter-0.12.1.linux-amd64.tar.gz

文件名字太长,重命名一下:
[root@xinsz08-20 ~]# mv mysqld_exporter-0.12.1.linux-amd64 mysqld_exporter
[root@xinsz08-20 ~]# cd mysqld_exporter/
[root@xinsz08-20 mysqld_exporter]# pwd
/root/mysqld_exporter

2. 安装mariadb

[root@xinsz08-20 mysqld_exporter]# yum install mariadb\* -y
[root@xinsz08-20 ~]# systemctl start mariadb
[root@xinsz08-20 ~]# systemctl enable mariadb
[root@xinsz08-20 ~]# ss -natlp |grep 3306 //查看端口是否开启
LISTEN 0 80 0.0.0.0:3306 0.0.0.0:* users:(("mysqld",pid=67872,fd=22))

3. 在数据库里创建mysql账号用户收集数据

[root@xinsz08-20 ~]# mysql

MariaDB [(none)]> grant select,replication client,process ON *.* to 'mysql_monitor'@'localhost' identified by '12345678';
Query OK, 0 rows affected (0.000 sec)

MariaDB [(none)]> flush privileges;
Query OK, 0 rows affected (0.000 sec)

MariaDB [(none)]> exit
Bye
[root@xinsz08-20 ~]#

备注: 此处是prometheus服务器来找mysql_exporter,然后mysql_exporter 在找mariadb,所以这里用的是localhost,指的是mysql_exporter的ip

4. 在mysql_exporter中设置mysql配置信息

[root@xinsz08-20 mysqld_exporter]# pwd
/root/mysqld_exporter

[root@xinsz08-20 mysqld_exporter]# vim .my.cnf (手工创建)

[client]
user=mysql_monitor
password=12345678

5. 启动mysql_exporter

[root@xinsz08-20 mysqld_exporter]# nohup ./mysqld_exporter --config.my-cnf=/root/mysqld_exporter/.my.cnf &
[1] 68166
注意; 此处是 --config.my-cnf=

查看端口(9104)

[root@xinsz08-20 ~]# ss -naltp |grep 9104
LISTEN 0 128 *:9104 *:* users:(("mysqld_exporter",pid=68249,fd=3))

6. 配置prometheus拉取mysql节点信息

在prometheus的server端进行修改

[root@zmedu-17 prometheus-2.16.0.linux-amd64]# pwd
/root/prometheus-2.16.0.linux-amd64
[root@zmedu-17 prometheus-2.16.0.linux-amd64]# vim prometheus.yml
- job_name: 'mariadb'
static_configs:
- targets: ['192.168.1.20:9104']

重启prometheus服务

[root@zmedu-17 prometheus-2.16.0.linux-amd64]# pkill prometheus
[root@zmedu-17 prometheus-2.16.0.linux-amd64]# lsof -i:9090
[root@zmedu-17 prometheus-2.16.0.linux-amd64]# ./prometheus &
[1] 84662
[root@zmedu-17 ~]# ss -naltp |grep 9090
LISTEN 0 128 [::]:9090 [::]:* users:(("prometheus",pid=84662,fd=9))

7. 通过web端查看

http://192.168.1.17:9090 在这里插入图片描述 查看mysql的连接数,看到只有一个连接数: mysql_global_status_aria_pagecache_blocks_unused 在这里插入图片描述

8. prometheus.yml配置文件详解

global:
# 全局配置
scrape_interval: 15s # 多久收集一次数据

evaluation_interval: 15s # 多久评估一次规则
scrape_timeout: 10s # 每次收集数据的超时时间
# Alertmanager configuration #告警设置
alerting:
alertmanagers:
- static_configs: #告警规则,也可以基于动态方式进行告警
- targets:
rule_files: #规则文件
#收集数据配置列表
scrape_configs:
- job_name: 'prometheus'

Python函数的变量域

itlaoxin阅读(898)

变量作用域
Python作用域一共分为四种,分别是:
L 局部作用域
E 闭包函数外的函数中
G 全局作用域
B 内建作用域

变量的查找是以 L E G B的规则顺序查找的。 现在局部中招,找不到变会去局部外的局部找(例如闭包)
Python中只有模块,累,以及函数def,lambda,才会引入新的工作域

实例:
total = 0
n2 = 10
def sum(m,p):
    print(n2)
    total = m + p
    print("函数是局部变量total:" ,total)
    return total
sum(10,20)
print("函数外是全局变量total",total)

打印结果

10
函数是局部变量total: 30
函数外是全局变量total 0

匿名函数

语法: lambda[参数1[参数2,参数3,..参数n] : 表达式

实例:

g = lambda x:x*x+1
print(g(1))
print(g(2))

输出结果:

D:\python_install\py3.5\python.exe 
2
5

Process finished with exit code 0

【DevOps】软件开发生命周期

itlaoxin阅读(452)

文章目录

  1. 计划和需求分析
    a) 计划
    b) 需求分析
  2. 设计项目架构
  3. 开发和编程(实现阶段)
  4. 测试
  5. 部署(进化阶段)
    案例
    软件开发模型
  6. 概念
  7. 分类
    a 瀑布模型
    b. 敏捷模型
    瀑布和敏捷开发的理解
    后记

DevOps工具篇 主要针对的是DevOps常用的工具,比如jenkins,gitlab, docker等工具的结合使用。

软件开发的生命周期,又叫做SDLC, 主要集成了
1. 计划和需求分析
2. 设计项目架构
3. 开发和编程
4. 测试
5. 部署。

1. 计划和需求分析

我们拿到一个项目,它到底要做什么样的功能。每个软件的开发生命周期模型都是从分析开始, 讨论最终的产品的要求。

a) 计划

1) 确定软件的开发总目标
2) 给出软件的功能,性能,可靠性以及接口等方面的设想
3) 对可供开发使用的资源,成本,以及可取得的效益和开发进度做出估计
4) 指定完成开发任务的实施计划

b) 需求分析

软件研发的类型不同,需求来源也不同,针对产品的软件开发,需要做好市场调研。 比如确定软件系统的功能,性能,数据,和界面要求等

在这一阶段,主要的产出物有两个: 一个是项目开发计划,一个是软件需求说明书。 有的公司可能会有一个可行性分析报告。

2. 设计项目架构

第二阶段主要是设计阶段,系统架构和满意状态,就是你要做成什么样子,有什么功能。
明确软件系统是由哪些模块组成的,这些模块的层次结构,调用关系,以及模块的功能,同时确定数据结构和数据库结构。

这个阶段的产出物有: 概要设计说明书,数据库设计说明书,接口设计,详细设计说明书

3. 开发和编程(实现阶段)

编码就是把模块的控制结构转化为程序代码,该阶段需要编码规范。
一般由项目经理带领我们的开发人员进行开发,根据项目的大小和复杂程度,可能需要数月或者更长的时间完成。

4. 测试

测试是为了保证软件质量,该阶段产生的文档主要有软件测试计划、测试用例、软件测试报告。

测试一般由测试人员测试,一些小的项目也可以是开发人员进行测试,测试主要分为:

  • [ ] 功能测试
  • [ ] 代码测试
  • [ ] 压力测试

  • 单元测试: 开发自测,包含各个单元模块,具体到类,函数

  • 集成: 各个单元组合测试,接口是否正确,数据是否正常传递
    • 系统测试: 把整个系统搭建起来,根据规格说明书需求对应测试,看各个功能模块是否与需求相符,系统运行是否ok

5. 部署(进化阶段)

发布就是完成软件开发并把已开发的软件系统安装到客户的服务器上,并进行相关的维护, 根据用户的情况,可能需要对某功能进行修改,bug修复,功能增加等
这个阶段其实就是上线及线上bug反馈
说来也怪,bug的生命周期和软件开发周期一样:
- bug发现并提出
- bug的确认和分析
- 设计bug的修改方案
- bug修复阶段
- 测试bug是否修复成功
- 修复完成后上线
然后进入下一轮的bug发现并提出阶段,周而复始,所以很多新入行的开发人员,第一年就是在不听的发现bug,修复bug,不会让你涉及到更多核心内容。

该阶段产生的文档主要有项目开发总结报告、用户手册、应用软件清单、源代码清单、维护文档。

案例

公司准备做一个软件,可以帮助用户在回答知乎文章的时候,提高点赞率和收藏量。能够实时的发现热门问答和有潜力的问答,能够根据一些参数生成分数供用户参考。能够判断种草的购物链接是否还存在,能够自动提升知乎盐值分数,以及一些其他功能(此案例只是举例)

  1. 需求: 对知乎用户进行访谈,需求文档撰写,用户确认, 3天
  2. 设计(该要设计2天)
  3. 编码(30-40天)
  4. 测试(7天)
  5. 接项 (5天)

当然每个项目都不一样,软件各个生命阶段周期的大致分布

计划与需求分析: 10 --25%

设计项目架构: 20%~25%
开发与编码: 15%~25%
测试与部署: 30~40%

软件开发模型

1. 概念

软件开发模型(Software Development Model)是指软件开发全部过程、活动和任务的结构框架

2. 分类
a 瀑布模型

瀑布模型是最著名和最常用的软件开发模型,但目前已经不太适合现在的开发了。就像汽车生产流水线一样,各个部门各司其职,工作按照顺序展开。如同瀑布流水,逐层下落。

特点: 阶段时具有顺序性和依赖性,前一个阶段完成,才能进行后一个阶段。
简单易用和容易理解,根据里程碑去检查实现的目标。

缺点:
- 不适应用户需求的变化,
- 各个阶段的划分完全固定,阶段之间产生大量的文档,极大的增加了工作量

b. 敏捷模型

敏捷开发的核心是迭代开发+增量开发

迭代开发: 将开发过程拆分成多个小周期,每次小开发都是同样 流程
增量开发: 软件的每个版本,都会增加一个用户可以感知的完整功能,根据新增功能划分迭代。

特点:及时了解市场需求,降低产品不合适市场的风向。

瀑布和敏捷开发的理解

假设我们要建10栋楼

瀑布模型: 打好10栋楼的地基-盖好10层-封顶-交付

花费的时间长,出现问题不容易修改,无法尽快适应市场变化

敏捷开发: 打好1栋楼地基-盖好10层-封顶-交付。
周期快,及时根据市场需求更新

后记

很多学员毕业后去了公司,我找人收集了他们公司现有的开发模型,发现大多数公司的开发模型就是没有模型,完全是混乱状态。

在留言区聊聊你们公司正在用的开发模型吧,我是高胜寒,一个教培行业不忘初心的人。欢迎点赞收藏,我们下片文章再见!

【DevOps】持续集成

itlaoxin阅读(378)

文章目录

什么是集成
什么是持续集成
持续集成的六个步骤:
1. 提交
2. 测试(第一轮)
3. 构建
4. 测试(第二轮测试)
5. 部署
持续集成的组成要素
持续集成有什么好处
总结

大家好,我是高胜寒,一个在教培行业不忘初心的人,本文是【循序渐进学运维】DevOps工具篇的第2篇文章

【循序渐进学运维】DevOps工具篇 主要针对的是DevOps常用的工具,比如jenkins,gitlab, docker等工具的结合使用。

什么是集成

开发人员写代码,代码写完后直接给客户吗? 显然不是,客户需要的是软件而不是一堆代码,而一个软件不是一个开发完成的,是一个团队的开发完成的,这么多人的代码不可能自己组合一起, 所以当我们想把每个程序员写好的代码组合在一起,这个过程就叫做集成。

一个学员在做项目,他们的工作流程是,先开发一个月,一个月后,在召集团队里的精英来做集成,把最基本的流程跑通,通常需要花3-4天时间,如果改动量比较大,可能需要一两周时间。

既然一个月之后再集成,那为什么不把时间弄短点,比如一周集成一次。每天集成一次。时间越短,代码量越少,需要改动的也少,集成的难度会降低。
那如果在降低呢,比如2小时,半小时,有人尝试着让开发和集成同时进行,最终诞生了持续集成的想法。

持续集成的想法很好,但总不能有人提交了代码,就有个负责人去集成把,这种工作中肯定是行不通的,所以就有人编写了脚本,定期去源码服务器拉取代码,出现程序更新时,就自动完成构建。

这个脚本也慢慢发展,变成了工具,能够适用于大部分的开发语言。

什么是持续集成

持续集成(CI), 指的是,频繁的(一天多次)将代码集成到主干。
持续进程的目的,就是让产品可以快速迭代,同时还能保证高质量。它的核心措施是,代码集成到主干之前,必须通过自动化测试,只要有一个测试用例失败,就不能集成。

通过持续集成,一个开发团队可以快速的从一个功能到另一个功能,而我们之前提到的敏捷开发,很大一部分就是归功于持续集成。

持续集成的六个步骤:

在这里插入图片描述
代码从提交到部署到生产环境,一共经历了六个步骤:
1. 提交
2. 测试(第一轮)
3. 构建
4. 测试(第二轮测试)
5. 部署
6. 回滚

1. 提交

流程的第一步,主要是开发者向代码仓库提交代码,代码仓库或者叫代码托管平台,目前常见的有 github, gitlab, bitbucket,开源中国代码托管,coding.net,CSDN代码托管,京东代码托管

我们在公司里一般是搭建自己的gitlab,来进行代码管理。自己搭建在公司内部服务器,更加安全。当然 在github上用户也可以创建私有项目, 还要一些小公司会放在阿里云code代码托管平台上。

有个学员的公司,因为疫情在家办公,他刚入职,公司给发了VPN账号,可以登陆公司的SVN服务器,也可以把公司的代码资料都下载下来,刚要跟公司说这样不安全。
直到代码下载下来,看到代码后豁然开朗,这给别人,别人都不要,所以绝对安全。

2. 测试(第一轮)

代码仓库对commit操作配置了钩子(hook),只要提交代码或者合并到主干,就会跑自动化测试。

3. 构建

通过第一轮测试,代码就可以合并到主干,后面就可以进行交付了。
交付后,先进性构建(bulid),然后进入第二轮测试。所谓的构建,就是将源代码转换为事件的代码,比如安装依赖,配置资源(js脚本,图片)等等

4. 测试(第二轮测试)

构建完成进行第二轮测试,在第一轮中测试过的内容可以不用测试。也可以把构建放在最前面,把两次测试合并。

5. 部署

当第二轮测试结束,没有问题之后,当前的代码就 可以直接部署了,将当前版本的所有文件打包存档。 打包直接用tar打包即可, 然后发送到生产服务器。

  1. 回滚
    部署完成之后,进行在线访问测试,一旦发现当前版本有问题,就要回滚到上一个版本的构建结果, 可以使用我们之前学习过的符号链接,ln 来指向上一个版本。

持续集成的组成要素

  • 一个自动化构建过程,从检出代码,编译构建,运行测试,结果记录,测试统计等都是自动化完成的,无需人工干预
  • 在公司里,代码存储库,一般使用svn或者git。
  • 一个持续集成服务器,在公司我们用的最多的是jenkins。jenkins的配置和使用方法都很简单。

集成一定是集成团队的代码,而不是一个人的代码。

持续集成有什么好处

  • 快速返现错误,没完成一点就进行更新,集成到主干,可以很容易的发现和定位错误
  • 减少重复性的工作
  • 防止分支偏离主干,如果不做经常性的集成,主干一直在更新,会导致以后的集成难度变大。

总结

本文主要讲述了
1. 什么是集成
2. 什么是持续集成
3. 持续集成的步骤
4. 持续集成的优势

我是高胜寒,一个在教培行业不忘初心的人,下一篇文章,我们再见!

【DevOps】持续集成的流程及jenkins的介绍

itlaoxin阅读(377)

文章目录

前言
jenkins的概念
什么是DevOps
jenkins特性
持续集成的流程
总结

【循序渐进学运维】DevOps工具篇 主要针对的是DevOps常用的工具,比如jenkins,gitlab, docker等工具的结合使用。

前言

持续集成,一定要有一个持续集成服务器的参与,而jenkins就是搭建持续集成服务器,能够完成自动化构建的一款非常好的软件。

所以我们今天来探讨下jenkins这款软件的相关内容

jenkins的概念

jenkins官网: https://www.jenkins.io/

Jenkins是一个开源的、可扩展的持续集成、交付、部署(软件/代码的编译、打包、部署)的基于web界面的平台。允许持续集成和持续交付项目,无论用的是什么平台,可以处理任何类型的构建或持续集成。

jenkins 是用java开发的,一款开源的自动化服务器,我们只需要通过界面或者jenkinsfile告诉jenkins,执行什么任务,什么时间执行,就可以

官方文档:https://jenkins.io/doc/

持续集成: CI
持续部署: CD

在这里插入图片描述

什么是DevOps

高胜寒搜了很多答案,只有维基百科的答案比较贴切。

维基百科给出了定义:

DevOps 是一种重视软件开发人员(Dev)和运维人员(Ops)之间沟通合作的文化,运动和惯例。 通过自动化软件交付和架构变更的流程,使的构建,测试,发布软件能够更快,频繁和可信

其实维基百科的定义也不是很全面,但正是因为devops的定义没有标准,所以devops到底是什么,这些年来吵得不可开交。 不过所有的定义都透漏出一个信息,那就是能够更快,更好的交付软件。

很多大佬在谈及DevOps的时候都会说到jenkins,接下来我们看看jenkins的一些特性。

jenkins特性

  1. 开源的java语言开发持续集成工具,支持CI,CD;

  2. 易于安装部署配置:可通过yum安装,或下载war包以及通过docker容器等快速实现安装部署,可方便web界面配置管理;

  3. 消息通知及测试报告:集成RSS/E-mail通过RSS发布构建结果或当构建完成时通过e-mail通知,生成JUnit/TestNG测试报告;

  4. 分布式构建:支持Jenkins能够让多台计算机一起构建/测试;

  5. 文件识别:Jenkins能够跟踪哪次构建生成哪些jar,哪次构建使用哪个版本的jar等;

  6. 丰富的插件支持:支持扩展插件,你可以开发适合自己团队使用的工具,如git,svn,maven,docker等。

持续集成的流程

在这里插入图片描述

  1. 开发人员每天提交代码提交到gitlab代码仓库;
  2. jenkins使用git工具到gitlab里面去拉取代码到集成服务器(jenkins),在配合JDK,maven等软件完成代码的编译,代码测试与审查,测试,打包等工作,如果在执行的过程中出错,将重新执行整个流程
  3. jenkins把生成的jar包或者war包分发到测试服务器或者生产服务器,用户就可以从网站访问应用

在上述jenkins的整个流程中,其实还有一些地方需要考虑,我们会在后面的文章中着重介绍。
比如:

  • gitlab如何知道自己代码更新
  • jenkins如何知道gitlab代码更新了
  • enkins依靠什么插件进行拉取
  • jenkins依靠什么插件进行部署操作

部署和发布的区别:

部署: 把软件部署在远程的服务器上,但是用户还不能访问
发布: 用户已经可以访问

比如一个软件新增了一些功能,只有当用户看到了新功能的时候才交发布成功,单纯部署在服务器上叫部署。

总结

本文【DevOps】持续集成的流程及jenkins的介绍中我们主要探讨了持续集成的流程,也是代码或者软件发布的流程, 这整个的流程中,我们会用到jenkins和gitlab,所以下一次,我们着重来讨论jenkins和gitlab的使用。

我是高胜寒,一个在教培行业不忘初心的人,欢迎点赞收藏,我们下篇文章见。

【DevOps】centos7 下的 gitlab托管服务器的介绍与安装

itlaoxin阅读(309)

文章目录

前言
gitlab的介绍
gitlab 和github的区别
gitlab的安装
1. 实验环境:
2. 安装和配置必要的依赖项
3. 添加yum源
4. 更新本地yum缓存,并安装
5. 启动服务并从网页端访问
6. 添加组,创建用户和项目
7. 创建组的步骤:
8. 创建项目
9. 创建用户
10. 将用户添加到组
10. 测试
总结

前言

【循序渐进学运维】DevOps工具篇 主要针对的是DevOps常用的工具,比如jenkins,gitlab, docker等工具的结合使用。

gitlab的介绍

gitlab是一个用于仓库管理系统的开源项目,使用git作为代码管理工具,并在此基础上搭建起来的web服务

gitlab 和github的区别

  • gitlab和github都是基于git开发的管理代码的软件
  • 官网:
    Github的官网: https://github.com/
    gitlab的官网: https://gitlab.com/users/sign_in

  • github 创建私人项目的时候收费,gitlab新建私人项目不收费

  • gitlab可以内网办公使用,部署在自己的服务器上,适合团队内部开发。 github需要使用公网,容易被恶意攻击者拦截。

gitlab的安装

1. 实验环境:
[root@zmedu-17 ~]# cat /etc/redhat-release 
CentOS Linux release 7.7.1908 (Core)
[root@zmedu-17 ~]# uname -r
3.10.0-1062.el7.x86_64
[root@zmedu-17 ~]# ifconfig |grep inet
        inet 192.168.1.17  netmask 255.255.255.0  broadcast 192.168.1.255
2. 安装和配置必要的依赖项
[root@zmedu-17 ~]# yum install -y curl policycoreutils-python openssh-server 

启动服务

[root@zmedu-17 ~]# systemctl enable sshd
[root@zmedu-17 ~]# systemctl status sshd
## 一般默认已经安装好并已经启动,要不然你怎么连接过去

设置防火墙

[root@zmedu-17 ~]# firewall-cmd --permanent --add-service=http
success
[root@zmedu-17 ~]# firewall-cmd --permanent --add-service=https
success
[root@zmedu-17 ~]# systemctl reload firewalld
[root@zmedu-17 ~]# 

配置电子邮件,也可以使用外部的SMTP服务器,支持邮件发送
在这里插入图片描述
安装成功:
在这里插入图片描述

3. 添加yum源

官网提供的yum源

curl -s https://packages.gitlab.com/install/repositories/gitlab/gitlab-ce/script.rpm.sh | sudo bash
4. 更新本地yum缓存,并安装
[root@zmedu-17 ~]# yum makecache

[root@zmedu-17 ~]# yum install gitlab-ce

如果你的网速特别慢的话,可以会下载失败:

在这里插入图片描述
安装成功会有提示:
在这里插入图片描述

5. 启动服务并从网页端访问

修改默认访问端口为82

在这里插入图片描述
在这里插入图片描述
重新加载配置并启动:
[root@ecs-c13b ~]# gitlab-ctl reconfigure ## 重新加载配置

[root@ecs-c13b ~]# gitlab-ctl start
[root@ecs-c13b ~]# 

在这里插入图片描述

网页端访问:

在这里插入图片描述
登陆
在这里插入图片描述

6. 添加组,创建用户和项目

创建组: 一个组里面可以有多个项目分支,可以将开发人员添加到组里面进行设置全向,不同的组就是不同的开发项目或者服务模块。

在不同的组里面添加不同的开发人员或者说用户,就可以实现对开发设置权限的管理。

7. 创建组的步骤:

选择 create a group
在这里插入图片描述
创建组的名字
在这里插入图片描述

组创建完成: 在这里插入图片描述

8. 创建项目

在这里插入图片描述

项目的名字叫zmedu_web
在这里插入图片描述
点击project后可以看到创建的项目

在这里插入图片描述

回到我们的组的位置,会看到项目已经在我们的组下面了:
在这里插入图片描述

9. 创建用户

在这里插入图片描述
在这里插入图片描述

选择new user
在这里插入图片描述

创建用户:
在这里插入图片描述
在这里插入图片描述

设置密码
在这里插入图片描述
在这里插入图片描述

10. 将用户添加到组

回到组的目录下,选择members
在这里插入图片描述

选择要添加的用户:
在这里插入图片描述

选择 a role permission

这里一共有五种角色:
- guest: 可以创建issue, 发表评论,不能读写版本库
- reporter: 可以克隆代码不能提交,QA,PM可以赋予这个权限
- Developer 可以克隆代码,开发,提交,push, 普通开发可以授予这个权限
- maintainer: 可以创建项目,添加tag,保护分支,添加项目成员,编辑项目,核心开发可以赋予这个权限。
- owner: (最高权限)可以设置项目访问权限,删除项目,迁移项目,管理组成员,开发组组长可以授予这个权限

给gaosh owner权限:
在这里插入图片描述

可以看到现在已经有了两个owner权限的用户
在这里插入图片描述

10. 测试

我们现在退出当前用户,登陆gaosh用户进行测试
在这里插入图片描述
登陆gaosh测试

在这里插入图片描述

登陆后要求修改密码:
在这里插入图片描述

重新登陆

在这里插入图片描述

在这里插入图片描述

说明gaosh用户设置成功

总结

本文我们主要讨论了gitlab的介绍,搭建以及使用,后期 我们会结合Jenkins来一起使用。实现最终的CI/CD。

我是高胜寒,一个在教培行业不忘初心的人。欢迎点赞收藏,我们下篇文章再见。

【DevOps】持续集成环境-Jenkins安装图文版

itlaoxin阅读(205)

文章目录

前言
Jenkins的安装
1. 环境
2. 安装java
3. 下载Jenkins
4. 安装Jenkins
5. 访问测试
6. 安装插件
7. 创建管理员账号
8. 安装完成:
总结

前言

【循序渐进学运维】DevOps工具篇 主要针对的是DevOps常用的工具,比如jenkins,gitlab, docker等工具的结合使用。

Jenkins的安装

1. 环境

最低配置:
- 256M 内存,建议大于512M
- 10G 硬盘空间

需要安装一下软件:
- Java8
- docker

我使用的实验机器:

cpu:2c
硬盘: 20G
内存: 4G

2. 安装java

在这里插入图片描述
在这里插入图片描述

3. 下载Jenkins

下载网址:点击开始下载

下载好后:
在这里插入图片描述

4. 安装Jenkins

java -jar jenkins.war --httpPort=8080

gitlab和Jenkins尽量安装在不同服务器

5. 访问测试

浏览器输入ip:8080
在这里插入图片描述
需要查看管理员密码:
路径:网页上有提示:/root/.jenkins/secrets/initialAdminPassword

[root@ecs-c13b ~]# cat .jenkins/secrets/initialAdminPassword 
583802ee57b34025a5392933ba33fec0

输入密码并继续
在这里插入图片描述

6. 安装插件

Jenkins官方插件需要连接默认官网下载,速度非常慢,而且经常会失败,所以我们先跳过插件安装。 所以我们选择插件,然后选择无插件模式安装。
在这里插入图片描述
在这里插入图片描述

7. 创建管理员账号

在这里插入图片描述

这里是默认的: 在这里插入图片描述

8. 安装完成:

在这里插入图片描述

总结

本文我们主要讨论了Jenkins的安装,而且在安装的时候我们没有选择任何插件,下篇文章开始,我们将来讨论Jenkins的使用。

我是高胜寒,一个在教培行业不忘初心的人,欢迎点赞收藏,我们下篇文章再见!

【庖丁解牛】jenkins安装出现提示“Please wait while Jenkins is getting ready to work”

itlaoxin阅读(288)

文章目录

问题复现
问题分析
问题解决

问题复现

jenkins在安装执行java -jar jenkins.war --httpPort=8080后, 通过网页端进行访问安装:
输入:浏览器输入ip:8080
出现的报错及报错截图如下:

Please wait while Jenkins is getting ready to work (jenkins)
如果界面提示Jenkins正在启动,请稍后…或者提示
Please wait while Jenkins is getting ready to work…

在这里插入图片描述

问题分析

可能原因是: 因为屏蔽导致的访问官网太慢。我们只需要换一个源,不使用官网的源即可。

问题解决

找到jenkins工作目录,打开文件hudson.model.UpdateCenter.xml

[root@gaosh-64 ~]# find / -name *.UpdateCenter.xml
/root/.jenkins/hudson.model.UpdateCenter.xml

[root@gaosh-64 ~]# vim  .jenkins/hudson.model.UpdateCenter.xml 

把红框里的内容进行修改为https://mirrors.tuna.tsinghua.edu.cn/jenkins/updates/update-center.json
在这里插入图片描述
修改为
在这里插入图片描述
然后重启jenkins

重新进入:
在这里插入图片描述

【devops】持续集成环境-jenkins插件管理

itlaoxin阅读(171)

文章目录

前言
一. jenkins插件地址修改
web端后台修改
2. 在配置文件里修改:
3. 修改完后重启jenkins
二 . 安装插件举例
总结

前言

jenkins本身的功能并不多,很多的功能我们需要使用jenkins的插件来完成我们的工作。 比如从gitlab上拉取代码,使用maven构建项目等功能都需要依靠插件来完成,今天我们就来聊聊jenkins 的插件管理

一. jenkins插件地址修改

web端后台修改

我们在之前的文章中介绍过,安装jenkins的时候,有个插件安装过程我们直接跳过了,因为使用jenkins国外的官网进行插件安装,速度非常慢,所以我们需要在后台来修改插件地址,改为国内的地址。

具体路径: jenkins-Manage jenkins-Manage Plugins, 点击Avaliable

在这里插入图片描述
在这里插入图片描述

Available: 查找官网可用插件,它会自己加载

在这里插入图片描述

在Advanced里面修改update site 改为国内插件地址:https://mirrors.tuna.tsinghua.edu.cn/jenkins/updates/update-center.json

在这里插入图片描述

2. 在配置文件里修改:

具体内容见:https://blog.csdn.net/xinshuzhan/article/details/107452935

3. 修改完后重启jenkins

在这里插入图片描述

二 . 安装插件举例

装一个汉化插件:chinses

在上面第一步,jenkins下载地址修改完重启后,需要重新登陆,我这里使用的用户是gaosh ,密码 123456

搜索插件:
在这里插入图片描述
选中开始安装,下载完自动重启
在这里插入图片描述

安装中:
在这里插入图片描述

安装完后重启:

在这里插入图片描述
可以看到,已经汉化好了,
在这里插入图片描述

总结

本文主要讲解了插件的安装,本次安装的是汉化插件,后期我们用到的所有插件都需要手动安装。所以插件的使用一定要学会,当然插件有很多,官网介绍有1000多。
但并不是每一个都要会,我们在工作中用到的也不过30个左右。

【DevOps】Kubernetes相关概念入门

itlaoxin阅读(282)

文章目录

Kubernetes入门及实践
前言
1.1 Kebernets介绍
1.2 Kubernetes主要功能
1.3 设计架构及核心组件
1.3.1 Master 节点组件
1.3.2 Node 节点组件
1.3.3 分层架构
1.4 基本对象概念
总结

Kubernetes入门及实践

前言

本文节选自运维课程的教学课件,在教培行业,我们不忘初心,坚持分享,坚持以学员为本,坚持以就业为导向。敢于跟不良教学风气做斗争,为初学者和中高级运维学习者打造最具有实战性的课程。

1.1 Kebernets介绍

Kubernetes(k8s)是Google2014年开源的容器集群管理系统(谷歌内部:Borg),它主要用于容器容器化应用程序的部署、扩展和管理。

k8s提供了容器编排、资源调度、弹性伸缩、部署管理、服务发现等一系列功能。

k8s的目标是让部署容器化的应用简单并且高效,k8s提供了应用部署、规划、更新、维护的一种机制!

官网地址:https://kubernetes.io/

1.2 Kubernetes主要功能

名词 解释
数据卷 Pod中容器之间共享数据,可以使用数据卷。
应用程序健康检查 容器内服务可能进程堵塞无法处理请求,可以设置监控检查策略保证应用健壮性。
复制应用程序实例 控制器维护着Pod副本数量,保证一个Pod或一组同类的Pod数量始终可用。
弹性伸缩 根据设定的指标(CPU利用率)自动缩放Pod副本数。
服务发现 使用环境变量或DNS服务插件保证容器中程序发现Pod入口访问地址。
负载均衡 一组Pod副本分配一个私有的集群IP地址,负载均衡转发请求到后端容器。在集群内部其他Pod可通过这个ClusterIP访问应用。
滚动更新 更新服务不中断,一次更新一个Pod,而不是同时删除整个服务。
服务编排 通过文件描述部署服务,使得应用程序部署变得更高效。
资源监控 Node节点组件集成cAdvisor资源收集工具,可通过Heapster汇总整个集群节点资源数据,然后存储到InfluxDB时序数据库,再由Grafana展示。
提供认证和授权 支持角色访问控制(RBAC)认证授权等策略。

1.3 设计架构及核心组件

在这里插入图片描述

上图可以看到如下组件,使用特别的图标表示Service和Label:

EN CN
Pod 根容器(容器组)
Container/docker 容器
Label 标签
Replication Controller 复制控制器
Service 服务
Node 节点
Kubernetes Master Kubernetes主节点

1.3.1 Master 节点组件

master节点上主要运行四个组件:api-server、scheduler、controller-manager、etcd。

在这里插入图片描述

组件 作用
api-server 提供了资源操作的唯一入口,各组件协调者并提供认证、授权、访问控制、API注册和发现等机制;
scheduler 负责资源的调度,按照预定的调度策略将Pod调度到相应的机器上,Kubernetes目前提供了调度算法,但是同样也保了接口,用户可以根据自己的需求定义自己的调度算法。;
controller-manager 如果说APIServer做的是“前台”的工作的话,那controller manager就是负责“后台”的。每个资源一般都对一个控制器,而controller manager就是负责管理这些控制器的。比如我们通过APIServer创建一个pod,当这个pod创建成功后,APIServer的任务就算完成了。而后面保证Pod的状态始终和我们预期的一样的重任就由controller manager去保证了。
etcd etcd是一个高可用的键值存储系统,Kubernetes使用它来存储各个资源的状态,从而实现了Restful的API。

1.3.2 Node 节点组件

每个Node节点主要由三个模块组成:kubelet、kube-proxy、Container runtime。
在这里插入图片描述

组件 作用
Container runtime 负责镜像管理以及Pod和容器的真正运行(CRI);指的是容器运行环境,目前Kubernetes支持docker和rkt两种容器。
kube-proxy 负责为Service提供cluster内部的服务发现和负载均衡;该模块实现了Kubernetes中的服务发现和反向代理功能。反向代理方面:kube-proxy支持TCP和UDP连接转发,默认基于Round Robin算法将客户端流量转发到与service对应的一组后端pod。服务发现方面,kube-proxy使用etcd的watch机制,监控集群中service和endpoint对象数据的动态变化,并且维护一个service到endpoint的映射关系,从而保证了后端pod的IP变化不会对访问者造成影响。另外kube-proxy还支持session affinity。
kubelet 负责维护容器的生命周期,同时也负责Volume(CVI)和网络(CNI)的管理;是Master在每个Node节点上面的agent,是Node节点上面最重要的模块,它负责维护和管理该Node上面的所有容器但是如果容器不是通过Kubernetes创建的,它并不会管理。本质上,它负责使Pod得运行状态与期望的状态一致。

除了核心组件,还有一些推荐的Add-ons(插件):

  • kube-dns负责为整个集群提供DNS服务
  • Ingress Controller为服务提供外网入口
  • Heapster提供资源监控
  • Dashboard提供GUI
  • Federation提供跨可用区的集群
  • Fluentd-elasticsearch提供集群日志采集、存储与查询

master与node关系:

在这里插入图片描述

1.3.3 分层架构

Kubernetes设计理念和功能其实就是一个类似Linux的分层架构,如下图所示

在这里插入图片描述

  • 核心层:Kubernetes最核心的功能,对外提供API构建高层的应用,对内提供插件式应用执行环境
  • 应用层:部署(无状态应用、有状态应用、批处理任务、集群应用等)和路由(服务发现、DNS解析等)
  • 管理层:系统度量(如基础设施、容器和网络的度量),自动化(如自动扩展、动态Provision等)以及策略管理(RBAC、Quota、PSP、NetworkPolicy等)
  • 接口层:kubectl命令行工具、客户端SDK以及集群联邦
  • 生态系统:在接口层之上的庞大容器集群管理调度的生态系统,可以划分为两个范畴
    • Kubernetes外部:日志、监控、配置管理、CI、CD、Workflow、FaaS、OTS应用、ChatOps等
    • Kubernetes内部:CRI、CNI、CVI、镜像仓库、Cloud Provider、集群自身的配置和管理等

1.4 基本对象概念

基本对象:

名称 概念
Pod 容器组Pod是最小部署单元,一个Pod有一个或多个容器组成, Pod中容器共享存储和网络,在同一台Docker主机上运行。
Service Service一个应用服务抽象,定义了Pod逻辑集合和访问这个Pod集合的策略。
Service代理Pod集合对外表现是为一个访问入口,分配一个集群IP地址,来自这个IP的请求将负载均衡转发后端Pod中的容器。
Service通过Lable Selector选择一组Pod提供服务。
Volume 数据卷,共享Pod中容器使用的数据。分为临时卷、本地卷和网络卷,临时卷和本地卷位于Node本地,常用于数据缓存
Namespace 命名空间将对象逻辑上分配到不同Namespace,可以是不同的项目、用户等区分管理,并设定控制策略,从而实现多租户。命名空间也称为虚拟集群。同一类型资源对象的Name必须唯一,逻辑分组,默认名称空间是default
Lable 标签用于区分对象(比如Pod、 Service),是key/values数据;每个对象可以有多个标签,通过标签关联对象。标签可以在创建一个对象的时候直接给与,也可以在后期随时修改,每一个对象可以拥有多个标签,但是,key值必须是唯一的。

基于基本对象更高层次抽象:

名称 概念
ReplicaSet 下一代Replication Controller。确保任何给定时间指定的Pod副本数量,并提供声明式更新等功能。RC与RS唯一区别就是lable selector支持不同, RS支持新的基于集合的标签, RC仅支持基于等式的标签。
Deployment Deployment是一个更高层次的API对象,它管理ReplicaSets和Pod,并提供声明式更新等功能。官方建议使用Deployment管理ReplicaSets,而不是直接使用ReplicaSets,这就意味着可能永远不需要直接操作。
StatefulSet StatefulSet适合持久性的应用程序,有唯一的网络标识符(IP),持久存储,有序的部署、扩展、删除和滚动更新。
DaemonSet DaemonSet确保所有(或一些)节点运行同一个Pod。当节点加入Kubernetes集群中, Pod会被调度到该节点上运行,当节点从集群中。移除时, DaemonSet的Pod会被删除。删除DaemonSet会清理它所有创建的Pod。
Job 一次性任务,运行完成后Pod销毁,不再重新启动新容器。还可以任务定时运行。

总结

关于k8s的概念只介绍这些还远远不够,因为k8s是牵一发而动全身,容器技术涉及到操作系统,网络,存储,调度,分布式原理都方方面面的知识,不像你以前学习个软件那样,学完会用就完事,k8s技术需要你持续的精进和研究。