Rook рдпрд╛ рдирд╣реАрдВ - рдпрд╣ рд╕рд╡рд╛рд▓ рд╣реИ



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

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

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

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

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

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

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

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




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

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

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

рдЖрдЗрдП рдСрдмреНрдЬреЗрдХреНрдЯ рд╕реНрдЯреЛрд░ рдмрдирд╛рдиреЗ рдХреЗ рдЙрджрд╛рд╣рд░рдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдмрд╛рд░реАрдХрд┐рдпреЛрдВ рдХреЛ рджреЗрдЦреЗрдВ, рдпрд╛ 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 рдлрд╝рд╛рдЗрд▓ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╣рдо "рдСрд░реНрдбрд░" рд╕рдВрд╕рд╛рдзрдиреЛрдВ, рдЬрд┐рд╕рдХреЗ рд▓рд┐рдП рдСрдкрд░реЗрдЯрд░ рдЖрд╡рд╢реНрдпрдХ рдЖрджреЗрд╢реЛрдВ рдХреЛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рддрд╛ рд╣реИ рдФрд░ рд╣рдореЗрдВ "рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдирд╣реАрдВ" рд░рд╣рд╕реНрдп рджреЗрддрд╛ рд╣реИ, рдЬрд┐рд╕рдХреЗ рд╕рд╛рде рд╣рдо рдХрд╛рдо рдХрд░рдирд╛ рдЬрд╛рд░реА рд░рдЦ рд╕рдХрддреЗ рд╣реИрдВ (рдиреАрдЪреЗ рджреЗрдЦреЗрдВ) ред рдФрд░ рдЬрд┐рди рдЪрд░реЛрдВ рдХреЛ рдКрдкрд░ рджрд░реНрд╢рд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдЙрдирдореЗрдВ рд╕реЗ рдХрдорд╛рдВрдб рдФрд░ рд╕реАрдХреНрд░реЗрдЯ рдирд╛рдо рдХреА рд░рдЪрдирд╛ рд╣реЛрдЧреАред

рдпрд╣ рдХрд┐рд╕ рддрд░рд╣ рдХреА рдЯреАрдо рд╣реИ? рдСрдмреНрдЬреЗрдХреНрдЯ рд╕реНрдЯреЛрд░реЗрдЬ рдХреЗ рд▓рд┐рдП рдПрдХ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдмрдирд╛рддреЗ рд╕рдордп, рдкреЙрдб рдХреЗ рдЕрдВрджрд░ Rook рд╕реНрдЯреЗрдЯрдореЗрдВрдЯ рдирд┐рдореНрди рдХрд╛рд░реНрдп рдХрд░реЗрдЧрд╛:

 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 рд╡рд╣ рд╣реИ рдЬреЛ рднрд╡рд┐рд╖реНрдп рдХреЗ рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рдХреЛ рдПрд╕ 3 рдПрдкреАрдЖрдИ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдСрдмреНрдЬреЗрдХреНрдЯ рд╕реНрдЯреЛрд░реЗрдЬ рддрдХ рдкрд╣реБрдВрдЪрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреАред рд░реВрдХ рдСрдкрд░реЗрдЯрд░ рдХреГрдкрдпрд╛ рдЙрдиреНрд╣реЗрдВ рдЪреБрдирддрд╛ рд╣реИ рдФрд░ 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 рдкреНрд░рдХреНрд░рд┐рдпрд╛ рджрд┐рдЦрд╛рдИ рджреЗрддреА рд╣реИред

рд░реВрдХ рдФрд░ рд░реИрдбреЛрд╕ рдХреЗ рд╕рд╛рде рдЬреЙрдп рддрдХ


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

рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ, рдирд╛рдорд╕реНрдерд╛рди рдХреЗ рдкрд╛рд╕ рд╕реЗрдл рддрдХ рдкрд╣реБрдВрдЪрдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд░рд╣рд╕реНрдп рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП рддрд╛рдХрд┐ рд░рд╛рдЬреНрдп рдХреЗ рдЖрд╡реЗрджрди рдХрд╛рд░реНрдп рдХрд░ рд╕рдХреЗрдВред рдпрджрд┐ рдЖрдкрдХреЗ рдирд╛рдорд╕реНрдерд╛рдиреЛрдВ рдореЗрдВ 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 рдЕрд▓рдЧ рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рдкрд╛ рд╕рдХрддреЗ рд╣реИрдВред рдлрд╛рдЗрд▓ред рд╕рдмрд╕реЗ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдмрд╛рдд, рдПрдЬреЗрдВрдЯреЛрдВ рдФрд░ рдЦреЛрдЬ рдХреЗ рд▓рд┐рдП рд╕рд╣рд┐рд╖реНрдгреБрддрд╛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░реЗрдВред рдЖрдк taints / tolerations рддрдВрддреНрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХреНрдпреЛрдВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рд╣рдордиреЗ рдЗрд╕ рд▓реЗрдЦ рдореЗрдВ рд╡рд┐рд╕реНрддрд╛рд░ рд╕реЗ рд╡рд░реНрдгрд┐рдд рдХрд┐рдпрд╛ рд╣реИред

рд╕рдВрдХреНрд╖реЗрдк рдореЗрдВ, рд╣рдо рдирд╣реАрдВ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдХрд┐ рдХреНрд▓рд╛рдЗрдВрдЯ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЗ рд╕рд╛рде рдкреЙрдбреНрд╕ рдЙрд╕реА рдиреЛрдбреНрд╕ рдкрд░ рд╕реНрдерд┐рдд рд╣реЛрдВ рдЬрд╣рд╛рдВ рдбреЗрдЯрд╛ рд╕реНрдЯреЛрд░реЗрдЬ рдХреЗ рд▓рд┐рдП рдбрд┐рд╕реНрдХ рд╕реНрдерд┐рдд рд╣реИрдВред рдХрд╛рд░рдг рд╕рд░рд▓ рд╣реИ: рдЗрд╕ рддрд░рд╣ рд╕реЗ рд░реВрдХ рдПрдЬреЗрдВрдЯреЛрдВ рдХрд╛ рдХрд╛рдо рдЖрд╡реЗрджрди рдХреЛ рдкреНрд░рднрд╛рд╡рд┐рдд рдирд╣реАрдВ рдХрд░реЗрдЧрд╛ред

рддреЛ, rook-ceph/values.yaml рдкрд╕рдВрджреАрджрд╛ рд╕рдВрдкрд╛рджрдХ рдХреЗ 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 рд╕реНрдерд┐рддрд┐ рдЬрд╛рдВрдЪреЗрдВ - HEALTH_OK рджреЗрдЦрдиреЗ рдХреА 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 

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

Rooks and Hooks: рдХреНрдпрд╛ рд╣рд░ рдЪреАрдЬ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рд╣реИ?


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

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

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


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

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

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

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


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

Source: https://habr.com/ru/post/hi451818/


All Articles