使用helm3在gke上安装prometheus-operator

简介

本文主要讲解如何使用helm3在gke上安装prometheus-operator,包含持久化存储的使用。

今天会先最简单安装一下prometheus-operator,然后再一步一步优化,最终我们使用自定义Chart文件保存为私有的安装包。

前提

  1. 安装并会使用helm3

步骤

  1. 安装helm3

  2. 最简安装prometheus-operator

  3. 使用ingress来暴露服务

  4. 创建自定义chart文件

    ① 设置自定义ns

    ② 设置svc暴露方式为NodePort

    ③ 自定义ingress

    ④ 设置持久化存储

    ⑤ 自定义镜像

    ⑥ 修改默认grafana的用户密码

    ⑦ 打包

开始

1. 安装helm3

非常简单,官方文档给出了几种安装方式,随便一个都行。文档

这里我采用最简单的二进制文件安装即可

1
2
3
4
1.到这里下载适合你系统的二进制文件包https://github.com/helm/helm/releases
2.tar -zxvf helm-v3.0.0-linux-amd64.tar.gz
3.mv linux-amd64/helm /usr/local/bin/helm
4.helm help 验证下是否安装成功

安装好之后,我们配置下helm的仓库,既然安装prometheus-operator,那么就先add一个他的仓库。

1
2
3
4
5
1.helm repo add stable https://charts.helm.sh/stable
2.验证仓库,helm repo list
[root@localhost]# helm repo list
NAME URL
stable https://charts.helm.sh/stable

最简安装prometheus-operator

如果你不知道prometheus-operator是什么,以及他包含了啥,请移步这里:文档

1.查找一下我们仓库中的prometheus-operator的包

1
2
3
[root@localhost]# helm search repo prometheus-operator
NAME CHART VERSION APP VERSION DESCRIPTION
stable/prometheus-operator 9.3.2 0.38.1 DEPRECATED Provides easy monitoring definitions...

2.直接安装,报错暂时忽略

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
[root@localhost]# helm install <release-name> --namespace <your-namespace> stable/prometheus-operator
WARNING: This chart is deprecated
manifest_sorter.go:192: info: skipping unknown hook: "crd-install"
manifest_sorter.go:192: info: skipping unknown hook: "crd-install"
manifest_sorter.go:192: info: skipping unknown hook: "crd-install"
manifest_sorter.go:192: info: skipping unknown hook: "crd-install"
manifest_sorter.go:192: info: skipping unknown hook: "crd-install"
manifest_sorter.go:192: info: skipping unknown hook: "crd-install"
NAME: eve-prometheus-operator
LAST DEPLOYED: Fri Nov 6 13:50:46 2020
NAMESPACE: meitu-monitoring
STATUS: deployed
REVISION: 1
NOTES:
*******************
*** DEPRECATED ****
*******************
* stable/prometheus-operator chart is deprecated.
* Further development has moved to https://github.com/prometheus-community/helm-charts
* The chart has been renamed kube-prometheus-stack to more clearly reflect
* that it installs the `kube-prometheus` project stack, within which Prometheus
* Operator is only one component.

The Prometheus Operator has been installed. Check its status by running:
kubectl --namespace meitu-monitoring get pods -l "release=eve-prometheus-operator"

Visit https://github.com/coreos/prometheus-operator for instructions on how

3.安装完成之后,你就可以在你的ns下看到资源了

1
2
3
4
5
6
7
8
9
[root@beautyplus-bigdata-gcp pre]# kubectl get pods -n monitoring
NAME READY STATUS RESTARTS AGE
alertmanager-prometheus-operator-alertmanager-0 2/2 Running 0 53m
prometheus-operator-grafana-b4494db55-f87mt 2/2 Running 0 53m
prometheus-operator-kube-state-metrics-5fd49d67d-xhpjs 1/1 Running 0 53m
prometheus-operator-operator-75d86956bb-4rg99 2/2 Running 0 53m
prometheus-operator-prometheus-node-exporter-hvccz 1/1 Running 0 53m
prometheus-operator-prometheus-node-exporter-l4kdx 1/1 Running 0 53m
prometheus-prometheus-operator-prometheus-0 3/3 Running 0 53m

3.使用ingress来暴露服务

注意:我们首先看下安装好之后的svc信息

1
2
3
4
5
6
7
8
9
10
[root@localhost]# kubectl get svc -n monitoring
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
alertmanager-operated ClusterIP None <none> 9093/TCP,9094/TCP,9094/UDP 56m
prometheus-operator-alertmanager ClusterIP 10.220.0.220 <none> 9093:31261/TCP 57m
prometheus-operator-grafana ClusterIP 10.220.0.54 <none> 80:30830/TCP 57m
prometheus-operator-kube-state-metrics ClusterIP 10.220.0.249 <none> 8080/TCP 57m
prometheus-operator-operator ClusterIP 10.220.0.178 <none> 8080/TCP,443/TCP 57m
prometheus-operator-prometheus ClusterIP 10.220.0.55 <none> 9090:32218/TCP 57m
prometheus-operator-prometheus-node-exporter ClusterIP 10.220.0.253 <none> 9100/TCP 57m
prometheus-operated ClusterIP None <none> 9090/TCP 56m

正常来讲都是ClusterIP的方式,如果我们没有公网代理等,请直接修改ClusterIP为NodePort方式。如果你有公网代理等,直接不用修改,创建ingress资源即可。

不过,gke特殊,如果你想暴露你的服务,必须要求你的svc是NodePort方式或者是LoadBalancer方式,所以在gke上使用ingress方式来暴露服务,那么必须要先修改svc为NodePort方式

