À Rook o micca à Rook - questa hè a quistione

À Rook o micca à Rook - questa hè a quistione

À l'iniziu di stu mese, u 3 di maghju, hè stata annunziata una liberazione maiò di un "sistema di gestione per u almacenamentu di dati distribuitu in Kubernetes" - Rook 1.0.0. Più di un annu fà avemu digià publicatu Panoramica generale di Rook. Allora ci hè statu dumandatu di parlà di a so sperienza aduprà in pratica - è avà, ghjustu à tempu per una tappa cusì significativa in a storia di u prugettu, simu felici di sparte e nostre impressioni accumulate.

In corta, Rook hè un set uperatori per Kubernetes, chì piglianu u cuntrollu tutale di l'implementazione, a gestione, a ricuperazione automatica di e soluzioni di almacenamiento di dati cum'è Ceph, EdgeFS, Minio, Cassandra, CockroachDB.

Attualmente i più sviluppati (è u solu в stabile stage) a suluzione hè rook-ceph-operatore.

Vita: Trà i cambiamenti significativi in ​​a versione Rook 1.0.0 in relazione à Ceph, pudemu nutà u supportu per Ceph Nautilus è a capacità di utilizà NFS per CephFS o RGW buckets. Ciò chì si distingue trà l'altri hè a maturazione di u supportu EdgeFS à u livellu beta.

Dunque, in questu articulu avemu:

  • Rispondemu à a quistione di quali vantaghji vedemu in l'usu di Rook per implementà Ceph in un cluster Kubernetes;
  • Avemu da sparte a nostra sperienza è impressioni di l'usu di Rook in a produzzione;
  • Dicemu perchè dicemu "Sì!" à Rook, è di i nostri piani per ellu.

Accuminciamu cù cuncetti generali è teoria.

"Aghju un vantaghju di una Rook!" (jocatore scunnisciutu)

À Rook o micca à Rook - questa hè a quistione

Unu di i vantaghji principali di Rook hè chì l'interazzione cù i magazzini di dati hè realizatu attraversu i meccanismi Kubernetes. Questu significa chì ùn avete più bisognu di copià i cumandamenti per cunfigurà Ceph da u fogliu in a cunsola.

- Vulete implementà CephFS in un cluster? Basta à scrive un schedariu YAML!
- Chì ? Vulete ancu implementà un magazinu d'ogetti cù l'API S3? Basta à scrive un secondu schedariu YAML!

Rook hè creatu secondu tutte e regule di un operatore tipicu. L'interazzione cun ellu si faci cù l'usu CRD (definizioni di risorse persunalizate), in quale avemu descrizzione di e caratteristiche di l'entità Ceph chì avemu bisognu (Siccomu questu hè l'unica implementazione stabile, per difettu questu articulu parlerà di Ceph, salvu s'ellu ùn hè esplicitamente dichjaratu altrimenti). Sicondu i paràmetri specificati, l'operatore eseguirà automaticamente i cumandamenti necessarii per a cunfigurazione.

Fighjemu i specifichi cù l'esempiu di creà un Object Store, o piuttostu - CephObjectStoreUser.

apiVersion: ceph.rook.io/v1
kind: CephObjectStore
metadata:
  name: {{ .Values.s3.crdName }}
  namespace: kube-rook
spec:
  metadataPool:
    failureDomain: host
    replicated:
      size: 3
  dataPool:
    failureDomain: host
    erasureCoded:
      dataChunks: 2
      codingChunks: 1
  gateway:
    type: s3
    sslCertificateRef:
    port: 80
    securePort:
    instances: 1
    allNodes: false
---
apiVersion: ceph.rook.io/v1
kind: CephObjectStoreUser
metadata:
  name: {{ .Values.s3.crdName }}
  namespace: kube-rook
spec:
  store: {{ .Values.s3.crdName }}
  displayName: {{ .Values.s3.username }}

I paràmetri indicati in u listinu sò abbastanza standard è pocu bisognu di cumenti, ma vale a pena prestu una attenzione particulari à quelli attribuiti à e variàbili di mudelli.

U schema generale di u travagliu vene à u fattu chì avemu "ordine" risorse attraversu un schedariu YAML, per quale l'operatore eseguisce i cumandamenti necessarii è ci rende un sicretu "micca vera" cù quale pudemu travaglià più. (vede sottu). E da e variàbili elencate sopra, u cumandamentu è u nome secretu seranu compilati.

Chì tippu di squadra hè questu? Quandu crea un utilizatore per u almacenamentu di l'ughjettu, l'operatore Rook in u pod farà u seguente:

radosgw-admin user create --uid="rook-user" --display-name="{{ .Values.s3.username }}"

U risultatu di eseguisce stu cumandamentu serà una struttura JSON:

{
    "user_id": "rook-user",
    "display_name": "{{ .Values.s3.username }}",
    "keys": [
        {
           "user": "rook-user",
           "access_key": "NRWGT19TWMYOB1YDBV1Y",
           "secret_key": "gr1VEGIV7rxcP3xvXDFCo4UDwwl2YoNrmtRlIAty"
        }
    ],
    ...
}

