Sa Rook o dili sa Rook - kana ang pangutana

Sa Rook o dili sa Rook - kana ang pangutana

Sa sinugdanan niining bulana, niadtong Mayo 3, usa ka dakong pagpagawas sa usa ka "sistema sa pagdumala alang sa gipang-apod-apod nga pagtipig sa datos sa Kubernetes" gipahibalo - Rook 1.0.0. Kapin sa usa ka tuig ang milabay kami na gipatik kinatibuk-ang pagtan-aw sa Rook. Unya gihangyo mi sa paghisgot bahin sa iyang kasinatian gamiton sa praktis β€” ug karon, sa tukma nga panahon alang sa ingon ka hinungdanon nga milestone sa kasaysayan sa proyekto, malipayon kami nga ipaambit ang among natipon nga mga impresyon.

Sa laktud, ang Rook usa ka set mga operator alang sa Kubernetes, nga hingpit nga nagkontrol sa pagdeploy, pagdumala, awtomatikong pagbawi sa mga solusyon sa pagtipig sa datos sama sa Ceph, EdgeFS, Minio, Cassandra, CockroachDB.

Sa pagkakaron ang labing naugmad (ug ang bugtong Π² lig-on yugto) ang solusyon mao rook-ceph-operator.

ΠŸΡ€ΠΈΠΌΠ΅Ρ‡Π°Π½ΠΈΠ΅: Lakip sa mahinungdanong mga kausaban sa Rook 1.0.0 release nga may kalabutan sa Ceph, atong mamatikdan ang suporta alang sa Ceph Nautilus ug ang abilidad sa paggamit sa NFS alang sa CephFS o RGW nga mga balde. Ang nagbarug taliwala sa uban mao ang pagkahinog sa suporta sa EdgeFS sa lebel sa beta.

Busa, niining artikuloha atong:

  • Atong tubagon ang pangutana mahitungod sa unsa nga mga bentaha ang atong makita sa paggamit sa Rook sa pag-deploy sa Ceph sa usa ka Kubernetes cluster;
  • Ipaambit namo ang among kasinatian ug mga impresyon sa paggamit sa Rook sa produksiyon;
  • Atong isulti kanimo kung nganong nag-ingon kita "Oo!" kang Rook, ug mahitungod sa atong mga plano alang kaniya.

Magsugod ta sa kinatibuk-ang konsepto ug teorya.

"Aduna koy bintaha sa usa ka Rook!" (wala mailhi nga chess player)

Sa Rook o dili sa Rook - kana ang pangutana

Usa sa mga nag-unang bentaha sa Rook mao nga ang pakig-uban sa mga tindahan sa datos gihimo pinaagi sa mga mekanismo sa Kubernetes. Kini nagpasabot nga dili na nimo kinahanglan kopyahon ang mga sugo aron ma-configure ang Ceph gikan sa sheet ngadto sa console.

β€” Gusto ba nimong i-deploy ang CephFS sa usa ka cluster? Pagsulat lang ug YAML file!
- Unsa? Gusto ba usab nimo nga magbutang usa ka tindahan sa butang nga adunay S3 API? Pagsulat lang ug ikaduhang YAML file!

Ang Rook gihimo sumala sa tanan nga mga lagda sa usa ka tipikal nga operator. Ang pakig-uban kaniya mahitabo gamit CRD (Custom Resource Definition), diin atong gihulagway ang mga kinaiya sa Ceph entidad nga atong gikinahanglan (Tungod kay mao ra kini ang lig-on nga pagpatuman, sa default kini nga artikulo maghisgot bahin sa Ceph, gawas kung klaro nga gipahayag kung dili). Sumala sa gitakda nga mga parameter, ang operator awtomatik nga ipatuman ang mga sugo nga gikinahanglan alang sa pag-configure.

Atong tan-awon ang mga detalye gamit ang panig-ingnan sa paghimo sa usa ka Object Store, o hinoon - 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 }}

