
แฉแแแ แ แแขแแ แแแแแฌแแแก Rook: แแก แแแแจแแแแแแแแแ แแแแ แขแแแแแก Kubernetes-แแก แแแแกแขแแ แแแจแ แจแแแแฎแแแกแแแ แแฃแจแแแแแก. แแฃแแชแ, แแ แกแแแแ แขแแแแก แแแ แแแแฃแแ แกแแ แแฃแแแแแแช แแฎแแแแก แแแ. แแแแแแแแแแแ, แ แแ แแก แแฎแแแ แแแกแแแ แแแแแฎแแแ แแแแ แแ แกแแ แแฃแแแแแแก แฃแแแ แแแแแ แแแแจแ, แกแแแแ แแกแแแ แฌแแ แแแแฅแแแแแ.
แแแแฎแแแก แฃแคแ แ แกแแแแขแแ แแกแแ แฌแแ แแแ แแแแกแแแแก, แแแแแฌแงแแ แจแแแแแแแ แฐแแแแแแขแฃแ แ แแ แแแแแแ แแแแกแขแแ แจแ.
"แงแแแแแคแแ แ แแแแแ แแฃแแแ!"
แฌแแ แแแแแแแแแ, แ แแ แแ แแฎแแ แฃแแแ แแแแแแแคแแแฃแ แแ แแ แแ แแแฃแจแแแ Rook แแฅแแแแก K8s แแแแกแขแแ แจแ แแ แแก แแแแแแฃแ แแ แแฃแจแแแแแ, แแแแ แแ แ แแฆแแช โแแจแแแแแแ โ แแแแแแขแจแ แจแแแแแแ แฎแแแแ:
- แแฎแแ แแแแแแก แแ แจแแฃแซแแแแ Ceph-แแแ RBD แกแฃแ แแแแแแก แแแแแแขแแแแแ.
- แแฃแแแแแ, แ แแแแ แแชแแ
lsblkะธdfแแกแแแ แแ แแฃแจแแแแแ Kubernetes-แแก แแแแแซแแแแ. แแก แแแขแแแแขแฃแ แแ แแแจแแแแก, แ แแ แแแแแซแแแแ แแแแแแขแแแแแฃแ RBD แกแฃแ แแแแแแแ แแแแแแจแแ แแแแ แ แแฆแแช แแ แแแแแแแ. แแแแ แฌแแแแแฎแแ แจแแฃแซแแแแแแแ, แ แแช แแแฃแแแแแแก, แ แแ แแแแแขแแ แแแ แแแฃแฌแแแแแแแแ... - แแแแฎ, แแแแกแขแแ แจแ แแ แแ แแก แแแแฃแจแแแ แแแแแขแแ แแแ. แฃแคแ แ แแแขแแช, แแ แช OSD แแแแแแ แแ แแ แช MGR แแแแแ.
แ แแแแกแแช แแแแ แแแแฌแงแ rook-ceph-operator? แแ แช แแกแ แแแแ แฎแแแก แฌแแ แแแแแแแแ. แ แแขแแ? Rook แแแแ แแขแแ แแ แแแแแฌแงแแแขแ แแฎแแแ แแแแกแขแแ แแก แจแแฅแแแ... แ แแแแ แจแแแแแซแแแ แแฎแแ แแแแกแขแแ แแก แแ แแแกแ แแแแแชแแแแแแก แแฆแแแแแ?
แแแแแฌแงแแ แฃแคแ แ แฎแแแแ แซแแแแ แแ แกแแแแขแแ แแกแ แแแแแแแแ, แ แฃแแแก แจแแแ แกแแกแขแแแแแแก แกแแคแฃแซแแแแแแ แแแแแซแแแแแ แแ แแแกแ แแแแแแแแแขแแแแก แแขแแแแแ แแแ แแฆแแแแแแ. แ แ แแฅแแ แฃแแแ, แแ แกแแแแแก แฃแคแ แ แแแแแ แแ แแคแแฅแขแฃแ แ แแแแช: แกแแ แแแแ แแ แแกแแแแแก แแแแแงแแแแแ. แ แแแแ แช แงแแแแแ แแแชแแ, แแแแแแแกแขแ แแขแแ แแแแก แแ แ แขแแแ แแ แกแแแแแก: แแกแแแ, แแแแช แกแแ แแแแ แแ แแกแแแแก แแ แฅแแแแก แแ แแกแแแ, แแแแช แแแแแแแก... แแฃแแชแ, แแแแแ แแแแแซแแแแแก แจแแแแแ แแแกแแฃแแ แแแ.
แแแขแแ แ แแ แแฅแขแแแ, แแฃ แแ แซแแแ แแแ
แฉแแแ แแแแแแแแแแแ แแแ แแ แแแแแ แแ แกแแแฃแ แแแแแ แแแแก แแ แแฆแแแแแแแ แแฅแแแแก แแแแแขแแ แแแก.
แแแแแ, แแแแแแฎแแแแ ConfigMaps-แแก แกแแแก: แแ แแก แแก, แ แแช แกแแญแแ แแ แกแแ แแแแ แแ แแกแแแก แจแแกแแฅแแแแแแ. rook-ceph-config ะธ rook-config-overrideแแกแแแ แฉแแแแแแแ, แ แแแแกแแช แแแแกแขแแ แ แฌแแ แแแขแแแแ แแแแแแแแแแ.
NB: แแฎแแ แแแ แกแแแแจแ, แแแแขแแแชแแแแก แจแแแแแ ConfigMaps แแฆแแ แฌแแ แแแแแแแแก แแแแกแขแแ แแก แแแแแแแแแแก แฌแแ แแแขแแแแก แแแแแแแขแแ แก.
แจแแแแแแแ แแแฅแแแแแแแแแก แจแแกแแกแ แฃแแแแแแ, แกแแญแแ แแ แงแแแแ แกแแ แแแ แแก แแงแแ แ แแแแแขแแแ แแแ, แ แแแแแแแช แแแแแแขแแแแแฃแแแ RBD แกแฃแ แแแแแ (ls /dev/rbd*). แแก แฃแแแ แแแแแแแแก sysrq-แแก แแแจแแแแแแ (แแ โแคแแฎแแโ แแแแแชแแแแ แชแแแขแ แจแ). แแก แแแแฎแแแแ แแฃแชแแแแแแแแ แแแแแแขแแแแแฃแแ RBD-แแแแก แแแกแแฎแกแแแแแ, แ แแแแแแแแแแกแแช แกแขแแแแแ แขแฃแแ แแแแแขแแแ แแแ แแ แแแฃแจแแแแแก (แแก แฌแแ แฃแแแขแแแแแ แจแแแชแแแแ แแแ แฉแแแฃแแแแ แแ แแแแแแขแแแก).
แแแแแแแแขแ แ แแฌแงแแแ แแแแขแแแแแก แกแแแแแแ, แฎแแแ Ceph-แแก แแแแกแขแแ แ - แแแแแขแแ แแแแ. แแแแแ, แแแแแแฎแแแแ แแกแแแ.
แ แฃแแ แแแแแขแแ แแก แแแแจแ แจแแแแแ แแแแแฅแขแแแก แแแแแ แแแก:
Volumes:
rook-ceph-config:
Type: ConfigMap (a volume populated by a ConfigMap)
Name: rook-ceph-config
rook-ceph-mons-keyring:
Type: Secret (a volume populated by a Secret)
SecretName: rook-ceph-mons-keyring
rook-ceph-log:
Type: HostPath (bare host directory volume)
Path: /var/lib/rook/kube-rook/log
ceph-daemon-data:
Type: HostPath (bare host directory volume)
Path: /var/lib/rook/mon-a/data
Mounts:
/etc/ceph from rook-ceph-config (ro)
/etc/ceph/keyring-store/ from rook-ceph-mons-keyring (ro)
/var/lib/ceph/mon/ceph-a from ceph-daemon-data (rw)
/var/log/ceph from rook-ceph-log (rw) แแแแฎแแ, แ แ แแ แแก แกแแแแฃแแแ rook-ceph-mons-keyring:
kind: Secret
data:
keyring: LongBase64EncodedString=แฉแแแ แแจแแคแ แแแ แแ แแแฆแแแ แฉแแแฃแแแแ แแ แกแแแแแแซแ แ แแแแก แแแแแแแกแขแ แแขแแ แแกแ แแ แแแแแขแแ แแแแก แฃแคแแแแแแแ:
[mon.]
key = AQAhT19dlUz0LhBBINv5M5G4YyBswyU43RsLxA==
caps mon = "allow *"
[client.admin]
key = AQAhT19d9MMEMRGG+wxIwDqWO1aZiZGcGlSMKp==
caps mds = "allow *"
caps mon = "allow *"
caps osd = "allow *"
caps mgr = "allow *" แแแแแฎแกแแแแ. แแฎแแ แแ แกแแแแฃแแแแ แแแแแแฎแแแแ แแแกแแฆแแแแก แกแแแแแก. rook-ceph-admin-keyring:
kind: Secret
data:
keyring: anotherBase64EncodedString=แ แ แแ แแก แแแกแจแ?
[client.admin]
key = AQAhT19d9MMEMRGG+wxIwDqWO1aZiZGcGlSMKp==
caps mds = "allow *"
caps mon = "allow *"
caps osd = "allow *"
caps mgr = "allow *" แแฅแแช แแแแแแ. แแแแแ แแ แแฎแแ แแแแฎแแ... แแ, แแแแแแแแแ, แกแแแแฃแแแ. rook-ceph-mgr-a-keyring:
[mgr.a]
key = AQBZR19dbVeaIhBBXFYyxGyusGf8x1bNQunuew==
caps mon = "allow *"
caps mds = "allow *"
caps osd = "allow *" แกแแแแแแแ ConfigMap-แจแ แแแแแ แ แแแแแแแแ แกแแแแฃแแแแก แแแแฃแแแแ. rook-ceph-mon:
kind: Secret
data:
admin-secret: AQAhT19d9MMEMRGG+wxIwDqWO1aZiZGcGlSMKp==
cluster-name: a3ViZS1yb29r
fsid: ZmZiYjliZDMtODRkOS00ZDk1LTczNTItYWY4MzZhOGJkNDJhCg==
mon-secret: AQAhT19dlUz0LhBBINv5M5G4YyBswyU43RsLxA==แแ แแก แแ แแก แแ แแแแแแแฃแ แ แกแแ แแแกแแฆแแแแก แ แแแแแแแ, แกแแแแแแแช แแแแแก แแแแแ แแฆแฌแแ แแแ แงแแแแ แกแแแแฃแแแ.
แ แแแแ แช แชแแแแแแแ (แแฎ. dataDirHostPath ะฒ ), แ แฃแแ แแ แแแแแชแแแแแก แแ แแแแแแแก แแแแฎแแแก. แแแแแ, แแแแแแแแแ แแแแแซแแแแ, แ แแแ แแแแฎแแ แแ แแแแแแแ, แ แแแแแแแช แจแแแแฎแฃแแแ แแแแแขแแ แแแแแ แแ OSD-แแแแ แแแแแแจแ แแแแแแขแแแแแฃแ แแแ แแฅแขแแ แแแแจแ. แแแแกแแแแแก แแแแแซแแแแ แแแแแแแ [แแ แแแแแแแก]. /var/lib/rook/mon-a/data/keyring แแ แฉแแแ แแแแฎแแแ:
# cat /var/lib/rook/mon-a/data/keyring
[mon.]
key = AXAbS19d8NNUXOBB+XyYwXqXI1asIzGcGlzMGg==
caps mon = "allow *"แฃแแชแ แแ แแฅ แกแแแแฃแแแ แแแแกแฎแแแแแแฃแแ แแฆแแแฉแแแ - แแ แ ConfigMaps-แแก แแกแแแแกแแ.
แ แแช แจแแแฎแแแ แแแแแแแกแขแ แแขแแ แแก แแแกแแฆแแแก? แแกแแช แแแแฅแแก:
# cat /var/lib/rook/kube-rook/client.admin.keyring
[client.admin]
key = AXAbR19d8GGSMUBN+FyYwEqGI1aZizGcJlHMLgx=
caps mds = "allow *"
caps mon = "allow *"
caps osd = "allow *"
caps mgr = "allow *"แแ แแแแแแ แกแฌแแ แแ แแก แแ แแก. แแงแ แ แแฆแแช แฎแแ แแแแ: แแแแกแขแแ แ แฎแแแแฎแแ แจแแแฅแแแ... แกแแแแแแแแแแจแ แแ แแกแ แแ แแแฎแแ.
แชแฎแแแ แฎแแแแ, แ แแ แกแแแแฃแแแแแแแแ แจแแแชแแแก แแฎแแแ แแแแแ แแ แแแฃแ แแแกแแฆแแแแก แ แแแแแแก แแ แแกแแแ แแ แแ แแก แฉแแแแ แซแแแแ แแแแกแขแแ แแแแ. แแแแขแแ:
- แแแแแขแแ แแก แแแกแแฆแแแแก แ แแแแก แคแแแแแแแ แแแฆแแแ
/var/lib/rook/mon-a/data/keyring(แแ แกแแ แแแแ แแ แแกแแแแแ); - แคแแ แฃแแแ แจแแชแแแแแ แแแกแแฆแแแแก แกแแแแแ แ
rook-ceph-mons-keyring; - แแแแ แแแแกแขแ แแ แแ แแแกแแฆแแแแก แ แแแแ แแแแแแแกแขแ แแขแแ แแแแ แแ แแแแแขแแ แแแแ ConfigMap-แจแ
rook-ceph-mon; - แฉแแแ แแฎแกแแแ แแแ แแแแขแ แแแแ แแแก แแแแแขแแ แแแแแ แแ แแแ.
แกแแกแฌแแฃแแ แแแแ แแแฎแแแแ: แแแแแขแแ แแแ แแแแแฉแแแแแ แแ แแแแฌแงแแแแ แแฃแจแแแแแก. แฐแฃแ แ, แงแแแแแคแแ แ แแแแฌแงแ!
แฉแแแ แแฆแแแแแแแ OSD-แก
แแแแ, แแแแจแ แฌแแแแแแ rook-operator: แแแแแฌแแแแ ceph mon dump แแฉแแแแแแก, แ แแ แงแแแแ แแแแแขแแ แ แแแแแแแแ แแ ceph -s - แ แแ แแกแแแ แแแแ แฃแแจแ แแ แแแ. แแฃแแชแ, แแฃ OSD แฎแแก แแแแแแแ แแแแแ (ceph osd tree), แฃแชแแแฃแ แ แแแแก แแแแแแแฎแแแ: OSD-แแแ แแแแแฉแแแ, แแแแ แแ แแกแแแ แชแแ แแแแแ. แแฆแแแฉแแแ, แ แแ แแแแ แแฆแแแแแแช แ แแแแ แแ แกแแญแแ แแ. แแแแ แแ แ แแแแ ?
แแแแกแแแแจแ, ConfigMaps-แแ แจแแแซแแแ แแก แคแฃแแฅแชแแแแ, แ แแแแแแแช แแกแ แกแแกแแฌแแ แแแแแแแแ แแแญแแ แแแแแแ. rook-ceph-config ะธ rook-config-override, แแกแแแ แแ แแแแแ แกแฎแแ ConfigMap แกแแฎแแแฌแแแแแแ, แ แแแแ แแชแแ rook-ceph-osd-$nodename-configแแแแแ แจแแแฎแแแแ แแแ:
kind: ConfigMap
data:
osd-dirs: '{"/mnt/osd1":16,"/mnt/osd2":18}'แงแแแแแคแแ แ แแ แแกแฌแแ แแ, แงแแแแแคแแ แ แแแ แแ!
แแแแแ, แแแแ แแขแแ แแก แแแแ แแฃแแแแแ แแแแแงแแแแแ, แฌแแแจแแแแ แแแแแ แแ แแแฃแแ แแแแแก แแแแแแแแแแแ OSD-แแก แแแจแแแแแแ แแ แแแแแแแกแฌแแ แแ แแก ConfigMaps. แแแแ แแ แกแแแแแ แแแจแแแแ แแกแแแ? แกแฌแแ แ OSD แ แฃแแ แแแแแซแแแแก แแแฎแแแแแ?
- แแแแแ, แแแแแ แแ แแฎแแ แแชแแแแ แแแ แแฅแขแแ แแแแแก แแแแแแแแแ แแแ.
/mnt/osd[1-2]แแแแแซแแแแ - แแ แแแแแแ, แ แแ แแฅ แ แแฆแแชแแก แแแแฎแแแแแแ. - แแแขแแแแแจแ
/mnt/osd1แแ แกแแแแแก 2 แฅแแแแแ แแฅแขแแ แแ:osd0ะธosd16แแก แฃแแแแแกแแแแแ แแฃแกแขแแ ConfigMap-แจแ (16) แแแแแแแแฃแแ ID-แแ? - แแแแแ, แจแแแแแแฌแแแ แแแแแแ แแ แแแแฎแแ, แ แแ
osd0แแแแ แแ แแแขแosd16.
แฉแแแ แแ แแแกแแแแแแแ แแแแแแแแ แ, แ แแ osd0 - แแก แแ แแก แกแแญแแ แ OSD, แ แแแแแแช แแแแแแแแฃแแ แแงแ, แ แแแแ แช /mnt/osd1 ConfigMap-แจแ (แ แแแแแ แฉแแแ แแแงแแแแแ .)
แแขแแแแแ แแแแ, แฉแแแ แแแแแฌแแแแ แงแแแแ แแแแแซแก แแ แแแ แแแแฅแขแแ แแแ ConfigMaps-แก. แงแแแแ แแแกแขแ แฃแฅแชแแแก แแแกแ แฃแแแแแก แจแแแแแ, แจแแแแแซแแแ แแแแฃแจแแแ Rook แแแแ แแขแแ แแก แแแแ แแ แฌแแแแแแแฎแแ แแแกแ แแฃแ แแแแแแ. แแ แงแแแแแคแแ แ แจแแกแแแแจแแแแแ แแแแแแงแฃแ แแแ:
- แแ แแแแกแขแแ แแก แแแแ แแขแแ แ แแแ ;
- แแแแแซแแแแ แแแกแแแแ แแแแแแ;
- แแแแแขแแ แแแ แแแแแแ;
- แแแแแแแ แแแแแแแ แแแแแแแแ แแแแ, แแแฃ แแแ แแแแ แฃแแ แจแแฅแแแแก;
- OSD แแแแแแแแแแแก แแแฎแแ แชแแแแแ...
แแแแแ, แแกแแ Rook แแแแ แแขแแ แแแแก แแแแจแ แจแแแแแแ แแ แแแแกแขแแ แแก แแแแแแแ แแแแ แจแแแแแแฌแแแ... แแแแฎ, แแแแแแ แ แแแแแซแแ OSD แกแแฎแแแแแ แชแแขแแแ แจแแแแคแแ แฎแแ! แแ แแแแแแ แแ แแ แแก: แฎแแแแฎแแ แจแแแชแแแแแ ConfigMaps, แแฎแแแ OSD-แแแแแแ แแแแแแขแ แแแ แแฅแขแแ แแแแ แฌแแแจแแแแ แแ แแแแ แฎแแแก แแแแแขแ แแแแแแแ แแแแแก แแแแแฆแฌแแแ. HEALTH_OK!
แแแแแ, แแแแแแฎแแแแ แแฃแแจแ แแแแแฆแแแฃแ แกแฃแ แแแแแก:
# rbd ls -p kube
pvc-9cfa2a98-b878-437e-8d57-acb26c7118fb
pvc-9fcc4308-0343-434c-a65f-9fd181ab103e
pvc-a6466fea-bded-4ac7-8935-7c347cff0d43
pvc-b284d098-f0fc-420c-8ef1-7d60e330af67
pvc-b6d02124-143d-4ce3-810f-3326cfa180ae
pvc-c0800871-0749-40ab-8545-b900b83eeee9
pvc-c274dbe9-1566-4a33-bada-aabeb4c76c32
โฆแงแแแแแคแแ แ แแแแแก แแแแแแแแ - แแแแกแขแแ แ แจแแแแฎแฃแแแ!
แซแแแแแ แแแแแ แแแ แกแแ แแแแ แแ แแกแแแแแก แแแแแแแแ, แแ แกแฌแ แแคแ แแแ
แแฃ Rook-แแกแแแแก แกแแ แแแแ แแ แแกแแแแ แจแแแฅแแแ, แแฆแแแแแแก แแ แแชแแแฃแ แ แแแแจแแแแแแแแแ แแแแแ แขแแแแแแ แแ แจแแแแแแแแแ แแ แแแแงแแแแแแ:
- แฉแแแ Rook แแแแ แแขแแ แแก แแแแแแแแแแก แแฃแแแแแ แแแฎแแแแ;
- แฉแแแ แแจแแแ แงแแแแ แแแแแแแแแแก, แแแ แแ Rook แแแแ แแขแแ แแกแ;
- แฉแแแ แแฆแแแแแแแ แงแแแแ แกแแแแฃแแแแแแแก แแ ConfigMaps-แก แกแแ แแแแ แแ แแกแแแแแ;
- แแแ แแฅแขแแ แแแก แจแแแแแ แกแแก แแฆแแแแแ
/var/lib/rook/mon-*แแแแแซแแแแ; - แฉแแแ แแฆแแแแแแแ (แแฃ แแแฃแแแแแแแแ แแแแแแ แแแ) CRD-แก
CephCluster,CephFilesystem,CephBlockPool,CephNFS,CephObjectStore; - Rook แแแแ แแขแแ แแก แแแแแแแแแแก แแกแแ 1-แแแ แแแแชแแ แแแ.
แกแแกแแ แแแแแ แ แฉแแแแแ
แจแแฅแแแแแ แกแแ แแแแ แแ แแกแแแแ!
แแ แแ แกแแขแฃแแชแแแแแก แแแแแแแ แแกแแชแแแแแแแ, แ แแแแกแแช แแแแแแ แแฆแแแแแแ แกแแญแแ แ:
- แกแแ แแแ แแแแก แแแแแขแแแ แแแแกแแแ แแแแแแจแแ แแแฃแแ แแแกแจแขแแแฃแ แ แแแแกแขแแ แฃแแ แกแแแฃแจแแแก แจแแกแ แฃแแแแแแแ, Rook แแแแ แแขแแ แ แแฃแแแแแ แแแแงแแแแ, แ แแแ แแแ แแแแแแขแ แแ แแคแแ แ แแแแแแแแก.
- แแแแแขแแ แแแแ แฌแแแแกแฌแแ .
- แงแฃแ แแแฆแแแ แแแแฅแชแแแ แฌแแแแกแฌแแ
ROOK_MON_HEALTHCHECK_INTERVALะธROOK_MON_OUT_TIMEOUT.
แแแแก แแแชแแแแ, แ แแ แแแกแแแแ
แแแ แ แแ แแฅแแก แแแแก แแขแแแชแแแแก, แ แแ Rook, แ แแแแ แช แแแแแขแแแแแ แคแแแ (Kubernetes-แแก แกแแชแแแแก แแ แแแแแแแชแแแก แกแแแ แแ แกแฅแแแแจแ), แแ แแแ แแฃแแแ แแแแ แขแแแแแก แแแแ แ แแแแก แแ แจแแแแแฅแแก แแฎแแแ แกแแ แแฃแแแแแ แแ แแแขแแแชแแฃแ แ แแแคแ แแกแขแ แฃแฅแขแฃแ แฃแแ แแ แแแแแแแแ. แแ แแแแแ แแ, แ แแช แ แฉแแแ, แแ แแก แแแแแแแแกแแแฃแแ, แแแคแแ แแแ แแแฃแแ แแ แฉแแแแแแก แแแแแแแแ, แแ แแ แแฎแ แแ, แแ แ แแกแแแแกแ แแ แแแแ แ แแฎแ แแ, แแ แกแแ แแแแแแก แจแแ แแก, แ แแแแแกแแช แแแแแฌแงแแแขแ แแแแฅแแก แแฅแแแแก แแแแแ แแขแฃแ แกแแขแฃแแชแแแจแ.
แกแฎแแแแ แจแแ แแก, แชแแขแ แฎแแแก แฌแแ Rook-แแก แแแแฃแแแแขแแชแแแจแ แแแแงแแคแแแแแแจแ โแแ แกแแแฃแแ Rook Ceph แแแแกแขแแ แแก แแฎแแ Kubernetes แแแแกแขแแ แจแ แแแฆแแแโ แฃแคแ แ แแแขแแแฃแ แแ แแ แแก แแฆแฌแแ แแแ, แแฃ แ แ แฃแแแ แแแแแแแแก แแ แกแแแฃแแ แแแแแชแแแแแแก แแฎแแ Kubernetes แแแแกแขแแ แจแ แแแแแกแแขแแแแ แแ แแแแกแขแแ แแก แแฆแกแแแแแแแ, แ แแแแแแช แแ แแ แแ แกแฎแแ แแแแแแแ แแแ แแแฎแแ แฎแแ.
PS
แแกแแแ แฌแแแแแแฎแแ แฉแแแแก แแแแแแ:
- ยซ";
- ยซ";
- ยซ".
- ยซ".
แฌแงแแ แ: www.habr.com
