เชฐเซเช• เชฎเชพเชŸเซ‡ เช•เซ‡ เชฐเซเช• เชฎเชพเชŸเซ‡ เชจเชนเซ€เช‚ - เชคเซ‡ เชชเซเชฐเชถเซเชจ เช›เซ‡

เชฐเซเช• เชฎเชพเชŸเซ‡ เช•เซ‡ เชฐเซเช• เชฎเชพเชŸเซ‡ เชจเชนเซ€เช‚ - เชคเซ‡ เชชเซเชฐเชถเซเชจ เช›เซ‡

เช† เชฎเชนเชฟเชจเชพเชจเซ€ เชถเชฐเซ‚เช†เชคเชฎเชพเช‚, 3 เชฎเซ‡เชจเชพ เชฐเซ‹เชœ, "เช•เซเชฌเชฐเชจเซ‡เชŸเซเชธเชฎเชพเช‚ เชตเชฟเชคเชฐเชฟเชค เชกเซ‡เชŸเชพ เชธเซเชŸเซ‹เชฐเซ‡เชœ เชฎเชพเชŸเซ‡ เชฎเซ‡เชจเซ‡เชœเชฎเซ‡เชจเซเชŸ เชธเชฟเชธเซเชŸเชฎ" เชจเซ€ เชฎเซเช–เซเชฏ เชฐเชœเซ‚เช†เชคเชจเซ€ เชœเชพเชนเซ‡เชฐเชพเชค เช•เชฐเชตเชพเชฎเชพเช‚ เช†เชตเซ€ เชนเชคเซ€ - เชฐเซ‚เช• 1.0.0. เชเช• เชตเชฐเซเชท เช•เชฐเชคเชพเช‚ เชตเชงเซ เชชเชนเซ‡เชฒเชพเช‚ เช…เชฎเซ‡ เชชเชนเซ‡เชฒเซ‡เชฅเซ€ เชœ เชชเซเชฐเช•เชพเชถเชฟเชค เชฐเซ‚เช•เชจเซ€ เชธเชพเชฎเชพเชจเซเชฏ เชเชพเช‚เช–เซ€. เชชเช›เซ€ เช…เชฎเชจเซ‡ เชคเซ‡เชฎเชจเชพ เช…เชจเซเชญเชต เชตเชฟเชถเซ‡ เชตเชพเชค เช•เชฐเชตเชพเชจเซเช‚ เช•เชนเซ‡เชตเชพเชฎเชพเช‚ เช†เชตเซเชฏเซเช‚ เชตเซเชฏเชตเชนเชพเชฐเชฎเชพเช‚ เช‰เชชเชฏเซ‹เช— เช•เชฐเซ‹ โ€” เช…เชจเซ‡ เชนเชตเซ‡, เชชเซเชฐเซ‹เชœเซ‡เช•เซเชŸเชจเชพ เช‡เชคเชฟเชนเชพเชธเชฎเชพเช‚ เช†เชตเชพ เชจเซ‹เช‚เชงเชชเชพเชคเซเชฐ เชธเซ€เชฎเชพเชšเชฟเชนเซเชจเชฐเซ‚เชช เชธเชฎเชฏ เชฎเชพเชŸเซ‡, เช…เชฎเซ‡ เช…เชฎเชพเชฐเซ€ เชธเช‚เชšเชฟเชค เช›เชพเชช เชถเซ‡เชฐ เช•เชฐเชตเชพเชฎเชพเช‚ เช–เซเชถ เช›เซ€เช.

เชŸเซ‚เช‚เช•เชฎเชพเช‚, เชฐเซเช• เชเช• เชธเชฎเซ‚เชน เช›เซ‡ เช“เชชเชฐเซ‡เชŸเชฐเซ‹ เช•เซเชฌเชฐเชจเซ‡เชŸเซเชธ เชฎเชพเชŸเซ‡, เชœเซ‡ เชกเซ‡เชŸเชพ เชธเซเชŸเซ‹เชฐเซ‡เชœ เชธเซ‹เชฒเซเชฏเซเชถเชจเซเชธ เชœเซ‡เชฎ เช•เซ‡ Ceph, EdgeFS, Minio, Cassandra, CockroachDB เชจเชพ เชœเชฎเชพเชตเชŸ, เชธเช‚เชšเชพเชฒเชจ, เชธเซเชตเชšเชพเชฒเชฟเชค เชชเซเชจเชƒเชชเซเชฐเชพเชชเซเชคเชฟเชจเซเช‚ เชธเช‚เชชเซ‚เชฐเซเชฃ เชจเชฟเชฏเช‚เชคเซเชฐเชฃ เชฒเซ‡ เช›เซ‡.