Ang mga parameter nga gipakita sa lista medyo sukaranan ug halos dili kinahanglan nga mga komentaryo, apan angay nga hatagan ug espesyal nga atensyon ang mga gigahin sa mga variable sa template.

Ang kinatibuk-ang laraw sa trabaho naggikan sa kamatuoran nga kita "nag-order" sa mga kapanguhaan pinaagi sa usa ka YAML file, diin ang operator nagpatuman sa gikinahanglan nga mga sugo ug nagbalik kanato sa usa ka "dili-tinuod" nga sekreto diin kita makatrabaho pa. (Tan-awa sa ubos). Ug gikan sa mga baryable nga gilista sa ibabaw, ang command ug sekreto nga ngalan i-compile.

Unsang klaseha ni nga team? Kung maghimo usa ka tiggamit alang sa pagtipig sa butang, ang operator sa Rook sa sulod sa pod mobuhat sa mosunod:

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

Ang resulta sa pagpatuman niini nga sugo mahimong JSON nga istruktura:

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

Keys - unsa nga umaabot nga mga aplikasyon ang kinahanglan aron ma-access ang pagtipig sa butang pinaagi sa S3 API. Ang Rook operator malulotong mopili kanila ug ibutang kini sa iyang namespace sa porma sa usa ka sekreto nga adunay ngalan rook-ceph-object-user-{{ $.Values.s3.crdName }}-{{ $.Values.s3.username }}.

Aron magamit ang datos gikan niini nga sekreto, idugang lang kini sa sudlanan isip mga variable sa palibot. Ingon usa ka pananglitan, maghatag ako usa ka template alang sa Job, diin awtomatiko kaming naghimo og mga balde alang sa matag palibot sa tiggamit:

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

Ang tanan nga mga aksyon nga gilista niini nga Trabaho gihimo sulod sa gambalay sa Kubernetes. Ang mga istruktura nga gihulagway sa YAML nga mga file gitipigan sa usa ka Git repository ug gigamit pag-usab sa daghang mga higayon. Nakita namon kini nga usa ka dako nga dugang alang sa mga inhenyero sa DevOps ug ang proseso sa CI / CD sa kinatibuk-an.

Malipayon uban ni Rook ug Rados

Ang paggamit sa kombinasyon sa Ceph + RBD nagpahamtang sa pipila ka mga pagdili sa pagpataas sa mga volume sa mga pod.

Sa partikular, ang namespace kinahanglan adunay usa ka sekreto sa pag-access sa Ceph aron ang stateful nga mga aplikasyon magamit. Ok lang kung naa kay 2-3 ka environment sa ilang namespaces: pwede ka ug manu-mano ang pagkopya sa sekreto. Apan unsa man kung alang sa matag bahin usa ka lahi nga palibot nga adunay kaugalingon nga namespace nga gihimo alang sa mga developer?

Nasulbad namon kini nga problema sa among kaugalingon gamit shell-operator, nga awtomatik nga nagkopya sa mga sekreto ngadto sa bag-ong mga namespaces (usa ka pananglitan sa maong kaw-it gihulagway sa kini nga artikulo).

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

Bisan pa, kung gigamit ang Rook kini nga problema wala gyud maglungtad. Ang proseso sa pag-mount mahitabo gamit ang kaugalingon nga mga drayber nga gibase sa Flexvolume o CSI (naa pa sa beta nga yugto) ug busa wala magkinahanglan mga sekreto.

Awtomatikong nasulbad sa Rook ang daghang mga problema, nga nagdasig kanamo nga gamiton kini sa mga bag-ong proyekto.

Paglikos sa Rook

Atong kompletohon ang praktikal nga bahin pinaagi sa pag-deploy ni Rook ug Ceph aron makahimo kita sa atong kaugalingong mga eksperimento. Aron mas sayon ​​ang pag-unos niining dili mapukan nga tore, ang mga developers nag-andam ug usa ka Helm package. Atong i-download kini:

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

