OpenShift Π²ΠΈΡΡΡΠ°Π»ΠΈΠ·Π°ΡΠΈΡ (Π°ΠΏΡΡΡΠΈΠΌ ΠΏΡΠΎΠ΅ΠΊΡ β Kubernetes: KubeVirt, ΡΠΌ. ΠΈ ), Π² Π΄Π΅Π²ΠΈΡΠ΅ΡΡΠ²Π΅ Container-native Virtualization, Π±Π΅ΡΠ΅ ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π΅Π½ ΠΊΠ°ΡΠΎ ΡΡΠ½ΠΊΡΠΈΠΎΠ½Π°Π»Π½ΠΎΡΡ Π½Π° ΠΏΠ»Π°ΡΡΠΎΡΠΌΠ°ΡΠ° OpenShift, ΠΊΠΎΡΡΠΎ Π΅ ΠΏΡΠ΅Π΄Π½Π°Π·Π½Π°ΡΠ΅Π½Π° Π·Π° ΡΠ°Π·Π³ΡΡΡΠ°Π½Π΅ ΠΈ ΡΠΏΡΠ°Π²Π»Π΅Π½ΠΈΠ΅ Π½Π° Π²ΠΈΡΡΡΠ°Π»Π½ΠΈ ΠΌΠ°ΡΠΈΠ½ΠΈ (ΠΠ), ΠΊΠΎΠΈΡΠΎ ΡΡΠ½ΠΊΡΠΈΠΎΠ½ΠΈΡΠ°Ρ ΠΊΠ°ΡΠΎ ΠΎΡΠ½ΠΎΠ²Π½ΠΈ Π΅Π΄ΠΈΠ½ΠΈΡΠΈ Π½Π° Kubernetes. Π’Π°Π·ΠΈ Π·Π°Π΄Π°ΡΠ° Π΅ ΡΠ΅Ρ Π½ΠΈΡΠ΅ΡΠΊΠΈ ΡΠ»ΠΎΠΆΠ½Π° ΠΏΠΎΡΠ°Π΄ΠΈ ΡΡΠ½Π΄Π°ΠΌΠ΅Π½ΡΠ°Π»Π½ΠΈΡΠ΅ ΡΠ°Π·Π»ΠΈΡΠΈΡ Π² ΡΠ΅Ρ Π½ΠΎΠ»ΠΎΠ³ΠΈΠΈΡΠ΅. ΠΠ° Π΄Π° ΡΠ΅ ΠΏΠΎΡΡΠΈΠ³Π½Π΅ ΠΏΠΎΡΡΠ°Π²Π΅Π½Π°ΡΠ° ΡΠ΅Π», Π±ΡΡ Π° ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Π½ΠΈ Π΄ΠΎΠ±ΡΠ΅ ΠΏΠΎΠ·Π½Π°ΡΠΈΡΠ΅ ΡΠ΅Ρ Π½ΠΎΠ»ΠΎΠ³ΠΈΠΈ Π½Π° Π±Π°Π·Π°ΡΠ° Π½Π° Red Hat Enterprise Linux ΠΈ KVM, ΠΊΠΎΠΈΡΠΎ Π½ΠΈ ΡΡΠΏΡΡΡΡΠ²Π°Ρ ΠΎΡ Π³ΠΎΠ΄ΠΈΠ½ΠΈ ΠΈ Π΄ΠΎΠΊΠ°Π·Π°Ρ Π° ΡΠ²ΠΎΡΡΠ° Π΅ΡΠ΅ΠΊΡΠΈΠ²Π½ΠΎΡΡ.

Π ΡΠ°Π·ΠΈ ΡΡΠ°ΡΠΈΡ ΡΠ΅ ΡΠ°Π·Π³Π»Π΅Π΄Π°ΠΌΠ΅ ΡΠ΅Ρ
Π½ΠΈΡΠ΅ΡΠΊΠΈΡΠ΅ Π°ΡΠΏΠ΅ΠΊΡΠΈ Π½Π° OpenShift Π²ΠΈΡΡΡΠ°Π»ΠΈΠ·Π°ΡΠΈΡ, ΠΊΠΎΠΈΡΠΎ ΠΏΡΠ°Π²ΡΡ Π²ΡΠ·ΠΌΠΎΠΆΠ½ΠΎ ΡΡΡΠ΅ΡΡΠ²ΡΠ²Π°Π½Π΅ΡΠΎ Π½Π° ΠΠ ΠΈ ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅ΡΠΈ Π² ΡΠ°ΠΌΠΊΠΈΡΠ΅ Π½Π° Π΅Π΄Π½Π° ΠΏΠ»Π°ΡΡΠΎΡΠΌΠ°, ΠΊΠΎΡΡΠΎ Π³ΠΈ ΡΠΏΡΠ°Π²Π»ΡΠ²Π° ΠΊΠ°ΡΠΎ Π΅Π΄Π½ΠΎ ΡΡΠ»ΠΎ.
ΠΠ·ΡΠΈΡΠ»ΠΈΡΠ΅Π»Π½ΠΈ Π·Π°Π΄Π°ΡΠΈ
ΠΠΎΠ½ΡΠ΅ΠΉΠ½Π΅ΡΠΈΡΠ΅ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Ρ ΠΌΠ΅Ρ Π°Π½ΠΈΠ·ΠΌΠΈ Π½Π° Linux ΡΠ΄ΡΠΎΡΠΎ, ΠΊΠ°ΡΠΎ namespaces ΠΈ cgroups, Π·Π° ΠΈΠ·ΠΎΠ»Π°ΡΠΈΡ Π½Π° ΠΏΡΠΎΡΠ΅ΡΠΈΡΠ΅ ΠΈ ΡΠΏΡΠ°Π²Π»Π΅Π½ΠΈΠ΅ Π½Π° ΡΠ΅ΡΡΡΡΠΈΡΠ΅. ΠΠ±ΠΈΠΊΠ½ΠΎΠ²Π΅Π½ΠΎ ΠΏΠΎΠ΄ ΠΏΡΠΎΡΠ΅ΡΠΈΡΠ΅ ΡΠ°Π·Π±ΠΈΡΠ°ΠΌΠ΅ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ Π½Π° Python, Java ΠΈΠ»ΠΈ ΠΈΠ·ΠΏΡΠ»Π½ΡΠ΅ΠΌΠΈ ΡΠ°ΠΉΠ»ΠΎΠ²Π΅, Π½ΠΎ Π²ΡΡΡΠ½ΠΎΡΡ ΡΠΎΠ²Π° ΠΌΠΎΠ³Π°Ρ Π΄Π° Π±ΡΠ΄Π°Ρ Π²ΡΡΠΊΠ°ΠΊΠ²ΠΈ ΠΏΡΠΎΡΠ΅ΡΠΈ, ΡΡΡΠΈΡΡ bash, Emacs ΠΈΠ»ΠΈ vim.
Π ΠΊΠ°ΠΊΠ²ΠΎ Π΅ Π²ΠΈΡΡΡΠ°Π»Π½Π° ΠΌΠ°ΡΠΈΠ½Π°? ΠΡ Π³Π»Π΅Π΄Π½Π° ΡΠΎΡΠΊΠ° Π½Π° Ρ ΠΈΠΏΠ΅ΡΠ²ΠΈΠ·ΠΎΡΠ° β ΡΠΎΠ²Π° ΡΡΡΠΎ Π΅ ΠΏΡΠΎΡΠ΅Ρ. ΠΠΎ Π½Π΅ ΠΏΡΠΎΡΠ΅Ρ Π½Π° ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅, Π° KVM ΠΏΡΠΎΡΠ΅Ρ, ΠΎΡΠ³ΠΎΠ²ΠΎΡΠ΅Π½ Π·Π° ΠΈΠ·ΠΏΡΠ»Π½Π΅Π½ΠΈΠ΅ΡΠΎ Π½Π° ΠΊΠΎΠ½ΠΊΡΠ΅ΡΠ½Π° ΠΠ.

