Kubernetes рдХреЗ рд▓рд┐рдП рдмрд╛рд╣рд░реА рднрдВрдбрд╛рд░рдг рдХреЗ рд░реВрдк рдореЗрдВ GlusterFS

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

рд▓рдХреНрд╖реНрдп


рдирдП рднрдВрдбрд╛рд░ рд╕реЗ рд╣рдореЗрдВ рдХреНрдпрд╛ рдЙрдореНрдореАрдж рдереА:

  • рдкреНрд░рддрд┐рдХреГрддрд┐ рдХреЗ рд▓рд┐рдП рдиреЛрдб рдХреА рдПрдХ рд╕рдорд╛рди рд╕рдВрдЦреНрдпрд╛ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреА рдХреНрд╖рдорддрд╛ред
  • рдЖрд╕рд╛рди рд╕реНрдерд╛рдкрдирд╛, рд╕реЗрдЯрдЕрдк, рд╕рдорд░реНрдерди
  • рд╕рд┐рд╕реНрдЯрдо рд╡рдпрд╕реНрдХ, рд╕рдордп-рдкрд░реАрдХреНрд╖рдг рдФрд░ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП
  • рдбрд╛рдЙрдирдЯрд╛рдЗрдо рдХреЗ рдмрд┐рдирд╛ рднрдВрдбрд╛рд░рдг рд╕реНрдерд╛рди рдХрд╛ рд╡рд┐рд╕реНрддрд╛рд░ рдХрд░рдиреЗ рдХреА рдХреНрд╖рдорддрд╛
  • рднрдВрдбрд╛рд░рдг рдХреБрдмреЗрд░рдиреЗрдЯреНрд╕ рдХреЗ рд╕рд╛рде рд╕рдВрдЧрдд рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП
  • рдиреЛрдбреНрд╕ рдХреЗ рдХреНрд░реИрд╢ рд╣реЛрдиреЗ рдкрд░ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд╡рд┐рдлрд▓рддрд╛ рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдП

рдпрд╣ рдЕрдВрддрд┐рдо рдмрд┐рдВрджреБ рдкрд░ рд╣реИ рдХрд┐ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдмрд╣реБрдд рд╕рд╛рд░реЗ рдкреНрд░рд╢реНрди рд╣реИрдВред

рддреИрдирд╛рддреА


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

рдкреНрд░рд╛рд░рдВрднрд┐рдХ рддреИрдпрд╛рд░реА


GlusterFS рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ XFS рдХреЗ рд╕рд╛рде рдПрдХ рдЕрд▓рдЧ рдбрд┐рд╕реНрдХ рдЖрд╡рдВрдЯрд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рддрд╛рдХрд┐ рдпрд╣ рдХрд┐рд╕реА рднреА рддрд░рд╣ рд╕реЗ рд╕рд┐рд╕реНрдЯрдо рдХреЛ рдкреНрд░рднрд╛рд╡рд┐рдд рди рдХрд░реЗред

рд╡рд┐рднрд╛рдЬрди рдХрд╛ рдЪрдпрди рдХрд░реЗрдВ:

$ fdisk /dev/sdb
Command (m for help): n
Partition type
   p   primary (0 primary, 0 extended, 4 free)
   e   extended (container for logical partitions)
Select (default p): p
Partition number (1-4, default 1):  1
First sector (2048-16777215, default 2048): 
Last sector, +sectors or +size{K,M,G,T,P} (2048-16777215, default 16777215): 
 
Created a new partition 1 of type тАШLinuxтАЩ and of size 8 GiB.
Command (m for help): w 

The partition table has been altered.
Calling ioctl() to re-read partition table. Syncing disks.

XFS рдФрд░ рдорд╛рдЙрдВрдЯ рдореЗрдВ рдкреНрд░рд╛рд░реВрдк:

$ mkfs.xfs /dev/sdb1
$ mkdir /gluster
$ mount /dev/sdb1 /gluster

