์ด์ , 9์ XNUMX์ผ Kubernetes์ ๋ค์ ๋ฆด๋ฆฌ์ค - 1.17. ์ฐ๋ฆฌ ๋ธ๋ก๊ทธ๋ฅผ ์ํด ๋ฐ์ ํด ์จ ์ ํต์ ๋ฐ๋ผ ์ฐ๋ฆฌ๋ ์ ๋ฒ์ ์ ๊ฐ์ฅ ์ค์ํ ๋ณ๊ฒฝ ์ฌํญ์ ๋ํด ์ด์ผ๊ธฐํฉ๋๋ค.

์ด ์๋ฃ๋ฅผ ์ค๋นํ๋ ๋ฐ ์ฌ์ฉ๋ ์ ๋ณด๋ ๊ณต์ ๋ฐํ์์ ๊ฐ์ ธ์์ต๋๋ค. , ๊ด๋ จ ๋ฌธ์ , ํ ์์ฒญ, KEP(Kubernetes Enhancement Proposals) ๋ฑ์ด ์์ต๋๋ค. ์๋ก์ด ์์์์ด?..
ํ ํด๋ก์ง ์ธ์ ๋ผ์ฐํ
Kubernetes ์ปค๋ฎค๋ํฐ๋ ์ค๋ซ๋์ ์ด ๊ธฐ๋ฅ์ ๊ธฐ๋ค๋ ค์์ต๋๋ค. ํ ํด๋ก์ง ์ธ์ ์๋น์ค ๋ผ์ฐํ . ๋ง์ฝ 2018๋ XNUMX์์ ์์๋์์ผ๋ฉฐ ๊ณต์์ ์ผ๋ก๋ โ 2๋ ์ , ํํ ์๋ ๋ฌธ์ ๋ค (์ข๋ค ) - ๊ทธ๋ฆฌ๊ณ ๋ช ์ด ๋ ๋ง์์ก๋๋ฐ...
์ผ๋ฐ์ ์ธ ์์ด๋์ด๋ Kubernetes์ ์๋ ์๋น์ค์ ๋ํด "๋ก์ปฌ" ๋ผ์ฐํ ์ ๊ตฌํํ๋ ๊ธฐ๋ฅ์ ์ ๊ณตํ๋ ๊ฒ์ ๋๋ค. ์ด ๊ฒฝ์ฐ "์ง์ญ์ฑ"์ "๋์ผํ ํ ํด๋ก์ง ์์ค"์ ์๋ฏธํฉ๋๋ค. (ํ ํด๋ก์ง ์์ค), ์ด๋ ๋ค์๊ณผ ๊ฐ์ ์ ์์ต๋๋ค:
- ์๋น์ค์ ๋ํด ๋์ผํ ๋ ธ๋,
- ๋์ผํ ์๋ฒ ๋,
- ๊ฐ์ ์ง์ญ
- ๋์ผํ ํด๋ผ์ฐ๋ ์ ๊ณต์ ์ฒด,
- ...
์ด ๊ธฐ๋ฅ์ ์ฌ์ฉํ๋ ์:
- ์ฌ๋ฌ ๊ฐ์ฉ์ฑ ์์ญ(๋ค์ค AZ)์ด ์๋ ํด๋ผ์ฐ๋ ์ค์น์ ํธ๋ํฝ ์ ๊ฐ - ์ฐธ์กฐ. ๋์ผํ ์ง์ญ์ด์ง๋ง AWS์ ๋ค๋ฅธ AZ์์ ๋ฐ์ํ๋ ํธ๋ํฝ์ ์๋ฅผ ์ฌ์ฉํฉ๋๋ค.
- ๋ ๋ฎ์ ์ฑ๋ฅ ๋๊ธฐ ์๊ฐ/๋ ๋์ ์ฒ๋ฆฌ๋;
- ๊ฐ ์ค๋์ ๋ ธ๋์ ๋ํ ๋ก์ปฌ ์ ๋ณด๋ฅผ ๊ฐ์ง๊ณ ์๋ ์ค๋ ์๋น์ค
- ๋ก๊ทธ๊ฐ ์์ง๋๋ ์ ํ๋ฆฌ์ผ์ด์ ๊ณผ ๋์ผํ ๋ ธ๋์ fluentd(๋๋ ์ ์ฌํ) ๋ฐฐ์น
- ...
ํ ํด๋ก์ง์ ๋ํด "์๊ณ ์๋" ์ด๋ฌํ ๋ผ์ฐํ
์ ๋คํธ์ํฌ ์ ํธ๋๋ผ๊ณ ๋ ํฉ๋๋ค. , ๋๋ ๋ฑ์ฅ (๊ทธ๋ฆฌ๊ณ ). ํ์ฌ ๊ตฌํ ์์ค ServiceTopology Kubernetes - ์ํ ๋ฒ์ .
๊ธฐ๋ฅ์ ์๋ ๋ฐฉ์๊ณผ ์ด๋ฏธ ์ฌ์ฉํ ์ ์๋ ๋ฐฉ๋ฒ์ ๋ํ ์์ธํ ๋ด์ฉ์ ๋ค์์ ์ฝ์ด๋ณด์ธ์. ์๊ฐ ์ค ํ ๋ช ์๊ฒ์.
IPv4/IPv6 ๋์ผ ์คํ ์ง์
์๋นํ ์ง์ ๋ ๋ค๋ฅธ ๋คํธ์ํฌ ๊ธฐ๋ฅ: 2๊ฐ์ IP ์คํ์ ๋์์ ์ง์ํฉ๋๋ค. . ํนํ ์ ๋ฆด๋ฆฌ์ค์์๋ ๋ค์๊ณผ ๊ฐ์ ๋ณ๊ฒฝ ์ฌํญ์ด ์ ์ฉ๋์์ต๋๋ค.
- ํ๋ธ ํ๋ก์์์ ๋ ๋ชจ๋(IPv4 ๋ฐ IPv6)์์ ๋์ ์๋ ๊ฐ๋ฅ์ฑ;
- ะฒ
Pod.Status.PodIPsํํฅ API ์ง์(๋์์/etc/hosts์ด์ ๋ ํธ์คํธ๊ฐ IPv6 ์ฃผ์๋ฅผ ์ถ๊ฐํด์ผ ํฉ๋๋ค. - ๋์ผ ์คํ ์ง์ (Kubernetes IN Docker) ๋ฐ ;
- e2e ํ ์คํธ๋ฅผ ์ ๋ฐ์ดํธํ์ต๋๋ค.

KIND์์ ๋์ผ ์คํ IPV4/IPv6 ์ฌ์ฉ
CSI ์งํ ์ํฉ
์์ ์ ์ด๋ผ๊ณ ์ ์ธ๋จ CSI ๊ธฐ๋ฐ ์คํ ๋ฆฌ์ง์ฉ์ผ๋ก ์ฒ์ ๋์ ๋จ .
์ด๋์ ํฐ๋ธ ๋ณผ๋ฅจ ํ๋ฌ๊ทธ์ธ์ CSI๋ก ๋ง์ด๊ทธ๋ ์ด์ - - ๋ฒ ํ ๋ฒ์ ์ ๋๋ฌํ์ต๋๋ค. ์ด ๊ธฐ๋ฅ์ ๊ธฐ์กด ์ ์ฅ์ ํ๋ฌ๊ทธ์ธ์ ๋ฒ์ญํ๋ ๋ฐ ์ค์ํฉ๋๋ค. (ํธ๋ฆฌ ๋ด) ํ๋์ ์ธ ์ธํฐํ์ด์ค๋ก (CSI, ํธ๋ฆฌ ์ธ๋ถ) Kubernetes ์ต์ข ์ฌ์ฉ์์๊ฒ๋ ๋ณด์ด์ง ์์ต๋๋ค. ํด๋ฌ์คํฐ ๊ด๋ฆฌ์๋ CSI ๋ง์ด๊ทธ๋ ์ด์ ๋ง ํ์ฑํํ๋ฉด ๊ธฐ์กด์ ์ํ ์ ์ฅ ๋ฆฌ์์ค์ ์ํฌ๋ก๋๊ฐ ๊ณ์ "์๋"ํ์ง๋ง Kubernetes ์ฝ์ด์ ํฌํจ๋ ์ค๋๋ ๋๋ผ์ด๋ฒ ๋์ ์ต์ CSI ๋๋ผ์ด๋ฒ๋ฅผ ์ฌ์ฉํ๊ฒ ๋ฉ๋๋ค.
ํ์ฌ AWS EBS ๋๋ผ์ด๋ฒ์ ๋ํ ๋ง์ด๊ทธ๋ ์ด์
์ ๋ฒ ํ ๋ฒ์ (kubernetes.io/aws-ebs) ๋ฐ GCE PD(kubernetes.io/gce-pd). ๊ธฐํ ์ ์ฅ์์ค์ ๋ํ ์ ๋ง์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.

์ฐ๋ฆฌ๋ K8์ "์ ํต์ ์ธ" ์คํ ๋ฆฌ์ง ์ง์์ด CSI์ ์ด๋ป๊ฒ ๋์
๋์๋์ง์ ๋ํด ์ด์ผ๊ธฐํ์ต๋๋ค. . ๊ทธ๋ฆฌ๊ณ CSI ๋ง์ด๊ทธ๋ ์ด์
์ ๋ฒ ํ ์ํ๋ก ์ ํํ๋ ๊ฒ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค. ํ๋ก์ ํธ ๋ธ๋ก๊ทธ์์
๋ํ K1.17s 8์์ ์์๋(์ํ ๊ตฌํ) CSI ๋งฅ๋ฝ์ ๋ ๋ค๋ฅธ ์ค์ํ ๊ธฐ๋ฅ์ Kubernetes 1.12 ๋ฆด๋ฆฌ์ค์์ ๋ฒ ํ ์ํ(์ฆ, ๊ธฐ๋ณธ์ ์ผ๋ก ํ์ฑํ๋จ)์ ๋๋ฌํ์ต๋๋ค. ๊ทธ๋ฆฌ๊ณ ๊ทธ๋ค๋ก๋ถํฐ์ ํ๋ณต. ๋ฒ ํ ์ถ์ ๊ณผ์ ์์ Kubernetes ๋ณผ๋ฅจ ์ค๋ ์ท์ ์ ์ฉ๋ ๋ณ๊ฒฝ ์ฌํญ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
- CSI ์ธ๋ถ ์ค๋ ์ท ์ฌ์ด๋์นด๋ฅผ ๋ ๊ฐ์ ์ปจํธ๋กค๋ฌ๋ก ๋ถํ
- ์ญ์ ๋ฅผ ์ํด ๋น๋ฐ๋ฒํธ๋ฅผ ์ถ๊ฐํ์ต๋๋ค (์ญ์ ๋น๋ฐ) ๋ณผ๋ฅจ ์ค๋ ์ท์ ๋ด์ฉ์ ๋ํ ์ฃผ์์ผ๋ก,
- ์๋ก์ด ์ข ๋ฃ์ (์ข ๋ฃ์) ์ฐ๊ฒฐ์ด ๋จ์ ์๋ ๊ฒฝ์ฐ ์ค๋ ์ท API ๊ฐ์ฒด๊ฐ ์ญ์ ๋๋ ๊ฒ์ ๋ฐฉ์งํฉ๋๋ค.
๋ฆด๋ฆฌ์ค 1.17 ์์ ์์ ์ด ๊ธฐ๋ฅ์ ์ธ ๊ฐ์ง CSI ๋๋ผ์ด๋ฒ(GCE ์๊ตฌ ๋์คํฌ CSI ๋๋ผ์ด๋ฒ, Portworx CSI ๋๋ผ์ด๋ฒ ๋ฐ NetApp Trident CSI ๋๋ผ์ด๋ฒ)์์ ์ง์๋ฉ๋๋ค. ๊ตฌํ ๋ฐ ์ฌ์ฉ์ ๋ํ ์์ธํ ๋ด์ฉ์ ๋ค์์์ ํ์ธํ ์ ์์ต๋๋ค. ๋ธ๋ก๊ทธ์.
ํด๋ผ์ฐ๋ ์ ๊ณต์ ์ฒด ๋ผ๋ฒจ
์๋์ผ๋ก ๋ผ๋ฒจ์ด ์ง์ ๋ฉ๋๋ค. ์ฌ์ฉ๋ ํด๋ผ์ฐ๋ ๊ณต๊ธ์์ ๋ฐ๋ผ ์์ฑ๋ ๋ ธ๋ ๋ฐ ๋ณผ๋ฅจ์ ํ ๋น๋จ, K8s 1.2 ์ถ์ ์ดํ ์ค๋ซ๋์ Kubernetes์์ ๋ฒ ํ ๋ฒ์ ์ผ๋ก ์ฌ์ฉ ๊ฐ๋ฅํ์ต๋๋ค. (2016๋ XNUMX์!). ์ค๋ซ๋์ ๋๋ฆฌ ์ฌ์ฉ๋์๊ธฐ ๋๋ฌธ์ ๊ฐ๋ฐ์๋ , ์ด์ ๊ธฐ๋ฅ ์์ (GA)์ ์ ์ธํ ์๊ฐ์ ๋๋ค.
๋ฐ๋ผ์ ๋ชจ๋ ๊ทธ์ ๋ฐ๋ผ(ํ ํด๋ก์ง์ ๋ฐ๋ผ) ์ด๋ฆ์ด ๋ณ๊ฒฝ๋์์ต๋๋ค.
-
beta.kubernetes.io/instance-typeโnode.kubernetes.io/instance-type -
failure-domain.beta.kubernetes.io/zoneโtopology.kubernetes.io/zone -
failure-domain.beta.kubernetes.io/regionโtopology.kubernetes.io/region
...ํ์ง๋ง ์ด์ ์ด๋ฆ์ผ๋ก ๊ณ์ ์ฌ์ฉํ ์ ์์ต๋๋ค(์ด์ ๋ฒ์ ๊ณผ์ ํธํ์ฑ์ ์ํด). ๊ทธ๋ฌ๋ ๋ชจ๋ ๊ด๋ฆฌ์๋ ํ์ฌ ๋ ์ด๋ธ๋ก ์ ํํ๋ ๊ฒ์ด ์ข์ต๋๋ค. K8s๊ฐ ์ ๋ฐ์ดํธ๋์์ต๋๋ค.
kubeadm์ ๊ตฌ์กฐํ๋ ์ถ๋ ฅ
์ฒ์์ผ๋ก ์ํ ๋ฒ์ ์ผ๋ก ์ ๋ณด์์ต๋๋ค. . ์ง์๋๋ ํ์: JSON, YAML, Go ํ ํ๋ฆฟ.
์ด ๊ธฐ๋ฅ์ ๊ตฌํํ๋ ค๋ ๋๊ธฐ(์ ๋ฐ๋ฆ) ) ์ด๋ค:
Kubernetes๋ฅผ ์๋์ผ๋ก ๋ฐฐํฌํ ์ ์์ง๋ง ์ด ์์ ์ ๋ํ ์ฌ์ค์์(๋ฒ๋ฅ ์ ์ด์ง๋ ์๋๋ผ๋) ํ์ค์ kubeadm์ ์ฌ์ฉํ๋ ๊ฒ์ ๋๋ค. Terraform๊ณผ ๊ฐ์ ๋๋ฆฌ ์ฌ์ฉ๋๋ ์์คํ ๊ด๋ฆฌ ๋๊ตฌ๋ Kubernetes ๋ฐฐํฌ๋ฅผ ์ํด kubeadm์ ์ฌ์ฉํฉ๋๋ค. ํด๋ฌ์คํฐ API์ ๋ํ ๊ณํ๋ ๊ฐ์ ์๋ kubeadm ๋ฐ cloud-init๋ฅผ ์ฌ์ฉํ Kubernetes ๋ถํธ์คํธ๋ํ์ ์ํ ๊ตฌ์ฑ ๊ฐ๋ฅํ ํจํค์ง๊ฐ ํฌํจ๋ฉ๋๋ค.
๊ตฌ์กฐํ๋ ์ถ๋ ฅ์ด ์์ผ๋ฉด ์ธ๋ป ๋ณด๊ธฐ์ ๊ฐ์ฅ ๋ฌดํดํ ๋ณ๊ฒฝ์ด๋ผ๋ Terraform, Cluster API ๋ฐ kubeadm์ ๊ฒฐ๊ณผ๋ฅผ ์ฌ์ฉํ๋ ๊ธฐํ ์ํํธ์จ์ด๋ฅผ ์์์ํฌ ์ ์์ต๋๋ค.
์ฐ๋ฆฌ์ ์ฆ๊ฐ์ ์ธ ๊ณํ์๋ ๋ค์ kubeadm ๋ช ๋ น์ ๋ํ ์ง์(๊ตฌ์กฐํ๋ ์ถ๋ ฅ ํ์)์ด ํฌํจ๋ฉ๋๋ค.
-
alpha certs -
config images list -
init -
token create -
token list -
upgrade plan -
version
๋ช
๋ น์ ๋ํ JSON ์๋ต์ ๊ทธ๋ฆผ kubeadm init -o json:
{
"node0": "192.168.20.51:443",
"caCrt": "sha256:1f40ff4bd1b854fb4a5cf5d2f38267a5ce5f89e34d34b0f62bf335d74eef91a3",
"token": {
"id": "5ndzuu.ngie1sxkgielfpb1",
"ttl": "23h",
"expires": "2019-05-08T18:58:07Z",
"usages": [
"authentication",
"signing"
],
"description": "The default bootstrap token generated by 'kubeadm init'.",
"extraGroups": [
"system:bootstrappers:kubeadm:default-node-token"
]
},
"raw": "Rm9yIHRoZSBhY3R1YWwgb3V0cHV0IG9mIHRoZSAia3ViZWFkbSBpbml0IiBjb21tYW5kLCBwbGVhc2Ugc2VlIGh0dHBzOi8vZ2lzdC5naXRodWIuY29tL2FrdXR6LzdhNjg2ZGU1N2JmNDMzZjkyZjcxYjZmYjc3ZDRkOWJhI2ZpbGUta3ViZWFkbS1pbml0LW91dHB1dC1sb2c="
}๊ธฐํ ํ์ ์ ์์ ํ
์ผ๋ฐ์ ์ผ๋ก Kubernetes 1.17์ ์ถ์๋ "์์ ์ฑ" ์ด๋ ๊ทธ ์์ ๋ง์ ๊ธฐ๋ฅ์ด ์๋ค๋ ์ฌ์ค๋ก ์ธํด ์ด์ง๋์์ต๋๋ค (์ด ๊ฐ์๋ 14) GA ์ํ๋ฅผ ๋ฐ์์ต๋๋ค. ๊ทธ ์ค์๋:
- ํน์ ์กฐ๊ฑด์ ๋ฐ๋ผ ๋ ธ๋๋ฅผ "๋งํน"ํฉ๋๋ค(), ์ ๋ํ๋ฌ๋ค ;
- - ๋ชจ๋ ๊ฐ์ฒด๊ฐ ํน์ ๋ฒ์ ์ ํด๋นํ๋ค๋ ๋ผ๋ฒจ์ด ๋ถ์ ์๋ก์ด ์ ํ์ ์ด๋ฒคํธ(
resourceVersion) ์ด๋ฏธ ์๊ณ์ ์ํด ์ฒ๋ฆฌ๋์์ต๋๋ค. - (๊ธฐ๋ณธ๊ฐ) ์ฌ์ฉ์ ์ ์ ๋ฆฌ์์ค์ ๊ฒฝ์ฐ;
- ํฌ๋ ํ๋ก์ธ์ค ๋ค์์คํ์ด์ค์์;
-
ScheduleDaemonSetPods- kube-scheduler ์ฌ์ฉ(DaemonSet ์ปจํธ๋กค๋ฌ ๋์ ) - ๋ ธ๋ ์ ํ์ ๋ฐ๋ฅธ ๋ณผ๋ฅจ ์
- ๋ค์์ผ๋ก ๋ง์ดํธ๋ ๋๋ ํ ๋ฆฌ ์ด๋ฆ์ ๊ฒฝ์ฐ
subPath; - ์ ๋ฌธํ๋ Lease API๋ก;
- "์ข ๋ฃ์ ๋ณดํธ"() ๋ก๋ ๋ฐธ๋ฐ์์ ๊ฒฝ์ฐ(LoadBalancer ๋ฆฌ์์ค๋ฅผ ์ญ์ ํ๊ธฐ ์ ์ ํด๋น ์๋น์ค ๋ฆฌ์์ค ํ์ธ)
- ๋์ผํ ๊ฐ์ฒด ์งํฉ์ ๋ชจ๋ํฐ๋งํ๋ ์ฌ๋ฌ ์๊ณ๋ก ์์ ํ ๋ ์ฑ๋ฅ ํฅ์ - ๊ฐ ๊ด์ฐฐ์์ ๋ํด ๋์ผํ ๊ฐ์ฒด์ ๋ฐ๋ณต์ ์ธ ์ง๋ ฌํ๋ฅผ ํผํจ์ผ๋ก์จ ๋ฌ์ฑ๋ฉ๋๋ค.
๊ธฐํ ๋ณ๊ฒฝ ์ฌํญ
๋ฌผ๋ก Kubernetes 1.17์ ์ ์ฒด ํ์ ๋ชฉ๋ก์ ์์ ๋์ด๋ ํญ๋ชฉ์๋ง ๊ตญํ๋์ง ์์ต๋๋ค. ๋ค์์ ๊ธฐํ ์ฌํญ์ ๋๋ค(๋ ์์ ํ ๋ชฉ๋ก์ ๋ค์์ ์ฐธ์กฐํ์ธ์). ):
- ๋ง์ง๋ง ๋ฆด๋ฆฌ์ค์ ์ ์๋ ๊ธฐ๋ฅ์ด ๋ฒ ํ ๋ฒ์ ์ ๋๋ฌํ์ต๋๋ค. ;
- ๋น์ทํ ๋ณํ EndpointSlice API(๋ํ K8s 1.16๋ถํฐ). ๊ทธ๋ฌ๋ ํ์ฌ๋ก์๋ Endpoint API์ ์ฑ๋ฅ/ํ์ฅ์ฑ์ ๊ฐ์ ํ๋ ์ด ์๋ฃจ์ ์ด ๊ธฐ๋ณธ์ ์ผ๋ก ํ์ฑํ๋์ด ์์ง ์์ต๋๋ค.
- ํฌ๋๋ ์ด์ ํด๋ฌ์คํฐ ์ด์์ ์ค์ํฉ๋๋ค. ๋ค์์คํ์ด์ค๋ฟ๋ง ์๋๋ผ
kube-system(์์ธํ ๋ด์ฉ์ ์ค๋ช ์๋ฅผ ์ฐธ์กฐํ์ธ์. ); - kubelet์ ์๋ก์ด ์ต์ - โ ์์คํ ์ ์์ฝ๋ CPU ๋ชฉ๋ก์ ๋ช ์์ ์ผ๋ก ์ ์ํ ์ ์์ต๋๋ค.
- ์
kubectl logs์ ๊น๋ฐ--prefix, ๋ก๊ทธ์ ๊ฐ ์ค์ Pod ๋ฐ ์์ค ์ปจํ ์ด๋์ ์ด๋ฆ์ ์ถ๊ฐํฉ๋๋ค. - ะฒ
label.SelectorRequiresExactMatch; - kube-dns์ ๋ชจ๋ ์ปจํ ์ด๋ ๋ ์ ์ ๊ถํ์ผ๋ก;
- ๋ณ๋์ GitHub ์ ์ฅ์๋ก ๋ถ๋ฆฌ๋์ด ๋ ์ด์ Kubernetes ๋ฆด๋ฆฌ์ค์ ํฌํจ๋์ง ์์ต๋๋ค.
- ๋ง์ ๋น UDP ํฌํธ์ฉ kube-proxy.
์ข ์์ฑ ๋ณ๊ฒฝ:
- kubeadm์ ํฌํจ๋ CoreDNS ๋ฒ์ ์ 1.6.5์ ๋๋ค.
- crictl ๋ฒ์ ์ด v1.16.1๋ก ์ ๋ฐ์ดํธ๋์์ต๋๋ค.
- CSI 1.2.0;
- etcd 3.4.3;
- ํ ์คํธ๋ ์ต์ Docker ๋ฒ์ ์ด 19.03์ผ๋ก ์ ๊ทธ๋ ์ด๋๋์์ต๋๋ค.
- Kubernetes 1.17์ ๋น๋ํ๋ ๋ฐ ํ์ํ ์ต์ Go ๋ฒ์ ์ 1.13.4์ ๋๋ค.
PS
๋ธ๋ก๊ทธ์์๋ ์ฝ์ด๋ณด์ธ์.
- ยซ";
- ยซ";
- ยซ";
- ยซ".
์ถ์ฒ : habr.com
