Ба Рук ё не Рук - ин савол аст

Ба Рук ё не Рук - ин савол аст

Дар аввали ҳамин моҳ, 3 май, як нашри асосии "системаи идоракунӣ барои нигаҳдории тақсимоти додаҳо дар Кубернетес" эълон карда шуд - Rook 1.0.0. Зиёда аз як сол пеш мо аллакай нашр шуд шарҳи умумии Rook. Баъд аз мо хоҳиш карданд, ки дар бораи таҷрибаи ӯ сӯҳбат кунем дар амал истифода баранд — ва акнун, дар вацти чунин мархалаи му-хими таърихи лоиха, мо аз таассуроти чамъшудаи худ бо камоли хурсандй накл мекунем.

Хулоса, Рук маҷмӯи аст операторҳо барои Kubernetes, ки ҷойгиркунӣ, идоракунӣ ва барқарорсозии автоматии ҳалли нигаҳдории маълумотро ба монанди Ceph, EdgeFS, Minio, Cassandra, CockroachDB пурра назорат мекунанд.

Дар айни замон аз ҳама пешрафта (ва ягона в устувор марҳила) ҳалли он аст rook-ceph-оператор.

эрод гирифтан: Дар байни тағироти назаррас дар версияи Rook 1.0.0, ки ба Ceph алоқаманд аст, мо метавонем дастгирии Ceph Nautilus ва қобилияти истифодаи NFS-ро барои сатилҳои CephFS ё RGW қайд кунем. Он чизе, ки дар байни дигарон фарқ мекунад, камолоти дастгирии EdgeFS ба сатҳи бета мебошад.

Пас, дар ин мақола мо:

  • Биёед ба саволе ҷавоб диҳем, ки мо дар истифодаи Rook барои ҷойгиркунии Ceph дар кластери Kubernetes чӣ бартариҳоро мебинем;
  • Мо таҷриба ва таассуроти худро дар бораи истифодаи Rook дар истеҳсолот мубодила хоҳем кард;
  • Биёед ба шумо бигӯем, ки чаро мо ба Рук «Ҳа!» мегӯем ва дар бораи нақшаҳои мо барои ӯ.

Биёед бо мафҳумҳо ва назарияи умумӣ оғоз кунем.

"Ман бартарии як Рӯк дорам!" (шоҳмотбози номаълум)

Ба Рук ё не Рук - ин савол аст

Яке аз бартариҳои асосии Rook дар он аст, ки ҳамкорӣ бо мағозаҳои маълумот тавассути механизмҳои Kubernetes амалӣ карда мешавад. Ин маънои онро дорад, ки ба шумо дигар лозим нест, ки фармонҳоро барои танзим кардани Ceph аз варақ ба консол нусхабардорӣ кунед.

— Оё шумо мехоҳед CephFS-ро дар кластер ҷойгир кунед? Танҳо як файли YAML нависед!
- Чӣ? Оё шумо инчунин мехоҳед, ки мағозаи объектро бо API S3 ҷойгир кунед? Танҳо як файли дуюми YAML нависед!

Rook мувофиқи тамоми қоидаҳои оператори маъмулӣ сохта шудааст. Муносибат бо ӯ истифода мешавад CRD (Таърифҳои захираҳои фармоишӣ), ки дар он мо хусусиятҳои объектҳои Ceph ба мо лозимро тавсиф мекунем (азбаски ин ягона татбиқи устувор аст, ба таври нобаёнӣ ин мақола дар бораи Ceph сӯҳбат хоҳад кард, агар тартиби дигаре ошкор нагардида бошад). Мувофиқи параметрҳои муайяншуда, оператор ба таври худкор фармонҳои барои конфигуратсия заруриро иҷро мекунад.

Биёед бо истифода аз мисоли сохтани Дӯкони Объектҳо мушаххасотро бубинем, ё дурусттараш - 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 }}

Параметрҳои дар рӯйхат нишондодашуда хеле стандартӣ мебошанд ва ба шарҳҳо ниёз надоранд, аммо ба онҳое, ки ба тағирёбандаҳои шаблон ҷудо карда шудаанд, диққати махсус додан лозим аст.