рдФрд░ рдЗрд╕реЗ рдмрдВрдж рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╕рд┐рд╕реНрдЯрдо рд╕реНрдЯрд╛рд░реНрдЯрдЕрдк рдкрд░ рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдХреЛ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдорд╛рдЙрдВрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП / etc / fstab рдореЗрдВ рдкреНрд░рд╡рд┐рд╖реНрдЯрд┐ рдЫреЛрдбрд╝реЗрдВ:

/dev/sdb1       /gluster        xfs     defaults        0       0

рд╕реНрдерд╛рдкрдирд╛


рд╕реНрдерд╛рдкрдирд╛ рдХреЗ рд╕рдВрдмрдВрдз рдореЗрдВ, рдХрдИ рд▓реЗрдЦ рд▓рд┐рдЦреЗ рдЧрдП рд╣реИрдВ, рдЗрд╕ рд╕рдВрдмрдВрдз рдореЗрдВ рд╣рдо рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдореЗрдВ рдЧрд╣рд░рд╛рдИ рд╕реЗ рдирд╣реАрдВ рдЬрд╛рдПрдВрдЧреЗ, рд╣рдо рд╕рд┐рд░реНрдл рдЗрд╕ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВрдЧреЗ рдХрд┐ рдпрд╣ рдзреНрдпрд╛рди рджреЗрдиреЗ рдпреЛрдЧреНрдп рд╣реИред

рджреЛрдиреЛрдВ рдиреЛрдбреНрд╕ рдкрд░, рдирд╡реАрдирддрдо рд╕рдВрд╕реНрдХрд░рдг glusterfs рдХреЛ рдЗрдВрд╕реНрдЯреЙрд▓ рдФрд░ рд░рди рдХрд░реЗрдВ:

$ wget -P /etc/yum.repos.d  https://download.gluster.org/pub/gluster/glusterfs/LATEST/CentOS/glusterfs-rhel8.repo
$ yum -y install yum-utils
$ yum-config-manager --enable PowerTools
$ yum install -y glusterfs-server
$ systemctl start glusterd

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

$ gluster peer probe gluster-02.example.com

рдпрджрд┐ рдпрд╣ рд╕рдлрд▓ рдерд╛, рддреЛ рд╣рдо рджреЛрдиреЛрдВ рд╕рд░реНрд╡рд░ рд╕реЗ рдХрдорд╛рдВрдб рдХреЗ рд╕рд╛рде рдХрдиреЗрдХреНрд╢рди рдХреА рдЬрд╛рдВрдЪ рдХрд░рддреЗ рд╣реИрдВ:

$ gluster peer status
Number of Peers: 1

Hostname: gluster-02.example.com
Uuid: a6de3b23-ee31-4394-8bff-0bd97bd54f46
State: Peer in Cluster (Connected)
Other names:
10.10.6.72

рдЕрдм рдЖрдк рдПрдХ рд╡реЙрд▓реНрдпреВрдо рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВ рдЬрд┐рд╕рдореЗрдВ рд╣рдо рд▓рд┐рдЦреЗрдВрдЧреЗред

gluster volume create main replica 2 gluster-01.example.com:/gluster/main gluster-02.example.com:/gluster/main force

рдХрд╣рд╛рдБ рдкреЗ:

  • рдореБрдЦреНрдп - рдирд╛рдо рдорд╛рддреНрд░рд╛
  • рдкреНрд░рддрд┐рдХреГрддрд┐ - рдкреНрд░рдХрд╛рд░ рдЦрдВрдб (рдЕрдзрд┐рдХ рд╡рд┐рд╡рд░рдг рдЖрдзрд┐рдХрд╛рд░рд┐рдХ рджрд╕реНрддрд╛рд╡реЗрдЬ рдореЗрдВ рдкрд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ )
  • 2 - рдкреНрд░рддрд┐рдХреГрддрд┐рдпреЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛

