Эксплуатация YDB в Kubernetes

Мониторинг

Для удобства YDB предоставляет стандартные механизмы сбора логов и метрик.

Логирование осуществляется в стандартные каналы stdout и stderr и может быть перенаправлено при помощи популярных решений. Мы рекомендуем использовать комбинацию из Fluentd и Elastic Stack.

Для сбора метрик ydb-controller предоставляет ресурсы типа ServiceMonitor, которые могут быть обработаны с помощью kube-prometheus-stack.

Описание ресурсов контроллера YDB

Ресурс Storage

apiVersion: ydb.tech/v1alpha1
kind: Storage
metadata:
  # имя будет необходимо указать при создании базы данных
  name: storage-sample
spec:
  # можно указать либо версию YDB, либо имя контейнера 
  # image:
  #   name: "cr.yandex/ydb/ydb:stable-21-4-14"
  version: 21.4.30
  # количество подов кластера
  nodes: 8

# https://kubernetes.io/docs/concepts/storage/persistent-volumes/#persistentvolumeclaims
# спецификация дисковых ресурсов для подов кластера
dataStore:
  volumeMode: Block
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 80Gi

# https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/
# Ограничение ресурсов подов кластера YDB
resources:
  limits:
    cpu: 2
    memory: 8Gi
  requests:
    cpu: 2
    memory: 8Gi
  
# https://kubernetes.io/docs/concepts/scheduling-eviction/assign-pod-node/#nodeselector
# selector того, на каких нодах кластера могут запускаться поды YDB
# nodeSelector:
#   network: fast

# https://kubernetes.io/docs/concepts/scheduling-eviction/taint-and-toleration/
# недостатки каких машин кластера могут быть проигнорированы при назначении подов YDB
# tolerations:
#   - key: "example-key"
#     operator: "Exists"
#     effect: "NoSchedule"

# https://kubernetes.io/docs/concepts/scheduling-eviction/assign-pod-node/#affinity-and-anti-affinity
# указание для планировщика распределять поды YDB по нодам равномерно
# affinity:
#   podAntiAffinity:
#      preferredDuringSchedulingIgnoredDuringExecution:
#      - weight: 100
#        podAffinityTerm:
#          labelSelector:
#            matchExpressions:
#            - key: app.kubernetes.io/instance
#              operator: In
#              values:
#              - ydb
#          topologyKey: kubernetes.io/hostname

Ресурс Database

apiVersion: ydb.tech/v1alpha1
kind: Database
metadata:
  # имя будет использовано при создании базы, => `/root/database-sample`
  name: database-sample
spec:
  # можно указать либо версию YDB, либо имя контейнера 
  # image:
  #   name: "cr.yandex/ydb/ydb:stable-21-4-14"
  version: 21.4.30
  # количество подов базы данных
  nodes: 6
  
  # указатель storage nodes кластера ydb, соответствует имени релиза Helm
  storageClusterRef:
    name: ydb
    namespace: default
    
  # https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/
  # Ограничение ресурсов динамического пода YDB
  resources:
    limits:
      cpu: 2
      memory: 8Gi
    requests:
      cpu: 2
      memory: 8Gi
    
  # https://kubernetes.io/docs/concepts/scheduling-eviction/assign-pod-node/#nodeselector
  # selector того, на каких нодах кластера могут запускаться поды YDB
  # nodeSelector:
  #   network: fast
  
  # https://kubernetes.io/docs/concepts/scheduling-eviction/taint-and-toleration/
  # недостатки каких машин кластера могут быть проигнорированы при назначении подов YDB
  # tolerations:
  #   - key: "example-key"
  #     operator: "Exists"
  #     effect: "NoSchedule"
  
  # https://kubernetes.io/docs/concepts/scheduling-eviction/assign-pod-node/#affinity-and-anti-affinity
  # указание для планировщика распределять поды YDB по нодам равномерно
  # affinity:
  #   podAntiAffinity:
  #      preferredDuringSchedulingIgnoredDuringExecution:
  #      - weight: 100
  #        podAffinityTerm:
  #          labelSelector:
  #            matchExpressions:
  #            - key: app.kubernetes.io/instance
  #              operator: In
  #              values:
  #              - ydb
  #          topologyKey: kubernetes.io/hostname

Выделение ресурсов

Каждый под YDB может быть ограничен в потреблении ресурсов. Если оставить значения ограничений пустыми, поду будет доступно все процессорное время и вся память ВМ, что может привести к нежелательным последствиям. Мы рекомендуем всегда явно указывать лимиты ресурсов.

Более детально ознакомиться с принципами распределения и ограничения ресурсов можно в документации Kubernetes.