เช† เช•เซเชทเชฃเซ‡ เชธเซŒเชฅเซ€ เชตเชงเซ เชตเชฟเช•เชธเชฟเชค (เช…เชจเซ‡ เชฎเชพเชคเซเชฐ เชเช• เชœ ะฒ เชธเซเชฅเชฟเชฐ เชธเซเชŸเซ‡เชœ) เช‰เช•เซ‡เชฒ เช›เซ‡ rook-ceph-operator.

เชจเซ‹เช‚เชงเชฃเซ€: Ceph เชธเช‚เชฌเช‚เชงเชฟเชค เชฐเซเช• 1.0.0 เชฐเชฟเชฒเซ€เชเชฎเชพเช‚ เชจเซ‹เช‚เชงเชชเชพเชคเซเชฐ เชซเซ‡เชฐเชซเชพเชฐเซ‹ เชชเซˆเช•เซ€, เช…เชฎเซ‡ Ceph Nautilus เชฎเชพเชŸเซ‡ เชธเชฎเชฐเซเชฅเชจ เช…เชจเซ‡ CephFS เช…เชฅเชตเชพ RGW เชฌเช•เซ‡เชŸเซเชธ เชฎเชพเชŸเซ‡ NFS เชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเชตเชพเชจเซ€ เช•เซเชทเชฎเชคเชพเชจเซ‡ เชจเซ‹เช‚เชงเซ€ เชถเช•เซ€เช เช›เซ€เช. เชฌเซ€เชŸเชพ เชธเซเชคเชฐ เชชเชฐ เชเชœเชเชซเชเชธ เชธเชชเซ‹เชฐเซเชŸเชจเซ€ เชชเชฐเชฟเชชเช•เซเชตเชคเชพ เช เช…เชจเซเชฏ เชฒเซ‹เช•เซ‹เชฎเชพเช‚ เช…เชฒเช— เช›เซ‡.

เชคเซ‡เชฅเซ€, เช† เชฒเซ‡เช–เชฎเชพเช‚ เช†เชชเชฃเซ‡:

  • เช•เซเชฌเชฐเชจเซ‡เชŸเซเชธ เช•เซเชฒเชธเซเชŸเชฐเชฎเชพเช‚ เชธเซ‡เชซเชจเซ‡ เชœเชฎเชพเชตเชตเชพ เชฎเชพเชŸเซ‡ เชฐเซเช•เชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเชตเชพเชฅเซ€ เช†เชชเชฃเชจเซ‡ เช•เชฏเชพ เชซเชพเชฏเชฆเชพ เชฆเซ‡เช–เชพเชฏ เช›เซ‡ เชคเซ‡ เช…เช‚เช—เซ‡เชจเชพ เชชเซเชฐเชถเซเชจเชจเซ‹ เชœเชตเชพเชฌ เช†เชชเซ€เช;
  • เช…เชฎเซ‡ เช‰เชคเซเชชเชพเชฆเชจเชฎเชพเช‚ เชฐเซเช•เชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเชตเชพเชจเชพ เช…เชฎเชพเชฐเชพ เช…เชจเซเชญเชต เช…เชจเซ‡ เช›เชพเชชเชจเซ‡ เชถเซ‡เชฐ เช•เชฐเซ€เชถเซเช‚;
  • เชšเชพเชฒเซ‹ เชคเชฎเชจเซ‡ เช•เชนเซ€เช เช•เซ‡ เชถเชพ เชฎเชพเชŸเซ‡ เช…เชฎเซ‡ เชฐเซเช•เชจเซ‡ โ€œเชนเชพ!โ€ เช•เชนเซ€เช เช›เซ€เช เช…เชจเซ‡ เชคเซ‡เชจเชพ เชฎเชพเชŸเซ‡ เช…เชฎเชพเชฐเซ€ เชฏเซ‹เชœเชจเชพเช“ เชตเชฟเชถเซ‡.