рд╡реЙрд▓реНрдпреВрдо рдЪрд▓рд╛рдПрдБ рдФрд░ рдЙрд╕рдХрд╛ рдкреНрд░рджрд░реНрд╢рди рджреЗрдЦреЗрдВ:

gluster volume start main
gluster volume status main

рдкреНрд░рддрд┐рдХреГрддрд┐ рд╡реЙрд▓реНрдпреВрдо рдХреЗ рд▓рд┐рдП, рдпрд╣ рдЕрдиреБрд╢рдВрд╕рд╛ рдХреА рдЬрд╛рддреА рд╣реИ рдХрд┐ рдЖрдк рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдкреИрд░рд╛рдореАрдЯрд░ рд╕реЗрдЯ рдХрд░реЗрдВ:

$ gluster volume set main network.ping-timeout 5
$ gluster volume set main cluster.quorum-type fixed
$ gluster volume set main cluster.quorum-count 1
$ gluster volume set main performance.quick-read on

рдЗрди рд╕рд░рд▓ рдЪрд░рдгреЛрдВ рдХреЗ рд╕рд╛рде, рд╣рдордиреЗ рдПрдХ GlusterFS рдХреНрд▓рд╕реНрдЯрд░ рдмрдирд╛рдпрд╛ рд╣реИред рдпрд╣ рдЗрд╕реЗ рдХрдиреЗрдХреНрдЯ рдХрд░рдиреЗ рдФрд░ рдкреНрд░рджрд░реНрд╢рди рдХреА рдЬрд╛рдВрдЪ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрдирд╛ рд╣реБрдЖ рд╣реИред рдЙрдмрдВрдЯреВ рдХреНрд▓рд╛рдЗрдВрдЯ рдорд╢реАрди рдкрд░ рд╕реНрдерд╛рдкрд┐рдд рд╣реИ, рдмрдврд╝рддреЗ рдХреЗ рд▓рд┐рдП рдЖрдкрдХреЛ рдХреНрд▓рд╛рдЗрдВрдЯ рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ:

$ add-apt-repository ppa:gluster/glusterfs-7
$ apt install glusterfs-client
$ mkdir /gluster
$ mount.glusterfs gluster-01.example.com:/main /gluster

рдЧреНрд▓рд╕реНрдЯрд░, рдЬрдм рдХрд┐рд╕реА рдПрдХ рдиреЛрдб рд╕реЗ рдЬреБрдбрд╝рд╛ рд╣реЛрддрд╛ рд╣реИ, рддреЛ рд╕рднреА рдиреЛрдбреНрд╕ рдХреЗ рдкрддреЗ рджреЗрддрд╛ рд╣реИ рдФрд░ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рд╕рднреА рд╕реЗ рдЬреБрдбрд╝ рдЬрд╛рддрд╛ рд╣реИред рдпрджрд┐ рдЧреНрд░рд╛рд╣рдХ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЬреБрдбрд╝рд╛ рд╣реБрдЖ рд╣реИ, рддреЛ рдиреЛрдбреНрд╕ рдореЗрдВ рд╕реЗ рдПрдХ рдХреА рд╡рд┐рдлрд▓рддрд╛ рд░реБрдХ рдирд╣реАрдВ рдЬрд╛рдПрдЧреАред рд▓реЗрдХрд┐рди рдЕрдЧрд░ рдкрд╣рд▓рд╛ рдиреЛрдб рдЕрдиреБрдкрд▓рдмреНрдз рд╣реИ, рддреЛ рд╕рддреНрд░ рд╡рд┐рд░рд╛рдо рдХреА рд╕реНрдерд┐рддрд┐ рдореЗрдВ рдХрдиреЗрдХреНрдЯ рдХрд░рдирд╛ рд╕рдВрднрд╡ рдирд╣реАрдВ рд╣реЛрдЧрд╛ред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдмрдврд╝рддреЗ рд╕рдордп, рдЖрдк рдмреИрдХрдЕрдк рдиреЛрдб рдХреЛ рджреВрд╕рд░реЗ рдиреЛрдб рдХрд╛ рд╕рдВрдХреЗрдд рджреЗрддреЗ рд╣реБрдП рдкрд╛рд╕ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
mount.glusterfs gluster-01.example.com:/main /gluster -o backupvolfile-server=gluster-02.example.com

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

