Rook vĂ”i mitte Rook — see on kĂŒsimus

Rook vĂ”i mitte Rook — see on kĂŒsimus

KĂ€esoleva kuu alguses, 3. mail, kuulutati vĂ€lja oluline versioon "andmete jaotustehnoloogiate haldamise sĂŒsteem Kuberneteses" — Rook 1.0.0. Üks aasta tagasi avaldasime me juba ĂŒlevaate Rookist. Sel ajal paluti meil rÀÀkida kogemustest selle kasutamisel praktikas — ja just selle tĂ€htsa verstpalu puhul oleme rÔÔmsad, et saame jagada omandatud muljeid. KokkuvĂ”ttes esindab Rook komplekti

operaatoreid Kuberneteses, mis vÔtavad tÀieliku kontrolli andmesalvestuslahenduste, nÀiteks Ceph, EdgeFS, Minio, Cassandra, CockroachDB, deploymente, haldamist ja automaatset taastamist. Praegu on kÔige arenenum (ja

ainus stabiilse ja faasi) lahendus : Rook 1.0.0 versiooniga seonduvatest olulisest muudatustest Cephiga seoses vĂ”ib mĂ€rkida Ceph Nautiluse toetuse ja NFS-i kasutamise vĂ”imaluse CephFS- vĂ”i RGW-konteinerites. Teiste hulgas on silma jÀÀb EdgeFS toe "kĂŒpsemine" beta tasemele. rook-ceph-operator.

MĂ€rkusNii et selles artiklis me:

vastame kĂŒsimusele, millised eelised me nĂ€eme Rooki kasutamisel Ceph kĂ€itamisel Kubernetes klastris;

  • jagame kogemusi ja muljeid Rooki kasutamisest tootmises;
  • rÀÀgime, miks me ĂŒtlevad Rookile "Jah!" ja millised on meie plaanid selle osas.
  • Alustame ĂŒldiste mĂ”istete ja teooriaga.

"Mul on eelis ĂŒhe Torniga!" (tundmatu maletaja)

Üks Rooki peamisi eeliseid on see, et andmesalvestuse haldamine toimub Kuberneteses toimivate mehhanismide kaudu. See tĂ€hendab, et ei ole enam vaja kĂ€ske Ceph’i seadmiseks paberilt konsooli kopeerida.

Rook vĂ”i mitte Rook — see on kĂŒsimus

— Tahad klastrisse CephFS paigaldada? Kirjutage lihtsalt YAML-fail!

— Mis? Tahad paigaldada ka objektide salvestamise sĂŒsteemi S3 API-ga? Kirjutage lihtsalt teine YAML-fail!
Rook on loodud vastavalt tĂŒĂŒpilise operaatori reeglitele. Koostöö toimub

CRD (Custom Resource Definitions) , milles kirjeldame vajalikud Ceph'i ĂŒksuste omadused,(kuna see on ainus stabiilne rakendus, siis artiklis kĂ€sitletakse eelkĂ”ige Ceph'i, kui ei öelda teisiti) . Vastavalt antud parameetritele viib operaator automaatselt lĂ€bi vajalikud seadistuskorraldused.Konkreetsemalt vaatame, kuidas luua Object Store'i, tĂ€psemalt —

CephObjectStoreUser 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 }}

Loetletud parameetrid on piisavalt standardsed ning ei vaja tÔenÀoliselt tÀiendavat kommentaari, kuid tasub pöörata erilist tÀhelepanu neile, mis on esitatud mallimuutujates.

Üldine tööskeem nĂ€eb ette, et YAML-faili kaudu „tellime“ ressursid, millega operaator tĂ€idab vajalikud kĂ€sud ning tagastab meile „mitte kĂ”ige tĂ”elisema“ salajase, millega saame edaspidi töötada. (vt allpool). Ja eespool kasutatud muutujatest koostatakse kĂ€sk ja saladuse nimi.

Milline kÀsk see on? Rook-operatori poolt objekti salvestuse kasutaja loomise kÀigus tÀidab pod'is jÀrgmise:

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

Selle kÀsu tÀitmise tulemusel saadakse JSON-struktuur:

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

VĂ”tmed — need on vajalikud tulevikus rakendustele, et pÀÀseda objekti salvestusele ligi S3 API kaudu. Rook-operator valib need ja salvestab oma namespace'is saladusena nimega rook-ceph-object-user-{{ $.Values.s3.crdName }}-{{ $.Values.s3.username }}.

Selle saladuse andmete kasutamiseks piisab nende lisamisest konteinerisse keskkonnamuutujatena. NÀiteks toon vÀlja malli Job'ile, mille kÀigus loome automaatselt bucket'e iga kasutaja keskkonna jaoks:

{{- 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 }}

KĂ”ik selle Job'i tegevused toimusid, jÀÀdes Kubernetesi piiridesse. YAML-failides kirjeldatud struktuurid on kogutud Git-repositoriumi ja neid on korduvalt uuesti kasutatud. NĂ€eme selles suurt eelist DevOps-inseneridele ja CI/CD protsessile ĂŒldiselt.

Rook ja Rados toovad rÔÔmu

