рд░реБрдХрд▓рд╛рдИ рдХрд┐ рд░реБрдХрд▓рд╛рдИ рд╣реЛрдЗрди - рддреНрдпреЛ рдкреНрд░рд╢реНрди рд╣реЛ

рд░реБрдХрд▓рд╛рдИ рдХрд┐ рд░реБрдХрд▓рд╛рдИ рд╣реЛрдЗрди - рддреНрдпреЛ рдкреНрд░рд╢реНрди рд╣реЛ

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

рдЫреЛрдЯрдХрд░реАрдорд╛, рд░реБрдХ рдПрдХ рд╕реЗрдЯ рд╣реЛ рдЕрдкрд░реЗрдЯрд░рд╣рд░реБ Kubernetes рдХреЛ рд▓рд╛рдЧрд┐, рдЬрд╕рд▓реЗ Ceph, EdgeFS, Minio, Cassandra, CockroachDB рдЬрд╕реНрддрд╛ рдбреЗрдЯрд╛ рднрдгреНрдбрд╛рд░рдг рд╕рдорд╛рдзрд╛рдирд╣рд░реВрдХреЛ рддреИрдирд╛рддреА, рд╡реНрдпрд╡рд╕реНрдерд╛рдкрди, рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░рд┐рдХрднрд░реАрдХреЛ рдкреВрд░реНрдг рдирд┐рдпрдиреНрддреНрд░рдг рд▓рд┐рдиреНрдЫред

рдпрд╕ рд╕рдордпрдорд╛ рд╕рдмреИрднрдиреНрджрд╛ рд╡рд┐рдХрд╕рд┐рдд (рд░ рдПрдХ рдорд╛рддреНрд░ ╨▓ рд╕реНрдерд┐рд░ рдЪрд░рдг) рд╕рдорд╛рдзрд╛рди рд╣реЛ rook-ceph-operator.

рднрдиреНрдиреБ: Ceph рд╕рдБрдЧ рд╕рдореНрдмрдиреНрдзрд┐рдд Rook 1.0.0 рд░рд┐рд▓реАрдЬрдорд╛ рднрдПрдХрд╛ рдорд╣рддреНрддреНрд╡рдкреВрд░реНрдг рдкрд░рд┐рд╡рд░реНрддрдирд╣рд░реВ рдордзреНрдпреЗ, рд╣рд╛рдореА Ceph Nautilus рдХреЛ рд╕рдорд░реНрдерди рд░ CephFS рд╡рд╛ RGW рдмрдХреЗрдЯрд╣рд░реВрдХреЛ рд▓рд╛рдЧрд┐ NFS рдкреНрд░рдпреЛрдЧ рдЧрд░реНрдиреЗ рдХреНрд╖рдорддрд╛рд▓рд╛рдИ рдиреЛрдЯ рдЧрд░реНрди рд╕рдХреНрдЫреМрдВред рдЕрд░реВрдХреЛ рдмреАрдЪрдорд╛ рдХреЗ рдмрд╛рд╣рд┐рд░ рдЦрдбрд╛ рдЫ рдмреАрдЯрд╛ рд╕реНрддрд░рдорд╛ EdgeFS рд╕рдорд░реНрдердирдХреЛ рдкрд░рд┐рдкрдХреНрд╡рддрд╛ред

рддреНрдпрд╕реЛрднрдП, рдпрд╕ рд▓реЗрдЦрдорд╛ рд╣рд╛рдореА:

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

рд╕рд╛рдорд╛рдиреНрдп рдЕрд╡рдзрд╛рд░рдгрд╛ рд░ рд╕рд┐рджреНрдзрд╛рдиреНрдд рд╕рдВрдЧ рд╕реБрд░реБ рдЧрд░реМрдВред

"рдорд╕рдБрдЧ рдПрдЙрдЯрд╛ рд░реБрдХрдХреЛ рдлрд╛рдЗрджрд╛ рдЫ!" (рдЕрдЬреНрдЮрд╛рдд рдЪреЗрд╕ рдЦреЗрд▓рд╛рдбреА)

рд░реБрдХрд▓рд╛рдИ рдХрд┐ рд░реБрдХрд▓рд╛рдИ рд╣реЛрдЗрди - рддреНрдпреЛ рдкреНрд░рд╢реНрди рд╣реЛ