рдХреБрдмреЗрд░рдиреЗрдЯреНрд╕ рд╕реЗ рдХрдиреЗрдХреНрдЯ рдХрд░реЗрдВ


рдЗрд╕ рд╕реНрддрд░ рдкрд░, рдкреНрд░рд╢реНрди рд╢реБрд░реВ рд╣реБрдП: "рдЗрд╕реЗ рдХреИрд╕реЗ рдХрдиреЗрдХреНрдЯ рдХрд░реЗрдВ?"ред рдФрд░ рдХрдИ рд╡рд┐рдХрд▓реНрдк рд╣реИрдВред рдЙрди рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВред

Heketi


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

Kubernetes рдкрд░ рд╕рдорд╛рдкрди рдмрд┐рдВрджреБ


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

apiVersion: v1
kind: Endpoints
metadata: 
  name: glusterfs-cluster
subsets:
  - addresses:
      #  ip  
      - ip: 10.10.6.71
    ports:
      #    1,    
      - port: 1
  - addresses:
      - ip: 10.10.6.72
    ports:
      - port: 1

---
apiVersion: v1
kind: Service
metadata:
  name: glusterfs-cluster
spec:
  ports:
  - port: 1

рдЕрдм рд╣рдо рдПрдХ рд╕рд░рд▓ рдкрд░реАрдХреНрд╖рдг рдкрд░рд┐рдирд┐рдпреЛрдЬрди рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдЬрд╛рдБрдЪ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдмрдврд╝рддреЗ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред рдиреАрдЪреЗ рдПрдХ рд╕рд░рд▓ рдкрд░реАрдХреНрд╖рдг рдкрд░рд┐рдирд┐рдпреЛрдЬрди рдХрд╛ рдЙрджрд╛рд╣рд░рдг рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: gluster-test
spec:
  replicas: 1
  selector:
    matchLabels:
      app: gluster-test
  template:
    metadata:
      labels:
        app: gluster-test
    spec:
      volumes:
      - name: gluster
        glusterfs:
          endpoints: glusterfs-cluster
          path: main
      containers:
      - name: gluster-test
        image: nginx
        volumeMounts:
        - name: gluster
          mountPath: /gluster

рдпрд╣ рд╡рд┐рдХрд▓реНрдк рд╣рдореЗрдВ рд╕реВрдЯ рдирд╣реАрдВ рдХрд░рддрд╛ рдерд╛, рдХреНрдпреЛрдВрдХрд┐ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рд╕рднреА рдХреБрдмреЗрд░рдиреЗрдЯреНрд╕ рдиреЛрдбреНрд╕ рдкрд░ рдХрдВрдЯреЗрдирд░-рд▓рд╛рдЗрдирдХреНрд╕ рд╣реИред рдкреИрдХреЗрдЬ рдореИрдиреЗрдЬрд░ рдирд╣реАрдВ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдмрдврд╝рддреЗ рд╣реБрдП рдЧреНрд▓рд╕реНрдЯрд░-рдХреНрд▓рд╛рдЗрдВрдЯ рдХреЛ рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдирд╛ рд╕рдВрднрд╡ рдирд╣реАрдВ рдерд╛ред рдЗрд╕ рд╕рдВрдмрдВрдз рдореЗрдВ, рддреАрд╕рд░рд╛ рд╡рд┐рдХрд▓реНрдк рдорд┐рд▓рд╛, рдЬрд┐рд╕реЗ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рдирд┐рд░реНрдгрдп рд▓рд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред

GlusterFS + NFS + рдХреЛ рд░рдЦрд╛ рдЧрдпрд╛