Keys - quali applicazioni future anu bisognu à accede à u almacenamentu di l'ughjettu via l'API S3. L'operatore Rook gentilmente li selezziunà è li mette in u so namespace in a forma di un sicretu cù u nome rook-ceph-object-user-{{ $.Values.s3.crdName }}-{{ $.Values.s3.username }}.

Per utilizà e dati da questu sicretu, aghjunghje solu à u cuntinuu cum'è variabili di l'ambiente. Per esempiu, daraghju un mudellu per Job, in quale creamu automaticamente buckets per ogni ambiente d'utilizatore:

{{- range $bucket := $.Values.s3.bucketNames }}
apiVersion: batch/v1
kind: Job
metadata:
  name: create-{{ $bucket }}-bucket-job
  annotations:
    "helm.sh/hook": post-install
    "helm.sh/hook-weight": "2"
spec:
  template:
    metadata:
      name: create-{{ $bucket }}-bucket-job
    spec:
      restartPolicy: Never
      initContainers:
      - name: waitdns
        image: alpine:3.6
        command: ["/bin/sh", "-c", "while ! getent ahostsv4 rook-ceph-rgw-{{ $.Values.s3.crdName }}; do sleep 1; done" ]
      - name: config
        image: rook/ceph:v1.0.0
        command: ["/bin/sh", "-c"]
        args: ["s3cmd --configure --access_key=$(ACCESS-KEY) --secret_key=$(SECRET-KEY) -s --no-ssl --dump-config | tee /config/.s3cfg"]
        volumeMounts:
        - name: config
          mountPath: /config
        env:
        - name: ACCESS-KEY
          valueFrom:
            secretKeyRef:
              name: rook-ceph-object-user-{{ $.Values.s3.crdName }}-{{ $.Values.s3.username }}
              key: AccessKey
        - name: SECRET-KEY
          valueFrom:
            secretKeyRef:
              name: rook-ceph-object-user-{{ $.Values.s3.crdName }}-{{ $.Values.s3.username }}
              key: SecretKey
      containers:
      - name: create-bucket
        image: rook/ceph:v1.0.0
        command: 
        - "s3cmd"
        - "mb"
        - "--host=rook-ceph-rgw-{{ $.Values.s3.crdName }}"
        - "--host-bucket= "
        - "s3://{{ $bucket }}"
        ports:
        - name: s3-no-sll
          containerPort: 80
        volumeMounts:
        - name: config
          mountPath: /root
      volumes:
      - name: config
        emptyDir: {}
---
{{- end }}

Tutte l'azzioni listate in questu Job sò state realizate in u quadru di Kubernetes. E strutture descritte in i schedari YAML sò almacenati in un repository Git è riutilizati parechje volte. Videmu questu cum'è un grande plus per l'ingegneri DevOps è u prucessu CI / CD in generale.

Felice cù Rook è Rados

Utilizà a combinazione Ceph + RBD impone certe restrizioni à i volumi di muntagna à pods.

In particulare, u spaziu di nomi deve cuntene un sicretu per accede à Ceph in modu chì l'applicazioni stateful funzionanu. Hè bè s'è vo avete 2-3 ambienti in i so namespaces: pudete andà è cupià u sicretu manualmente. Ma chì se per ogni funzione un ambiente separatu cù u so propiu namespace hè creatu per i sviluppatori?

Avemu risoltu stu prublema noi stessi usendu shell-operatore, chì hà copiatu automaticamente sicreti à novi spazii di nomi (un esempiu di un tali ganciu hè descrittu in stu articulu).

#! /bin/bash

if [[ $1 == “--config” ]]; then
   cat <<EOF
{"onKubernetesEvent":[
 {"name": "OnNewNamespace",
  "kind": "namespace",
  "event": ["add"]
  }
]}
EOF
else
    NAMESPACE=$(kubectl get namespace -o json | jq '.items | max_by( .metadata.creationTimestamp ) | .metadata.name')
    kubectl -n ${CEPH_SECRET_NAMESPACE} get secret ${CEPH_SECRET_NAME} -o json | jq ".metadata.namespace="${NAMESPACE}"" | kubectl apply -f -
fi

Tuttavia, quandu si usa Rook, stu prublema ùn esiste micca. U prucessu di muntatura si faci utilizendu i so propii drivers basatu nantu Flexvolume o CSI (ancora in fase beta) è per quessa ùn hà micca bisognu di secreti.

Rook risolve automaticamente parechji prublemi, chì ci incita à aduprà in novi prughjetti.

Assediu di Rook

Cumpitemu a parte pratica implementendu Rook è Ceph in modu chì pudemu fà i nostri esperimenti. Per fà più faciule per assaltà sta torre impregnable, i sviluppatori anu preparatu un pacchettu Helm. Scaricamu:

$ helm fetch rook-master/rook-ceph --untar --version 1.0.0