ΠΠΎΠ½ΡΠ΅ΠΉΠ½Π΅ΡΠ½ΠΈΡΡ ΠΎΠ±ΡΠ°Π· ΡΡΠ΄ΡΡΠΆΠ° Π²ΡΠΈΡΠΊΠΈ ΠΈΠ½ΡΡΡΡΠΌΠ΅Π½ΡΠΈ, Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠΈ ΠΈ ΡΠ°ΠΉΠ»ΠΎΠ²Π΅, Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΈ Π·Π° Π²ΠΈΡΡΡΠ°Π»Π½Π°ΡΠ° ΠΌΠ°ΡΠΈΠ½Π° KVM. ΠΠΊΠΎ ΠΈΠ½ΡΠΏΠ΅ΠΊΡΠΈΡΠ°ΠΌΠ΅ pod Π½Π° ΡΠ°Π±ΠΎΡΠ΅ΡΠ°ΡΠ° ΠΠ, ΡΠ΅ Π²ΠΈΠ΄ΠΈΠΌ ΡΠ°ΠΌ ΠΏΠΎΠΌΠΎΡΠ½ΠΈ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΈ ΠΈ ΠΏΡΠΎΡΠ΅ΡΠΈ qemu-kvm. ΠΡΠ²Π΅Π½ ΡΠΎΠ²Π°, ΠΈΠΌΠ°ΠΌΠ΅ Π΄ΠΎΡΡΡΠΏ Π΄ΠΎ KVM ΠΈΠ½ΡΡΡΡΠΌΠ΅Π½ΡΠΈ Π·Π° ΡΠΏΡΠ°Π²Π»Π΅Π½ΠΈΠ΅ Π½Π° Π²ΠΈΡΡΡΠ°Π»Π½ΠΈΡΠ΅ ΠΌΠ°ΡΠΈΠ½ΠΈ, ΠΊΠ°ΡΠΎ qemu-img, qemu-nbd ΠΈ virsh.