рдХреБрдЫ рд╕рдордп рдкрд╣рд▓реЗ рддрдХ, GlusterFS рдиреЗ рдЕрдкрдиреЗ NFS рд╕рд░реНрд╡рд░ рдХреА рдкреЗрд╢рдХрд╢ рдХреА рдереА, рд▓реЗрдХрд┐рди рдЕрдм NFS рдХреЗ рд▓рд┐рдП рдмрд╛рд╣рд░реА рд╕реЗрд╡рд╛ nfs-ganesha рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХрд╛рдлреА рдХреБрдЫ рд▓рд┐рдЦрд╛ рдЧрдпрд╛ рд╣реИ, рдЗрд╕ рд╕рдВрдмрдВрдз рдореЗрдВ рд╣рдо рдпрд╣ рдкрддрд╛ рд▓рдЧрд╛рдПрдВрдЧреЗ рдХрд┐ рдЗрд╕реЗ рдХреИрд╕реЗ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд┐рдпрд╛ рдЬрд╛рдПред

рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рдХреЛ рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ рдкрдВрдЬреАрдХреГрдд рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдлрд╝рд╛рдЗрд▓ /etc/yum.repos.d/nfs-ganesha.repo рдореЗрдВ рд╣рдо рдЬреЛрдбрд╝реЗрдВ:

[nfs-ganesha]
name=nfs-ganesha
baseurl=https://download.nfs-ganesha.org/2.8/2.8.0/RHEL/el-8/$basearch/
enabled=1
gpgcheck=1
[nfs-ganesha-noarch]
name=nfs-ganesha-noarch
baseurl=https://download.nfs-ganesha.org/2.8/2.8.0/RHEL/el-8/noarch/
enabled=1
gpgcheck=1

рдФрд░ рд╕реНрдерд╛рдкрд┐рдд рдХрд░реЗрдВ:

yum -y install nfs-ganesha-gluster --nogpgcheck

рд╕реНрдерд╛рдкрдирд╛ рдХреЗ рдмрд╛рдж, рд╣рдо рдлрд╝рд╛рдЗрд▓ /etc/ganesha/ganesha.conf рдореЗрдВ рдореВрд▓ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдХрд╛ рд╕рдВрдЪрд╛рд▓рди рдХрд░рддреЗ рд╣реИрдВред

# create new
NFS_CORE_PARAM {
    # possible to mount with NFSv3 to NFSv4 Pseudo path
    mount_path_pseudo = true;
    # NFS protocol
    Protocols = 3,4;
}
EXPORT_DEFAULTS {
    # default access mode
    Access_Type = RW;
}
EXPORT {
    # uniq ID
    Export_Id = 101;
    # mount path of Gluster Volume
    Path = "/gluster/main";
    FSAL {
        # any name
        name = GLUSTER;
        # hostname or IP address of this Node
        hostname="gluster-01.example.com";
        # Gluster volume name
        volume="main";
    }
    # config for root Squash
    Squash="No_root_squash";
    # NFSv4 Pseudo path
    Pseudo="/main";
    # allowed security options
    SecType = "sys";
}
LOG {
    # default log level
    Default_Log_Level = WARN;
}

рд╣рдореЗрдВ рд╕реЗрд╡рд╛ рд╢реБрд░реВ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рд╣рдорд╛рд░реЗ рд╡реЙрд▓реНрдпреВрдо рдХреЗ рд▓рд┐рдП рдПрдирдПрдлрд╝рдПрд╕ рд╕рдХреНрд╖рдо рдХрд░реЗрдВ рдФрд░ рдЬрд╛рдВрдЪреЗрдВ рдХрд┐ рдпрд╣ рдЪрд╛рд▓реВ рд╣реИред

$ systemctl start nfs-ganesha
$ systemctl enable nfs-ganesha
$ gluster volume set main nfs.disable off
$ gluster volume status main

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

mkdir /gluster-nfs
mount.nfs gluster-01.example.com:/main /gluster-nfs

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