рд░реБрдХрдХреЛ рдореБрдЦреНрдп рдлрд╛рдЗрджрд╛рд╣рд░реВ рдордзреНрдпреЗ рдПрдХ рдпреЛ рд╣реЛ рдХрд┐ рдбрд╛рдЯрд╛ рд╕реНрдЯреЛрд░рд╣рд░реВрд╕рдБрдЧ рдЕрдиреНрддрд░рдХреНрд░рд┐рдпрд╛ Kubernetes рд╕рдВрдпрдиреНрддреНрд░рд╣рд░реВ рдорд╛рд░реНрдлрдд рдЧрд░рд┐рдиреНрдЫред рдпрд╕рдХреЛ рдорддрд▓рдм рдпреЛ рд╣реЛ рдХрд┐ рддрдкрд╛рдИрдВрд▓реЗ рдЕрдм рдХрдиреНрд╕реЛрд▓рдорд╛ рдкрд╛рдирд╛рдмрд╛рдЯ Ceph рдХрдиреНрдлрд┐рдЧрд░ рдЧрд░реНрди рдЖрджреЗрд╢рд╣рд░реВ рдкреНрд░рддрд┐рд▓рд┐рдкрд┐ рдЧрд░реНрди рдЖрд╡рд╢реНрдпрдХ рдЫреИрдиред

тАФ рдХреЗ рддрдкрд╛рдИрдВ рдХреНрд▓рд╕реНрдЯрд░рдорд╛ CephFS рдбрд┐рдкреНрд▓реЛрдп рдЧрд░реНрди рдЪрд╛рд╣рдиреБрд╣реБрдиреНрдЫ? рдХреЗрд╡рд▓ YAML рдлрд╛рдЗрд▓ рд▓реЗрдЦреНрдиреБрд╣реЛрд╕реН!
- рдХреЗ? рдХреЗ рддрдкрд╛рдЗрдБ S3 API рд╕рдБрдЧ рдХреБрдиреИ рд╡рд╕реНрддреБ рд╕реНрдЯреЛрд░ рдкрдирд┐ рдбрд┐рдкреНрд▓реЛрдп рдЧрд░реНрди рдЪрд╛рд╣рдиреБрд╣реБрдиреНрдЫ? рдХреЗрд╡рд▓ рджреЛрд╕реНрд░реЛ 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 рдлрд╛рдЗрд▓ рдорд╛рд░реНрдлрдд рд╕реНрд░реЛрддрд╣рд░реВ "рдЕрд░реНрдбрд░" рдЧрд░реНрдЫреМрдВ, рдЬрд╕рдХреЛ рд▓рд╛рдЧрд┐ рдЕрдкрд░реЗрдЯрд░рд▓реЗ рдЖрд╡рд╢реНрдпрдХ рдЖрджреЗрд╢рд╣рд░реВ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдЧрд░реНрджрдЫ рд░ рд╣рд╛рдореАрд▓рд╛рдИ "рдЕрддреНрдпрдиреНрддреИ рд╡рд╛рд╕реНрддрд╡рд┐рдХ" рдЧреЛрдкреНрдп рдлрд░реНрдХрд╛рдЙрдБрдЫ рдЬрд╕рдХреЛ рд╕рд╛рде рд╣рд╛рдореА рдердк рдХрд╛рдо рдЧрд░реНрди рд╕рдХреНрдЫреМрдВред (рддрд▓ рд╣реЗрд░)ред рд░ рдорд╛рдерд┐ рд╕реВрдЪреАрдмрджреНрдз рдЪрд░рд╣рд░реВрдмрд╛рдЯ, рдЖрджреЗрд╢ рд░ рдЧреЛрдкреНрдп рдирд╛рдо рдХрдореНрдкрд╛рдЗрд▓ рдЧрд░рд┐рдиреЗрдЫред

рдпреЛ рдХрд╕реНрддреЛ рдЯрд┐рдо рд╣реЛ ? рд╡рд╕реНрддреБ рднрдгреНрдбрд╛рд░рдгрдХреЛ рд▓рд╛рдЧрд┐ рдкреНрд░рдпреЛрдЧрдХрд░реНрддрд╛ рд╕рд┐рд░реНрдЬрдирд╛ рдЧрд░реНрджрд╛, рдкреЛрдб рднрд┐рддреНрд░рдХреЛ рд░реБрдХ рдЕрдкрд░реЗрдЯрд░рд▓реЗ рдирд┐рдореНрди рдХрд╛рд░реНрдп рдЧрд░реНрдиреЗрдЫ:

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

