dockerfile指令

1.FROM

1
2
#指定所创建镜像的基础镜像,如果本地不存在,则默认去镜像仓库下载指定镜像  
FROM <image>:<tag>

2.MAINTAINER

1
2
#指定维护者信息  
MAINTAINER [xxx@xxx.com](mailto:xxx@xxx.com)

3.RUN

1
2
3
4
#镜像制作过程中,在可写层执行指定命令  
RUN <command>
#默认在 shell 终端中运行命令,即 /bin/sh -c;
#RUN ["executable","param1","param2"] 会被解析成Json数组,因此必须要用"",可指定使用其他终端类型,如 RUN ["/bin/bash","-c","echo helloworld"]

4.CMD

1
2
3
4
5
6
7
#指定启动容器时默认执行的命令,一般用于执行服务启动脚本。每个 Dockerfile 只能有一条 CMD 指令,如果指定了多条,只有最后一条会生效,并且 docker run 接的命令会覆盖掉 CMD 指令的内容。支持三种格式:  
CMD ["executable","param1","param2"]
#使用 exec 执行
CMD command param1 param2
#在 /bin/sh 中执行,提供给需要交互的应用
CMD ["param1","param2"]
#提供给 ENTRYPOINT 的默认参数

docker常用容器管理命令

1.创建容器

1
2
3
4
5
6
7
docker create [OPTIONS] CONTAINER_NAME[:TAG]

options:

-t #将容器的标准输出绑定到一个伪终端

-i #交互

2.启动容器

1
docker start CONTAINER_ID

3.运行容器(相当于docker create + docker start)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
docker run [OPTIONS] NAME[:TAG]

options:

-d #在后台运行容器

-t #将容器的标准输出绑定到一个伪终端

-i #交互

-c,--cpu-shares [=0] #调整容器使用 CPU 的权重

-m,--memory [=MEMORY] #调整容器使用 Memory 的大小

#执行 docker run,Docker 服务端在后台运行的操作如下:

#1.检查本地是否存在指定的镜像,不存在就从公有仓库下载;

#2.利用镜像创建并启动一个容器;

#3.分配一个文件系统,并在只读的镜像层外面挂在一层可读层;

#4.从宿主主机配置的网桥接口中桥接一个虚拟接口到容器中;

#5.从地址池配置一个IP地址给容器;

#6.执行用户指定的应用程序;

#7.执行完毕后容器被终止。

ELK集群部署

1.基础环境说明

1.1 数据流向图

ELK数据流向图

1.1、数据采集层
这一层主要收集日志,也可以做一些简单的数据处理和过滤。通常有两种方式:

(1)日志采集客户端监,比如filebeat、logstash、Flume、Logagent、rsyslog、fluentd等
(2)直接从程序中将日志写入消息队列或es集群

1.2、消息队列
由于数据处理层中的logstash不能持久化存储数据,为防止异常时日志无法储存到es集群中,通常会加一层消息队列作为缓存和持久化存储数据,一般选择kafka或redis。

1.3、数据处理
日志写入es集群前,通常需要做一些数据处理,比如清理一些无效日志、对一些日志做格式化处理、根据不同的类型写入不同的索引等,由于这块可能比较消耗时间和性能,所以官方建议使用比较轻量级的filebeat来收集日志,将日志处理的操作放在服务端做。虽然logstash的功能十分强大,但是其缺点也一直然人诟病,就是在解析时对日志的消费速率会有很大影响。新版的es中针对这点也做了相应的策略,推出的ignest node可以用来处理数据。

1.4、数据存储
Es集群分布式存储数据,采用lucene作为其底层检索引擎,在上层提供了丰富的查询的api,方便快速查询想要的数据

1.5、数据展示
可以通过简单的配置kibana或grafana,就能图形化展示出es中存储的信息。也可以通过api的调用自己实现图形化的展示。

prometheus监控k8s集群

1.整体概述

本文主要讲述如何使用prometheus,结合kube-state-metrics,cAdvisor,Grafana对k8s集群进行监控和报警,和监控大盘的整体展示。

2.环境描述

  • Kubernetes:v1.12.5
  • Prometheus:v2.3.1
  • kube-state-metrics:v1.3.1(收集k8s集群内资源对象数据)
  • cAdvisor(已经在k8s内部集成,不需要重新安装,收集资源使用情况)
  • Grafana:v5.3.4

3.监控组件部署

3.1 kube-state-metrics部署

kube-state-metrics安装有以下配置文件,可以把kube-state-metrics-deployment.yaml里面的镜像路径改成内网的镜像路径。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#把配置文件都放在kube-state-metrics,执行这个命令即可部署
kubectl -f kube-state-metrics/
#kube-state-metrics目录里面的配置信息
kube-state-metrics
├── kube-state-metrics-cluster-role-binding.yaml
├── kube-state-metrics-cluster-role.yaml
├── kube-state-metrics-deployment.yaml
├── kube-state-metrics-role-binding.yaml
├── kube-state-metrics-role.yaml
├── kube-state-metrics-service-account.yaml
└── kube-state-metrics-service.yaml