CentOs рдореЗрдВ рд░рдЦрдиреЗ рдХреА рд╕реНрдерд╛рдкрдирд╛ рддреБрд░рдВрдд рдкреИрдХреЗрдЬ рдореИрдиреЗрдЬрд░ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдХреА рдЬрд╛рддреА рд╣реИред

$ yum install -y keepalived

рд╣рдо рдлрд╝рд╛рдЗрд▓ /etc/keepalived/keepalived.conf рдореЗрдВ рд╕реЗрд╡рд╛ рдХреЛ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░рддреЗ рд╣реИрдВ:

global_defs {
    notification_email {
        admin@example.com
    }
    notification_email_from alarm@example.com
    smtp_server mail.example.com
    smtp_connect_timeout 30

    vrrp_garp_interval 10
    vrrp_garp_master_refresh 30
}

#C   ,   .    , VIP .
vrrp_script chk_gluster {
    script "pgrep glusterd"
    interval 2
}

vrrp_instance gluster {
    interface ens192
    state MASTER #     BACKUP
    priority 200 #      ,  100
    virtual_router_id 1
    virtual_ipaddress {
        10.10.6.70/24
    }

    unicast_peer {
        10.10.6.72 #        
    }

    track_script {
        chk_gluster
    }
}

рдЕрдм рд╣рдо рд╕реЗрд╡рд╛ рд╢реБрд░реВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдЬрд╛рдВрдЪ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдиреЛрдб рдкрд░ рд╡реАрдЖрдИрдкреА рдкреНрд░рдХрдЯ рд╣реЛрддрд╛ рд╣реИ:

$ systemctl start keepalived
$ systemctl enable keepalived
$ ip addr
1: ens192: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
    link/ether 00:50:56:97:55:eb brd ff:ff:ff:ff:ff:ff
    inet 10.10.6.72/24 brd 10.10.6.255 scope global noprefixroute ens192
       valid_lft forever preferred_lft forever
    inet 10.10.6.70/24 scope global secondary ens192
       valid_lft forever preferred_lft forever

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

---
apiVersion: v1
kind: PersistentVolume
metadata:
  name: gluster-nfs
spec:
  capacity:
    storage: 10Gi
  accessModes:
    - ReadWriteMany
  persistentVolumeReclaimPolicy: Retain
  nfs:
    server: 10.10.6.70
    path: /main

---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
 name: gluster-nfs
spec:
 accessModes:
 - ReadWriteMany
 resources:
   requests:
     storage: 10Gi
 volumeName: "gluster-nfs"

---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: gluster-test
  labels:
    app: gluster-test
spec:
  replicas: 1
  selector:
    matchLabels:
      app: gluster-test
  template:
    metadata:
      labels:
        app: gluster-test
    spec:
      volumes:
      - name: gluster
        persistentVolumeClaim:
          claimName: gluster-nfs
      containers:
      - name: gluster-test
        image: nginx
        volumeMounts:
        - name: gluster
          mountPath: /gluster

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

рд╕рд╛рд░рд╛рдВрд╢


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

1 рдПрдордмреА рдкрд░ рдлрд╛рдЗрд▓реЗрдВ:

sync; dd if=/dev/zero of=tempfile bs=1M count=1024; sync
Gluster: 1073741824 bytes (1.1 GB, 1.0 GiB) copied, 2.63496 s, 407 MB/s
NFS: 1073741824 bytes (1.1 GB, 1.0 GiB) copied, 5.4527 s, 197 MB/s

1 рдХреЗрдмреА рдкрд░ рдлрд╛рдЗрд▓реЗрдВ:

sync; dd if=/dev/zero of=tempfile bs=1K count=1048576; sync
Gluster: 1073741824 bytes (1.1 GB, 1.0 GiB) copied, 70.0508 s, 15.3 MB/s
NFS: 1073741824 bytes (1.1 GB, 1.0 GiB) copied, 6.95208 s, 154 MB/s

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

All Articles