In u schedariu rook-ceph/values.yaml pudete truvà parechje paràmetri diffirenti. A più impurtante hè di specificà e tolerazioni per l'agenti è a ricerca. Avemu descrittu in dettagliu ciò chì u mecanismu di taints / tollerazioni pò esse usatu per stu articulu.

In corta, ùn vulemu chì i pods di l'applicazioni di u cliente si trovanu nantu à i stessi nodi cum'è i dischi di almacenamiento di dati. U mutivu hè simplice: questu modu u travagliu di l'agenti Rook ùn affetterà micca l'applicazione stessa.

Allora, apre u schedariu rook-ceph/values.yaml cù u vostru editore preferitu è ​​aghjunghje u seguente bloccu à a fine:

discover:
  toleration: NoExecute
  tolerationKey: node-role/storage
agent:
  toleration: NoExecute
  tolerationKey: node-role/storage
  mountSecurityMode: Any

Per ogni node riservatu à u almacenamentu di dati, aghjunghje a taint currispundente:

$ kubectl taint node ${NODE_NAME} node-role/storage="":NoExecute

Allora installate u graficu Helm cù u cumandimu:

$ helm install --namespace ${ROOK_NAMESPACE} ./rook-ceph

Avà avete bisognu di creà un cluster è specificà u locu OSD:

apiVersion: ceph.rook.io/v1
kind: CephCluster
metadata:
  clusterName: "ceph"
  finalizers:
  - cephcluster.ceph.rook.io
  generation: 1
  name: rook-ceph
spec:
  cephVersion:
    image: ceph/ceph:v13
  dashboard:
    enabled: true
  dataDirHostPath: /var/lib/rook/osd
  mon:
    allowMultiplePerNode: false
    count: 3
  network:
    hostNetwork: true
  rbdMirroring:
    workers: 1
  placement:
    all:
      tolerations:
      - key: node-role/storage
        operator: Exists
  storage:
    useAllNodes: false
    useAllDevices: false
    config:
      osdsPerDevice: "1"
      storeType: filestore
    resources:
      limits:
        memory: "1024Mi"
      requests:
        memory: "1024Mi"
    nodes:
    - name: host-1
      directories:
      - path: "/mnt/osd"
    - name: host-2
      directories:
      - path: "/mnt/osd"
    - name: host-3
      directories:
      - path: "/mnt/osd"

Verificate u statutu di Ceph - aspettate di vede HEALTH_OK:

$ kubectl -n ${ROOK_NAMESPACE} exec $(kubectl -n ${ROOK_NAMESPACE} get pod -l app=rook-ceph-operator -o name -o jsonpath='{.items[0].metadata.name}') -- ceph -s

À u listessu tempu, verificate chì i pods cù l'applicazione cliente ùn finiscinu micca in i nodi riservati à Ceph:

$ kubectl -n ${APPLICATION_NAMESPACE} get pods -o custom-columns=NAME:.metadata.name,NODE:.spec.nodeName

Inoltre, cumpunenti supplementari ponu esse cunfigurati cum'è desiderate. Più dettagli nantu à elli sò indicati in ducumentazione. Per l'amministrazione, ricumandemu fermamente di installà u dashboard è u toolbox.

Rook and hooks: Rook hè abbastanza per tuttu?

Comu pudete vede, u sviluppu di Rook hè in piena. Ma ci sò sempre prublemi chì ùn ci permettenu micca di abbandunà completamente a cunfigurazione manuale di Ceph:

  • No Rook Driver ùn pò micca metrica d'esportazione nantu à l'usu di blocchi muntati, chì ci priva di surviglianza.
  • Flexvolume è CSI nun sacciu comu cambià a dimensione di volumi (in uppusizione à u stessu RBD), cusì Rook hè privatu di un strumentu utile (è qualchì volta criticamente necessariu!).
  • Rook ùn hè ancu flexible cum'è Ceph regular. Se vulemu cunfigurà a piscina per i metadati CephFS per esse almacenati in SSD, è i dati stessi per esse guardati in HDD, avemu bisognu di registrà gruppi separati di dispusitivi in ​​carte CRUSH manualmente.
  • Malgradu u fattu chì rook-ceph-operator hè cunsideratu stabile, ci sò attualmente alcuni prublemi quandu aghjurnà Ceph da a versione 13 à 14.

scuperti

"In questu momentu, Rook hè chjusu da u mondu esternu da i peoni, ma credemu chì un ghjornu hà da ghjucà un rolu decisivu in u ghjocu!" (citazione inventata apposta per questu articulu)

U prughjettu Rook hà senza dubbitu guadagnatu i nostri cori - cridemu chì [cù tutti i so pro è i contra] meriteghja sicuramente a vostra attenzione.

I nostri piani futuri si riducenu à fà rook-ceph un modulu per addun-operatore, chì farà u so usu in i nostri numerosi clusters Kubernetes ancu più simplice è cunvene.

PS

Leghjite puru nant'à u nostru blog:

Source: www.habr.com

Add a comment