Ka Rook atanapi henteu ka Rook - éta patarosan

Ka Rook atanapi henteu ka Rook - éta patarosan

Dina awal bulan ieu, dina 3 Méi, sékrési utama "sistem manajemén pikeun neundeun data anu disebarkeun di Kubernetes" diumumkeun - Rook 1.0.0. Leuwih ti sataun katukang urang geus diterbitkeun gambaran umum Rook. Teras kami dipenta pikeun ngobrol ngeunaan pangalamanana ngagunakeun dina prakna - sareng ayeuna, pas dina waktosna pikeun tonggak penting dina sajarah proyék éta, kami resep ngabagikeun akumulasi kesan.

Pondokna, Rook mangrupikeun set operator pikeun Kubernetes, nu nyokot kadali pinuh ku deployment, manajemén, recovery otomatis solusi gudang data kayaning Ceph, EdgeFS, Minio, Cassandra, CockroachDB.

Di momen paling dimekarkeun (jeung hiji-hijina в stabil tahap) leyuran nyaeta rook-ceph-operator.

nyarios: Diantara parobahan signifikan dina Rook 1.0.0 release patali Ceph, urang tiasa catetan rojongan pikeun Ceph Nautilus jeung kamampuh ngagunakeun NFS pikeun CephFS atanapi RGW ember. Anu menonjol diantarana nyaéta maturasi dukungan EdgeFS kana tingkat béta.

Janten, dina tulisan ieu urang:

  • Hayu urang ngajawab patarosan ngeunaan naon kaunggulan urang tingali dina ngagunakeun Rook pikeun nyebarkeun Ceph dina klaster Kubernetes;
  • Kami bakal ngabagikeun pangalaman sareng kesan ngeunaan ngagunakeun Rook dina produksi;
  • Hayu urang nyarioskeun ka anjeun naha urang nyarios "Enya!" ka Rook, sareng ngeunaan rencana urang pikeun anjeunna.

Hayu urang mimitian ku konsep umum jeung téori.

"Kuring boga kaunggulan hiji Rook!" (Pamaén catur kanyahoan)

Ka Rook atanapi henteu ka Rook - éta patarosan

Salah sahiji kaunggulan utama Rook nyaéta yén interaksi sareng toko data dilaksanakeun ngaliwatan mékanisme Kubernetes. Ieu ngandung harti yén anjeun henteu kedah deui nyalin paréntah pikeun ngonpigurasikeun Ceph tina lambaran kana konsol.

- Naha anjeun badé nyebarkeun CephFS dina klaster? Tulis file YAML!
- Naon? Naha anjeun ogé hoyong nyebarkeun toko obyék sareng S3 API? Tulis file YAML kadua!

Rook dijieun nurutkeun sagala aturan operator has. Interaksi sareng anjeunna lumangsung ngagunakeun CRD (Definisi Sumber Daya Khusus), dimana urang ngajelaskeun karakteristik éntitas Ceph anu urang peryogikeun (sabab ieu hiji-hijina palaksanaan stabil, sacara standar artikel ieu bakal ngobrol ngeunaan Ceph, iwal eksplisit dinyatakeun disebutkeun). Numutkeun parameter anu ditangtukeun, operator bakal otomatis ngaéksekusi paréntah anu dipikabutuh pikeun konfigurasi.

Hayu urang tingali spésifikna nganggo conto nyiptakeun Toko Obyék, atanapi langkungna - 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 }}

Parameter anu dituduhkeun dina daptar cukup standar sareng boro peryogi koméntar, tapi kedah diperhatoskeun khusus pikeun anu dialokasikeun kana variabel template.

Skéma umum gawé turun kana kanyataan yén urang "mesen" sumberdaya ngaliwatan file YAML, nu operator executes paréntah diperlukeun tur mulih kami rusiah "teu-kitu-nyata" nu urang tiasa salajengna dianggo. (tingali kahandap). Sareng tina variabel anu didaptarkeun di luhur, paréntah sareng nami rahasia bakal disusun.

Tim naon ieu? Nalika nyiptakeun pangguna pikeun neundeun obyék, operator Rook di jero pod bakal ngalakukeun ieu:

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

Hasil tina ngajalankeun paréntah ieu bakal janten struktur JSON:

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

Keys - naon aplikasi kahareup bakal perlu ngakses gudang obyék via S3 API. The Rook operator bageur nawaran reureuh di milih aranjeunna sarta nempatkeun aranjeunna dina spasi ngaran na dina bentuk rusiah kalawan ngaran rook-ceph-object-user-{{ $.Values.s3.crdName }}-{{ $.Values.s3.username }}.

Pikeun ngagunakeun data tina rusiah ieu, tambahkeun kana wadahna salaku variabel lingkungan. Salaku conto, kuring bakal masihan témplat pikeun Proyék, dimana urang otomatis nyiptakeun ember pikeun unggal lingkungan pangguna:

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

Sadaya tindakan anu didaptarkeun dina Proyék ieu dilaksanakeun dina kerangka Kubernetes. Struktur anu dijelaskeun dina file YAML disimpen dina gudang Git sareng dianggo deui sababaraha kali. Kami ningali ieu salaku tambah ageung pikeun insinyur DevOps sareng prosés CI / CD sacara gembleng.