เชšเชพเชฒเซ‹ เชธเชพเชฎเชพเชจเซเชฏ เช–เซเชฏเชพเชฒเซ‹ เช…เชจเซ‡ เชธเชฟเชฆเซเชงเชพเช‚เชค เชธเชพเชฅเซ‡ เชชเซเชฐเชพเชฐเช‚เชญ เช•เชฐเซ€เช.

"เชฎเชจเซ‡ เชเช• เชฐเซเช•เชจเซ‹ เชซเชพเชฏเชฆเซ‹ เช›เซ‡!" (เช…เชœเชพเชฃเซเชฏเชพ เชšเซ‡เชธ เช–เซ‡เชฒเชพเชกเซ€)

เชฐเซเช• เชฎเชพเชŸเซ‡ เช•เซ‡ เชฐเซเช• เชฎเชพเชŸเซ‡ เชจเชนเซ€เช‚ - เชคเซ‡ เชชเซเชฐเชถเซเชจ เช›เซ‡

เชฐเซเช•เชจเชพ เชฎเซเช–เซเชฏ เชซเชพเชฏเชฆเชพเช“เชฎเชพเช‚เชจเซ‹ เชเช• เช เช›เซ‡ เช•เซ‡ เชกเซ‡เชŸเชพ เชธเซเชŸเซ‹เชฐเซเชธ เชธเชพเชฅเซ‡เชจเซ€ เช•เซเชฐเชฟเชฏเชพเชชเซเชฐเชคเชฟเช•เซเชฐเชฟเชฏเชพ เช•เซเชฌเชฐเชจเซ‡เชŸเซเชธ เชฎเชฟเช•เซ‡เชจเชฟเชเชฎเซเชธ เชฆเซเชตเชพเชฐเชพ เชนเชพเชฅ เชงเชฐเชตเชพเชฎเชพเช‚ เช†เชตเซ‡ เช›เซ‡. เช†เชจเซ‹ เช…เชฐเซเชฅ เช เช›เซ‡ เช•เซ‡ เชคเชฎเชพเชฐเซ‡ เชนเชตเซ‡ เช•เชจเซเชธเซ‹เชฒเชฎเชพเช‚ เชถเซ€เชŸเชฎเชพเช‚เชฅเซ€ Ceph เชจเซ‡ เช—เซ‹เช เชตเชตเชพ เชฎเชพเชŸเซ‡ เช†เชฆเซ‡เชถเซ‹เชจเซ€ เชจเช•เชฒ เช•เชฐเชตเชพเชจเซ€ เชœเชฐเซ‚เชฐ เชจเชฅเซ€.

โ€” เชถเซเช‚ เชคเชฎเซ‡ เช•เซเชฒเชธเซเชŸเชฐเชฎเชพเช‚ CephFS เชœเชฎเชพเชตเชตเชพ เชฎเชพเช‚เช—เซ‹ เช›เซ‹? เชซเช•เซเชค YAML เชซเชพเช‡เชฒ เชฒเช–เซ‹!
- เชถเซเช‚? เชถเซเช‚ เชคเชฎเซ‡ S3 API เชธเชพเชฅเซ‡ เช‘เชฌเซเชœเซ‡เช•เซเชŸ เชธเซเชŸเซ‹เชฐ เชชเชฃ เชœเชฎเชพเชตเชตเชพ เชฎเชพเช‚เช—เซ‹ เช›เซ‹? เชซเช•เซเชค เชฌเซ€เชœเซ€ YAML เชซเชพเช‡เชฒ เชฒเช–เซ‹!