Π’ΡΠΉ ΠΊΠ°ΡΠΎ Π²ΠΈΡΡΡΠ°Π»Π½Π°ΡΠ° ΠΌΠ°ΡΠΈΠ½Π° Π΅ pod, ΡΡ Π°Π²ΡΠΎΠΌΠ°ΡΠΈΡΠ½ΠΎ Π½Π°ΡΠ»Π΅Π΄ΡΠ²Π° ΡΡΠ»Π°ΡΠ° ΡΡΠ½ΠΊΡΠΈΠΎΠ½Π°Π»Π½ΠΎΡΡ Π½Π° pod-a Π² Kubernetes. ΠΡΠΌ ΠΠ-pod-ΠΎΠ²Π΅, ΡΡΡΠΎ ΠΊΠ°ΠΊΡΠΎ ΠΈ ΠΊΡΠΌ ΠΎΠ±ΠΈΠΊΠ½ΠΎΠ²Π΅Π½ΠΈΡΠ΅ pod-ΠΎΠ²Π΅, ΡΠ΅ ΠΏΡΠΈΠ»Π°Π³Π°Ρ ΡΡ Π΅ΠΌΠΈ ΠΈ ΠΊΡΠΈΡΠ΅ΡΠΈΠΈ Π½Π° ΠΏΠ»Π°Π½ΠΈΡΠΎΠ²ΡΠΈΠΊΠ° ΠΊΠ°ΡΠΎ taints, tolerations, affinity ΠΈ anti-affinity. ΠΡΠ²Π΅Π½ ΡΠΎΠ²Π° ΠΏΠΎΠ»ΡΡΠ°Π²Π°ΡΠ΅ ΠΏΡΠ΅Π΄ΠΈΠΌΡΡΠ²Π° ΠΊΠ°ΡΠΎ Π²ΠΈΡΠΎΠΊΠ° Π½Π°Π»ΠΈΡΠ½ΠΎΡΡ ΠΈ Π΄Ρ. ΠΡΠΏΡΠ΅ΠΊΠΈ ΡΠΎΠ²Π°, ΠΈΠΌΠ° Π΅Π΄Π½ΠΎ Π²Π°ΠΆΠ½ΠΎ ΠΎΡΠ»ΠΈΡΠΈΠ΅: ΠΎΠ±ΠΈΠΊΠ½ΠΎΠ²Π΅Π½ΠΈΡΠ΅ pod-ΠΎΠ²Π΅ Π½Π΅ ΠΌΠΈΠ³ΡΠΈΡΠ°Ρ ΠΎΡ Ρ ΠΎΡΡ Π½Π° Ρ ΠΎΡΡ Π² ΠΏΠΎΠ·Π½Π°ΡΠΈΡ Π½ΠΈ ΡΠΌΠΈΡΡΠ». ΠΠΊΠΎ Π²ΡΠ·Π΅Π»ΡΡ Π±ΡΠ΄Π΅ ΠΈΠ·ΠΊΠ»ΡΡΠ΅Π½, pod-ΡΡ Π½Π° Π½Π΅Π³ΠΎ ΡΠ΅ ΠΏΡΠ΅ΠΊΡΡΠ²Π° ΠΈ ΠΏΡΠ΅ΡΠ°Π·ΠΏΡΠ΅Π΄Π΅Π»Ρ Π½Π° Π΄ΡΡΠ³ Π²ΡΠ·Π΅Π» Π² ΠΊΠ»ΡΡΡΠ΅ΡΠ°. Π ΠΏΡΠΈ Π²ΠΈΡΡΡΠ°Π»Π½Π°ΡΠ° ΠΌΠ°ΡΠΈΠ½Π° ΠΎΡΠ°ΠΊΠ²Π°ΠΌΠ΅ Π΄Π° Π²ΠΈΠ΄ΠΈΠΌ ΠΆΠΈΠ²Π° ΠΌΠΈΠ³ΡΠ°ΡΠΈΡ.
ΠΠ° Π΄Π° ΡΠ΅ ΠΏΠΎΠΏΡΠ°Π²ΠΈ ΡΠΎΠ·ΠΈ ΠΏΡΠΎΠΏΡΡΠΊ, Π±Π΅ΡΠ΅ ΡΡΠ·Π΄Π°Π΄Π΅Π½ custom resource definition (CDR), ΠΎΠΏΠΈΡΠ²Π°Ρ ΠΌΠ΅Ρ Π°Π½ΠΈΠ·ΠΌΠ° Π·Π° ΠΆΠΈΠ²Π° ΠΌΠΈΠ³ΡΠ°ΡΠΈΡ, ΠΊΠΎΠΉΡΠΎ ΠΎΡΠ³ΠΎΠ²Π°ΡΡ Π·Π° ΠΈΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·Π°ΡΠΈΡΡΠ°, ΠΌΠΎΠ½ΠΈΡΠΎΡΠΈΡΠ°Π½Π΅ΡΠΎ ΠΈ ΡΠΏΡΠ°Π²Π»Π΅Π½ΠΈΠ΅ΡΠΎ Π½Π° ΠΆΠΈΠ²ΠΈΡΠ΅ ΠΌΠΈΠ³ΡΠ°ΡΠΈΠΈ Π½Π° ΠΠ ΠΌΠ΅ΠΆΠ΄Ρ ΡΠ°Π±ΠΎΡΠ½ΠΈΡΠ΅ Π²ΡΠ·Π»ΠΈ.
apiVersion: kubevirt.io/v1alpha3
kind: VirtualMachineInstanceMigration
metadata:
name: migration-job
spec:
vmiName: fedora
ΠΡΠΈ Π΄Π΅Π°ΠΊΡΠΈΠ²ΠΈΡΠ°Π½Π΅ Π½Π° Π²ΡΠ·Π΅Π» Π·Π° Π²ΠΈΡΡΡΠ°Π»Π½ΠΈ ΠΌΠ°ΡΠΈΠ½ΠΈ, Π·Π° ΠΊΠΎΠΈΡΠΎ Π΅ Π·Π°Π΄Π°Π΄Π΅Π½Π° ΡΡΡΠ°ΡΠ΅Π³ΠΈΡ Π·Π° ΠΈΠ·Π²Π΅ΠΆΠ΄Π°Π½Π΅ Live Migration, Π°Π²ΡΠΎΠΌΠ°ΡΠΈΡΠ½ΠΎ ΡΠ΅ ΡΡΠ·Π΄Π°Π²Π°Ρ Π·Π°Π΄Π°ΡΠΈ Π·Π° ΠΌΠΈΠ³ΡΠ°ΡΠΈΡ. ΠΠΎ ΡΠΎΠ·ΠΈ Π½Π°ΡΠΈΠ½ ΠΌΠΎΠΆΠ΅ΡΠ΅ Π΄Π° ΠΊΠΎΠ½ΡΡΠΎΠ»ΠΈΡΠ°ΡΠ΅ ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ΡΠΎ Π½Π° Π²ΠΈΡΡΡΠ°Π»Π½ΠΈΡΠ΅ ΠΌΠ°ΡΠΈΠ½ΠΈ ΠΏΡΠΈ ΠΏΡΠ΅ΠΌΠ΅ΡΡΠ²Π°Π½Π΅ ΠΌΠ΅ΠΆΠ΄Ρ Π²ΡΠ·Π»ΠΈΡΠ΅ Π½Π° ΠΊΠ»ΡΡΡΠ΅ΡΠ°. ΠΠΎΠΆΠ΅ΡΠ΅ Π΄Π° ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠΈΡΠ°ΡΠ΅ Live Migration ΠΈ Π΄Π° ΡΠΏΡΠ°Π²Π»ΡΠ²Π°ΡΠ΅ ΠΠ, ΠΊΠ°ΠΊΡΠΎ ΠΈ Π²ΡΠΈΡΠΊΠΈ ΠΎΡΡΠ°Π½Π°Π»ΠΈ ΠΏΠΎΠ΄ΠΎΠ²Π΅.
ΠΡΠ΅ΠΆΠ°
ΠΡΡΠΊΠ° Kubernetes ΡΠΈΡΡΠ΅ΠΌΠ° ΠΎΡΠΈΠ³ΡΡΡΠ²Π° ΡΠ²ΡΡΠ·Π°Π½ΠΎΡΡ ΠΌΠ΅ΠΆΠ΄Ρ Π²ΡΠ·Π»ΠΈΡΠ΅ ΠΈ pod-ΠΎΠ²Π΅ΡΠ΅ Ρ ΠΏΠΎΠΌΠΎΡΡΠ° Π½Π° ΡΠΎΡΡΡΠ΅ΡΠ½ΠΈ SDN ΠΌΡΠ΅ΠΆΠΈ. OpenShift Π½Π΅ Π΅ ΠΈΠ·ΠΊΠ»ΡΡΠ΅Π½ΠΈΠ΅ ΠΈ ΠΎΡ 3-ΡΠ° Π²Π΅ΡΡΠΈΡ ΠΏΠΎ ΠΏΠΎΠ΄ΡΠ°Π·Π±ΠΈΡΠ°Π½Π΅ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π° OpenShiftSDN Π·Π° ΡΠ°Π·ΠΈ ΡΠ΅Π». ΠΡΠ²Π΅Π½ ΡΠΎΠ²Π° Π² OpenShift 4 ΡΠ΅ ΠΏΠΎΡΠ²ΠΈ Π½ΠΎΠ²Π° ΡΡΠ½ΠΊΡΠΈΡ Π½Π° ΠΈΠΌΠ΅ Multus, ΠΊΠΎΡΡΠΎ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ²Π° Π΄ΠΎΡΡΡΠΏ Π΄ΠΎ Π½ΡΠΊΠΎΠ»ΠΊΠΎ ΠΌΡΠ΅ΠΆΠΈ ΠΈ ΡΠ²ΡΡΠ·Π²Π°Π½Π΅ Π½Π° pod-ΠΎΠ²Π΅ΡΠ΅ ΠΊΡΠΌ ΡΡΡ Π΅Π΄Π½ΠΎΠ²ΡΠ΅ΠΌΠ΅Π½Π½ΠΎ.