#查看kube-state-metrics是否已经起来
kubectl get pod -n kube-system -o wide |grep "kube-state-metrics"
#如果启动部署成功,信息如下:
kube-state-metrics-7fd5dcc9b6-kpxmm 2/2 Running 4 526d 10.244.3.39 wx-2-centos53 <none>

k8s 1.13.4升级到1.14.6

1.镜像准备

镜像准备(注意,提前在所有节点都下载好镜像,不然coredns kube-proxy 这些pod会自动安装安装不上 )

master节点粘贴下面脚本,下载镜像:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#!/bin/bash
registry_host=reg.qingye.info
version=v1.14.6
pause_version=3.1
etcd_version=3.3.10
coredns_version=1.3.1
#镜像下载
docker pull $registry_host/library/kube-apiserver:$version
docker pull $registry_host/library/kube-controller-manager:$version
docker pull $registry_host/library/kube-scheduler:$version
docker pull $registry_host/library/kube-proxy:$version
docker pull $registry_host/library/pause:$pause_version
docker pull $registry_host/library/etcd:$etcd_version
docker pull $registry_host/library/coredns:$coredns_version
#镜像打tag
docker tag $registry_host/library/kube-apiserver:$version k8s.gcr.io/kube-apiserver:$version
docker tag $registry_host/library/kube-controller-manager:$version k8s.gcr.io/kube-controller-manager:$version
docker tag $registry_host/library/kube-scheduler:$version k8s.gcr.io/kube-scheduler:$version
docker tag $registry_host/library/kube-proxy:$version k8s.gcr.io/kube-proxy:$version
docker tag $registry_host/library/pause:$pause_version k8s.gcr.io/pause:$pause_version
docker tag $registry_host/library/etcd:$etcd_version k8s.gcr.io/etcd:$etcd_version
docker tag $registry_host/library/coredns:$coredns_version k8s.gcr.io/coredns:$coredns_version

node节点粘贴下面脚本,下载镜像:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#!/bin/bash
registry_host=reg.qingye.info
version=v1.14.6
pause_version=3.1
etcd_version=3.3.10
coredns_version=1.3.1
#镜像下载
docker pull $registry_host/library/kube-proxy:$version
docker pull $registry_host/library/pause:$pause_version
docker pull $registry_host/library/etcd:$etcd_version
docker pull $registry_host/library/coredns:$coredns_version
#镜像打tag
docker tag $registry_host/library/kube-proxy:$version k8s.gcr.io/kube-proxy:$version
docker tag $registry_host/library/pause:$pause_version k8s.gcr.io/pause:$pause_version
docker tag $registry_host/library/etcd:$etcd_version k8s.gcr.io/etcd:$etcd_version
docker tag $registry_host/library/coredns:$coredns_version k8s.gcr.io/coredns:$coredns_version

Prometheus专题[8.Prometheus之Alertmanager]

1.概述

Alertmanager与Prometheus是相互分离的两个组件。Prometheus服务器根据报警规则将警报发送给Alertmanager,然后Alertmanager将silencing、inhibition、aggregation等消息通过电子邮件、PaperDuty和HipChat发送通知。

在 Prometheus 中告警分为两部分:

  • Prometheus 服务根据所设置的告警规则将告警信息发送给 Alertmanager。

  • Alertmanager 对收到的告警信息进行处理,包括分组,抑制,静默策略路由告警通知。
    使用告警服务主要的步骤如下:

  • 安装配置 Alertmanager。

  • 通过设置 -alertmanager.url 让 Prometheus 服务与 Alertmanager 进行通信。

  • 在 Prometheus 服务中设置告警规则。

2.Grouping:分组

分组是指当出现问题时,Alertmanager会收到一个单一的通知,而当系统宕机时,很有可能成百上千的警报会同时生成,这种机制在较大的中断中特别有用。

例如,当数十或数百个服务的实例在运行,网络发生故障时,有可能服务实例的一半不可达数据库。在告警规则中配置为每一个服务实例都发送警报的话,那么结果是数百警报被发送至Alertmanager。

但是作为用户只想看到单一的报警页面,同时仍然能够清楚的看到哪些实例受到影响,因此,人们通过配置Alertmanager将警报分组打包,并发送一个相对看起来紧凑的通知。

分组警报、警报时间,以及接收警报的receiver是在配置文件中通过路由树配置的。

3.Inhibition:抑制

抑制是指当警报发出后,停止重复发送由此警报引发其他错误的警报的机制。

例如,当警报被触发,通知整个集群不可达,可以配置Alertmanager忽略由该警报触发而产生的所有其他警报,这可以防止通知数百或数千与此问题不相关的其他警报。