เชฐเซเช• เชธเชพเชฎเชพเชจเซเชฏ เช“เชชเชฐเซ‡เชŸเชฐเชจเชพ เชคเชฎเชพเชฎ เชจเชฟเชฏเชฎเซ‹ เช…เชจเซเชธเชพเชฐ เชฌเชจเชพเชตเชตเชพเชฎเชพเช‚ เช†เชตเซ‡ เช›เซ‡. เชคเซ‡เชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเซ€เชจเซ‡ เชคเซ‡เชจเซ€ เชธเชพเชฅเซ‡ เช•เซเชฐเชฟเชฏเชพเชชเซเชฐเชคเชฟเช•เซเชฐเชฟเชฏเชพ เชฅเชพเชฏ เช›เซ‡ 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 เชซเชพเช‡เชฒ เชฆเซเชตเชพเชฐเชพ เชธเช‚เชธเชพเชงเชจเซ‹เชจเซ‡ "เช“เชฐเซเชกเชฐ" เช•เชฐเซ€เช เช›เซ€เช, เชœเซ‡เชจเชพ เชฎเชพเชŸเซ‡ เช‘เชชเชฐเซ‡เชŸเชฐ เชœเชฐเซ‚เชฐเซ€ เช†เชฆเซ‡เชถเซ‹ เชšเชฒเชพเชตเซ‡ เช›เซ‡ เช…เชจเซ‡ เช…เชฎเชจเซ‡ "เช…เชคเซเชฏเช‚เชค เชตเชพเชธเซเชคเชตเชฟเช•" เชฐเชนเชธเซเชฏ เช†เชชเซ‡ เช›เซ‡ เชœเซ‡เชจเซ€ เชธเชพเชฅเซ‡ เช…เชฎเซ‡ เช†เช—เชณ เช•เชพเชฎ เช•เชฐเซ€ เชถเช•เซ€เช เช›เซ€เช. (เชจเซ€เชšเซ‡ เชœเซเช“). เช…เชจเซ‡ เช‰เชชเชฐ เชธเซ‚เชšเชฟเชฌเชฆเซเชง เชšเชฒเซ‹เชฎเชพเช‚เชฅเซ€, เช†เชฆเซ‡เชถ เช…เชจเซ‡ เช—เซเชชเซเชค เชจเชพเชฎเชจเซเช‚ เชธเช‚เช•เชฒเชจ เช•เชฐเชตเชพเชฎเชพเช‚ เช†เชตเชถเซ‡.

เช† เช•เซ‡เชตเชพ เชชเซเชฐเช•เชพเชฐเชจเซ€ เชŸเซ€เชฎ เช›เซ‡? เช‘เชฌเซเชœเซ‡เช•เซเชŸ เชธเซเชŸเซ‹เชฐเซ‡เชœ เชฎเชพเชŸเซ‡ เชตเชชเชฐเชพเชถเช•เชฐเซเชคเชพ เชฌเชจเชพเชตเชคเซ€ เชตเช–เชคเซ‡, เชชเซ‹เชกเชจเซ€ เช…เช‚เชฆเชฐ เชฐเซเช• เช‘เชชเชฐเซ‡เชŸเชฐ เชจเซ€เชšเซ‡ เชฎเซเชœเชฌ เช•เชฐเชถเซ‡:

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

เช† เชœเซ‹เชฌเชฎเชพเช‚ เชธเซ‚เชšเชฟเชฌเชฆเซเชง เชคเชฎเชพเชฎ เช•เซเชฐเชฟเชฏเชพเช“ เช•เซเชฌเชฐเชจเซ‡เชŸเซเชธเชจเชพ เชฎเชพเชณเช–เชพเชฎเชพเช‚ เช•เชฐเชตเชพเชฎเชพเช‚ เช†เชตเซ€ เชนเชคเซ€. YAML เชซเชพเช‡เชฒเซ‹เชฎเชพเช‚ เชตเชฐเซเชฃเชตเซ‡เชฒ เชธเซเชŸเซเชฐเช•เซเชšเชฐเซเชธ เช—เชฟเชŸ เชฐเชฟเชชเซ‹เชเซ€เชŸเชฐเซ€เชฎเชพเช‚ เชธเช‚เช—เซเชฐเชนเชฟเชค เชฅเชพเชฏ เช›เซ‡ เช…เชจเซ‡ เช˜เชฃเซ€ เชตเช–เชค เชชเซเชจเชƒเช‰เชชเชฏเซ‹เช— เช•เชฐเชตเชพเชฎเชพเช‚ เช†เชตเซ‡ เช›เซ‡. เช…เชฎเซ‡ เช†เชจเซ‡ 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

เชœเซ‹ เช•เซ‡, เชฐเซเช•เชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเชคเซ€ เชตเช–เชคเซ‡ เช† เชธเชฎเชธเซเชฏเชพ เช…เชธเซเชคเชฟเชคเซเชตเชฎเชพเช‚ เชจเชฅเซ€. เชฎเชพเช‰เชจเซเชŸเชฟเช‚เช— เชชเซเชฐเช•เซเชฐเชฟเชฏเชพ เชคเซ‡เชจเชพ เช†เชงเชพเชฐเซ‡ เชคเซ‡เชจเชพ เชชเซ‹เชคเชพเชจเชพ เชกเซเชฐเชพเช‡เชตเชฐเซ‹เชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเซ€เชจเซ‡ เชฅเชพเชฏ เช›เซ‡ เชซเซเชฒเซ‡เช•เซเชธเชตเซ‹เชฒเซเชฏเซเชฎ เช…เชฅเชตเชพ CSI (เชนเชœเซ เชฌเซ€เชŸเชพ เชคเชฌเช•เซเช•เชพเชฎเชพเช‚ เช›เซ‡) เช…เชจเซ‡ เชคเซ‡เชฅเซ€ เชฐเชนเชธเซเชฏเซ‹เชจเซ€ เชœเชฐเซ‚เชฐ เชจเชฅเซ€.

