K8S自己动手系列 - 2.5 - StatefulSet & Grafana

本文涉及的产品
云数据库 RDS MySQL Serverless,0.5-2RCU 50GB
可观测可视化 Grafana 版,10个用户账号 1个月
云数据库 RDS MySQL Serverless,价值2615元额度,1个月
简介: 前面的实验,我们通过Deployment+PV/PVC,部署了mysql,wordpress,并通过NodePort类型的Service对服务进行暴露,使集群外可以访问,但是当replicas大于1时,Deployment产生的多个POD是共享一个PV的,这样在性能及业务上都有可能是有问题的,这种情况我们就应该考虑StatefulSet,在官网上StatefulSet用了Mysql的主从作为例子,但是笔者认为Mysql主从本身与Mysql的知识有关,并且例子更偏向于实践拓扑结构的有状态服务,所以后面的实验,我基于目前比较流行,也比较简单的监控系统Grafana+Prometheus来进行实验。

前言

前面的实验,我们通过Deployment+PV/PVC,部署了mysql,wordpress,并通过NodePort类型的Service对服务进行暴露,使集群外可以访问,但是当replicas大于1时,Deployment产生的多个POD是共享一个PV的,这样在性能及业务上都有可能是有问题的,这种情况我们就应该考虑StatefulSet,在官网上StatefulSet用了Mysql的主从作为例子,但是笔者认为Mysql主从本身与Mysql的知识有关,并且例子更偏向于实践拓扑结构的有状态服务,所以后面的实验,我基于目前比较流行,也比较简单的监控系统Grafana+Prometheus来进行实验。

场景

使用StatefulSet部署grafana,使用PV & PVC持久化保存数据。
本文实验所有的源码保存在:
https://github.com/zrbcool/blog-public/tree/master/k8s-hands-on/lab08

动手

准备PV & PVC

 kubectl apply -f 01-1-grafana-pvc.yaml 
persistentvolumeclaim/grafana-pv-claim created
 mkdir -p /data/pv/grafana
 kubectl apply -f 01-2-grafana-pv.yaml 
persistentvolume/grafana-pv-volume created
 kubectl get pvc
NAME               STATUS   VOLUME              CAPACITY   ACCESS MODES   STORAGECLASS   AGE
grafana-pv-claim   Bound    grafana-pv-volume   2Gi        RWX                           24m

如果此处不明白或者有问题,请参考前面讲过的K8S自己动手系列 - 2.3 - PV & PVC

用StatefulSet创建Grafana,使用PVC作为持久化存储

 kubectl apply -f 01-3-grafana-statefulset.yaml 
statefulset.apps/monitor-grafana created
 kubectl get pods
NAME                READY   STATUS             RESTARTS   AGE
monitor-grafana-0   0/1     CrashLoopBackOff   3          2m2s
 kubectl logs monitor-grafana-0
GF_PATHS_DATA='/var/lib/grafana' is not writable.
You may have issues with file permissions, more information here: http://docs.grafana.org/installation/docker/#migration-from-a-previous-version-of-the-docker-container-to-5-1-or-later
mkdir: cannot create directory '/var/lib/grafana/plugins': Permission denied

启动失败了,提示也很清楚是权限问题,也给了解决方案

# 参考文章 http://docs.grafana.org/installation/docker/#migration-from-a-previous-version-of-the-docker-container-to-5-1-or-later
# 修改文件权限
 chown -R 472:472 /data/pv/grafana
# 增加POD配置(我们的01-3-grafana-statefulset.yaml已经加好了)
      securityContext:
        runAsGroup: 472
        runAsUser: 472
        fsGroup: 472

执行上述操作后仍然是不行,最后经过排查发现,POD被调度到worker02节点上了,因为我们的PV使用的Local类型,worker02上并没有这个目录,所以无法创建成功,参考前面的K8S自己动手系列 - 1.3 - Taint & Affinity增加nodeSelector指定节点调度

...
  template:
    metadata:
      labels:
        app: monitor
        type: grafana
    spec:
      nodeSelector:
        kubernetes.io/hostname: worker01 #这个请根据需要修改到你指定的节点上,或者你使用其他的持久化存储方式,则可能没有我这个问题,比如nfs

成功!

 kubectl get pods -o wide
NAME                READY   STATUS    RESTARTS   AGE     IP            NODE       NOMINATED NODE   READINESS GATES
monitor-grafana-0   1/1     Running   0          3m19s   10.244.0.93   worker01   <none>           <none>