Ceph + RBD kombinatsiooni kasutamine seab teatud piirangud mahtude mountimisele pod'idesse.

EelkÔige peab namespace'is olema saladus Ceph'i ligipÀÀsu jaoks, et stateful-rakendused saaksid funktsioneerida. On okei, kui sul on 2-3 keskkonda oma nimede ruumides: saad minna ja kopeerida saladuse kÀsitsi. Aga mis teha, kui iga arendaja funktsionaalsuse jaoks luuakse eraldi keskkond oma nime ruumis?

Me lahendasime selle probleemi shell-operator, mis kopeeris saladused automaatselt uutesse nime ruumidesse (nÀidis sellisest nahast on kirjeldatud selles artiklis).

#! /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

Kuid Rook'i kasutamisel ei eksisteeri seda probleemi. Mountimise protsess toimub selle enda draiverite abil Flexvolume vĂ”i on nĂŒĂŒd saadaval (alfa-versioonis) (praegu beetastaadiumis) ja seetĂ”ttu ei vaja saladusi.

Rook lahendab automaatselt paljusid probleeme, mis kutsub meid seda kasutada uutes projektides.

Rook'i rĂŒnnak

LĂ”petame praktilise osa Rook'i ja Ceph'i juurutamisega, et saaksime oma katseid lĂ€bi viia. Selle mĂŒĂŒri vallutamine on lihtsam, kui arendajad on ette valmistanud Helm-paketi. Laadime selle alla:

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

Failis rook-ceph/values.yaml vÔib leida palju erinevaid sÀtteid. KÔige olulisem on vÀlja tuua tolerations agentide ja otsimise jaoks. Kuidas saame kasutada taintide/toleratsioonide mehhanismi, oleme pÔhjalikult arutanud selles artiklis.

LĂŒhidalt, me ei soovi, et kliendi rakenduse pod'id asuksid samadel sĂ”lmedel, kus asuvad andmete salvestamise kettad. PĂ”hjus on lihtne: nii ei mĂ”juta Rook'i agentide töö ise rakendust.

Nii et avame faili rook-ceph/values.yaml oma lemmikredaktoriga ja lisame lÔppu jÀrgmise ploki:

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

Iga andmete salvestamiseks reserveeritud sÔlme jaoks lisame vastava tainti:

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

PÀrast seda installime Helm-chart'i kÀsuga:

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

NĂŒĂŒd on vaja luua klaster ja mÀÀrata asukoht 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"

Kontrollime Cephi olekut — ootame, et nĂ€eme 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

Samuti kontrollime, et kliendi rakenduse pod'id ei satuks Ceph'e jaoks reserveeritud sÔlmedele:

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

Edasi on soovi korral vÔimalik seadistada tÀiendavaid komponente. Rohkem teavet nende kohta on esitatud dokumentatsioon. Halduseks soovitame tungivalt installida armatuurlaua ja tööriistakasti.

Rook'i-hĂŒbrid: kas Rook'ist jĂ€tkub?

Nagu nÀha, Rooki arendamine kÀib tÀie hooga. Kuid endiselt on probleeme, mis takistavad meil tÀielikult loobuda Cephi kÀsitsi seadistamisest:

  • Ükski Rooki draiver ei oska eksporteerida kinnitatud blokke kasutamise mÔÔdikut, mis vĂ”tab meilt jĂ€lgimise vĂ”imaluse.
  • Flexvolume ja CSI ei oska mahu suurust muuta (erinevalt RBD-st), seega jÀÀb Rook ilma kasulikust (mĂ”nikord isegi kriitiliselt vajalikust!) tööriistast.
  • Rook ei ole endiselt nii paindlik kui tavaline Ceph. Kui me tahame seadistada, et CephFS-i metaandmete bassein oleks SSD-l ja andmed HDD-l, tuleb eraldi seadmete rĂŒhmad CRUSH kaardis kĂ€sitsi mÀÀrata.
  • Kuigi rook-ceph-operator on stabiilseks tunnistatud, on hetkel teatud probleemid Cephi uuendamisel versioonilt 13 versioonile 14.

JĂ€reldused

„Praegu on Laevuke vĂ€lismaailmast kinni, kuid usume, et ĂŒhel pĂ€eval mĂ€ngib see mĂ€ngus otsustavat rolli!“ (tsitaat on koostatud spetsiaalselt selle artikli jaoks)

Rooki projekt on kahtlemata meie sĂŒdameid vĂ”itnud – usume, et [kĂ”igi oma plusside ja miinustega] vÀÀrib see kindlasti ka teie tĂ€helepanu.

Meie edasised plaanid koostavad rook-ceph mooduliks, addon-operator, mis muudab selle kasutamise meie paljudes Kubernetes-klastrites veelgi lihtsamaks ja mugavamaks.

P.S.

Lugege ka meie blogist:

Allikas: habr.com

Osta usaldusvÀÀrne hostimine veebilehtede jaoks DDoS-i kaitsega, VPS VDS serverid đŸ”„ Osta usaldusvÀÀrne hostimine veebilehtede jaoks DDoS-i kaitsega, VPS VDS serverid | ProHoster