Нақшаи умумии кор аз он иборат аст, ки мо захираҳоро тавассути файли YAML "фармоиш" медиҳем, ки барои он оператор фармонҳои заруриро иҷро мекунад ва ба мо сирри "нақадар воқеӣ" -ро бармегардонад, ки мо метавонем бо он минбаъд кор кунем. (нигаред ба поён). Ва аз тағирёбандаҳои дар боло номбаршуда, фармон ва номи махфӣ тартиб дода мешавад.

Ин чӣ гуна даста аст? Ҳангоми сохтани корбар барои нигаҳдории объект, оператори Rook дар дохили подкӯҳ амалҳои зеринро иҷро мекунад:

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

Натиҷаи иҷрои ин фармон сохтори JSON хоҳад буд:

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

Keys - кадом барномаҳои оянда барои дастрасӣ ба нигаҳдории объект тавассути S3 API лозим аст. Оператори Rook онҳоро меҳрубонона интихоб мекунад ва онҳоро дар фазои номи худ дар шакли сир бо ном мегузорад rook-ceph-object-user-{{ $.Values.s3.crdName }}-{{ $.Values.s3.username }}.

Барои истифодаи маълумот аз ин сир, танҳо онро ба контейнер ҳамчун тағирёбандаҳои муҳити зист илова кунед. Ба унвони мисол, ман барои Ҷоб як қолаб медиҳам, ки дар он мо ба таври худкор сатилҳоро барои ҳар як муҳити корбар эҷод мекунем:

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

Ҳама амалҳои дар ин кор номбаршуда дар доираи Kubernetes иҷро карда шуданд. Сохторҳои дар файлҳои YAML тавсифшуда дар анбори Git нигоҳ дошта мешаванд ва борҳо истифода мешаванд. Мо инро ҳамчун як плюси бузург барои муҳандисони DevOps ва раванди CI/CD дар маҷмӯъ мебинем.

Аз Рук ва Радос хушҳол

Истифодаи комбинатсияи Ceph + RBD барои насб кардани ҳаҷмҳо ба қуттиҳо маҳдудиятҳои муайян мегузорад.

Махсусан, фазои ном бояд сирри дастрасӣ ба Ceph дошта бошад, то ки замимаҳои давлатӣ кор кунанд. Хуб аст, агар шумо дар фазои номҳои онҳо 2-3 муҳит дошта бошед: шумо метавонед рафта, сирро дастӣ нусхабардорӣ кунед. Аммо чӣ мешавад, агар барои ҳар як хусусият муҳити алоҳида бо фазои номи худ барои таҳиягарон сохта шавад?

Мо бо истифода аз ин масъала худамон ҳал кардем оператори снаряд, ки ба таври худкор сиррҳоро ба фазои номҳои нав нусхабардорӣ мекунад (намунаи чунин қалмоқ дар ин мақола).

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

Аммо, ҳангоми истифодаи Rook ин мушкилот танҳо вуҷуд надорад. Раванди насбкунӣ бо истифода аз драйверҳои худ дар асоси он сурат мегирад Ҳаҷми Flex ё CSI (ҳанӯз дар марҳилаи бета) ва аз ин рӯ сирри талаб намекунад.

Rook ба таври худкор мушкилоти зиёдеро ҳал мекунад, ки ин моро водор мекунад, ки онро дар лоиҳаҳои нав истифода барем.

Муҳосираи Рук

Биёед қисми амалиро тавассути ҷойгиркунии Rook and Ceph ба анҷом расонем, то мо метавонем таҷрибаҳои шахсии худро гузаронем. Барои осонтар кардани ҳамла ба ин бурҷи дастнорас, таҳиягарон бастаи Helm омода кардаанд. Биёед онро зеркашӣ кунем:

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