最后生效的yaml文件如下:

apiVersion: apps/v1
kind: StatefulSet
metadata:
  labels:
    app: monitor
    type: grafana
  name: monitor-grafana
spec:
  replicas: 1 
  selector:
    matchLabels:
      app: monitor
      type: grafana
  serviceName: grafana
  template:
    metadata:
      labels:
        app: monitor
        type: grafana
    spec:
      nodeSelector:
        kubernetes.io/hostname: worker01 #保证调度到我们创建了本地目录的主机上
      containers:
      - name: grafana
        image: grafana/grafana:latest
        imagePullPolicy: IfNotPresent
        ports:
        - containerPort: 3000
          name: grafana
        volumeMounts:
        - name: grafana-pv-storage
          mountPath: /var/lib/grafana
      securityContext:
        runAsGroup: 472
        runAsUser: 472
        fsGroup: 472
      volumes:
      - name: grafana-pv-storage
        persistentVolumeClaim:
          claimName: grafana-pv-claim

使用Service暴露grafana,使可以在集群外访问

 kubectl apply -f 01-4-grafana-svc.yaml 
service/grafana-svc created

如果这块有疑问,可以回顾K8S自己动手系列 - 2.4 - Service
现在我们的grafana可以访问了,如图所示:

相关实践学习
容器服务Serverless版ACK Serverless 快速入门:在线魔方应用部署和监控
通过本实验,您将了解到容器服务Serverless版ACK Serverless 的基本产品能力,即可以实现快速部署一个在线魔方应用,并借助阿里云容器服务成熟的产品生态,实现在线应用的企业级监控,提升应用稳定性。
云原生实践公开课
课程大纲 开篇:如何学习并实践云原生技术 基础篇: 5 步上手 Kubernetes 进阶篇:生产环境下的 K8s 实践 相关的阿里云产品:容器服务&nbsp;ACK 容器服务&nbsp;Kubernetes&nbsp;版(简称&nbsp;ACK)提供高性能可伸缩的容器应用管理能力,支持企业级容器化应用的全生命周期管理。整合阿里云虚拟化、存储、网络和安全能力,打造云端最佳容器化应用运行环境。 了解产品详情:&nbsp;https://www.aliyun.com/product/kubernetes
目录
相关文章
|
7月前
|
存储 Kubernetes 网络协议
【K8S系列】深入解析StatefulSet(一)
【K8S系列】深入解析StatefulSet(一)
165 1
|
7月前
|
存储 应用服务中间件 nginx
kubernetes Statefulset控制器
kubernetes Statefulset控制器
|
7月前
|
存储 Kubernetes 负载均衡
【Kubernetes系统原理、核心资源、Pod原理与创建及生命周期管理、Job、Cronjob、Statefulset、Service负载均衡Ingress】
【Kubernetes系统原理、核心资源、Pod原理与创建及生命周期管理、Job、Cronjob、Statefulset、Service负载均衡Ingress】
357 2
|
5月前
|
存储 Kubernetes 网络协议
k8s学习-StatefulSet(模板、更新、扩缩容、删除等)
k8s学习-StatefulSet(模板、更新、扩缩容、删除等)
141 0
|
7月前
|
存储 Kubernetes 数据库
剖析 Kubernetes 控制器:Deployment、ReplicaSet 和 StatefulSet 的功能与应用场景
剖析 Kubernetes 控制器:Deployment、ReplicaSet 和 StatefulSet 的功能与应用场景
248 0
|
10月前
|
Kubernetes Go Docker
【k8s 系列】k8s 学习二十六-3,Statefulset 实战 1
上一部分与大家分享到 Statefulset 与 RplicaSet 的区别,以及 Statefulset 的特点,能做的一些事情及一些注意事项
|
5月前
|
Prometheus Kubernetes Cloud Native
k8s grafana 安装插件配置
k8s grafana 安装插件配置
135 1
|
5月前
|
Kubernetes NoSQL MongoDB
k8s教程(pod篇)-使用StatefulSet搭建MongoDB集群
k8s教程(pod篇)-使用StatefulSet搭建MongoDB集群
495 1
|
7月前
|
存储 Kubernetes 网络协议
【K8S系列】深入解析StatefulSet(二)
【K8S系列】深入解析StatefulSet(二)
31 0
|
7月前
|
Prometheus Kubernetes 监控
【 Kubernetes的Kiali、prometheus、grafana和ELK系统】
【 Kubernetes的Kiali、prometheus、grafana和ELK系统】
124 0