helm Prometheus-operator use host local persistent volume

2019-12-10

本博客所有文章采用的授权方式为 自由转载-非商用-非衍生-保持署名 ,转载请务必注明出处,谢谢。


背景

kubernets集群流行的监控平台是prometheus,为了更方便的部署,出现了Prometheus-Operator,随着helm的发展,helm在 ali的容器平台,使用也越来越多。

默认helm的配置中,prometheus的 TSDB数据库放在emptyDir中,这样pod 重启时,历史的监控数据就找不到了。因为lab中本来就已经有ceph集群,一开始打算通过kubernets的 StoarageClass来实现pv的自动创建,因为涉及到和ceph的storage network通信,所以放到后面再研究。

所以本次研究的重点是,通过在host节点挂载单独的磁盘做成pv,供Prometheus-Operator来使用。考虑到本地的pv只会挂载在特定的host上,所以 需要考虑到 node affinity

helm 是由CNCF孵化和管理的项目,用于需要在k8s上部署复杂应用进行定义,安装和更新。 helm以chart方式对应用软件进行描述,可以方便的创建,版本化,共享和发布复杂应用软件。相关术语chart: 一个helm包,包含了一个应用所需的工具和资源定义,可能还包括kubernets集群中的服务定义,类比apt中的deb,或者yum中的rpm文件release:k8s上运行的chart 实例。同一个集群上,一个chart可以安装多次,每次安装都会生成新的release,拥有独立的release名称repository: 存放和共享chart的仓库

helm由2部分组成,helmclient(拥有对repository,chart,release对象的管理能力); tillerServer(负责客户端指令和k8s集群之间的交互,根据chart定义生成和管理各种k8s的资源对象),helm3 已经没有 tiller server了

#helm安装Prometheus-Operator

helm是go开发的,可以直接在官网下载,解压出来就是binary可执行文件

需要提前安装好 helm,参考命令如下:


https://get.helm.sh/helm-v3.0.2-linux-amd64.tar.gz

helm 安装prometheus-operator

helm 安装可以通过源的方式在线安装,也可以通过 下载好chart包,通过本地安装。 也可以将 chart 包解压开,修改value.yml后再安装。

helm install prometheus-operator-release ./prometheus-operator

修改Prometheus-Operator的配置声明local-persistent-volume

默认的配置文件

values.yaml

    storage: {}
    # volumeClaimTemplate:
    #   spec:
    #     storageClassName: gluster
    #     accessModes: ["ReadWriteOnce"]
    #     resources:
    #       requests:
    #         storage: 50Gi
    #   selector: {}

可以看到storage默认的值是空的,所以默认存储用的是host的emptyDir

##修改后的文件

1605     ## Prometheus StorageSpec for persistent data
1606     ## ref: https://github.com/coreos/prometheus-operator/blob/master/Documentation/user-guides/storage.md
1607     ##
1608     storageSpec:
1609       volumeClaimTemplate:
1610         spec:
1611           storageClassName: local-storage
1612           accessModes: ["ReadWriteOnce"]
1613           resources:
1614             requests:
1615               storage: 200Gi
1616         selector: {}
1617 

可以看到这里我们申明了,一个 local-storage 类型的 storage class(本质上定义了一个pvc),所以下一步,我们需要进一步定义storage class。

这里补充下pvc,pv,storageclass之间的关系,学习自 极客时间 阿里 张磊的《深入剖析kubernets》:

而 StorageClass 对象的作用,其实就是创建 PV 的模板。具体地说,StorageClass 对象会定义如下两个部分内容:
第一,PV 的属性。比如,存储类型、Volume 的大小等等。
第二,创建这种 PV 需要用到的存储插件。比如,Ceph 等等。
有了这样两个信息之后,Kubernetes 就能够根据用户提交的 PVC,找到一个对应的 StorageClass 了。然后,Kubernetes 就会调用该 StorageClass 声明的存储插件,创建出需要的 PV。

定义上面 storage class

具体定义如下:

wsg@ubuntu16:~/kube_ymal/pv_pvc/local_pv$ cat local-storage-class.yaml 
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: local-storage
provisioner: kubernetes.io/no-provisioner
volumeBindingMode: WaitForFirstConsumer

需要注意 其中的 provisioner 值,

定义 对应pv

wsg@ubuntu16:~/kube_ymal/pv_pvc/local_pv$ cat local-pv.yaml 

apiVersion: v1
kind: PersistentVolume
metadata:
  name: local-pv
spec:
  capacity:
    storage: 200Gi
  volumeMode: Filesystem
  accessModes:
  - ReadWriteOnce
  persistentVolumeReclaimPolicy: Retain
  storageClassName: local-storage
  local:
    path: /mnt/disks/vol1
  nodeAffinity:
    required:
      nodeSelectorTerms:
      - matchExpressions:
        - key: kubernetes.io/hostname
          operator: In
          values:
          - ubuntu16-template

注意,该pv 有 host主机 ubuntu16-template才会存在,所以 pv的定义中 增加了 nodeAffinity,所以该pv 只会调度在 hostname 为 ubuntu16-template的host上。

为了保证 pod重启后,pv中的数据还在,需要 设置 persistentVolumeReclaimPolicy: Retain

accessModes设置为ReadWriteOnce,保证只有一个 pod有读写权限

该host上的磁盘已经挂载到 /mnt/disks/vol1

启用 StorageClass 和pv

kubectl apply -f local-storage-class.yaml 
kubectl apply -f local-pv.yaml

检查pvc的情况,可以看到pvc 已经处于bond状态,也就是找到了我们定义的pv,可以看到是通过 local-storage(STORAGECLASS)来找到的。

wsg@ubuntu16:~/kube_ymal/pv_pvc/local_pv$ kubectl get pvc
NAME                                                                                               STATUS    VOLUME     CAPACITY   ACCESS MODES   STORAGECLASS    AGE
data-wsg-logstash-0                                                                                Pending                                                        2d23h
prometheus-wsg-prometheus-operator-prometheus-db-prometheus-wsg-prometheus-operator-prometheus-0   Bound     local-pv   200Gi      RWO            local-storage   5d23h


进一步检查pv的状态,可以看到pv处于bond状态,并且可以看到 谁使用了 该pv

wsg@ubuntu16:~/kube_ymal/pv_pvc/local_pv$ kubectl get pv
NAME                    CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS     CLAIM                                                                                                      STORAGECLASS    REASON   AGE
local-pv                200Gi      RWO            Retain           Bound      default/prometheus-wsg-prometheus-operator-prometheus-db-prometheus-wsg-prometheus-operator-prometheus-0   local-storage            8d
wsg@ubuntu16:~/kube_ymal/pv_pvc/local_pv$ 

这样就完成了 将Prometheus使用本地存储实现监控数据的持久化。

文章评论

comments powered by Disqus


章节列表