Дар файл rook-ceph/values.yaml шумо метавонед бисёр танзимоти гуногун пайдо кунед. Муҳимтар аз ҳама ин аст, ки таҳаммулпазирӣ барои агентҳо ва ҷустуҷӯ. Мо ба таври муфассал тавсиф кардем, ки механизми таҳаммулпазирӣ/таҳаммулпазириро барои чӣ истифода бурдан мумкин аст ин мақола.

Хулоса, мо намехоҳем, ки қуттиҳои замимаи муштарӣ дар ҳамон гиреҳҳо бо дискҳои нигаҳдории маълумот ҷойгир шаванд. Сабаб оддӣ аст: бо ин роҳ кори агентҳои Rook ба худи барнома таъсир намерасонад.

Пас, файлро кушоед rook-ceph/values.yaml бо муҳаррири дӯстдоштаи худ ва дар охир блоки зеринро илова кунед:

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

Барои ҳар як гиреҳе, ки барои нигаҳдории додаҳо ҳифз шудааст, доғи мувофиқро илова кунед:

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

Сипас диаграммаи Helm-ро бо фармони зерин насб кунед:

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

Акнун ба шумо лозим аст, ки кластер эҷод кунед ва маконро муайян кунед 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"

Санҷиши ҳолати Ceph - интизор шавед 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

Ҳамзамон, биёед санҷем, ки подкҳо бо замимаи муштарӣ дар гиреҳҳои барои Ceph ҷудошуда хотима намеёбанд:

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

Ғайр аз он, ҷузъҳои иловагӣ метавонанд мувофиқи хоҳиш танзим карда шаванд. Тафсилоти бештар дар бораи онҳо дар хуччатхо. Барои маъмурият, мо тавсия медиҳем, ки панели асбобҳо ва қуттии асбобҳоро насб кунед.

Рок ва қалмоқҳо: оё Рук барои ҳама чиз кофӣ аст?

Тавре ки шумо мебинед, рушди Rook босуръат идома дорад. Аммо ҳанӯз ҳам мушкилоте вуҷуд доранд, ки ба мо имкон намедиҳанд, ки конфигуратсияи дастӣ аз Cephро комилан тарк кунем:

  • Ронандаи Rook нест наметавонад ченакҳои содиротӣ оид ба истифодаи блокҳои насбшуда, ки моро аз мониторинг маҳрум мекунад.
  • Flexvolume ва CSI намедонам чи тавр андозаи ҳаҷмҳоро тағир диҳед (бар хилофи ҳамон RBD), аз ин рӯ Рук аз абзори муфид (ва баъзан ба таври интиқодӣ лозим!) маҳрум аст.
  • Рук ҳоло ҳам мисли Ceph муқаррарӣ чандир нест. Агар мо хоҳем, ки ҳавзро барои метамаълумоти CephFS дар SSD нигоҳ дошта шавад ва худи маълумот дар HDD нигоҳ дошта шавад, ба мо лозим меояд, ки гурӯҳҳои алоҳидаи дастгоҳҳоро дар харитаҳои CRUSH дастӣ сабти ном кунем.
  • Сарфи назар аз он, ки rook-ceph-оператор устувор ҳисобида мешавад, дар айни замон ҳангоми навсозии Ceph аз версияи 13 ба 14 баъзе мушкилот вуҷуд дорад.

натиҷаҳои

"Ҳозир Рук аз ҷаҳони беруна тавассути пиёдаҳо баста шудааст, аммо мо боварӣ дорем, ки рӯзе вай дар бозӣ нақши ҳалкунанда хоҳад дошт!" (иқтибос махсус барои ин мақола ихтироъ шудааст)

Лоиҳаи Rook бешубҳа дили моро ба даст овард - мо боварӣ дорем, ки [бо тамоми ҷиҳатҳои мусбат ва манфии он] он бешубҳа сазовори таваҷҷӯҳи шумост.

Нақшаҳои ояндаи мо аз он иборат аст, ки rook-ceph ба модул барои addon-operator, ки истифодаи онро дар кластерҳои сершумори Kubernetes мо боз ҳам соддатар ва қулайтар мекунад.

PS

Инчунин дар блоги мо хонед:

Манбаъ: will.com

Илова Эзоҳ