Π‘ ΠΏΠΎΠΌΠΎΡΡΠ° Π½Π° Multus Π°Π΄ΠΌΠΈΠ½ΠΈΡΡΡΠ°ΡΠΎΡΡΡ ΠΌΠΎΠΆΠ΅ Π΄Π° Π½Π°ΡΡΡΠΎΠΈ Π΄ΠΎΠΏΡΠ»Π½ΠΈΡΠ΅Π»Π½ΠΈ CNI ΠΌΡΠ΅ΠΆΠΈ, ΠΊΠΎΠΈΡΠΎ ΡΠ»Π΅Π΄ ΡΠΎΠ²Π° ΡΠ΅ Π±ΡΠ΄Π°Ρ ΡΠ°Π·ΠΏΠΎΠ»ΠΎΠΆΠ΅Π½ΠΈ ΠΈ ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠΈΡΠ°Π½ΠΈ Π² ΠΊΠ»ΡΡΡΠ΅ΡΠ° ΠΎΡ ΡΠΏΠ΅ΡΠΈΠ°Π»Π΅Π½ ΠΎΠΏΠ΅ΡΠ°ΡΠΎΡ Cluster Network Operator. Π‘Π»Π΅Π΄ ΡΠΎΠ²Π° pod-ΠΎΠ²Π΅ΡΠ΅ ΡΠ΅ ΡΠ²ΡΡΠ·Π²Π°Ρ ΠΊΡΠΌ Π΅Π΄Π½Π° ΠΈΠ»ΠΈ ΠΏΠΎΠ²Π΅ΡΠ΅ ΠΎΡ ΡΠ΅Π·ΠΈ ΠΌΡΠ΅ΠΆΠΈ, ΠΎΠ±ΠΈΠΊΠ½ΠΎΠ²Π΅Π½ΠΎ ΠΊΡΠΌ ΡΡΠ°Π½Π΄Π°ΡΡΠ½ΠΈΡ OpenShiftSDN ΠΈ Π΄ΠΎΠΏΡΠ»Π½ΠΈΡΠ΅Π»Π½ΠΈΡ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡ. Π‘ ΡΡΡΡΠΎΠΉΡΡΠ²Π° SR-IOV, ΡΡΠ°Π½Π΄Π°ΡΡΠ½ΠΈ Linux Bridge, MACVLAN ΠΈ IPVLAN, Π²ΡΠΈΡΠΊΠΎ ΡΠΎΠ²Π° ΠΌΠΎΠΆΠ΅ Π΄Π° ΡΠ΅ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°, Π°ΠΊΠΎ Π΅ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎ Π·Π° Π²Π°ΡΠ°ΡΠ° ΠΠ. ΠΠ° ΠΈΠ·ΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΠ΅ΡΠΎ ΠΏΠΎ-Π΄ΠΎΠ»Ρ Π΅ ΠΏΠΎΠΊΠ°Π·Π°Π½ΠΎ ΠΊΠ°ΠΊ Π΄Π° Π·Π°Π΄Π°Π΄Π΅ΡΠ΅ Multus CNI Π·Π° bridge ΠΌΡΠ΅ΠΆΠ° Π½Π° ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡΠ° eth1:
apiVersion: operator.openshift.io/v1
kind: Network
metadata:
name: cluster
spec:
additionalNetworks:
- name: multus1
rawCNIConfig: '{ "cniVersion": "0.3.1", "type": "bridge", "master": "eth1", "ipam":
{ "type": "static", "addresses": [ { "address": "191.168.1.1/24" } ] } }'
type: Raw
ΠΡΠ½ΠΎΡΠ½ΠΎ OpenShift Π²ΠΈΡΡΡΠ°Π»ΠΈΠ·Π°ΡΠΈΡΡΠ°, ΡΠΎΠ²Π° ΠΎΠ·Π½Π°ΡΠ°Π²Π°, ΡΠ΅ ΠΠ ΠΌΠΎΠΆΠ΅ Π΄Π° Π±ΡΠ΄Π΅ ΡΠ²ΡΡΠ·Π°Π½Π° Π΄ΠΈΡΠ΅ΠΊΡΠ½ΠΎ ΠΊΡΠΌ Π²ΡΠ½ΡΠ½Π°ΡΠ° ΠΌΡΠ΅ΠΆΠ°, Π·Π°ΠΎΠ±ΠΈΠΊΠ°Π»ΡΠΉΠΊΠΈ SDN. Π’ΠΎΠ²Π° Π΅ Π²Π°ΠΆΠ½ΠΎ Π·Π° Π²ΠΈΡΡΡΠ°Π»Π½ΠΈΡΠ΅ ΠΌΠ°ΡΠΈΠ½ΠΈ, ΠΌΠΈΠ³ΡΠΈΡΠ°Π½ΠΈ Π½Π° OpenShift ΠΎΡ Red Hat Virtualization ΠΈΠ»ΠΈ VMware vSphere, ΡΡΠΉ ΠΊΠ°ΡΠΎ ΠΏΡΠΈ Π½Π°Π»ΠΈΡΠΈΠ΅ΡΠΎ Π½Π° Π΄ΠΎΡΡΡΠΏ Π½Π° Π²ΡΠΎΡΠΎ Π½ΠΈΠ²ΠΎ OSI, ΠΌΡΠ΅ΠΆΠΎΠ²ΠΈΡΠ΅ Π½Π°ΡΡΡΠΎΠΉΠΊΠΈ Π½ΡΠΌΠ° Π΄Π° ΡΠ΅ ΠΏΡΠΎΠΌΠ΅Π½ΡΡ. Π’ΠΎΠ²Π° ΡΡΡΠΎ ΠΎΠ·Π½Π°ΡΠ°Π²Π°, ΡΠ΅ ΠΠ ΠΌΠΎΠΆΠ΅ Π΄Π° ΠΈΠΌΠ° ΠΌΡΠ΅ΠΆΠΎΠ² Π°Π΄ΡΠ΅Ρ, Π·Π° ΠΊΠΎΠΉΡΠΎ Π·Π°ΡΠ²ΠΊΠΈΡΠ΅ Π·Π° Π΄ΠΎΡΡΡΠΏ ΡΠ΅ Π·Π°ΠΎΠ±ΠΈΠΊΠ°Π»ΡΡ SDN. ΠΠΎ ΡΠΎΠ·ΠΈ Π½Π°ΡΠΈΠ½ ΠΌΠΎΠΆΠ΅ΠΌ Π΅ΡΠ΅ΠΊΡΠΈΠ²Π½ΠΎ Π΄Π° ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΌΠ΅ ΡΠΏΠ΅ΡΠΈΠ°Π»ΠΈΠ·ΠΈΡΠ°Π½ΠΈ ΠΌΡΠ΅ΠΆΠΎΠ²ΠΈ Π°Π΄Π°ΠΏΡΠ΅ΡΠΈ ΠΈΠ»ΠΈ Π΄Π° ΡΠ΅ ΡΠ²ΡΡΠ·Π²Π°ΠΌΠ΅ Π΄ΠΈΡΠ΅ΠΊΡΠ½ΠΎ ΠΊΡΠΌ Π‘Π₯Π.
ΠΠΎΠΆΠ΅ΡΠ΅ Π΄Π° Π½Π°ΡΡΠΈΡΠ΅ ΠΏΠΎΠ²Π΅ΡΠ΅ Π·Π° Π½Π°ΡΠΈΠ½Π° Π½Π° ΡΡΠ·Π΄Π°Π²Π°Π½Π΅ ΠΈ ΡΠ²ΡΡΠ·Π²Π°Π½Π΅ Π½Π° Π²ΠΈΡΡΡΠ°Π»Π½ΠΈ ΠΌΠ°ΡΠΈΠ½ΠΈ Π² OpenShift Π²ΠΈΡΡΡΠ°Π»ΠΈΠ·Π°ΡΠΈΡΡΠ° ΠΊΡΠΌ ΠΌΡΠ΅ΠΆΠ°ΡΠ° . ΠΡΠ²Π΅Π½ ΡΠΎΠ²Π°, , Π²Π½Π΅Π΄ΡΠ΅Π½ Π² ΡΡΡΡΠ°Π²Π° Π½Π° OpenShift Π²ΠΈΡΡΡΠ°Π»ΠΈΠ·Π°ΡΠΈΡ, ΠΏΡΠ΅Π΄Π»Π°Π³Π° ΠΎΡΠ΅ Π΅Π΄ΠΈΠ½ Π΄ΠΎΠ±ΡΠ΅ ΠΏΠΎΠ·Π½Π°Ρ ΠΌΠ΅ΡΠΎΠ΄ Π·Π° ΡΡΠ·Π΄Π°Π²Π°Π½Π΅ ΠΈ ΡΠΏΡΠ°Π²Π»Π΅Π½ΠΈΠ΅ Π½Π° ΠΌΡΠ΅ΠΆΠΎΠ²ΠΈ ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΠΈ Π½Π° ΡΠΈΠ·ΠΈΡΠ΅ΡΠΊΠΈ Π²ΡΠ·Π»ΠΈ, ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Π½ΠΈ ΠΏΠΎΠ΄ Ρ ΠΈΠΏΠ΅ΡΠ²ΠΈΠ·ΠΎΡΠΈΡΠ΅.
Π₯ΡΠ°Π½Π΅Π½ΠΈΠ΅
Π‘Π²ΡΡΠ·Π²Π°Π½Π΅ΡΠΎ ΠΈ ΡΠΏΡΠ°Π²Π»Π΅Π½ΠΈΠ΅ΡΠΎ Π½Π° Π΄ΠΈΡΠΊΠΎΠ²Π΅ΡΠ΅ Π½Π° Π²ΠΈΡΡΡΠ°Π»Π½ΠΈΡΠ΅ ΠΌΠ°ΡΠΈΠ½ΠΈ Π² ΡΠ°ΠΌΠΊΠΈΡΠ΅ Π½Π° OpenShift Π²ΠΈΡΡΡΠ°Π»ΠΈΠ·Π°ΡΠΈΡΡΠ° ΡΠ΅ ΠΈΠ·Π²ΡΡΡΠ²Π° Ρ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Π½Π΅ΡΠΎ Π½Π° ΠΊΠΎΠ½ΡΠ΅ΠΏΡΠΈΠΈ Π½Π° Kubernetes ΠΊΠ°ΡΠΎ StorageClasses, PersistentVolumeClaims (PVC) ΠΈ PersistentVolume (PV), ΠΊΠ°ΠΊΡΠΎ ΠΈ ΡΡΠ°Π½Π΄Π°ΡΡΠ½ΠΈΡΠ΅ ΠΏΡΠΎΡΠΎΠΊΠΎΠ»ΠΈ Π·Π° ΡΡΡ ΡΠ°Π½Π΅Π½ΠΈΠ΅ Π² ΡΡΠ΅Π΄Π°ΡΠ° Π½Π° Kubernetes. ΠΠΎ ΡΠΎΠ·ΠΈ Π½Π°ΡΠΈΠ½ Π°Π΄ΠΌΠΈΠ½ΠΈΡΡΡΠ°ΡΠΎΡΠΈΡΠ΅ Π½Π° Kubernetes ΠΈ Π΅ΠΊΠΈΠΏΠΈΡΠ΅, ΠΎΡΠ³ΠΎΠ²ΠΎΡΠ½ΠΈ Π·Π° ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ, ΠΏΠΎΠ»ΡΡΠ°Π²Π°Ρ Π΅Π΄ΠΈΠ½Π΅Π½ ΠΈ ΠΏΠΎΠ·Π½Π°Ρ ΠΌΠ΅Ρ Π°Π½ΠΈΠ·ΡΠΌ Π·Π° ΡΠΏΡΠ°Π²Π»Π΅Π½ΠΈΠ΅ ΠΊΠ°ΠΊΡΠΎ Π½Π° ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅ΡΠΈ, ΡΠ°ΠΊΠ° ΠΈ Π½Π° Π²ΠΈΡΡΡΠ°Π»Π½ΠΈ ΠΌΠ°ΡΠΈΠ½ΠΈ. ΠΠ° ΠΌΠ½ΠΎΠ³ΠΎ Π°Π΄ΠΌΠΈΠ½ΠΈΡΡΡΠ°ΡΠΎΡΠΈ Π½Π° Π²ΠΈΡΡΡΠ°Π»ΠΈΠ·Π°ΡΠΈΠΎΠ½Π½ΠΈ ΡΡΠ΅Π΄ΠΈ ΡΠ°Π·ΠΈ ΠΊΠΎΠ½ΡΠ΅ΠΏΡΠΈΡ ΠΌΠΎΠΆΠ΅ Π΄Π° ΠΈΠ·Π³Π»Π΅ΠΆΠ΄Π° ΠΏΠΎΠ·Π½Π°ΡΠ°, ΡΡΠΉ ΠΊΠ°ΡΠΎ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π° ΡΡΡΠΈΡ ΠΏΡΠΈΠ½ΡΠΈΠΏ Π½Π° ΡΠ°Π·Π΄Π΅Π»Π΅Π½ΠΈΠ΅ Π½Π° ΡΠ°ΠΉΠ»ΠΎΠ²Π΅ΡΠ΅ Π·Π° ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡ Π½Π° ΠΠ ΠΈ Π΄ΠΈΡΠΊΠΎΠ²Π΅, ΠΊΠΎΠΉΡΠΎ ΡΠ΅ ΠΏΡΠΈΠ»Π°Π³Π° Π² OpenStack ΠΈ Π½Π° ΠΌΠ½ΠΎΠ³ΠΎ Π΄ΡΡΠ³ΠΈ ΠΎΠ±Π»Π°ΡΠ½ΠΈ ΠΏΠ»Π°ΡΡΠΎΡΠΌΠΈ.
ΠΡΠΏΡΠ΅ΠΊΠΈ ΡΠΎΠ²Π° Π½Π΅ ΠΌΠΎΠΆΠ΅ ΠΏΡΠΎΡΡΠΎ Π²ΡΠ΅ΠΊΠΈ ΠΏΡΡ Π΄Π° ΡΠ΅ ΡΡΠ·Π΄Π°Π²Π° Π½ΠΎΠ² Π΄ΠΈΡΠΊ Π·Π° ΠΠ, ΡΡΠΉ ΠΊΠ°ΡΠΎ ΠΏΡΠΈ ΠΌΠΈΠ³ΡΠ°ΡΠΈΡ ΠΎΡ Ρ ΠΈΠΏΠ΅ΡΠ²ΠΈΠ·ΠΎΡ Π² OpenShift Π΅ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎ Π΄Π° ΡΠ΅ Π·Π°ΠΏΠ°Π·ΡΡ Π΄Π°Π½Π½ΠΈΡΠ΅. ΠΠΎΡΠΈ ΠΊΠΎΠ³Π°ΡΠΎ ΡΠ°Π·Π³ΡΡΡΠ°ΠΌΠ΅ Π½ΠΎΠ²Π° ΠΠ, Π²ΠΈΠ½Π°Π³ΠΈ Π΅ ΠΏΠΎ-Π±ΡΡΠ·ΠΎ Π΄Π° ΡΠ΅ Π½Π°ΠΏΡΠ°Π²ΠΈ ΠΎΡ ΡΠ°Π±Π»ΠΎΠ½, ΠΎΡΠΊΠΎΠ»ΠΊΠΎΡΠΎ Π΄Π° ΡΠ΅ ΡΡΠ·Π΄Π°Π΄Π΅ ΠΎΡ Π½ΡΠ»Π°ΡΠ°. Π‘Π»Π΅Π΄ΠΎΠ²Π°ΡΠ΅Π»Π½ΠΎ ΡΡΠ½ΠΊΡΠΈΠΎΠ½Π°Π»Π½ΠΎΡΡΡΠ° Π·Π° ΠΈΠΌΠΏΠΎΡΡ Π½Π° ΡΡΡΠ΅ΡΡΠ²ΡΠ²Π°ΡΠΈ Π΄ΠΈΡΠΊΠΎΠ²Π΅ Π΅ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠ°.
ΠΠ° ΡΠ»Π΅ΡΠ½ΡΠ²Π°Π½Π΅ Π½Π° ΡΠ°Π·ΠΈ Π·Π°Π΄Π°ΡΠ° OpenShift Π²ΠΈΡΡΡΠ°Π»ΠΈΠ·Π°ΡΠΈΡΡΠ° ΡΠ°Π·Π³ΡΡΡΠ° ΠΏΡΠΎΠ΅ΠΊΡΠ° Containerized Data Importer (CDI), ΠΊΠΎΠΉΡΠΎ Π½Π°ΠΌΠ°Π»ΡΠ²Π° ΠΈΠΌΠΏΠΎΡΡΠ° Π½Π° ΠΎΠ±ΡΠ°Π·ΠΈ Π½Π° Π΄ΠΈΡΠΊΠΎΠ²Π΅ ΠΎΡ Π½ΡΠΊΠΎΠ»ΠΊΠΎ ΠΈΠ·ΡΠΎΡΠ½ΠΈΠΊΠ° Π΄ΠΎ ΡΡΠ·Π΄Π°Π²Π°Π½Π΅ΡΠΎ Π½Π° Π·Π°ΠΏΠΈΡ Π² PVC.
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: "fedora-disk0"
labels:
app: containerized-data-importer
annotations:
cdi.kubevirt.io/storage.import.endpoint: "http://10.0.0.1/images/Fedora-Cloud-Base-31-1.9.x86_64.qcow2"
spec:
storageClassName: ocs-gold
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 20Gi
Π’ΠΎΡΠ½ΠΎ ΡΠΎΠ·ΠΈ Π·Π°ΠΏΠΈΡ Π°ΠΊΡΠΈΠ²ΠΈΡΠ° CDI, ΡΡΠ°ΡΡΠΈΡΠ°ΠΉΠΊΠΈ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°ΡΠ΅Π»Π½ΠΎΡΡΡΠ° ΠΎΡ Π΄Π΅ΠΉΡΡΠ²ΠΈΡ, ΠΏΠΎΠΊΠ°Π·Π°Π½ΠΈ Π½Π° ΠΈΠ·ΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΠ΅ΡΠΎ ΠΏΠΎ-Π΄ΠΎΠ»Ρ:

