рд░реВрдХ рдХреЛ рдпрд╛ рд░реВрдХ рдХреЛ рдирд╣реАрдВ - рдпрд╣реА рд╕рд╡рд╛рд▓ рд╣реИ

рд░реВрдХ рдХреЛ рдпрд╛ рд░реВрдХ рдХреЛ рдирд╣реАрдВ - рдпрд╣реА рд╕рд╡рд╛рд▓ рд╣реИ

рдЗрд╕ рдорд╣реАрдиреЗ рдХреА рд╢реБрд░реБрдЖрдд рдореЗрдВ, 3 рдордИ рдХреЛ, "рдХреБрдмреЗрд░рдиреЗрдЯреНрд╕ рдореЗрдВ рд╡рд┐рддрд░рд┐рдд рдбреЗрдЯрд╛ рднрдВрдбрд╛рд░рдг рдХреЗ рд▓рд┐рдП рдкреНрд░рдмрдВрдзрди рдкреНрд░рдгрд╛рд▓реА" рдХреА рдПрдХ рдмрдбрд╝реА рд░рд┐рд▓реАрдЬ рдХреА рдШреЛрд╖рдгрд╛ рдХреА рдЧрдИ рдереА - рд░реВрдХ 1.0.0. рдПрдХ рд╡рд░реНрд╖ рд╕реЗ рдЕрдзрд┐рдХ рд╕рдордп рдкрд╣рд▓реЗ рд╣реА рд╣рдо рдкреНрд░рдХрд╛рд╢рд┐рдд рд░реВрдХ рдХрд╛ рд╕рд╛рдорд╛рдиреНрдп рдЕрд╡рд▓реЛрдХрдиред рдлрд┐рд░ рд╣рдорд╕реЗ рдЙрдирдХреЗ рдЕрдиреБрднрд╡ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░рдиреЗ рдХреЛ рдХрд╣рд╛ рдЧрдпрд╛ рд╡реНрдпрд╡рд╣рд╛рд░ рдореЗрдВ рдкреНрд░рдпреЛрдЧ рдХрд░реЗрдВ - рдФрд░ рдЕрдм, рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреЗ рдЗрддрд┐рд╣рд╛рд╕ рдореЗрдВ рдЗрддрдиреЗ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдореАрд▓ рдХреЗ рдкрддреНрдерд░ рдХреЗ рдареАрдХ рд╕рдордп рдкрд░, рд╣рдо рдЕрдкрдиреЗ рд╕рдВрдЪрд┐рдд рдЕрдиреБрднрд╡реЛрдВ рдХреЛ рд╕рд╛рдЭрд╛ рдХрд░рдиреЗ рдореЗрдВ рдкреНрд░рд╕рдиреНрди рд╣реИрдВред

рд╕рдВрдХреНрд╖реЗрдк рдореЗрдВ, рд░реВрдХ рдПрдХ рд╕рдореБрдЪреНрдЪрдп рд╣реИ рдСрдкрд░реЗрдЯрд░реЛрдВ рдХреБрдмреЗрд░рдиреЗрдЯреНрд╕ рдХреЗ рд▓рд┐рдП, рдЬреЛ рд╕реЗрдл, рдПрдЬрдПрдлрдПрд╕, рдорд┐рдирд┐рдУ, рдХреИрд╕реЗрдВрдбреНрд░рд╛, рдХреЙрдХрд░реЛрдЪрдбреАрдмреА рдЬреИрд╕реЗ рдбреЗрдЯрд╛ рднрдВрдбрд╛рд░рдг рд╕рдорд╛рдзрд╛рдиреЛрдВ рдХреА рддреИрдирд╛рддреА, рдкреНрд░рдмрдВрдзрди, рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рдкреБрдирд░реНрдкреНрд░рд╛рдкреНрддрд┐ рдХрд╛ рдкреВрд░реНрдг рдирд┐рдпрдВрддреНрд░рдг рд▓реЗрддрд╛ рд╣реИред

рдлрд┐рд▓рд╣рд╛рд▓ рд╕рдмрд╕реЗ рд╡рд┐рдХрд╕рд┐рдд (рдФрд░ рдПрдХрдорд╛рддреНрд░ ╨▓ рд╕реНрдерд┐рд░ рд╕реНрдЯреЗрдЬ) рд╕рдорд╛рдзрд╛рди рд╣реИ рд░реВрдХ-рд╕реЗрдл-рдСрдкрд░реЗрдЯрд░.

рдиреЛрдЯ: рд╕реЗрдл рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рд░реВрдХ 1.0.0 рд░рд┐рд▓реАрдЬ рдореЗрдВ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдмрджрд▓рд╛рд╡реЛрдВ рдХреЗ рдмреАрдЪ, рд╣рдо рд╕реЗрдл рдиреЙрдЯрд┐рд▓рд╕ рдХреЗ рд▓рд┐рдП рд╕рдорд░реНрдерди рдФрд░ рд╕реЗрдлрдПрдлрдПрд╕ рдпрд╛ рдЖрд░рдЬреАрдбрдмреНрд▓реНрдпреВ рдмрдХреЗрдЯ рдХреЗ рд▓рд┐рдП рдПрдирдПрдлрдПрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рдХреЛ рдиреЛрдЯ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рджреВрд╕рд░реЛрдВ рдХреЗ рдмреАрдЪ рдЬреЛ рдмрд╛рдд рд╕рдмрд╕реЗ рдЕрд▓рдЧ рд╣реИ рд╡рд╣ рд╣реИ рдПрдЬрдПрдлрдПрд╕ рд╕рдкреЛрд░реНрдЯ рдХрд╛ рдмреАрдЯрд╛ рд╕реНрддрд░ рдкрд░ рдкрд░рд┐рдкрдХреНрд╡ рд╣реЛрдирд╛ред

рддреЛ, рдЗрд╕ рд▓реЗрдЦ рдореЗрдВ рд╣рдо:

  • рдЖрдЗрдП рдЗрд╕ рдкреНрд░рд╢реНрди рдХрд╛ рдЙрддреНрддрд░ рджреЗрдВ рдХрд┐ рдХреБрдмреЗрд░рдиреЗрдЯреНрд╕ рдХреНрд▓рд╕реНрдЯрд░ рдореЗрдВ рд╕реЗрдл рдХреЛ рддреИрдирд╛рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд░реВрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдореЗрдВ рд╣рдореЗрдВ рдХреНрдпрд╛ рдлрд╛рдпрджреЗ рдорд┐рд▓рддреЗ рд╣реИрдВ;
  • рд╣рдо рдЙрддреНрдкрд╛рджрди рдореЗрдВ рд░реВрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рдЕрдкрдиреЗ рдЕрдиреБрднрд╡ рдФрд░ рдЫрд╛рдкреЛрдВ рдХреЛ рд╕рд╛рдЭрд╛ рдХрд░реЗрдВрдЧреЗ;
  • рдЖрдЗрдП рдЖрдкрдХреЛ рдмрддрд╛рдПрдВ рдХрд┐ рд╣рдо рд░реВрдХ рдХреЛ "рд╣рд╛рдВ!" рдХреНрдпреЛрдВ рдХрд╣рддреЗ рд╣реИрдВ, рдФрд░ рдЙрд╕рдХреЗ рд▓рд┐рдП рд╣рдорд╛рд░реА рдпреЛрдЬрдирд╛рдУрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВред

рдЖрдЗрдП рд╕рд╛рдорд╛рдиреНрдп рдЕрд╡рдзрд╛рд░рдгрд╛рдУрдВ рдФрд░ рд╕рд┐рджреНрдзрд╛рдВрдд рд╕реЗ рд╢реБрд░реВ рдХрд░реЗрдВред

"рдореБрдЭреЗ рдПрдХ рд░реВрдХ рдХрд╛ рдлрд╛рдпрджрд╛ рд╣реИ!" (рдЕрдЬреНрдЮрд╛рдд рд╢рддрд░рдВрдЬ рдЦрд┐рд▓рд╛рдбрд╝реА)

рд░реВрдХ рдХреЛ рдпрд╛ рд░реВрдХ рдХреЛ рдирд╣реАрдВ - рдпрд╣реА рд╕рд╡рд╛рд▓ рд╣реИ

рд░реВрдХ рдХрд╛ рдПрдХ рдореБрдЦреНрдп рд▓рд╛рдн рдпрд╣ рд╣реИ рдХрд┐ рдбреЗрдЯрд╛ рд╕реНрдЯреЛрд░ рдХреЗ рд╕рд╛рде рдмрд╛рддрдЪреАрдд рдХреБрдмреЗрд░рдиреЗрдЯреНрд╕ рддрдВрддреНрд░ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдХреА рдЬрд╛рддреА рд╣реИред рдЗрд╕рдХрд╛ рдорддрд▓рдм рдпрд╣ рд╣реИ рдХрд┐ рдЕрдм рдЖрдкрдХреЛ рд╢реАрдЯ рд╕реЗ рдХрдВрд╕реЛрд▓ рдореЗрдВ рд╕реЗрдл рдХреЛ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрдорд╛рдВрдб рдХреЛ рдХреЙрдкреА рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред

тАФ рдХреНрдпрд╛ рдЖрдк CephFS рдХреЛ рдХреНрд▓рд╕реНрдЯрд░ рдореЗрдВ рддреИрдирд╛рдд рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ? рдмрд╕ рдПрдХ YAML рдлрд╝рд╛рдЗрд▓ рд▓рд┐рдЦреЗрдВ!
- рдХреНрдпрд╛? рдХреНрдпрд╛ рдЖрдк рднреА S3 API рдХреЗ рд╕рд╛рде рдПрдХ рдСрдмреНрдЬреЗрдХреНрдЯ рд╕реНрдЯреЛрд░ рддреИрдирд╛рдд рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ? рдмрд╕ рджреВрд╕рд░реА YAML рдлрд╝рд╛рдЗрд▓ рд▓рд┐рдЦреЗрдВ!

Rook рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдСрдкрд░реЗрдЯрд░ рдХреЗ рд╕рднреА рдирд┐рдпрдореЛрдВ рдХреЗ рдЕрдиреБрд╕рд╛рд░ рдмрдирд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЙрд╕рдХреЗ рд╕рд╛рде рдмрд╛рддрдЪреАрдд рдХрд╛ рдЙрдкрдпреЛрдЧ рд╣реЛрддрд╛ рд╣реИ рд╕реАрдЖрд░рдбреА (рдХрд╕реНрдЯрдо рд╕рдВрд╕рд╛рдзрди рдкрд░рд┐рднрд╛рд╖рд╛рдПрдБ), рдЬрд┐рд╕рдореЗрдВ рд╣рдо рд╕реЗрдл рд╕рдВрд╕реНрдерд╛рдУрдВ рдХреА рдЙрди рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдХрд╛ рд╡рд░реНрдгрди рдХрд░рддреЗ рд╣реИрдВ рдЬрд┐рдирдХреА рд╣рдореЗрдВ рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ (рдЪреВрдБрдХрд┐ рдпрд╣ рдПрдХрдорд╛рддреНрд░ рд╕реНрдерд┐рд░ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╣реИ, рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ рдпрд╣ рд▓реЗрдЦ рд╕реЗрдлрд╝ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░реЗрдЧрд╛, рдЬрдм рддрдХ рдХрд┐ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдЕрдиреНрдпрдерд╛ рди рдХрд╣рд╛ рдЧрдпрд╛ рд╣реЛ). рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдорд╛рдкрджрдВрдбреЛрдВ рдХреЗ рдЕрдиреБрд╕рд╛рд░, рдСрдкрд░реЗрдЯрд░ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рдХрдорд╛рдВрдб рдХреЛ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░реЗрдЧрд╛ред

рдЖрдЗрдП рдСрдмреНрдЬреЗрдХреНрдЯ рд╕реНрдЯреЛрд░ рдмрдирд╛рдиреЗ рдХреЗ рдЙрджрд╛рд╣рд░рдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╡рд┐рд╢рд┐рд╖реНрдЯрддрд╛рдУрдВ рдХреЛ рджреЗрдЦреЗрдВ, рдпрд╛ рдпреЛрдВ рдХрд╣реЗрдВ - 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 рдлрд╝рд╛рдЗрд▓реЛрдВ рдореЗрдВ рд╡рд░реНрдгрд┐рдд рд╕рдВрд░рдЪрдирд╛рдПрдБ Git рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рдХреА рдЬрд╛рддреА рд╣реИрдВ рдФрд░ рдХрдИ рдмрд╛рд░ рдкреБрди: рдЙрдкрдпреЛрдЧ рдХреА рдЬрд╛рддреА рд╣реИрдВред рд╣рдо рдЗрд╕реЗ DevOps рдЗрдВрдЬреАрдирд┐рдпрд░реЛрдВ рдФрд░ рд╕рдордЧреНрд░ рд░реВрдк рд╕реЗ CI/CD рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЗ рд▓рд┐рдП рдПрдХ рдмрдбрд╝реЗ рд▓рд╛рдн рдХреЗ рд░реВрдк рдореЗрдВ рджреЗрдЦрддреЗ рд╣реИрдВред

рд░реВрдХ рдФрд░ рд░рд╛рдбреЛрд╕ рд╕реЗ рдЦреБрд╢

рд╕реЗрдл + рдЖрд░рдмреАрдбреА рд╕рдВрдпреЛрдЬрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдкреЙрдбреНрд╕ рдкрд░ рдмрдврд╝рддреЗ рд╡реЙрд▓реНрдпреВрдо рдкрд░ рдХреБрдЫ рдкреНрд░рддрд┐рдмрдВрдз рд▓рдЧрд╛рддрд╛ рд╣реИред

рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ, рд╕реНрдЯреЗрдЯрдлреБрд▓ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЗ рдХрд╛рд░реНрдп рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдиреЗрдорд╕реНрдкреЗрд╕ рдореЗрдВ рд╕реЗрдл рддрдХ рдкрд╣реБрдВрдЪрдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд░рд╣рд╕реНрдп рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред рдпрд╣ рдареАрдХ рд╣реИ рдпрджрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ рдЙрдирдХреЗ рдирд╛рдорд╕реНрдерд╛рди рдореЗрдВ 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

рд╣рд╛рд▓рд╛рдБрдХрд┐, рд░реВрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╕рдордп рдпрд╣ рд╕рдорд╕реНрдпрд╛ рдореМрдЬреВрдж рд╣реА рдирд╣реАрдВ рд╣реИред рдорд╛рдЙрдВрдЯрд┐рдВрдЧ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдЕрдкрдиреЗ рд╕реНрд╡рдпрдВ рдХреЗ рдбреНрд░рд╛рдЗрд╡рд░реЛрдВ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рд╣реЛрддреА рд╣реИ рдлреНрд▓реЗрдХреНрд╕рд╡реЙрд▓реНрдпреВрдо рдпрд╛ рд╕реАрдПрд╕рдЖрдИ (рдЕрднреА рднреА рдмреАрдЯрд╛ рдЪрд░рдг рдореЗрдВ) рдФрд░ рдЗрд╕рд▓рд┐рдП рд░рд╣рд╕реНрдпреЛрдВ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред

рд░реВрдХ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдХрдИ рд╕рдорд╕реНрдпрд╛рдУрдВ рдХрд╛ рд╕рдорд╛рдзрд╛рди рдХрд░рддрд╛ рд╣реИ, рдЬреЛ рд╣рдореЗрдВ рдирдИ рдкрд░рд┐рдпреЛрдЬрдирд╛рдУрдВ рдореЗрдВ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкреНрд░реЛрддреНрд╕рд╛рд╣рд┐рдд рдХрд░рддрд╛ рд╣реИред

рд░реВрдХ рдХреА рдШреЗрд░рд╛рдмрдВрджреА

рдЖрдЗрдП рд░реВрдХ рдФрд░ рд╕реЗрдл рдХреЛ рддреИрдирд╛рдд рдХрд░рдХреЗ рд╡реНрдпрд╛рд╡рд╣рд╛рд░рд┐рдХ рднрд╛рдЧ рдХреЛ рдкреВрд░рд╛ рдХрд░реЗрдВ рддрд╛рдХрд┐ рд╣рдо рдЕрдкрдиреЗ рд╕реНрд╡рдпрдВ рдХреЗ рдкреНрд░рдпреЛрдЧ рдХрд░ рд╕рдХреЗрдВред рдЗрд╕ рдЕрднреЗрджреНрдп рдЯрд╛рд╡рд░ рдкрд░ рдзрд╛рд╡рд╛ рдмреЛрд▓рдирд╛ рдЖрд╕рд╛рди рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдбреЗрд╡рд▓рдкрд░реНрд╕ рдиреЗ рдПрдХ рд╣реЗрд▓реНрдо рдкреИрдХреЗрдЬ рддреИрдпрд╛рд░ рдХрд┐рдпрд╛ рд╣реИред рдЖрдЗрдП рдЗрд╕реЗ рдбрд╛рдЙрдирд▓реЛрдб рдХрд░реЗрдВ:

$ 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"

рд╕реЗрдл рд╕реНрдерд┐рддрд┐ рдХреА рдЬрд╛рдБрдЪ - рджреЗрдЦрдиреЗ рдХреА рдЙрдореНрдореАрдж рд╣реИ 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

рдЙрд╕реА рд╕рдордп, рдЖрдЗрдП рдЬрд╛рдБрдЪ рдХрд░реЗрдВ рдХрд┐ рдХреНрд▓рд╛рдЗрдВрдЯ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рд╡рд╛рд▓реЗ рдкреЙрдбреНрд╕ рд╕реЗрдл рдХреЗ рд▓рд┐рдП рдЖрд░рдХреНрд╖рд┐рдд рдиреЛрдбреНрд╕ рдкрд░ рд╕рдорд╛рдкреНрдд рди рд╣реЛрдВ:

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

рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдЕрддрд┐рд░рд┐рдХреНрдд рдШрдЯрдХреЛрдВ рдХреЛ рдЗрдЪреНрдЫрд╛рдиреБрд╕рд╛рд░ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдЙрдирдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЕрдзрд┐рдХ рдЬрд╛рдирдХрд╛рд░реА рджреА рдЧрдИ рд╣реИ рдкреНрд░рд▓реЗрдЦрди. рдкреНрд░рд╢рд╛рд╕рди рдХреЗ рд▓рд┐рдП, рд╣рдо рджреГрдврд╝рддрд╛ рд╕реЗ рдбреИрд╢рдмреЛрд░реНрдб рдФрд░ рдЯреВрд▓рдмреЙрдХреНрд╕ рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрд╢рдВрд╕рд╛ рдХрд░рддреЗ рд╣реИрдВред

рд░реВрдХ рдФрд░ рд╣реБрдХ: рдХреНрдпрд╛ рд░реВрдХ рд╣рд░ рдЪреАрдЬ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рд╣реИ?

рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рд░реВрдХ рдХрд╛ рд╡рд┐рдХрд╛рд╕ рдЬреЛрд░реЛрдВ рдкрд░ рд╣реИред рд▓реЗрдХрд┐рди рдЕрднреА рднреА рдРрд╕реА рд╕рдорд╕реНрдпрд╛рдПрдВ рд╣реИрдВ рдЬреЛ рд╣рдореЗрдВ рд╕реЗрдл рдХреЗ рдореИрдиреНрдпреБрдЕрд▓ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдХреЛ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рддреНрдпрд╛рдЧрдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рдирд╣реАрдВ рджреЗрддреА рд╣реИрдВ:

  • рдХреЛрдИ рд░реВрдХ рдбреНрд░рд╛рдЗрд╡рд░ рдирд╣реАрдВ рдирд╣реА рд╕рдХрддрд╛ рдорд╛рдЙрдВрдЯреЗрдб рдмреНрд▓реЙрдХреЛрдВ рдХреЗ рдЙрдкрдпреЛрдЧ рдкрд░ рдирд┐рд░реНрдпрд╛рдд рдореЗрдЯреНрд░рд┐рдХреНрд╕, рдЬреЛ рд╣рдореЗрдВ рдирд┐рдЧрд░рд╛рдиреА рд╕реЗ рд╡рдВрдЪрд┐рдд рдХрд░рддрд╛ рд╣реИред
  • рдлреНрд▓реЗрдХреНрд╕рд╡реЙрд▓реНрдпреВрдо рдФрд░ рд╕реАрдПрд╕рдЖрдИ рдкрддрд╛ рдирд╣реАрдВ рдХреИрд╕реЗ рд╡реЙрд▓реНрдпреВрдо рдХрд╛ рдЖрдХрд╛рд░ рдмрджрд▓реЗрдВ (рдЙрд╕реА рдЖрд░рдмреАрдбреА рдХреЗ рд╡рд┐рдкрд░реАрдд), рдЗрд╕рд▓рд┐рдП рд░реВрдХ рдПрдХ рдЙрдкрдпреЛрдЧреА (рдФрд░ рдХрднреА-рдХрднреА рдЧрдВрднреАрд░ рд░реВрдк рд╕реЗ рдЖрд╡рд╢реНрдпрдХ!) рдЯреВрд▓ рд╕реЗ рд╡рдВрдЪрд┐рдд рд╣реИред
  • рд░реВрдХ рдЕрднреА рднреА рдирд┐рдпрдорд┐рдд рд╕реЗрдл рдЬрд┐рддрдирд╛ рд▓рдЪреАрд▓рд╛ рдирд╣реАрдВ рд╣реИред рдпрджрд┐ рд╣рдо SSD рдкрд░ рд╕рдВрдЧреНрд░рд╣реАрдд CephFS рдореЗрдЯрд╛рдбреЗрдЯрд╛ рдХреЗ рд▓рд┐рдП рдкреВрд▓ рдХреЛ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рдФрд░ рдбреЗрдЯрд╛ рдХреЛ HDD рдкрд░ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рд╣рдореЗрдВ CRUSH рдорд╛рдирдЪрд┐рддреНрд░реЛрдВ рдореЗрдВ рдЙрдкрдХрд░рдгреЛрдВ рдХреЗ рдЕрд▓рдЧ-рдЕрд▓рдЧ рд╕рдореВрд╣реЛрдВ рдХреЛ рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ рдкрдВрдЬреАрдХреГрдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреАред
  • рдЗрд╕ рддрдереНрдп рдХреЗ рдмрд╛рд╡рдЬреВрдж рдХрд┐ rook-ceph-рдСрдкрд░реЗрдЯрд░ рдХреЛ рд╕реНрдерд┐рд░ рдорд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИ, рд╡рд░реНрддрдорд╛рди рдореЗрдВ Ceph рдХреЛ рд╕рдВрд╕реНрдХрд░рдг 13 рд╕реЗ 14 рдореЗрдВ рдЕрдкрдЧреНрд░реЗрдб рдХрд░рддреЗ рд╕рдордп рдХреБрдЫ рд╕рдорд╕реНрдпрд╛рдПрдВ рд╣реИрдВред

рдирд┐рд╖реНрдХрд░реНрд╖

"рдЕрднреА рдкреНрдпрд╛рджреЛрдВ рджреНрд╡рд╛рд░рд╛ рд░реВрдХ рдХреЛ рдмрд╛рд╣рд░реА рджреБрдирд┐рдпрд╛ рд╕реЗ рджреВрд░ рд░рдЦрд╛ рдЧрдпрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рд╣рдореЗрдВ рд╡рд┐рд╢реНрд╡рд╛рд╕ рд╣реИ рдХрд┐ рдПрдХ рджрд┐рди рд╡рд╣ рдЦреЗрд▓ рдореЗрдВ рдирд┐рд░реНрдгрд╛рдпрдХ рднреВрдорд┐рдХрд╛ рдирд┐рднрд╛рдПрдЧреА!" (рдЗрд╕ рд▓реЗрдЦ рдХреЗ рд▓рд┐рдП рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдЖрд╡рд┐рд╖реНрдХрд╛рд░ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдЙрджреНрдзрд░рдг)

рд░реВрдХ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдиреЗ рдирд┐рд╕реНрд╕рдВрджреЗрд╣ рд╣рдорд╛рд░рд╛ рджрд┐рд▓ рдЬреАрдд рд▓рд┐рдпрд╛ рд╣реИ - рд╣рдорд╛рд░рд╛ рдорд╛рдирдирд╛ тАЛтАЛрд╣реИ рдХрд┐ [рдЗрд╕рдХреЗ рд╕рднреА рдлрд╛рдпрджреЗ рдФрд░ рдиреБрдХрд╕рд╛рди рдХреЗ рд╕рд╛рде] рдпрд╣ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдЖрдкрдХрд╛ рдзреНрдпрд╛рди рдЖрдХрд░реНрд╖рд┐рдд рдХрд░рдиреЗ рдпреЛрдЧреНрдп рд╣реИред

рд╣рдорд╛рд░реА рднрд╡рд┐рд╖реНрдп рдХреА рдпреЛрдЬрдирд╛рдПрдБ rook-ceph рдХреЛ рдПрдХ рдореЙрдбреНрдпреВрд▓ рдмрдирд╛рдиреЗ рддрдХ рд╕реАрдорд┐рдд рд╣реИрдВ addon-рдСрдкрд░реЗрдЯрд░, рдЬреЛ рд╣рдорд╛рд░реЗ рдЕрд╕рдВрдЦреНрдп рдХреБрдмреЗрд░рдиреЗрдЯ рд╕рдореВрд╣реЛрдВ рдореЗрдВ рдЗрд╕рдХреЗ рдЙрдкрдпреЛрдЧ рдХреЛ рдФрд░ рднреА рд╕рд░рд▓ рдФрд░ рдЕрдзрд┐рдХ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рдмрдирд╛ рджреЗрдЧрд╛ред

рдкреБрдирд╢реНрдЪ

рд╣рдорд╛рд░реЗ рдмреНрд▓реЙрдЧ рдкрд░ рднреА рдкрдврд╝реЗрдВ:

рд╕реНрд░реЛрдд: www.habr.com

рдПрдХ рдЯрд┐рдкреНрдкрдгреА рдЬреЛрдбрд╝реЗрдВ