Sa file rook-ceph/values.yaml makit-an nimo ang daghang lainlaing mga setting. Ang labing hinungdanon nga butang mao ang pagtino sa mga pagtugot alang sa mga ahente ug pagpangita. Gihulagway namo sa detalye kung unsa ang mekanismo sa mga hugaw/pagtugot nga magamit sa kini nga artikulo.

Sa laktod nga pagkasulti, dili namo gusto nga ang mga aplikasyon sa kliyente nga pods mahimutang sa parehas nga mga node sama sa mga data storage disks. Simple ra ang rason: niining paagiha ang trabaho sa mga ahente sa Rook dili makaapekto sa aplikasyon mismo.

Busa, ablihi ang file rook-ceph/values.yaml uban sa imong paborito nga editor ug idugang ang mosunod nga block sa katapusan:

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

Alang sa matag node nga gitagana alang sa pagtipig sa datos, idugang ang katugbang nga mantsa:

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

Dayon i-install ang Helm chart uban ang command:

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

Karon kinahanglan ka maghimo usa ka cluster ug ipiho ang lokasyon 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"

Pagsusi sa kahimtang sa Ceph - gilauman nga makita 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

Sa samang higayon, atong susihon nga ang mga pod nga adunay aplikasyon sa kliyente dili mapunta sa mga node nga gitagana alang kang Ceph:

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

Dugang pa, ang dugang nga mga sangkap mahimong ma-configure kung gusto. Ang dugang nga mga detalye bahin kanila gipakita sa dokumentasyon. Alang sa administrasyon, kusganon namon nga girekomenda nga i-install ang dashboard ug toolbox.

Rook ug hook: igo ba ang Rook sa tanan?

Sama sa imong nakita, ang pag-uswag sa Rook anaa sa bug-os nga paglihok. Apan adunay mga problema nga wala magtugot kanamo nga hingpit nga biyaan ang manual nga pag-configure sa Ceph:

  • Walay Rook Driver dili mahimo export metrics sa paggamit sa mounted blocks, nga naghikaw kanato sa pagmonitor.
  • Flexvolume ug CSI wala kabalo unsaon usba ang gidak-on sa mga volume (sukwahi sa sama nga RBD), mao nga ang Rook gihikawan sa usa ka mapuslanon (ug usahay kritikal nga gikinahanglan!) nga himan.
  • Dili gihapon flexible si Rook sama sa regular nga Ceph. Kung gusto namon nga i-configure ang pool alang sa metadata sa CephFS nga itago sa SSD, ug ang data mismo nga itago sa HDD, kinahanglan namon nga irehistro ang lainlaing mga grupo sa mga aparato sa mga mapa sa CRUSH nga mano-mano.
  • Bisan pa sa kamatuoran nga ang rook-ceph-operator gikonsiderar nga stable, sa pagkakaron adunay pipila ka mga problema sa pag-upgrade sa Ceph gikan sa bersyon 13 ngadto sa 14.

kaplag

"Karon ang Rook gisirhan gikan sa gawas nga kalibutan pinaagi sa mga pangan, apan kami nagtuo nga usa ka adlaw siya adunay usa ka mahukmanon nga papel sa dula!" (kinutlo nga giimbento espesipiko alang niini nga artikulo)

Ang proyekto sa Rook sa walay duhaduha nakadaog sa among mga kasingkasing - kami nagtuo nga [uban ang tanan nga mga bentaha ug disbentaha] kini siguradong takus sa imong pagtagad.

Ang among umaabot nga mga plano nagsukad sa paghimo sa rook-ceph nga usa ka module alang sa addon-operator, nga maghimo sa paggamit niini sa among daghang Kubernetes clusters nga mas simple ug mas sayon.

PS

Basaha usab sa among blog:

Source: www.habr.com

Idugang sa usa ka comment