Pou Rook oswa pa Rook - sa se kesyon an

Pou Rook oswa pa Rook - sa se kesyon an

Nan kòmansman mwa sa a, 3 me, yo te anonse yon gwo lage yon "sistèm jesyon pou depo done distribiye nan Kubernetes" - Rook 1.0.0. Plis pase yon ane de sa nou deja pibliye BECA jeneral Rook. Lè sa a, yo te mande nou pale sou eksperyans li itilize nan pratik — e kounye a, jis nan tan pou yon etap enpòtan konsa nan istwa pwojè a, nou kontan pataje enpresyon akimile nou yo.

Nan ti bout tan, Rook se yon seri operatè yo pou Kubernetes, ki pran kontwòl konplè sou deplwaman, jesyon, rekiperasyon otomatik solisyon depo done tankou Ceph, EdgeFS, Minio, Cassandra, CockroachDB.

Nan moman sa a ki pi devlope (ak yon sèl la sèlman в ki estab etap) solisyon an se rook-ceph-operateur.

Note: Pami chanjman enpòtan yo nan lage Rook 1.0.0 ki gen rapò ak Ceph, nou ka sonje sipò pou Ceph Nautilus ak kapasite pou itilize NFS pou bokit CephFS oswa RGW. Ki sa ki vle di nan mitan lòt moun se spirasyon sipò EdgeFS nan nivo beta.

Se konsa, nan atik sa a nou:

  • Ann reponn kesyon an sou ki avantaj nou wè nan itilize Rook pou deplwaye Ceph nan yon gwoup Kubernetes;
  • Nou pral pataje eksperyans nou ak enpresyon nou lè nou sèvi ak Rook nan pwodiksyon;
  • Ann di w poukisa nou di Rook "Wi!", ak sou plan nou pou li.

Ann kòmanse ak konsèp jeneral ak teyori.

"Mwen gen yon avantaj sou yon sèl Rook!" (jwè echèk enkoni)

Pou Rook oswa pa Rook - sa se kesyon an

Youn nan avantaj prensipal yo nan Rook se ke entèraksyon ak magazen done te pote soti nan mekanis Kubernetes. Sa vle di ke ou pa bezwen kopye kòmandman yo konfigirasyon Ceph soti nan fèy la nan konsole a.

— Èske ou vle deplwaye CephFS nan yon gwoup? Jis ekri yon dosye YAML!
- Kisa? Ou vle tou deplwaye yon magazen objè ak S3 API? Jis ekri yon dezyèm dosye YAML!

Rook se kreye dapre tout règ yo nan yon operatè tipik. Entèaksyon avèk li fèt lè l sèvi avèk CRD (Definisyon Resous Customize), kote nou dekri karakteristik antite Ceph nou bezwen yo (Depi sa a se sèlman aplikasyon ki estab, pa default atik sa a pral pale sou Ceph, sof si klèman endike otreman). Dapre paramèt yo espesifye, operatè a pral otomatikman egzekite kòmandman ki nesesè pou konfigirasyon.

Ann gade spesifik yo lè l sèvi avèk egzanp pou kreye yon magazen objè, oswa pito - 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 }}

Paramèt ki endike nan lis la se byen estanda ak diman bezwen kòmantè, men li vo peye atansyon espesyal sou sa yo resevwa lajan nan varyab modèl.

Konplo travay jeneral la vini nan lefèt ke nou "kòmande" resous atravè yon dosye YAML, pou ki operatè a egzekite kòmandman ki nesesè yo epi li retounen nou yon sekrè "pa tèlman reyèl" ak ki nou ka travay plis. (gade anba a). Ak nan varyab ki nan lis pi wo a, yo pral konpile kòmandman an ak non sekrè.

Ki kalite ekip sa a? Lè w ap kreye yon itilizatè pou depo objè, operatè Rook andedan gous la ap fè bagay sa yo:

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

Rezilta egzekite lòd sa a pral yon estrikti JSON:

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

Keys - ki aplikasyon nan lavni ap bezwen jwenn aksè nan depo objè atravè API S3 la. Operatè Rook la byen chwazi yo epi mete yo nan espas non l 'nan fòm lan nan yon sekrè ak non an rook-ceph-object-user-{{ $.Values.s3.crdName }}-{{ $.Values.s3.username }}.

Pou itilize done ki soti nan sekrè sa a, jis ajoute li nan veso a kòm varyab anviwònman an. Kòm yon egzanp, mwen pral bay yon modèl pou Job, nan ki nou otomatikman kreye bokit pou chak anviwònman itilizatè:

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

Tout aksyon ki nan lis nan travay sa a te fèt nan kad Kubernetes. Estrikti ki dekri nan dosye YAML yo estoke nan yon depo Git epi yo itilize ankò anpil fwa. Nou wè sa kòm yon gwo avantaj pou enjenyè DevOps ak pwosesis CI/CD an jeneral.