เชฐเซเช• เช†เชชเชฎเซ‡เชณเซ‡ เช˜เชฃเซ€ เชธเชฎเชธเซเชฏเชพเช“ เชนเชฒ เช•เชฐเซ‡ เช›เซ‡, เชœเซ‡ เช…เชฎเชจเซ‡ เชจเชตเชพ เชชเซเชฐเซ‹เชœเซ‡เช•เซเชŸเซเชธเชฎเชพเช‚ เชคเซ‡เชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเชตเชพ เชชเซเชฐเซ‹เชคเซเชธเชพเชนเชฟเชค เช•เชฐเซ‡ เช›เซ‡.

เชฐเซเช•เชจเซ‹ เช˜เซ‡เชฐเซ‹

เชšเชพเชฒเซ‹ เชฐเซเช• เช…เชจเซ‡ เชธเซ‡เชซเชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเซ€เชจเซ‡ เชตเซเชฏเชตเชนเชพเชฐเซ เชญเชพเช— เชชเซ‚เชฐเซเชฃ เช•เชฐเซ€เช เชœเซ‡เชฅเซ€ เช•เชฐเซ€เชจเซ‡ เช†เชชเชฃเซ‡ เช†เชชเชฃเชพ เชชเซ‹เชคเชพเชจเชพ เชชเซเชฐเชฏเซ‹เช—เซ‹ เช•เชฐเซ€ เชถเช•เซ€เช. เช† เช…เชญเซ‡เชฆเซเชฏ เชŸเชพเชตเชฐ เชชเชฐ เชคเซ‹เชซเชพเชจ เช•เชฐเชตเชพเชจเซเช‚ เชธเชฐเชณ เชฌเชจเชพเชตเชตเชพ เชฎเชพเชŸเซ‡, เชตเชฟเช•เชพเชธเช•เชฐเซเชคเชพเช“เช เชนเซ‡เชฒเซเชฎ เชชเซ‡เช•เซ‡เชœ เชคเซˆเชฏเชพเชฐ เช•เชฐเซเชฏเซเช‚ เช›เซ‡. เชšเชพเชฒเซ‹ เชคเซ‡เชจเซ‡ เชกเชพเช‰เชจเชฒเซ‹เชก เช•เชฐเซ€เช:

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

เชซเชพเชˆเชฒเชฎเชพเช‚ rook-ceph/values.yaml เชคเชฎเซ‡ เช˜เชฃเซ€ เชตเชฟเชตเชฟเชง เชธเซ‡เชŸเชฟเช‚เช—เซเชธ เชถเซ‹เชงเซ€ เชถเช•เซ‹ เช›เซ‹. เชธเซŒเชฅเซ€ เชฎเชนเชคเซเชตเชจเซ€ เชฌเชพเชฌเชค เช เช›เซ‡ เช•เซ‡ เชเชœเชจเซเชŸเซ‹ เช…เชจเซ‡ เชถเซ‹เชง เชฎเชพเชŸเซ‡ เชธเชนเชจเชถเซ€เชฒเชคเชพเชจเซ‹ เช‰เชฒเซเชฒเซ‡เช– เช•เชฐเชตเซ‹. เช…เชฎเซ‡ เชตเชฟเช—เชคเชตเชพเชฐ เชตเชฐเซเชฃเชจ เช•เชฐเซเชฏเซเช‚ เช›เซ‡ เช•เซ‡ เชฆเซ‚เชทเชฟเชคเชคเชพ/เชธเชนเชจเชถเซ€เชฒเชคเชพ เชชเชฆเซเชงเชคเชฟเชจเซ‹ เช‰เชชเชฏเซ‹เช— เชถเซเช‚ เชฎเชพเชŸเซ‡ เชฅเชˆ เชถเช•เซ‡ เช›เซ‡ เช† เชฒเซ‡เช–.

