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

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

前提

安装并会使用helm3

步骤

1.安装helm3    2.最简安装prometheus-operator3.使用ingress来暴露服务4.创建自定义chart文件① 设置自定义ns② 设置svc暴露方式为NodePort③ 自定义ingress④ 设置持久化存储⑤ 自定义镜像⑥ 修改默认grafana的用户密码⑦ 打包开始

1. 安装helm3

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

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

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

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

1.helm repo add stable https://charts.helm.sh/stable2.验证仓库,helm repo list[root@localhost]# helm repo listNAME                    URLstable                  https://charts.helm.sh/stable

最简安装prometheus-operator

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

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

[root@localhost]# helm search repo prometheus-operatorNAME                                        CHART VERSION    APP VERSION    DESCRIPTIONstable/prometheus-operator                  9.3.2            0.38.1         DEPRECATED Provides easy monitoring definitions...

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

[root@localhost]# helm install  --namespace  stable/prometheus-operatorWARNING: This chart is deprecatedmanifest_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-operatorLAST DEPLOYED: Fri Nov  6 13:50:46 2020NAMESPACE: meitu-monitoringSTATUS: deployedREVISION: 1NOTES:********************** 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下看到资源了

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

3.使用ingress来暴露服务

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

[root@localhost]# kubectl get svc -n monitoringNAME                                               TYPE        CLUSTER-IP     EXTERNAL-IP   PORT(S)                      AGEalertmanager-operated                          ClusterIP   None                   9093/TCP,9094/TCP,9094/UDP   56mprometheus-operator-alertmanager               ClusterIP    10.220.0.220           9093:31261/TCP               57mprometheus-operator-grafana                    ClusterIP    10.220.0.54            80:30830/TCP                 57mprometheus-operator-kube-state-metrics         ClusterIP   10.220.0.249           8080/TCP                     57mprometheus-operator-operator                   ClusterIP   10.220.0.178           8080/TCP,443/TCP             57mprometheus-operator-prometheus                 ClusterIP    10.220.0.55            9090:32218/TCP               57mprometheus-operator-prometheus-node-exporter   ClusterIP   10.220.0.253           9100/TCP                     57mprometheus-operated                            ClusterIP   None                   9090/TCP                     56m

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

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

[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证书)

[root@localhost]# cat ingress.yamlapiVersion: extensions/v1beta1kind: Ingressmetadata:  annotations:    nginx.ingress.kubernetes.io/enable-cors: "true"  name: prometheus-ingress  namespace: monitoringspec:  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一下,应用即可:

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

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

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

4. 创建自定义chart文件

首先我们下载chart文件

[root@localhost]# helm pull stable/prometheus-operator[root@localhost]# tar xzvf prometheus-operator-9.3.2.tgz[root@localhost]# cd prometheus-operator/

① 设置自定义ns

修改values.yaml中的namespaceOverride字段,设置为自己的ns

② 设置svc暴露方式为NodePort

1.修改alertmanager.service.type为NodePort2.修改prometheus.service.type为NodePort3.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了。

[root@localhost]# cat sc.yamlkind: StorageClassapiVersion: storage.k8s.io/v1metadata:  name: gke-standard-sc  namespace: monitoringprovisioner: kubernetes.io/gce-pdparameters:  type: pd-standardvolumeBindingMode: WaitForFirstConsumer # pvc创建后不会创建pv,只有pod正常后才会创建pv,也就是具体存储reclaimPolicy: Retain # 回收策略,pvc删除后,数据不会删除[root@localhost]# kubectl apply -f sc.yaml

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

grafana 调用mailx_grafana 调用mailx

[root@localhost]# vim values.yaml(注意是prometheus.prometheusSpec)storageSpec:      volumeClaimTemplate:        spec:          storageClassName: gke-standard-sc          accessModes: ["ReadWriteOnce"]          resources:            requests:              storage: 50Gi

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

grafana 调用mailx_grafana官方使用文档_02

【grafana持久化存储】

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

[root@localhost]# cat grafana-pvc.yamlapiVersion: v1kind: PersistentVolumeClaimmetadata:  name: gke-grafana-pvc  namespace: meitu-monitoringspec:  accessModes:    - ReadWriteOnce  resources:    requests:      storage: 10Gi  storageClassName: gke-standard-sc[root@localhost]# kubectl apply -f grafana-pvc.yaml

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

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节点是不允许登录的,所以你就在控制台看看就行)

grafana 调用mailx_自定义_03

⑤ 自定义镜像

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

⑥ 修改grafana默认用户密码

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

[root@localhost]# vim charts/grafana/values.yamladminUser: adminadminPassword: admin@2020

⑦ 打包

1. 修改Chart.yaml中的name字段,设置为自己的name2. helm package self-define-name --debug

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

References

[1] 文档: https://helm.sh/docs/intro/install/[2] 文档: https://cloud.tencent.com/developer/article/1708284[3] chartmuseum: https://blog.itmonkey.icu/2020/10/20/helm-repo-chartmuseum-deploy/