рдпрд╕ рдХрд╛рд░реНрдпрдорд╛ рд╕реВрдЪреАрдмрджреНрдз рд╕рдмреИ рдХрд╛рд░реНрдпрд╣рд░реВ Kubernetes рдХреЛ рдврд╛рдБрдЪрд╛ рднрд┐рддреНрд░ рдкреНрд░рджрд░реНрд╢рди рдЧрд░рд┐рдПрдХреЛ рдерд┐рдпреЛред 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

рдпрд╕рдмрд╛рд╣реЗрдХ, рдердк рдХрдореНрдкреЛрдиреЗрдиреНрдЯрд╣рд░реВ рдЗрдЪреНрдЫрд┐рдд рд░реВрдкрдорд╛ рдХрдиреНрдлрд┐рдЧрд░ рдЧрд░реНрди рд╕рдХрд┐рдиреНрдЫред рддрд┐рдиреАрд╣рд░реВрдХреЛ рдмрд╛рд░реЗрдорд╛ рдердк рд╡рд┐рд╡рд░рдгрд╣рд░реВрдорд╛ рд╕рдВрдХреЗрдд рдЧрд░рд┐рдПрдХреЛ рдЫ рдХрд╛рдЧрдЬрд╛рддред рдкреНрд░рд╢рд╛рд╕рдирдХреЛ рд▓рд╛рдЧрд┐, рд╣рд╛рдореА рджреГрдврддрд╛рдХрд╛ рд╕рд╛рде рдбреНрдпрд╛рд╕рдмреЛрд░реНрдб рд░ рдЙрдкрдХрд░рдг рдмрд╛рдХрд╕ рд╕реНрдерд╛рдкрдирд╛ рдЧрд░реНрди рд╕рд┐рдлрд╛рд░рд┐рд╕ рдЧрд░реНрджрдЫреМрдВред

рд░реБрдХ рд░ рд╣реБрдХ: рдХреЗ рд░реБрдХ рд╕рдмреИ рдХреБрд░рд╛рдХреЛ рд▓рд╛рдЧрд┐ рдкрд░реНрдпрд╛рдкреНрдд рдЫ?

рддрдкрд╛рдИрд▓реЗ рджреЗрдЦреНрди рд╕рдХреНрдиреБрд╣реБрдиреНрдЫ, рд░реБрдХрдХреЛ рд╡рд┐рдХрд╛рд╕ рдкреВрд░реНрдг рд╕реНрд╡рд┐рдВрдЧрдорд╛ рдЫред рддрд░ рддреНрдпрд╣рд╛рдБ рдЕрдЭреИ рдкрдирд┐ рд╕рдорд╕реНрдпрд╛рд╣рд░реВ рдЫрдиреН рдЬрд╕рд▓реЗ рд╣рд╛рдореАрд▓рд╛рдИ Ceph рдХреЛ рдореНрдпрд╛рдиреБрдЕрд▓ рдХрдиреНрдлрд┐рдЧрд░реЗрд╕рди рдкреВрд░реНрдг рд░реВрдкрдорд╛ рддреНрдпрд╛рдЧреНрди рдЕрдиреБрдорддрд┐ рджрд┐рдБрджреИрди:

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

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

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

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

рд╣рд╛рдореНрд░рд╛ рднрд╛рд╡реА рдпреЛрдЬрдирд╛рд╣рд░реВ рд░реБрдХ-рд╕реЗрдлрд▓рд╛рдИ рдореЛрдбреНрдпреБрд▓ рдмрдирд╛рдЙрдирдХрд╛ рд▓рд╛рдЧрд┐ рдЙрдмрд▓рд┐рдПрдХрд╛ рдЫрдиреН addon-operator, рдЬрд╕рд▓реЗ рд╣рд╛рдореНрд░реЛ рдЕрд╕рдВрдЦреНрдп Kubernetes рдХреНрд▓рд╕реНрдЯрд░рд╣рд░реВрдорд╛ рдпрд╕рдХреЛ рдкреНрд░рдпреЛрдЧ рдЕрдЭ рд╕рд░рд▓ рд░ рдердк рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рдмрдирд╛рдЙрдиреЗрдЫред

PS

рд╣рд╛рдореНрд░реЛ рдмреНрд▓рдЧрдорд╛ рдкрдирд┐ рдкрдвреНрдиреБрд╣реЛрд╕реН:

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

рдПрдХ рдЯрд┐рдкреНрдкрдгреА рдердкреНрди