เชŸเซ‚เช‚เช•เชฎเชพเช‚, เช…เชฎเซ‡ เชจเชฅเซ€ เช‡เชšเซเช›เชคเชพ เช•เซ‡ เช•เซเชฒเชพเชฏเช‚เชŸ เชเชชเซเชฒเชฟเช•เซ‡เชถเชจ เชชเซ‹เชกเซเชธ เชกเซ‡เชŸเชพ เชธเซเชŸเซ‹เชฐเซ‡เชœ เชกเชฟเชธเซเช• เชœเซ‡เชตเชพ เชœ เชจเซ‹เชกเซเชธ เชชเชฐ เชธเซเชฅเชฟเชค เชนเซ‹เชฏ. เช•เชพเชฐเชฃ เชธเชฐเชณ เช›เซ‡: เช† เชฐเซ€เชคเซ‡ เชฐเซเช• เชเชœเชจเซเชŸเซ‹เชจเซเช‚ เช•เชพเชฐเซเชฏ เชเชชเซเชฒเชฟเช•เซ‡เชถเชจเชจเซ‡ เช…เชธเชฐ เช•เชฐเชถเซ‡ เชจเชนเซ€เช‚.

เชคเซ‡เชฅเซ€, เชซเชพเช‡เชฒ เช–เซ‹เชฒเซ‹ 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 install --namespace ${ROOK_NAMESPACE} ./rook-ceph

เชนเชตเซ‡ เชคเชฎเชพเชฐเซ‡ เช•เซเชฒเชธเซเชŸเชฐ เชฌเชจเชพเชตเชตเชพเชจเซ€ เช…เชจเซ‡ เชธเซเชฅเชพเชจเชจเซ‹ เช‰เชฒเซเชฒเซ‡เช– เช•เชฐเชตเชพเชจเซ€ เชœเชฐเซ‚เชฐ เช›เซ‡ เช“เชเชธเชกเซ€:

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

เชตเชงเซเชฎเชพเช‚, เชตเชงเชพเชฐเชพเชจเชพ เช˜เชŸเช•เซ‹เชจเซ‡ เชˆเชšเซเช›เชพ เชชเซเชฐเชฎเชพเชฃเซ‡ เช—เซ‹เช เชตเซ€ เชถเช•เชพเชฏ เช›เซ‡. เชคเซ‡เชฎเชจเชพ เชตเชฟเชถเซ‡ เชตเชงเซ เชตเชฟเช—เชคเซ‹ เช†เชฎเชพเช‚ เชธเซ‚เชšเชตเชตเชพเชฎเชพเช‚ เช†เชตเซ€ เช›เซ‡ เชฆเชธเซเชคเชพเชตเซ‡เชœเซ€เช•เชฐเชฃ. เชตเชนเซ€เชตเชŸ เชฎเชพเชŸเซ‡, เช…เชฎเซ‡ เชกเซ‡เชถเชฌเซ‹เชฐเซเชก เช…เชจเซ‡ เชŸเซ‚เชฒเชฌเซ‹เช•เซเชธ เช‡เชจเซเชธเซเชŸเซ‹เชฒ เช•เชฐเชตเชพเชจเซ€ เชญเชพเชฐเชชเซ‚เชฐเซเชตเช• เชญเชฒเชพเชฎเชฃ เช•เชฐเซ€เช เช›เซ€เช.

เชฐเซเช• เช…เชจเซ‡ เชนเซเช•เซเชธ: เชถเซเช‚ เชฐเซเช• เชฆเชฐเซ‡เช• เชตเชธเซเชคเซ เชฎเชพเชŸเซ‡ เชชเซ‚เชฐเชคเซเช‚ เช›เซ‡?