抑制机制可以通过Alertmanager的配置文件来配置。

Prometheus专题[7.Prometheus之Exporter]

1.前言

在 Prometheus 中负责数据汇报的程序统一叫做 Exporter, 而不同的 Exporter 负责不同的业务。 它们具有统一命名格式,即 xx_exporter, 例如负责主机信息收集的 node_exporter。

Exporter原理就是将收集的数据转化为文本格式,并对外暴露接口,提供 http 请求。

2.node_exporter

node_exporter 主要用于 *NIX 系统监控, 用 Golang 编写。

默认开启的功能:
node_exporter 默认开启的功能

默认关闭的功能:
node_exporter 默认关闭的功能

注意:我们可以使用 –collectors.enabled 运行参数指定 node_exporter 收集的功能模块, 如果不指定,将使用默认模块。

3.程序安装和启动

3.1 二进制安装

我们可以到下载页面 选择对应的二进制安装包,下面我将以 0.14.0 作为例子:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#使用 wget 下载 Node Exporter
cd /usr/local/src/
https://github.com/prometheus/node_exporter/releases/download/v0.14.0/node_exporter-0.14.0.linux-amd64.tar.gz

#使用 tar 解压缩 node_exporter-0.14.0.linux-amd64.tar.gz
cd /usr/local/src/
tar -xvzf ~/Download/node_exporter-0.14.0.linux-amd64.tar.gz
cd node_exporter-0.14.0.linux-amd64
#启动 Node Exporter
#我们可以使用 ./node_exporter -h 查看运行选项,./node_exporter 运行 Node Exporter, 如果看到类似输出,表示启动成功。
./node_exporter
INFO[0000] Starting node_exporter (version=0.14.0, branch=master, revision=840ba5dcc71a084a3bc63cb6063003c1f94435a6) source="node_exporter.go:140"
INFO[0000] Build context (go=go1.7.5, user=root@bb6d0678e7f3, date=20170321-12:13:32) source="node_exporter.go:141"
INFO[0000] No directory specified, see --collector.textfile.directory source="textfile.go:57"
INFO[0000] Enabled collectors: source="node_exporter.go:160"
.....
INFO[0000] Listening on :9100 source="node_exporter.go:186"

Prometheus专题[6.Prometheus配置文件了解]

1.前言

Prometheus 启动的时候,可以加载运行参数 -config.file 指定配置文件,默认为 prometheus.yml。

在配置文件中我们可以指定 global, alerting, rule_files, scrape_configs, remote_write, remote_read 等属性。

2.全局配置

global 属于全局的默认配置,它主要包含 4 个属性,

scrape_interval: 拉取 targets 的默认时间间隔。
scrape_timeout: 拉取一个 target 的超时时间。
evaluation_interval: 执行 rules 的时间间隔。
external_labels: 额外的属性,会添加到拉取的数据并存到数据库中。

3.告警配置

通常我们可以使用运行参数 -alertmanager.xxx 来配置 Alertmanager, 但是这样不够灵活,没有办法做到动态更新加载,以及动态定义告警属性。

所以 alerting 配置主要用来解决这个问题,它能够更好的管理 Alertmanager, 主要包含 2 个参数:

  • alert_relabel_configs: 动态修改 alert 属性的规则配置。
  • alertmanagers: 用于动态发现 Alertmanager 的配置。

4.规则配置

rule_files 主要用于配置 rules 文件,它支持多个文件以及文件目录。

配置文件结构大致为:

1
2
3
rule_files:
- "rules/node.rules"
- "rules2/*.rules"

Prometheus专题[5.PromQL 基本使用]

1.前言

PromQL (Prometheus Query Language) 是 Prometheus 自己开发的数据查询 DSL 语言,语言表现力非常丰富,内置函数很多,在日常数据可视化,rule 告警中都会使用到它。

我们可以在页面 http://localhost:9090/graph 中,输入下面的查询语句,查看结果,例如:

http_requests_total{code=”200”}

2.字符串和数字

1
2
3
4
5
6
7
8
字符串: 在查询语句中,字符串往往作为查询条件 labels 的值,和 Golang 字符串语法一致,可以使用 "", '', 或者 `` , 格式如:
"this is a string"
'these are unescaped: \n \\ \t'
`these are not unescaped: \n ' " \t`

正数,浮点数: 表达式中可以使用正数或浮点数,例如:
3
-2.4

3.查询结果类型

PromQL 查询结果主要有 3 种类型:

  • 瞬时数据 (Instant vector): 包含一组时序,每个时序只有一个点,例如:http_requests_total
  • 区间数据 (Range vector): 包含一组时序,每个时序有多个点,例如:http_requests_total[5m]
  • 纯量数据 (Scalar): 纯量只有一个数字,没有时序,例如:count(http_requests_total)

:D 一言句子获取中...