Kè kontan ak Rook ak Rados

Sèvi ak konbinezon Ceph + RBD enpoze sèten restriksyon sou aliye volim nan gous.

An patikilye, espas non an dwe genyen yon sekrè pou jwenn aksè nan Ceph pou aplikasyon pou eta yo fonksyone. Li ok si ou gen 2-3 anviwònman nan espas non yo: ou ka ale epi kopye sekrè a manyèlman. Men, e si pou chak karakteristik yo kreye yon anviwònman separe ak espas non pa li pou devlopè yo?

Nou rezoud pwoblèm sa a tèt nou lè l sèvi avèk shell-operateur, ki otomatikman kopye sekrè nan nouvo espas non (yon egzanp yon zen sa yo dekri nan atik sa a).

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

Sepandan, lè w ap itilize Rook pwoblèm sa a tou senpleman pa egziste. Pwosesis aliye a fèt lè l sèvi avèk pwòp chofè ki baze sou Flexvolume oswa CSI (toujou nan etap beta) ak Se poutèt sa pa mande pou sekrè.

Rook otomatikman rezoud anpil pwoblèm, ki ankouraje nou sèvi ak li nan nouvo pwojè.

Syèj nan Rook

Ann ranpli pati pratik la nan deplwaye Rook ak Ceph pou nou ka fè pwòp eksperyans nou. Pou rann li pi fasil pou pran tanpèt gwo kay won sa a inexpugnable, devlopè yo te prepare yon pake Helm. Ann telechaje li:

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

Nan dosye rook-ceph/values.yaml ou ka jwenn anpil diferan paramèt. Bagay ki pi enpòtan an se presize tolerans pou ajan ak rechèch. Nou te dekri an detay ki sa mekanis taints/tolerans yo ka itilize pou atik sa a.

Nan ti bout tan, nou pa vle gous aplikasyon kliyan yo sitiye sou nœuds yo menm jan ak disk yo depo done. Rezon ki fè la se senp: fason sa a travay ajan Rook pa pral afekte aplikasyon an tèt li.

Se konsa, louvri dosye a rook-ceph/values.yaml ak editè pi renmen ou epi ajoute blòk sa a nan fen a:

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

Pou chak ne rezève pou depo done, ajoute tach ki koresponn lan:

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

Lè sa a, enstale tablo Helm la ak kòmandman an:

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

Koulye a, ou bezwen kreye yon gwoup epi presize kote a 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"

Tcheke estati Ceph - espere wè 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

An menm tan an, ann tcheke ke gous yo ak aplikasyon kliyan an pa fini sou nœuds rezève pou Ceph:

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

Anplis de sa, eleman adisyonèl yo ka configuré jan ou vle. Plis detay sou yo endike nan dokiman. Pou administrasyon an, nou rekòmande pou enstale tablodbò a ak bwat zouti.

Rook ak zen: Rook ase pou tout bagay?

Kòm ou ka wè, devlopman nan Rook se nan swing plen. Men, toujou gen pwoblèm ki pa pèmèt nou konplètman abandone konfigirasyon manyèl nan Ceph:

  • Pa gen chofè Rook pa kapab mezi ekspòtasyon sou itilizasyon blòk monte, ki anpeche nou siveyans.
  • Flexvolume ak CSI pa konn kijan chanje gwosè a nan komèsan (kòm opoze a RBD a menm), kidonk Rook prive de yon zouti itil (epi pafwa ki nesesè anpil!).
  • Rook toujou pa fleksib tankou Ceph regilye. Si nou vle konfigirasyon pisin lan pou metadata CephFS yo dwe estoke sou SSD, ak done yo li menm yo dwe estoke sou HDD, nou pral bezwen anrejistre gwoup separe nan aparèy nan kat CRUSH manyèlman.
  • Malgre lefèt ke rook-ceph-operator konsidere kòm ki estab, kounye a gen kèk pwoblèm lè amelyore Ceph soti nan vèsyon 13 a 14.

Jwenn

"Kounye a, Rook fèmen nan mond lan deyò pa pyon, men nou kwè ke yon jou li pral jwe yon wòl desizif nan jwèt la!" (quote envante espesyalman pou atik sa a)

Pwojè Rook te san dout genyen kè nou - nou kwè ke [ak tout avantaj ak dezavantaj li yo] li definitivman merite atansyon ou.

Plan fiti nou yo se pou fè rook-ceph yon modil pou addon-operatè, ki pral fè itilizasyon li nan anpil gwoup Kubernetes nou yo menm pi senp epi pi pratik.

PS

Li tou sou blog nou an:

Sous: www.habr.com

Add nouvo kòmantè