เชœเซ‡เชฎ เชคเชฎเซ‡ เชœเซ‹เชˆ เชถเช•เซ‹ เช›เซ‹, เชฐเซเช•เชจเซ‹ เชตเชฟเช•เชพเชธ เชชเซ‚เชฐเชœเซ‹เชถเชฎเชพเช‚ เช›เซ‡. เชชเชฐเช‚เชคเซ เชนเชœเซ€ เชชเชฃ เชเชตเซ€ เชธเชฎเชธเซเชฏเชพเช“ เช›เซ‡ เชœเซ‡ เช…เชฎเชจเซ‡ เชธเซ‡เชซเชจเชพ เชฎเซ‡เชจเซเชฏเซเช…เชฒ เช—เซ‹เช เชตเชฃเซ€เชจเซ‡ เชธเช‚เชชเซ‚เชฐเซเชฃเชชเชฃเซ‡ เช›เซ‹เชกเซ€ เชฆเซ‡เชตเชพเชจเซ€ เชฎเช‚เชœเซ‚เชฐเซ€ เช†เชชเชคเซ€ เชจเชฅเซ€:

  • เช•เซ‹เชˆ เชฐเซเช• เชกเซเชฐเชพเชˆเชตเชฐ เชจเชฅเซ€ เช•เชฐเซ€ เชถเช•เชคเชพ เชจเชฅเซ€ เชฎเชพเช‰เชจเซเชŸเซ‡เชก เชฌเซเชฒเซ‹เช•เซเชธเชจเชพ เช‰เชชเชฏเซ‹เช— เชชเชฐ เชจเชฟเช•เชพเชธ เชฎเซ‡เชŸเซเชฐเชฟเช•เซเชธ, เชœเซ‡ เช…เชฎเชจเซ‡ เชฆเซ‡เช–เชฐเซ‡เช–เชฅเซ€ เชตเช‚เชšเชฟเชค เชฐเชพเช–เซ‡ เช›เซ‡.
  • เชซเซเชฒเซ‡เช•เซเชธเชตเซ‹เชฒเซเชฏเซเชฎ เช…เชจเซ‡ CSI เช•เซ‡เชตเซ€ เชฐเซ€เชคเซ‡ เช–เชฌเชฐ เชจเชฅเซ€ เชตเซ‹เชฒเซเชฏเซเชฎเชจเซเช‚ เช•เชฆ เชฌเชฆเชฒเซ‹ (เชธเชฎเชพเชจ เช†เชฐเชฌเซ€เชกเซ€เชจเซ€ เชตเชฟเชฐเซเชฆเซเชง), เชคเซ‡เชฅเซ€ เชฐเซเช• เช‰เชชเชฏเซ‹เช—เซ€ (เช…เชจเซ‡ เช•เซเชฏเชพเชฐเซ‡เช• เชตเชฟเชตเซ‡เชšเชจเชพเชคเซเชฎเช• เชฐเซ€เชคเซ‡ เชœเชฐเซ‚เชฐเซ€!) เชธเชพเชงเชจเชฅเซ€ เชตเช‚เชšเชฟเชค เชฐเชนเซ‡ เช›เซ‡.
  • เชฐเซเช• เชนเชœเซ เชชเชฃ เชจเชฟเชฏเชฎเชฟเชค เช•เซ‡เชซเชจเซ€ เชœเซ‡เชฎ เชฒเชตเชšเซ€เช• เชจเชฅเซ€. เชœเซ‹ เช†เชชเชฃเซ‡ เชธเซ‡เชซเชเชซเชเชธ เชฎเซ‡เชŸเชพเชกเซ‡เชŸเชพเชจเซ‡ SSD เชชเชฐ เชธเช‚เช—เซเชฐเชนเชฟเชค เช•เชฐเชตเชพ เชฎเชพเชŸเซ‡ เชชเซ‚เชฒเชจเซ‡ เช—เซ‹เช เชตเชตเชพ เชฎเชพเช‚เช—เซ€เช เช›เซ€เช, เช…เชจเซ‡ เชกเซ‡เชŸเชพ เชชเซ‹เชคเซ‡ HDD เชชเชฐ เชธเช‚เช—เซเชฐเชนเชฟเชค เชฅเชพเชฏ เช›เซ‡, เชคเซ‹ เช…เชฎเชพเชฐเซ‡ CRUSH เชจเช•เชถเชพเชฎเชพเช‚ เชฎเซ‡เชจเซเชฏเซเช…เชฒเซ€ เช‰เชชเช•เชฐเชฃเซ‹เชจเชพ เช…เชฒเช— เชœเซ‚เชฅเซ‹เชจเซ€ เชจเซ‹เช‚เชงเชฃเซ€ เช•เชฐเชตเชพเชจเซ€ เชœเชฐเซ‚เชฐ เชชเชกเชถเซ‡.
  • เชฐเซเช•-เชธเซ‡เชซ-เช“เชชเชฐเซ‡เชŸเชฐเชจเซ‡ เชธเซเชฅเชฟเชฐ เชฎเชพเชจเชตเชพเชฎเชพเช‚ เช†เชตเซ‡ เช›เซ‡ เชคเซ‡ เชนเช•เซ€เช•เชค เชนเซ‹เชตเชพ เช›เชคเชพเช‚, เชนเชพเชฒเชฎเชพเช‚ เชธเช‚เชธเซเช•เชฐเชฃ 13 เชฅเซ€ 14 เชธเซเชงเซ€ Ceph เชจเซ‡ เช…เชชเช—เซเชฐเซ‡เชก เช•เชฐเชคเซ€ เชตเช–เชคเซ‡ เช•เซ‡เชŸเชฒเซ€เช• เชธเชฎเชธเซเชฏเชพเช“ เช›เซ‡.

