前言
临时记录一下学习笔记
自定义清单
安装
整个项目都是使用 jsonnet 编写
安装jsonnet
1
2
3
4
https://github.com/google/go-jsonnet/releases/tag/v0.17.0
tar zxf go-jsonnet_0.17.0_Linux_x86_64.tar.gz -C local安装jb
1 | go get github.com/jsonnet-bundler/jsonnet-bundler/cmd/jb |
- 将json编译成yaml文件我们需要用
gojsontoyaml,这里安装一下
1 | go get github.com/brancz/gojsontoyaml |
- 将二进制包软链, 这一步看各位需求
1 | ln -s $(pwd)/go/bin/* /usr/local/bin/ |
- 初始化jb,如果写过node项目或者maven项目的都会知道,他们都有一个依赖描述的文件,而jb用的依赖描述文件叫jsonnetfile.json,这里init就会创建这个文件。
1 | jb init |
- 安装项目, 版本请看官方支持文档
截止到本文编写, 已经发布到 release-0.7 版本, 并且在最新版本, kube-promtheus 项目结构发生了一次重构. 使用方法已经跟本文稍微有所区别.但是总体一样
本次我们选择:release-0.6 版本 支持的kubernetes版本为 1.17 1.18
1 | jb install github.com/prometheus-operator/kube-prometheus/jsonnet/kube-prometheus-0.6 |
构建脚本
目录结构
1
jsonnetfile.json jsonnetfile.lock.json vendor
其中
vendor目录为项目目录, 而且是库文件
简单了解过jsonnet以后, 我们可以知道. vendor 整个项目就是一个大的json对象, 我们可以通过 import 的方式导入, 来合并, 或者组合对象
- 官方示例
1 | // 这里定义了全局变量,并且import将库文件导入 |
- 构建脚本
1 |
|
- 构建
1
./build.sh example.jsonnet
自定义配置
- 镜像修改
1
quay.mirrors.ustc.edu.cn
kube-state-metrics
介绍
kube-state-metrics 是一个集群级别的组件,它负责从 kubelet 等服务中抓取集群中的监控指标, 并且存储到内存中.
保护并且访问指标
默认情况下, 是无法直接访问到kube-state-metrics 所收集到的指标.
首先我们看一下在 kube-prometheus 下的配置
1 | - args: |
我们发现, 默认绑定的地址是127.0.0.1,所以我们无法直接访问. 并且, 在Pod,还有一个组件负责保护kube-state-metrics的指标不轻易对外
1 | - args: |
kube-rbac-proxy 通过rbac负责去验证 访问者是否有访问权限.
那么我们如何去定义权限呢?让我们看一下 promtheus的 rbac配置
prometheus-clusterRole.yaml1
2
3
4
5
6
7
8
9
10
11
12
13
14
15apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
name: prometheus-k8s
rules:
- apiGroups:
- ""
resources:
- nodes/metrics
verbs:
- get
- nonResourceURLs:
- /metrics
verbs:
- getprometheus-clusterRoleBinding.yaml1
2
3
4
5
6
7
8
9
10
11
12apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
name: prometheus-k8s
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: ClusterRole
name: prometheus-k8s
subjects:
- kind: ServiceAccount
name: prometheus-k8s
namespace: monitoring
RBAC分为两种需要认证的资源类型, 一种是resources 另一种是 non-resources 通俗点来讲, resources 是集群中的资源, 比如pod,node,等等, 我们可以通过认证以后,可以对资源进行create,list,delete 操作的. 另一个non-resources,只是来验证非资源端点, 及URL地址
- 我们绑定了非资源地址
/metrics, 当我们携带serviceaccount Token时,就能去访问我们的指标, 只需要在请求头中加入:Authorization:即可
1 | curl -v -s -k -H "Authorization: Bearer `cat /var/run/secrets/kubernetes.io/serviceaccount/token`" https://kube-rbac-proxy.default.svc:8443/metrics |
当我们请求的时候, kube-rbac-proxy 会尝试review这个账号是否有对应的权限,如果有则返回资源,如果没有则返回HTTP/1.1 401 Unauthorized
- 那携带Token请求的操作是怎么在Promtheus中实现的呢?
kube-state-metrics-serviceMonitor.yaml1
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
30
31apiVersion: monitoring.coreos.com/v1
kind: ServiceMonitor
metadata:
labels:
app.kubernetes.io/name: kube-state-metrics
app.kubernetes.io/version: 1.9.5
name: kube-state-metrics
namespace: monitoring
spec:
endpoints:
- bearerTokenFile: /var/run/secrets/kubernetes.io/serviceaccount/token
honorLabels: true
interval: 30s
port: https-main
relabelings:
- action: labeldrop
regex: (pod|service|endpoint|namespace)
scheme: https
scrapeTimeout: 30s
tlsConfig:
insecureSkipVerify: true
- bearerTokenFile: /var/run/secrets/kubernetes.io/serviceaccount/token
interval: 30s
port: https-self
scheme: https
tlsConfig:
insecureSkipVerify: true
jobLabel: app.kubernetes.io/name
selector:
matchLabels:
app.kubernetes.io/name: kube-state-metrics
在serviceMonitor中,我们指定了prometheus的配置bearerTokenFile 并且在deployment的时候挂载了相应的serviceaccount