Senang sareng Rook sareng Rados

Ngagunakeun kombinasi Ceph + RBD maksakeun larangan tangtu dina volume ningkatna kana pods.

Khususna, namespace kedah ngandung rusiah pikeun ngakses Ceph supados aplikasi stateful tiasa dianggo. Henteu kunanaon upami anjeun gaduh 2-3 lingkungan dina ruang ngaranana: anjeun tiasa angkat sareng nyalin rusiah sacara manual. Tapi kumaha upami pikeun tiap fitur lingkungan anu misah sareng rohangan ngaran sorangan diciptakeun pikeun pamekar?

Urang ngajawab masalah ieu sorangan ngagunakeun cangkang-operator, anu otomatis nyalin rusiah ka spasi ngaran anyar (conto hook sapertos dijelaskeun dina artikel ieu).

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

Nanging, nalika nganggo Rook masalah ieu ngan saukur teu aya. Prosés ningkatna lumangsung ngagunakeun drivers sorangan dumasar kana Volume lentur atawa CSI (masih dina tahap béta) sahingga teu merlukeun rusiah.

Rook otomatis ngarengsekeun seueur masalah, anu nyorong urang ngagunakeunana dina proyék énggal.

Kepungan Rook

Hayu urang ngalengkepan bagian praktis ku deploying Rook jeung Ceph ku kituna urang bisa ngalakukeun percobaan sorangan. Sangkan leuwih gampang badai munara impregnable ieu, pamekar geus nyiapkeun paket Helm. Hayu urang unduh:

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

Dina file rook-ceph/values.yaml anjeun tiasa mendakan seueur setélan anu béda. Hal pangpentingna nyaéta pikeun nangtukeun tolerations pikeun agén jeung pilarian. Kami ngajelaskeun sacara rinci naon mékanisme taint / toléransi tiasa dianggo pikeun artikel ieu.

Pondokna, kami henteu hoyong pod aplikasi klien ayana dina titik anu sami sareng disk panyimpen data. Alesanna basajan: ku cara ieu karya agén Rook moal mangaruhan aplikasi éta sorangan.

Janten, buka filena rook-ceph/values.yaml sareng pangropéa paporit anjeun sareng tambahkeun blok di handap ieu dina tungtungna:

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

Pikeun unggal titik ditangtayungan pikeun neundeun data, tambahkeun taint pakait:

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

Teras pasang bagan Helm kalayan paréntah:

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

Ayeuna anjeun kudu nyieun klaster jeung nangtukeun lokasi 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"

Mariksa status Ceph - nyangka ningali 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

Dina waktos anu sami, hayu urang pariksa yén pod sareng aplikasi klien henteu dugi ka titik anu ditangtayungan pikeun Ceph:

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

Saterusna, komponén tambahan bisa ngonpigurasi sakumaha dipikahoyongna. Langkung rinci ngeunaan aranjeunna dituduhkeun dina dokuméntasi. Pikeun administrasi, kami nyarankeun pisan masang dasbor sareng kotak alat.

Rook sareng pancing: naha Rook cekap pikeun sadayana?

Sakumaha anjeun tiasa tingali, ngembangkeun Rook aya dina ayunan pinuh. Tapi aya kénéh masalah anu teu ngidinan urang pikeun sakabéhna abandon konfigurasi manual Ceph:

  • Taya Supir Rook teu tiasa métrik ékspor dina pamakéan blok dipasang, nu deprives kami ngawaskeun.
  • Flexvolume jeung CSI teu nyaho kumaha ngarobah ukuran jilid (sabalikna tina RBD sarua), ku kituna Rook dicabut sahiji alat mangpaat (sarta kadang kritis diperlukeun!).
  • Rook masih henteu fleksibel sapertos Ceph biasa. Upami urang hoyong ngonpigurasikeun kolam renang pikeun metadata CephFS pikeun disimpen dina SSD, sareng data sorangan disimpen dina HDD, urang kedah ngadaptarkeun grup alat anu misah dina peta CRUSH sacara manual.
  • Sanaos kanyataan yén rook-ceph-operator dianggap stabil, ayeuna aya sababaraha masalah nalika ningkatkeun Ceph tina versi 13 ka 14.

papanggihan

"Ayeuna Rook ditutup kaluar ti dunya luar ku pawns, tapi kami yakin yén hiji poé manehna bakal maénkeun peran decisive dina kaulinan!" (kutipan diciptakeun khusus pikeun tulisan ieu)

Proyék Rook geus pasti meunang haté urang - kami yakin yén [kalayan sagala pro jeung kontra na] eta pasti pantes perhatian Anjeun.

rencana hareup urang bisul handap pikeun nyieun rook-ceph modul pikeun addon-operator, anu bakal dianggo dina seueur klaster Kubernetes urang langkung saderhana sareng langkung merenah.

PS

Baca ogé dina blog urang:

sumber: www.habr.com

Tambahkeun komentar