เชคเชพเชฐเชฃเซ‹

"เช…เชคเซเชฏเชพเชฐเซ‡ เชฐเซเช• เชฌเชนเชพเชฐเชจเซ€ เชฆเซเชจเชฟเชฏเชพเชฅเซ€ เชชเซเชฏเชพเชฆเชพเช“ เชฆเซเชตเชพเชฐเชพ เชฌเช‚เชง เช›เซ‡, เชชเชฐเช‚เชคเซ เช…เชฎเซ‡ เชฎเชพเชจเซ€เช เช›เซ€เช เช•เซ‡ เชเช• เชฆเชฟเชตเชธ เชคเซ‡ เชฐเชฎเชคเชฎเชพเช‚ เชจเชฟเชฐเซเชฃเชพเชฏเช• เชญเซ‚เชฎเชฟเช•เชพ เชญเชœเชตเชถเซ‡!" (เช† เชฒเซ‡เช– เชฎเชพเชŸเซ‡ เช–เชพเชธ เชถเซ‹เชงเชพเชฏเซ‡เชฒ เช…เชตเชคเชฐเชฃ)

เชฐเซเช• เชชเซเชฐเซ‹เชœเซ‡เช•เซเชŸเซ‡ เชจเชฟเชƒเชถเช‚เช•เชชเชฃเซ‡ เช…เชฎเชพเชฐเซเช‚ เชนเซƒเชฆเชฏ เชœเซ€เชคเซ€ เชฒเซ€เชงเซเช‚ เช›เซ‡ - เช…เชฎเซ‡ เชฎเชพเชจเซ€เช เช›เซ€เช เช•เซ‡ [เชคเซ‡เชจเชพ เชคเชฎเชพเชฎ เช—เซเชฃเชฆเซ‹เชท เชธเชพเชฅเซ‡] เชคเซ‡ เชšเซ‹เช•เซเช•เชธเชชเชฃเซ‡ เชคเชฎเชพเชฐเชพ เชงเซเชฏเชพเชจเชจเซ‡ เชชเชพเชคเซเชฐ เช›เซ‡.

เช…เชฎเชพเชฐเซ€ เชญเชพเชตเชฟ เชฏเซ‹เชœเชจเชพเช“ เชฐเซ‚เช•-เชธเซ‡เชซ เชฎเชพเชŸเซ‡ เชฎเซ‹เชกเซเชฏเซเชฒ เชฌเชจเชพเชตเชตเชพ เชฎเชพเชŸเซ‡ เช‰เช•เชณเซ‡ เช›เซ‡ เชเชกเช“เชจ เช“เชชเชฐเซ‡เชŸเชฐ, เชœเซ‡ เช…เชฎเชพเชฐเชพ เช…เชธเช‚เช–เซเชฏ เช•เซเชฌเชฐเชจเซ‡เชŸเซเชธ เช•เซเชฒเชธเซเชŸเชฐเซ‹เชฎเชพเช‚ เชคเซ‡เชจเซ‹ เช‰เชชเชฏเซ‹เช— เชตเชงเซ เชธเชฐเชณ เช…เชจเซ‡ เชตเชงเซ เช…เชจเซเช•เซ‚เชณ เชฌเชจเชพเชตเชถเซ‡.

PS

เช…เชฎเชพเชฐเชพ เชฌเซเชฒเซ‹เช— เชชเชฐ เชชเชฃ เชตเชพเช‚เชšเซ‹:

เชธเซ‹เชฐเซเชธ: www.habr.com

เชเช• เชŸเชฟเชชเซเชชเชฃเซ€ เช‰เชฎเซ‡เชฐเซ‹