Π‘Π»Π΅Π΄ ΠΊΠ°ΡΠΎ CDI ΠΏΡΠΈΠΊΠ»ΡΡΠΈ, PVC ΡΠ΅ ΡΡΠ΄ΡΡΠΆΠ° Π΄ΠΈΡΠΊ Π½Π° Π²ΠΈΡΡΡΠ°Π»Π½Π°ΡΠ° ΠΌΠ°ΡΠΈΠ½Π°, Π³ΠΎΡΠΎΠ² Π·Π° ΡΠΏΠΎΡΡΠ΅Π±Π° ΠΈ ΠΏΡΠΈΠ²Π΅Π΄Π΅Π½ Π² ΡΡΠ°Π½Π΄Π°ΡΡΠ½ΠΈΡ ΡΠΎΡΠΌΠ°Ρ Π·Π° OpenShiftβ¦
ΠΡΠΈ ΡΠ°Π±ΠΎΡΠ° Ρ OpenShift Π²ΠΈΡΡΡΠ°Π»ΠΈΠ·Π°ΡΠΈΡ ΡΡΡΠΎ Π΅ ΠΏΠΎΠ»Π΅Π·Π΅Π½ OpenShift Container Storage (OCS), ΡΠ΅ΡΠ΅Π½ΠΈΠ΅ Π½Π° Red Hat, Π±Π°Π·ΠΈΡΠ°Π½ΠΎ Π½Π° ΡΠ°ΠΉΠ»ΠΎΠ²Π°ΡΠ° ΡΠΈΡΡΠ΅ΠΌΠ° Ceph, ΡΠ΅Π°Π»ΠΈΠ·ΠΈΡΠ°ΡΠΎ ΡΡΠ½ΠΊΡΠΈΠΎΠ½Π°Π»Π½ΠΎΡΡΡΠ° Π·Π° ΠΏΠΎΡΡΠΎΡΠ½Π½ΠΎ Ρ
ΡΠ°Π½ΠΈΠ»ΠΈΡΠ΅ Π·Π° ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅ΡΠΈ. Π Π΄ΠΎΠΏΡΠ»Π½Π΅Π½ΠΈΠ΅ ΠΊΡΠΌ ΡΡΠ°Π½Π΄Π°ΡΡΠ½ΠΈΡΠ΅ ΠΌΠ΅ΡΠΎΠ΄ΠΈ Π½Π° Π΄ΠΎΡΡΡΠΏ Π·Π° PVC β RWO (Π±Π»ΠΎΡΠ΅Π½) ΠΈ RWX (ΡΠ°ΠΉΠ»ΠΎΠ²) β OCS ΠΏΡΠ΅Π΄ΠΎΡΡΠ°Π²Ρ RWX Π·Π° ΡΡΡΡΠΎΠΉΡΡΠ²Π° raw block, ΠΊΠΎΠ΅ΡΠΎ Π΅ ΠΌΠ½ΠΎΠ³ΠΎ ΠΏΠΎΠ»Π΅Π·Π½ΠΎ ΠΏΡΠΈ ΠΎΡΠ³Π°Π½ΠΈΠ·ΠΈΡΠ°Π½Π΅ΡΠΎ Π½Π° ΡΠΏΠΎΠ΄Π΅Π»Π΅Π½ Π±Π»ΠΎΡΠ΅Π½ Π΄ΠΎΡΡΡΠΏ Π·Π° ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ Ρ Π²ΠΈΡΠΎΠΊΠΈ ΠΈΠ·ΠΈΡΠΊΠ²Π°Π½ΠΈΡ Π·Π° ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΠ΅Π»Π½ΠΎΡΡ. ΠΡΠ²Π΅Π½ ΡΠΎΠ²Π°, OCS ΠΏΠΎΠ΄Π΄ΡΡΠΆΠ° Π½ΠΎΠ²ΠΈΡ ΡΡΠ°Π½Π΄Π°ΡΡ Π·Π° ΠΈΡΠΊΠ°Π½Π΅ Π½Π° Π³ΡΡΠΏΠ° ΠΎΠ±Π΅ΠΊΡΠΈ Object Bucket Claim, ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ²Π°Ρ Π½Π° ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡΡΠ° Π΄ΠΈΡΠ΅ΠΊΡΠ½ΠΎ Π΄Π° ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Ρ ΠΎΠ±Π΅ΠΊΡΠ½ΠΎ Ρ
ΡΠ°Π½ΠΈΠ»ΠΈΡΠ΅ Π·Π° Π΄Π°Π½Π½ΠΈ.
ΠΠΈΡΡΡΠ°Π»Π½ΠΈ ΠΌΠ°ΡΠΈΠ½ΠΈ Π² ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅ΡΠΈ
ΠΠΊΠΎ Π²ΠΈ Π΅ ΠΈΠ½ΡΠ΅ΡΠ΅ΡΠ½ΠΎ Π΄Π° ΠΏΡΠΎΠ²Π΅ΡΠΈΡΠ΅ ΠΊΠ°ΠΊ ΡΠ°Π±ΠΎΡΠΈ, Π·Π½Π°ΠΉΡΠ΅, ΡΠ΅ OpenShift Π²ΠΈΡΡΡΠ°Π»ΠΈΠ·Π°ΡΠΈΡΡΠ° Π²Π΅ΡΠ΅ Π΅ Π½Π°Π»ΠΈΡΠ½Π° Π² ΡΠ΅ΠΆΠΈΠΌ Tech Preview Π² OpenShift 3.11 ΠΈ ΠΏΠΎ-Π½ΠΎΠ²ΠΈ. Π‘ΠΎΠ±ΡΡΠ²Π΅Π½ΠΈΡΠΈΡΠ΅ Π½Π° Π°ΠΊΡΠΈΠ²Π½Π° ΠΏΠΎΠ΄ΠΏΠΈΡΠΊΠ° Π·Π° OpenShift ΠΌΠΎΠ³Π°Ρ Π΄Π° ΡΠ΅ Π²ΡΠ·ΠΏΠΎΠ»Π·Π²Π°Ρ ΠΎΡ OpenShift Π²ΠΈΡΡΡΠ°Π»ΠΈΠ·Π°ΡΠΈΡ Π½Π°ΠΏΡΠ»Π½ΠΎ Π±Π΅Π·ΠΏΠ»Π°ΡΠ½ΠΎ ΠΈ Π±Π΅Π· Π΄ΠΎΠΏΡΠ»Π½ΠΈΡΠ΅Π»Π½ΠΈ ΡΡΠΈΠ»ΠΈΡ. ΠΡΠΌ ΠΌΠΎΠΌΠ΅Π½ΡΠ° Π½Π° ΠΏΡΠ±Π»ΠΈΠΊΡΠ²Π°Π½Π΅ΡΠΎ Π½Π° ΡΠΎΠ·ΠΈ ΠΏΠΎΡΡ, Π°ΠΊΡΡΠ°Π»Π½ΠΈ ΡΠ° OpenShift 4.4 ΠΈ OpenShift Π²ΠΈΡΡΡΠ°Π»ΠΈΠ·Π°ΡΠΈΡ 2.3; Π°ΠΊΠΎ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΡΠ΅ ΠΏΡΠ΅Π΄ΠΈΡΠ½ΠΈ Π²Π΅ΡΡΠΈΠΈ, ΡΡΡΡΠ²Π° ΡΠΈ Π΄Π° ΡΠ΅ ΠΎΠ±Π½ΠΎΠ²ΠΈΡΠ΅, Π·Π° Π΄Π° ΠΏΠΎΠ»ΡΡΠΈΡΠ΅ ΠΏΠΎΡΠ»Π΅Π΄Π½ΠΈΡΠ΅ ΡΡΠ½ΠΊΡΠΈΠΈ. ΠΡΠ»Π½ΠΎΡΡΠ½ΠΊΡΠΈΠΎΠ½Π°Π»Π½Π°ΡΠ° Π²Π΅ΡΡΠΈΡ Π½Π° OpenShift Π²ΠΈΡΡΡΠ°Π»ΠΈΠ·Π°ΡΠΈΡΡΠ° ΡΡΡΠ±Π²Π° Π΄Π° ΠΈΠ·Π»Π΅Π·Π΅ ΠΏΡΠ΅Π· Π²ΡΠΎΡΠ°ΡΠ° ΠΏΠΎΠ»ΠΎΠ²ΠΈΠ½Π° Π½Π° 2020 Π³ΠΎΠ΄ΠΈΠ½Π°.
ΠΠ° Π΄ΠΎΠΏΡΠ»Π½ΠΈΡΠ΅Π»Π½Π° ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ ΡΠ΅ ΡΠ²ΡΡΠΆΠ΅ΡΠ΅ Ρ Π·Π° ΠΈΠ½ΡΡΡΡΠΊΡΠΈΠΈ Π·Π° ΠΈΠ½ΡΡΠ°Π»Π°ΡΠΈΡ, Π²ΠΊΠ»ΡΡΠΈΡΠ΅Π»Π½ΠΎ , ΠΊΡΠ΄Π΅ΡΠΎ ΡΠ΅ ΠΏΡΠ΅Π΄ΠΎΡΡΠ°Π²ΡΡ Π΄Π°Π½Π½ΠΈ Π·Π° ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠΈΡΠ°Π½Π΅ Π½Π° Π²ΡΠ½ΡΠ½ΠΈ ΠΌΡΠ΅ΠΆΠΈ.
ΠΠ·ΡΠΎΡΠ½ΠΈΠΊ: habr.com
