Rook eller inte Rook — det Ă€r frĂ„gan

Rook eller inte Rook — det Ă€r frĂ„gan

I början av den hĂ€r mĂ„naden, den 3 maj, tillkĂ€nnagavs en stor release av "hanteringssystemet för distribuerade datalagringslösningar i Kubernetes" — Rook 1.0.0. För mer Ă€n ett Ă„r sedan publicerade vi en översikt av Rook. DĂ„ bad vi om att fĂ„ dela med oss av erfarenheterna frĂ„n dess praktiska anvĂ€ndning — och nu, precis i tid för denna betydelsefulla milstolpe i projektets historia, Ă€r vi glada att dela med oss av vĂ„ra insikter. Kort sagt, Rook Ă€r en uppsĂ€ttning

operatörer för Kubernetes, som helt tar kontroll över distributionen, hanteringen och den automatiska ÄterstÀllningen av sÄdana datalagringslösningar som Ceph, EdgeFS, Minio, Cassandra, CockroachDB. För nÀrvarande Àr den mest avancerade (och

enda stabila pÄ lösningen rook-ceph-operator : bland de betydande förÀndringarna i Rook 1.0.0 relaterade till Ceph, kan man notera stödet för Ceph Nautilus och möjligheten att anvÀnda NFS för CephFS- eller RGW-behÄllare. Bland annat framhÀvs "mognaden" av stödet för EdgeFS till beta-nivÄ..

AnmÀrkningSÄ, i denna artikel kommer vi att:

svara pÄ frÄgan om vilka fördelar vi ser med att anvÀnda Rook för distribution av Ceph i ett Kubernetes-kluster;

  • dela med oss av erfarenheterna och intrycken av att anvĂ€nda Rook i produktion;
  • berĂ€tta varför vi sĂ€ger "Ja!" till Rook, och om vĂ„ra planer för det.
  • Vi börjar med allmĂ€nna koncept och teori.

"Jag har en fördel pÄ en Torn!" (okÀnd schackspelare)

En av de stora fördelarna med Rook Àr att interaktionen med datalagringslösningarna sker genom Kubernetes-mekanismer. Detta innebÀr att du inte lÀngre behöver kopiera kommandon frÄn pappret till konsolen för att konfigurera Ceph.

Rook eller inte Rook — det Ă€r frĂ„gan

— Vill du distribuera CephFS i klustret? Skriv bara en YAML-fil!

— Vad? Vill du Ă€ven distribuera en objektlagring med S3 API? Skriv bara en andra YAML-fil!
Rook Àr skapad enligt alla regler för en typisk operator. Interaktionen med den sker via

CRD (Custom Resource Definitions) , dĂ€r vi beskriver de egenskaper vi behöver för Ceph-entiteter(eftersom detta Ă€r den enda stabila implementeringen kommer artikeln automatiskt att handla om Ceph, om inget annat anges) . Enligt de angivna parametrarna kommer operatören automatiskt att utföra de kommandon som krĂ€vs för konfigurationen.LĂ„t oss konkreta det med ett exempel pĂ„ att skapa ett Object Store, mer specifikt —

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

De angivna parametrarna i listan Àr ganska standard och behöver knappast kommentarer, men sÀrskild uppmÀrksamhet bör riktas mot de som Àr markerade som mallvariabler.

Den övergripande arbetsmodellen Àr att vi via en YAML-fil "bestÀller" resurser, som operatören utför nödvÀndiga kommandon för och returnerar oss ett "inte helt riktigt" hemligt vÀrde som vi sedan kan arbeta med. (se nedan). FrÄn de variabler som ovan anges, kommer ett kommando och namnet pÄ hemligheten att skapas.

Vad Àr dÄ detta kommando? Vid skapandet av en anvÀndare för objektlagring kommer Rook-operatören att inuti podden utföra följande:

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

Resultatet av detta kommando kommer att vara en JSON-struktur:

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

Nycklar — det som framtida applikationer behöver för att fĂ„ Ă„tkomst till objektlagringen via S3 API. Rook-operatören vĂ€ljer vĂ€nligt dessa och lagrar dem i sitt namespace som en hemlighet med namnet rook-ceph-object-user-{{ $.Values.s3.crdName }}-{{ $.Values.s3.username }}.

För att anvÀnda uppgifterna frÄn denna hemlighet rÀcker det att lÀgga till dem i containern som miljövariabler. Som exempel ger jag en mall för en jobb dÀr vi automatiskt skapar bucketar för varje anvÀndarmiljö:

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

Alla ÄtgÀrder som anges i detta jobb har genomförts utan att gÄ utanför Kubernetes. Strukturerna som beskrivs i YAML-filerna har lagrats i ett Git-förrÄd och kan anvÀndas om och om igen. Detta Àr en stor fördel för DevOps-ingenjörer och CI/CD-processen som helhet.

Med Rook och Rados blir det enklare.

AnvÀndningen av kombinationen Ceph + RBD innebÀr vissa begrÀnsningar för att kunna montera volymer till poddar.

Specifikt mÄste det finnas en hemlighet i namnomrÄdet för att fÄ Ätkomst till Ceph, sÄ att stateful-applikationer kan fungera. Det Àr okej om du har 2-3 miljöer i dina namnomrÄden: du kan gÄ och kopiera hemligheten manuellt. Men vad gör man om för varje feature för utvecklarna skapas en egen miljö med sitt eget namnomrÄde?

Vi löste detta problem genom shell-operator, som automatiskt kopierade hemligheter till nya namnomrÄden (ett exempel pÄ en sÄdan hook beskrivs i denna artikel).

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

Men vid anvÀndning av Rook existerar inte detta problem lÀngre. Monteringsprocessen sker genom egna drivrutiner baserade pÄ Flexvolume eller CSI (fortfarande i betastadiet) och krÀver dÀrför inte nÄgra hemligheter.

Rook löser automatiskt mÄnga problem, vilket driver oss att anvÀnda det i nya projekt.

BelÀgringen av Rook

Vi avslutar den praktiska delen med att installera Rook och Ceph för att möjliggöra egna experiment. För att lÀttare kunna erövra detta oförÀnderliga torn har utvecklarna förberett ett Helm-paket. LÄt oss ladda ner det:

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

I filen rook-ceph/values.yaml man kan hitta mÄnga olika instÀllningar. Det viktigaste Àr att ange tolerations för agenter och sökning. Vi har tidigare gÄtt igenom hur mekanismen taints/tolerations fungerar i denna artikel.

Kort sagt, vi vill inte att pods med den klientapplikation som anvÀnds ska placeras pÄ de noder dÀr lagringsdiskarna finns. Anledningen Àr enkel: pÄ sÄ sÀtt pÄverkar Rook-agenterna inte sjÀlva applikationen.

SÄ, öppna filen rook-ceph/values.yaml i din favorittextredigerare och lÀgg till följande block i slutet:

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

Till varje nod som reserveras för datalagring lÀgger vi till motsvarande taint:

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

DĂ€refter installerar vi Helm-diagrammet med kommandot:

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

Nu behöver vi skapa en kluster och ange platsen för 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"

Kontrollera statusen för Ceph — vi förvĂ€ntar oss att se 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

DÀrefter kontrollerar vi att pods med klientapplikationen inte hamnar pÄ noder reserverade för Ceph:

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

Vidare kan man valfritt konfigurera ytterligare komponenter. Mer information om dem finns i dokumentationen. För administration rekommenderar vi starkt att installera dashboard och toolbox.

Rook-krokar: rÀcker Rook till för allt?

Som man kan se, Àr utvecklingen av Rook i full gÄng. Men det finns fortfarande problem som hindrar oss frÄn att helt överge manuell konfiguration av Ceph:

  • Ingen Rook-drivrutin kan ex exportera mĂ€tvĂ€rden för anvĂ€ndning av monterade block, vilket gör att vi saknar övervakning.
  • Flexvolume och CSI kan inte kan inte Ă€ndra storlek pĂ„ volymer (till skillnad frĂ„n samma RBD), vilket gör att Rook saknar ett anvĂ€ndbart (och ibland kritiskt nödvĂ€ndigt!) verktyg.
  • Rook Ă€r fortfarande inte lika flexibel som vanlig Ceph. Om vi vill konfigurera sĂ„ att poolen för CephFS metadata lagras pĂ„ SSD och sjĂ€lva datan pĂ„ HDD, mĂ„ste vi manuellt ange separata enhetsgrupper i CRUSH-kartor.
  • Trots att rook-ceph-operator anses stabil, finns det för nĂ€rvarande vissa problem vid uppgradering av Ceph frĂ„n version 13 till 14.

Slutsatser

«Just nu Àr Ladya stÀngd frÄn omvÀrlden av bönder, men vi tror att den en dag kommer att spela en avgörande roll i partiet!» (citatet Àr uppdiktat sÀrskilt för denna artikel)

Projektet Rook har utan tvekan vunnit vĂ„ra hjĂ€rtan — vi anser att [med alla sina fördelar och nackdelar] förtjĂ€nar det verkligen ocksĂ„ din uppmĂ€rksamhet.

VÄra framtida planer handlar om att göra rook-ceph till en modul för addon-operator, vilket gör att dess anvÀndning i vÄra mÄnga Kubernetes-kluster blir Ànnu enklare och bekvÀmare.

P.S.

LÀs Àven i vÄr blogg:

KĂ€lla: habr.com

Köp pĂ„litlig webbhotell med DDoS-skydd, VPS VDS-servrar đŸ”„ Köp pĂ„litlig webbhotell med DDoS-skydd, VPS VDS-servrar | ProHoster