K8S Do-It-Yous Series - 2.5 - Сохранение и графана

Kubernetes

предисловие

В предыдущем эксперименте мы развернули mysql и wordpress с помощью Deployment+PV/PVC и предоставили доступ к службе через службу типа NodePort, чтобы к ней можно было получить доступ за пределами кластера, но когда число реплик больше 1, несколько POD, сгенерированных развертыванием являются общими A PV, поэтому могут быть проблемы в производительности и бизнесе.В этом случае мы должны рассмотреть StatefulSet.На официальном сайте StatefulSet использует в качестве примера master-slave Mysql, но автор считает, что master-slave Сам Mysql такой же, как и Mysql.Знания связаны, и примеры больше склонны к практике stateful службы структуры топологии, поэтому следующие эксперименты основаны на популярной в настоящее время и относительно простой системе мониторинга Grafana+Prometheus для проведения эксперименты.

Сцены

Используйте StatefulSet для развертывания grafana, используйте PV и PVC для сохранения данных. Весь исходный код этого эксперимента хранится в:GitHub.com/live версия классная/нет…

руки вверх

Подготовить ПВХ и ПВХ

✗ 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 и ПВХ

Создайте Grafana с помощью StatefulSet и используйте 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.Из-за типа Local, используемого нашим PV, этот каталог не существует на worker02, поэтому он не может быть успешно создан. См. предыдущуюСерия K8S «Сделай сам» — 1.3 — Порча и сходствоДобавьте 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

Используйте службу для предоставления доступа к grafana, чтобы к ней можно было получить доступ за пределами кластера.

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

Если вы сомневаетесь, просмотрите этоСерия K8S "Сделай сам" - 2.4 - ОбслуживаниеТеперь наша графана доступна, как показано ниже: