рд░реБрдХрдХрдбреЗ рдХрд┐рдВрд╡рд╛ рд░реБрдХрдХрдбреЗ рдирд╛рд╣реА - рд╣рд╛ рдкреНрд░рд╢реНрди рдЖрд╣реЗ

рд░реБрдХрдХрдбреЗ рдХрд┐рдВрд╡рд╛ рд░реБрдХрдХрдбреЗ рдирд╛рд╣реА - рд╣рд╛ рдкреНрд░рд╢реНрди рдЖрд╣реЗ

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

рдереЛрдбрдХреНрдпрд╛рдд, рд░реБрдХ рд╣рд╛ рдПрдХ рд╕рдВрдЪ рдЖрд╣реЗ рдСрдкрд░реЗрдЯрд░ Kubernetes рд╕рд╛рдареА, рдЬреЗ Ceph, EdgeFS, Minio, Cassandra, CockroachDB рд╕рд╛рд░рдЦреНрдпрд╛ рдбреЗрдЯрд╛ рд╕реНрдЯреЛрд░реЗрдЬ рд╕реЛрд▓реНрдпреВрд╢рдиреНрд╕рдЪреНрдпрд╛ рддреИрдирд╛рддреА, рд╡реНрдпрд╡рд╕реНрдерд╛рдкрди, рд╕реНрд╡рдпрдВрдЪрд▓рд┐рдд рдкреБрдирд░реНрдкреНрд░рд╛рдкреНрддреАрд╡рд░ рдкреВрд░реНрдг рдирд┐рдпрдВрддреНрд░рдг рдареЗрд╡рддрд╛рдд.

рдпрд╛рдХреНрд╖рдгреА рд╕рд░реНрд╡рд╛рдд рд╡рд┐рдХрд╕рд┐рдд (рдЖрдгрд┐ рдлрдХреНрдд рдПрдХ ╨▓ рд╕реНрдерд┐рд░ рд╕реНрдЯреЗрдЬ) рдЙрдкрд╛рдп рдЖрд╣реЗ rook-ceph-operator.

рд╢реЗрд░рд╛: Ceph рд╢реА рд╕рдВрдмрдВрдзрд┐рдд Rook 1.0.0 рдкреНрд░рдХрд╛рд╢рдирд╛рддреАрд▓ рдорд╣рддреНрддреНрд╡рдкреВрд░реНрдг рдмрджрд▓рд╛рдВрдкреИрдХреА, рдЖрдореНрд╣реА Ceph Nautilus рд╕рд╛рдареА рд╕рдорд░реНрдерди рдЖрдгрд┐ CephFS рдХрд┐рдВрд╡рд╛ RGW рдмрдХреЗрдЯрд╕рд╛рдареА NFS рд╡рд╛рдкрд░рдгреНрдпрд╛рдЪреА рдХреНрд╖рдорддрд╛ рд▓рдХреНрд╖рд╛рдд рдШреЗрдК рд╢рдХрддреЛ. рдПрдЬрдПрдлрдПрд╕ рд╕рдкреЛрд░реНрдЯрдЪреЗ рдмреАрдЯрд╛ рд╕реНрддрд░рд╛рд╡рд░реАрд▓ рдкрд░рд┐рдкрдХреНрд╡рддрд╛ рд╣реЗ рдЗрддрд░рд╛рдВрдордзреНрдпреЗ рд╡реЗрдЧрд│реЗ рдЖрд╣реЗ.

рддрд░, рдпрд╛ рд▓реЗрдЦрд╛рдд рдЖрдореНрд╣реА:

  • рдХреБрдмрд░реНрдиреЗрдЯреНрд╕ рдХреНрд▓рд╕реНрдЯрд░рдордзреНрдпреЗ рд╕реЗрдл рддреИрдирд╛рдд рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА рд░реБрдХрдЪрд╛ рд╡рд╛рдкрд░ рдХрд░рддрд╛рдирд╛ рдЖрдкрд▓реНрдпрд╛рд▓рд╛ рдХреЛрдгрддреЗ рдлрд╛рдпрджреЗ рджрд┐рд╕рддрд╛рдд рдпрд╛ рдкреНрд░рд╢реНрдирд╛рдЪреЗ рдЙрддреНрддрд░ рджреЗрдКрдпрд╛;
  • рдЖрдореНрд╣реА рдЙрддреНрдкрд╛рджрдирд╛рдд рд░реБрдХ рд╡рд╛рдкрд░рдгреНрдпрд╛рдЪрд╛ рдЖрдордЪрд╛ рдЕрдиреБрднрд╡ рдЖрдгрд┐ рдЫрд╛рдк рд╕рд╛рдорд╛рдпрд┐рдХ рдХрд░реВ;
  • рд░реБрдХрд▓рд╛ рдЖрдореНрд╣реА тАЬрд╣реЛрдп!тАЭ рдХрд╛ рдореНрд╣рдгрддреЛ рдЖрдгрд┐ рддреНрдпрд╛рдЪреНрдпрд╛рд╕рд╛рдареАрдЪреНрдпрд╛ рдЖрдордЪреНрдпрд╛ рдпреЛрдЬрдирд╛рдВрдмрджреНрджрд▓ рд╕рд╛рдВрдЧреВ.

рдЪрд▓рд╛ рд╕рд╛рдорд╛рдиреНрдп рд╕рдВрдХрд▓реНрдкрдирд╛ рдЖрдгрд┐ рд╕рд┐рджреНрдзрд╛рдВрддрд╛рд╕рд╣ рдкреНрд░рд╛рд░рдВрдн рдХрд░реВрдпрд╛.

"рдорд▓рд╛ рдПрдХрд╛ рд░реБрдХрдЪрд╛ рдлрд╛рдпрджрд╛ рдЖрд╣реЗ!" (рдЕрдЬреНрдЮрд╛рдд рдмреБрджреНрдзрд┐рдмрд│рдкрдЯреВ)

рд░реБрдХрдХрдбреЗ рдХрд┐рдВрд╡рд╛ рд░реБрдХрдХрдбреЗ рдирд╛рд╣реА - рд╣рд╛ рдкреНрд░рд╢реНрди рдЖрд╣реЗ

рд░реБрдХрдЪрд╛ рдПрдХ рдореБрдЦреНрдп рдлрд╛рдпрджрд╛ рдЕрд╕рд╛ рдЖрд╣реЗ рдХреА рдбреЗрдЯрд╛ рд╕реНрдЯреЛрдЕрд░реНрд╕рд╢реА рдкрд░рд╕реНрдкрд░рд╕рдВрд╡рд╛рдж рдХреБрдмрд░реНрдиреЗрдЯреНрд╕ рдпрдВрддреНрд░рдгреЗрджреНрд╡рд╛рд░реЗ рдХреЗрд▓рд╛ рдЬрд╛рддреЛ. рдпрд╛рдЪрд╛ рдЕрд░реНрде рдЕрд╕рд╛ рдХреА рддреБрдореНрд╣рд╛рд▓рд╛ рдпрд╛рдкреБрдвреЗ рд╢реАрдЯрдордзреВрди рдХрдиреНрд╕реЛрд▓рдордзреНрдпреЗ Ceph рдХреЙрдиреНрдлрд┐рдЧрд░ рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА рдХрдорд╛рдВрдб рдХреЙрдкреА рдХрд░рдгреНрдпрд╛рдЪреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╛рд╣реА.

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

рд░реВрдХ рдПрдХрд╛ рд╕рд╛рдорд╛рдиреНрдп рдСрдкрд░реЗрдЯрд░рдЪреНрдпрд╛ рд╕рд░реНрд╡ рдирд┐рдпрдорд╛рдВрдиреБрд╕рд╛рд░ рддрдпрд╛рд░ рдХреЗрд▓рд╛ рдЬрд╛рддреЛ. рд╡рд╛рдкрд░реВрди рддреНрдпрд╛рдЪреНрдпрд╛рд╢реА рд╕рдВрд╡рд╛рдж рд╕рд╛рдзрд▓рд╛ рдЬрд╛рддреЛ CRD (рд╕рд╛рдиреБрдХреВрд▓ рд╕рдВрд╕рд╛рдзрди рд╡реНрдпрд╛рдЦреНрдпрд╛), рдЬреНрдпрд╛рдордзреНрдпреЗ рдЖрдореНрд╣реА рдЖрдореНрд╣рд╛рд▓рд╛ рдЖрд╡рд╢реНрдпрдХ рдЕрд╕рд▓реЗрд▓реНрдпрд╛ 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 рдлрд╛рдЗрд▓реНрд╕рдордзреНрдпреЗ рд╡рд░реНрдгрди рдХреЗрд▓реЗрд▓реНрдпрд╛ рд░рдЪрдирд╛ Git рд░рд┐рдкреЙрдЭрд┐рдЯрд░реАрдордзреНрдпреЗ рд╕рдВрдЧреНрд░рд╣рд┐рдд рдХреЗрд▓реНрдпрд╛ рдЬрд╛рддрд╛рдд рдЖрдгрд┐ рдмрд░реНрдпрд╛рдЪ рд╡реЗрд│рд╛ рдкреБрдиреНрд╣рд╛ рд╡рд╛рдкрд░рд▓реНрдпрд╛ рдЬрд╛рддрд╛рдд. рдЖрдореНрд╣реА рдпрд╛рд▓рд╛ DevOps рдЕрднрд┐рдпрдВрддреНрдпрд╛рдВрд╕рд╛рдареА рдЖрдгрд┐ рд╕рдВрдкреВрд░реНрдгрдкрдгреЗ CI/CD рдкреНрд░рдХреНрд░рд┐рдпреЗрд╕рд╛рдареА рдПрдХ рдореЛрдард╛ рдкреНрд▓рд╕ рдореНрд╣рдгреВрди рдкрд╛рд╣рддреЛ.

Rook рдЖрдгрд┐ Rados рд╕рд╣ рдЖрдирдВрджреА

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 (рдЕрджреНрдпрд╛рдк рдмреАрдЯрд╛ рдЕрд╡рд╕реНрдереЗрдд) рдЖрдгрд┐ рдореНрд╣рдгреВрди рдЧреБрдкрд┐рддрд╛рдВрдЪреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╛рд╣реА.

рд░реБрдХ рдЖрдкреЛрдЖрдк рдЕрдиреЗрдХ рд╕рдорд╕реНрдпрд╛ рд╕реЛрдбрд╡рддреЗ, рдЬреЗ рдЖрдореНрд╣рд╛рд▓рд╛ рдирд╡реАрди рдкреНрд░рдХрд▓реНрдкрд╛рдВрдордзреНрдпреЗ рд╡рд╛рдкрд░рдгреНрдпрд╛рд╕ рдкреНрд░реЛрддреНрд╕рд╛рд╣рд┐рдд рдХрд░рддреЗ.

Rook рдЪрд╛ рд╡реЗрдврд╛

рд░реБрдХ рдЖрдгрд┐ рд╕реЗрдл рддреИрдирд╛рдд рдХрд░реВрди рд╡реНрдпрд╛рд╡рд╣рд╛рд░рд┐рдХ рднрд╛рдЧ рдкреВрд░реНрдг рдХрд░реВрдпрд╛ рдЬреЗрдгреЗрдХрд░реВрди рдЖрдкрдг рд╕реНрд╡рддрдГрдЪреЗ рдкреНрд░рдпреЛрдЧ рдХрд░реВ рд╢рдХреВ. рдпрд╛ рдЕрднреЗрджреНрдп рдЯреЙрд╡рд░рд╡рд░ рд╣рд▓реНрд▓рд╛ рдХрд░рдгреЗ рд╕реЛрдкреЗ рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА, рд╡рд┐рдХрд╛рд╕рдХрд╛рдВрдиреА рд╣реЗрд▓реНрдо рдкреЕрдХреЗрдЬ рддрдпрд╛рд░ рдХреЗрд▓реЗ рдЖрд╣реЗ. рдЪрд▓рд╛ рддреЗ рдбрд╛рдЙрдирд▓реЛрдб рдХрд░реВрдпрд╛:

$ 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 рдХрд╕реЗ рдорд╛рд╣рд┐рдд рдирд╛рд╣реА рд╡реНрд╣реЙрд▓реНрдпреВрдордЪрд╛ рдЖрдХрд╛рд░ рдмрджрд▓рд╛ (рддреНрдпрд╛рдЪ RBD рдЪреНрдпрд╛ рд╡рд┐рд░реВрджреНрдз), рддреНрдпрд╛рдореБрд│реЗ Rook рдЙрдкрдпреБрдХреНрдд (рдЖрдгрд┐ рдХрдзреАрдХрдзреА рдЧрдВрднреАрд░рдкрдгреЗ рдЖрд╡рд╢реНрдпрдХ!) рд╕рд╛рдзрдирд╛рдкрд╛рд╕реВрди рд╡рдВрдЪрд┐рдд рдЖрд╣реЗ.
  • рд░реБрдХ рдЕрдЬреВрдирд╣реА рдирд┐рдпрдорд┐рдд рд╕реЗрдлрдЗрддрдХрд╛ рд▓рд╡рдЪрд┐рдХ рдирд╛рд╣реА. рдЬрд░ рдЖрдореНрд╣рд╛рд▓рд╛ рд╕реЗрдлрдПрдлрдПрд╕ рдореЗрдЯрд╛рдбреЗрдЯрд╛ SSD рд╡рд░ рд╕рдВрдЧреНрд░рд╣рд┐рдд рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА рдкреВрд▓ рдХреЙрдиреНрдлрд┐рдЧрд░ рдХрд░рд╛рдпрдЪрд╛ рдЕрд╕реЗрд▓ рдЖрдгрд┐ рдбреЗрдЯрд╛ рд╕реНрд╡рддрдГ HDD рд╡рд░ рд╕рдВрдЧреНрд░рд╣рд┐рдд рдХрд░рд╛рдпрдЪрд╛ рдЕрд╕реЗрд▓, рддрд░ рдЖрдореНрд╣рд╛рд▓рд╛ CRUSH рдирдХрд╛рд╢реЗрдордзреНрдпреЗ рдбрд┐рд╡реНрд╣рд╛рдЗрд╕реЗрд╕рдЪреЗ рд╕реНрд╡рддрдВрддреНрд░ рдЧрдЯ рдореЕрдиреНрдпреБрдЕрд▓реА рдиреЛрдВрджрдгреА рдХрд░рдгреЗ рдЖрд╡рд╢реНрдпрдХ рдЖрд╣реЗ.
  • рд░реВрдХ-рд╕реЗрдл-рдСрдкрд░реЗрдЯрд░рд▓рд╛ рд╕реНрдерд┐рд░ рдорд╛рдирд▓реЗ рдЬрд╛рдд рдЕрд╕реВрдирд╣реА, рд╕реЗрдл рдЖрд╡реГрддреНрддреА 13 рддреЗ 14 рдкрд░реНрдпрдВрдд рд╢реНрд░реЗрдгреАрд╕реБрдзрд╛рд░рд┐рдд рдХрд░рддрд╛рдирд╛ рд╕рдзреНрдпрд╛ рдХрд╛рд╣реА рд╕рдорд╕реНрдпрд╛ рдЖрд╣реЗрдд.

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

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

рд░реБрдХ рдкреНрд░рдХрд▓реНрдкрд╛рдиреЗ рдирд┐рдГрд╕рдВрд╢рдпрдкрдгреЗ рдЖрдордЪреА рдордиреЗ рдЬрд┐рдВрдХрд▓реА рдЖрд╣реЗрдд - рдЖрдордЪрд╛ рд╡рд┐рд╢реНрд╡рд╛рд╕ рдЖрд╣реЗ рдХреА [рддреНрдпрд╛рдЪреНрдпрд╛ рд╕рд░реНрд╡ рд╕рд╛рдзрдХ рдЖрдгрд┐ рдмрд╛рдзрдХрд╛рдВрд╕рд╣] рддреЗ рдирд┐рд╢реНрдЪрд┐рддрдкрдгреЗ рддреБрдордЪреЗ рд▓рдХреНрд╖ рджреЗрдгреНрдпрд╛рд╕ рдкрд╛рддреНрд░ рдЖрд╣реЗ.

рдЖрдордЪреНрдпрд╛ рднрд╡рд┐рд╖реНрдпрд╛рддреАрд▓ рдпреЛрдЬрдирд╛ рд░реБрдХ-рд╕реЗрдлрд╕рд╛рдареА рдПрдХ рдореЙрдбреНрдпреВрд▓ рдмрдирд╡рдгреНрдпрд╛рдкрд░реНрдпрдВрдд рд╡рд╛рдврддрд╛рдд рдЕреЕрдбрдСрди-рдСрдкрд░реЗрдЯрд░, рдЬреЗ рдЖрдордЪреНрдпрд╛ рдЕрд╕рдВрдЦреНрдп Kubernetes рдХреНрд▓рд╕реНрдЯрд░реНрд╕рдордзреНрдпреЗ рддреНрдпрд╛рдЪрд╛ рд╡рд╛рдкрд░ рдЖрдгрдЦреА рд╕реЛрдкреЗ рдЖрдгрд┐ рдЕрдзрд┐рдХ рд╕реЛрдпреАрд╕реНрдХрд░ рдХрд░реЗрд▓.

PS

рдЖрдордЪреНрдпрд╛ рдмреНрд▓реЙрдЧрд╡рд░ рджреЗрдЦреАрд▓ рд╡рд╛рдЪрд╛:

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

рдПрдХ рдЯрд┐рдкреНрдкрдгреА рдЬреЛрдбрд╛