1
2
3
[root@localhost]# kubectl edit svc prometheus-operator-alertmanager -n monitoring
[root@localhost]# kubectl edit svc prometheus-operator-grafana -n monitoring
[root@localhost]# kubectl edit svc prometheus-operator-prometheus -n monitoring

修改完上述内容,那么我们直接创建ingress资源:(注意需要提前创建下secret证书)

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
30
[root@localhost]# cat ingress.yaml
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
annotations:
nginx.ingress.kubernetes.io/enable-cors: "true"
name: prometheus-ingress
namespace: monitoring
spec:
rules:
- host: grafana.xx.com
http:
paths:
- backend:
serviceName: prometheus-operator-grafana
servicePort: 80
- host: prometheus.xx.com
http:
paths:
- backend:
serviceName: prometheus-operator-prometheus
servicePort: 9090
- host: alertmanager.xx.com
http:
paths:
- backend:
serviceName: prometheus-operator-alertmanager
servicePort: 9093
tls:
- secretName: x-xx-com-20201106

创建完直接apply一下,应用即可:

1
[root@localhost]# kubectl apply -f ingress.yaml

最后到gcp控制台观察下该ingress创建的状态,拿到公网ip,本地绑定host测试下就行。

注意:grafana默认的用户密码是admin/prom-operator

4. 创建自定义chart文件

首先我们下载chart文件

1
2
3
[root@localhost]# helm pull stable/prometheus-operator
[root@localhost]# tar xzvf prometheus-operator-9.3.2.tgz
[root@localhost]# cd prometheus-operator/
① 设置自定义ns
1
修改values.yaml中的namespaceOverride字段,设置为自己的ns
② 设置svc暴露方式为NodePort
1
2
3
4
5
6
7
1.修改alertmanager.service.type为NodePort
2.修改prometheus.service.type为NodePort
3.grafana比较特殊,需要在charts/grafana/values.yaml文件中的service下添加以下内容:
service:
type: NodePort
port: 3000
targetPort: 3000
③ 自定义ingress

这个不建议了,因为这样默认会创建出三个公网ip,比较麻烦,最好的方式是安装好之后,单独定义一个ingress资源,去代理这三个服务:alertmanager、grafana、prometheus。

具体方法看上面说的ingress服务暴露。(注意:你前面已经吧grafana的暴露方式修改成NodePort,并且把端口也改了,注意修改ingress文件)

④ 设置持久化存储(prometheus+grafana)

首先你需要了解pv,pvc,StorageClass三个概念,不然没法进行下去。

注意:其实正常来讲你不用手动创建一个sc的,因为而且在gke提供了一个默认的standard (default) ,而且在gke上,我们是直接创建pvc,不用创建pv的,因为gke的csi已经帮我们管理pv了,即云厂商的磁盘服务而已。

【prometheus持久化存储】

当我们使用helm来设置自定义存储的时候,我们只需要:

1.创建一个sc

2.并且修改values文件的配置,不用再创建pvc了。

1
2
3
4
5
6
7
8
9
10
11
12
[root@localhost]# cat sc.yaml
kind: StorageClass
apiVersion: storage.k8s.io/v1
metadata:
name: gke-standard-sc
namespace: monitoring
provisioner: kubernetes.io/gce-pd
parameters:
type: pd-standard
volumeBindingMode: WaitForFirstConsumer # pvc创建后不会创建pv,只有pod正常后才会创建pv,也就是具体存储
reclaimPolicy: Retain # 回收策略,pvc删除后,数据不会删除
[root@localhost]# kubectl apply -f sc.yaml

创建好sc就可以在gcp看到如下内容:
png1

1
2
3
4
5
6
7
8
9
[root@localhost]# vim values.yaml(注意是prometheus.prometheusSpec)
storageSpec:
volumeClaimTemplate:
spec:
storageClassName: gke-standard-sc
accessModes: ["ReadWriteOnce"]
resources:
requests:
storage: 50Gi

修改完上述内容,然后安装好prometheus后,就能看到新的pvc创建出来了。
png1

【grafana持久化存储】

首先也是要使用上面创建的sc,并自已创建pvc

1
2
3
4
5
6
7
8
9
10
11
12
13
14
[root@localhost]# cat grafana-pvc.yaml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: gke-grafana-pvc
namespace: meitu-monitoring
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 10Gi
storageClassName: gke-standard-sc
[root@localhost]# kubectl apply -f grafana-pvc.yaml

然后修改charts/grafana/values.yaml,使用上面的pvc

1
2
3
4
5
6
7
8
9
10
11
12
persistence:
type: pvc
enabled: true
storageClassName: gke-standard-sc
accessModes:
- ReadWriteOnce
size: 10Gi
# annotations: {}
finalizers:
- kubernetes.io/pvc-protection
# subPath: ""
existingClaim: gke-grafana-pvc

持久化存储搞定之后,我们可以看看我们的grafana和prometheus运行在哪台机器上,然后登录到机器,就可以看到这台机器挂载了你的存储磁盘。
(注意:gke的node节点是不允许登录的,所以你就在控制台看看就行)
png3

⑤ 自定义镜像

这里只需要注意,你的镜像如果是私有的,那么请设置全局的global.imagePullSecrets

⑥ 修改grafana默认用户密码

注意要注释掉默认values中的grafana.adminPassword配置

1
2
3
[root@localhost]# vim charts/grafana/values.yaml
adminUser: abc
adminPassword: def
⑦ 打包
1
2
1. 修改Chart.yaml中的name字段,设置为自己的name
2. helm package self-define-name --debug

我们的helm仓库一般使用chartmuseum,如果想看怎么安装或者推送私有镜像到chartmuseum,请看我之前的博客:chartmuseum