αž”αž‘αž–αž·αžŸαŸ„αž’αž“αŸαžšαž”αžŸαŸ‹αž™αžΎαž„αž‡αžΆαž˜αž½αž™αž“αžΉαž„αž‘αž·αž“αŸ’αž“αž“αŸαž™αž“αŸ…αž€αŸ’αž“αž»αž„ etcd Kubernetes cluster αžŠαŸ„αž™αž•αŸ’αž‘αžΆαž›αŸ‹ (αžŠαŸ„αž™αž‚αŸ’αž˜αžΆαž“ K8s API)

αž€αžΆαž“αŸ‹αžαŸ‚αžαŸ’αž›αžΆαŸ†αž„αž‘αžΎαž„ αž’αžαž·αžαž·αž‡αž“αž€αŸ†αž–αž»αž„αžŸαŸ’αž“αžΎαžŸαž»αŸ†αž±αŸ’αž™αž™αžΎαž„αž•αŸ’αžαž›αŸ‹αž“αžΌαžœαž€αžΆαžšαž…αžΌαž›αž”αŸ’αžšαžΎαž…αž„αŸ’αž€αŸ„αž˜ Kubernetes αžŠαžΎαž˜αŸ’αž”αžΈαž’αžΆαž…αž…αžΌαž›αž”αŸ’αžšαžΎαžŸαŸαžœαžΆαž€αž˜αŸ’αž˜αž“αŸ…αž€αŸ’αž“αž»αž„αž…αž„αŸ’αž€αŸ„αž˜αŸ– αžŠαžΎαž˜αŸ’αž”αžΈαž’αžΆαž…αž—αŸ’αž‡αžΆαž”αŸ‹αžŠαŸ„αž™αž•αŸ’αž‘αžΆαž›αŸ‹αž‘αŸ…αž˜αžΌαž›αžŠαŸ’αž‹αžΆαž“αž‘αž·αž“αŸ’αž“αž“αŸαž™ αž¬αžŸαŸαžœαžΆαž€αž˜αŸ’αž˜αž˜αž½αž™αž…αŸ†αž“αž½αž“ αžŠαžΎαž˜αŸ’αž”αžΈαž—αŸ’αž‡αžΆαž”αŸ‹αž€αž˜αŸ’αž˜αžœαž·αž’αžΈαž€αŸ’αž“αž»αž„αžŸαŸ’αžšαž»αž€αž‡αžΆαž˜αž½αž™αž€αž˜αŸ’αž˜αžœαž·αž’αžΈαž“αŸ…αž€αŸ’αž“αž»αž„αž…αž„αŸ’αž€αŸ„αž˜...

αž”αž‘αž–αž·αžŸαŸ„αž’αž“αŸαžšαž”αžŸαŸ‹αž™αžΎαž„αž‡αžΆαž˜αž½αž™αž“αžΉαž„αž‘αž·αž“αŸ’αž“αž“αŸαž™αž“αŸ…αž€αŸ’αž“αž»αž„ etcd Kubernetes cluster αžŠαŸ„αž™αž•αŸ’αž‘αžΆαž›αŸ‹ (αžŠαŸ„αž™αž‚αŸ’αž˜αžΆαž“ K8s API)

αž‡αžΆαž§αž‘αžΆαž αžšαžŽαŸ αž˜αžΆαž“αžαŸ†αžšαžΌαžœαž€αžΆαžšαž€αŸ’αž“αž»αž„αž€αžΆαžšαžαž—αŸ’αž‡αžΆαž”αŸ‹αž–αžΈαž˜αŸ‰αžΆαžŸαŸŠαžΈαž“αž€αŸ’αž“αž»αž„αžŸαŸ’αžšαž»αž€αžšαž”αžŸαŸ‹αž’αŸ’αž“αž€αž‘αŸ…αž€αžΆαž“αŸ‹αžŸαŸαžœαžΆαž€αž˜αŸ’αž˜αž˜αž½αž™αŸ” memcached.staging.svc.cluster.local. αž™αžΎαž„αž•αŸ’αžαž›αŸ‹αžŸαž˜αžαŸ’αžαž—αžΆαž–αž“αŸαŸ‡αžŠαŸ„αž™αž”αŸ’αžšαžΎ VPN αž“αŸ…αž€αŸ’αž“αž»αž„αž…αž„αŸ’αž€αŸ„αž˜αžŠαŸ‚αž›αž’αžαž·αžαž·αž‡αž“αž—αŸ’αž‡αžΆαž”αŸ‹αŸ” αžŠαžΎαž˜αŸ’αž”αžΈβ€‹αž’αŸ’αžœαžΎβ€‹αžŠαžΌαž…αŸ’αž“αŸαŸ‡ αž™αžΎαž„β€‹αž”αŸ’αžšαž€αžΆαžŸβ€‹αž”αžŽαŸ’αžŠαžΆαž‰β€‹αžšαž„β€‹αž“αŸƒβ€‹αž•αž, សេវអ αž“αž·αž„β€‹αžšαž»αž‰ DNS αž…αž„αŸ’αž€αŸ„αž˜β€‹αž‘αŸ…β€‹αž˜αŸ‰αžΆαžŸαŸŠαžΈαž“β€‹αž—αŸ’αž‰αŸ€αžœαŸ” αžŠαžΌαž…αŸ’αž“αŸαŸ‡αž“αŸ…αž–αŸαž›αžŠαŸ‚αž›αž’αžαž·αžαž·αž‡αž“αž–αŸ’αž™αžΆαž™αžΆαž˜αž—αŸ’αž‡αžΆαž”αŸ‹αž‘αŸ…αžŸαŸαžœαžΆαž€αž˜αŸ’αž˜ memcached.staging.svc.cluster.localαžŸαŸ†αžŽαžΎαž‘αŸ…αž€αžΆαž“αŸ‹ cluster DNS αž αžΎαž™αž‡αžΆαž€αžΆαžšαž†αŸ’αž›αžΎαž™αžαž” αž‘αž‘αž½αž›αž”αžΆαž“αž’αžΆαžŸαž™αžŠαŸ’αž‹αžΆαž“αž“αŸƒαžŸαŸαžœαžΆαž€αž˜αŸ’αž˜αž“αŸαŸ‡αž–αžΈαž”αžŽαŸ’αžαžΆαž‰αžŸαŸαžœαžΆ cluster αž¬αž’αžΆαžŸαž™αžŠαŸ’αž‹αžΆαž“ pod αŸ”

αž™αžΎαž„αž€αŸ†αžŽαžαŸ‹αžšαž…αž“αžΆαžŸαž˜αŸ’αž–αŸαž“αŸ’αž’αž€αŸ’αžšαž»αž˜ K8s αžŠαŸ„αž™αž”αŸ’αžšαžΎ kubeadm αžŠαŸ‚αž›αž”αžŽαŸ’αžαžΆαž‰αžšαž„αžŸαŸαžœαžΆαž€αž˜αŸ’αž˜αž›αŸ†αž“αžΆαŸ†αžŠαžΎαž˜αž‚αžΊ 192.168.0.0/16αž“αž·αž„αž”αžŽαŸ’αžαžΆαž‰αž“αŸƒ pods αž‚αžΊ 10.244.0.0/16. αž‡αžΆαž’αž˜αŸ’αž˜αžαžΆαž’αŸ’αžœαžΈαŸ—αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαž›αŸ’αž’ αž”αŸ‰αž»αž“αŸ’αžαŸ‚αž˜αžΆαž“αž…αŸ†αžŽαž»αž…αž˜αž½αž™αž…αŸ†αž“αž½αž“αŸ–

  • αž”αžŽαŸ’αžαžΆαž‰αžšαž„ 192.168.*.* αž‡αžΆαž‰αžΉαž€αž‰αžΆαž”αŸ‹αžαŸ’αžšαžΌαžœαž”αžΆαž“αž‚αŸαž”αŸ’αžšαžΎαž“αŸ…αž€αŸ’αž“αž»αž„αž”αžŽαŸ’αžαžΆαž‰αž€αžΆαžšαž·αž™αžΆαž›αŸαž™αž’αžαž·αžαž·αž‡αž“ αž αžΎαž™αžαŸ‚αž˜αž‘αžΆαŸ†αž„αž‡αžΆαž‰αžΉαž€αž‰αžΆαž”αŸ‹αž“αŸ…αž€αŸ’αž“αž»αž„αž”αžŽαŸ’αžαžΆαž‰αž•αŸ’αž‘αŸ‡αž’αŸ’αž“αž€αž’αž—αž·αžœαžŒαŸ’αžαž“αŸαŸ” αž αžΎαž™αž”αž“αŸ’αž‘αžΆαž”αŸ‹αž˜αž€αž™αžΎαž„αž‘αž‘αž½αž›αž”αžΆαž“αž‡αž˜αŸ’αž›αŸ„αŸ‡αŸ– αžšαŸ‰αŸ„αžαž‘αŸαžšαž“αŸ…αž•αŸ’αž‘αŸ‡αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαž›αžΎαž”αžŽαŸ’αžαžΆαž‰αžšαž„αž“αŸαŸ‡ αž αžΎαž™ VPN αžšαž»αž‰αž”αžŽαŸ’αžαžΆαž‰αžšαž„αž‘αžΆαŸ†αž„αž“αŸαŸ‡αž–αžΈαž…αž„αŸ’αž€αŸ„αž˜αž‘αŸ…αž˜αŸ‰αžΆαžŸαŸŠαžΈαž“αž—αŸ’αž‰αŸ€αžœαŸ”
  • αž™αžΎαž„αž˜αžΆαž“αž…αž„αŸ’αž€αŸ„αž˜αž‡αžΆαž…αŸ’αžšαžΎαž“ (αž•αž›αž·αžαž€αž˜αŸ’αž˜ αžŠαŸ†αžŽαžΆαž€αŸ‹αž€αžΆαž› αž“αž·αž„/αž¬αž…αž„αŸ’αž€αŸ„αž˜αž’αŸ’αž“αž€αž’αž—αž·αžœαžŒαŸ’αžαž“αŸαž‡αžΆαž…αŸ’αžšαžΎαž“)αŸ” αž”αž“αŸ’αž‘αžΆαž”αŸ‹αž˜αž€ αžαžΆαž˜αž›αŸ†αž“αžΆαŸ†αžŠαžΎαž˜ αž–αž½αž€αžœαžΆαž‘αžΆαŸ†αž„αž’αžŸαŸ‹αž“αžΉαž„αž˜αžΆαž“αž”αžŽαŸ’αžαžΆαž‰αžšαž„αžŠαžΌαž…αž‚αŸ’αž“αžΆαžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž•αž αž“αž·αž„αžŸαŸαžœαžΆαž€αž˜αŸ’αž˜ αžŠαŸ‚αž›αž”αž„αŸ’αž€αžΎαžαž€αžΆαžšαž›αŸ†αž”αžΆαž€αž™αŸ‰αžΆαž„αžαŸ’αž›αžΆαŸ†αž„αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž€αžΆαžšαž„αžΆαžšαžŠαŸ†αžŽαžΆαž›αž‚αŸ’αž“αžΆαž‡αžΆαž˜αž½αž™αžŸαŸαžœαžΆαž€αž˜αŸ’αž˜αž“αŸ…αž€αŸ’αž“αž»αž„αž…αž„αŸ’αž€αŸ„αž˜αž‡αžΆαž…αŸ’αžšαžΎαž“αŸ”

αž™αžΎαž„αž”αžΆαž“αž’αž“αž»αžœαžαŸ’αžαž‡αžΆαž™αžΌαžšαž˜αž€αž αžΎαž™αž“αžΌαžœαž€αžΆαžšαž’αž“αž»αžœαžαŸ’αžαž“αŸƒαž€αžΆαžšαž”αŸ’αžšαžΎαž”αŸ’αžšαžΆαžŸαŸ‹αž”αžŽαŸ’αžαžΆαž‰αžšαž„αž•αŸ’αžŸαŸαž„αŸ—αž‚αŸ’αž“αžΆαžŸαž˜αŸ’αžšαžΆαž”αŸ‹αžŸαŸαžœαžΆαž€αž˜αŸ’αž˜ αž“αž·αž„αž•αžαž“αŸ…αž€αŸ’αž“αž»αž„αž‚αž˜αŸ’αžšαŸ„αž„αžŠαžΌαž…αž‚αŸ’αž“αžΆ - αž‡αžΆαž‘αžΌαž‘αŸ… αžŠαžΌαž…αŸ’αž“αŸαŸ‡αž…αž„αŸ’αž€αŸ„αž˜αž‘αžΆαŸ†αž„αž’αžŸαŸ‹αž˜αžΆαž“αž”αžŽαŸ’αžαžΆαž‰αž•αŸ’αžŸαŸαž„αŸ—αž‚αŸ’αž“αžΆαŸ” αž‘αŸ„αŸ‡αž™αŸ‰αžΆαž„αžŽαžΆαž€αŸαžŠαŸ„αž™ αž˜αžΆαž“αž…αž„αŸ’αž€αŸ„αž˜αž˜αž½αž™αž…αŸ†αž“αž½αž“αž’αŸ†αžŠαŸ‚αž›αž€αŸ†αž–αž»αž„αžŠαŸ†αžŽαžΎαžšαž€αžΆαžš αžŠαŸ‚αž›αžαŸ’αž‰αž»αŸ†αž˜αž·αž“αž…αž„αŸ‹αžšαŸ†αž€αž·αž›αž–αžΈαžŠαŸ†αž”αžΌαž„αž‘αžΎαž™ αž…αžΆαž”αŸ‹αžαžΆαŸ†αž„αž–αžΈαž–αž½αž€αž‚αŸαžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαžŸαŸαžœαžΆαž€αž˜αŸ’αž˜αž‡αžΆαž…αŸ’αžšαžΎαž“ αž€αž˜αŸ’αž˜αžœαž·αž’αžΈαžŠαŸ‚αž›αž˜αžΆαž“αžŸαŸ’αžαžΆαž“αž—αžΆαž–αž‡αžΆαžŠαžΎαž˜αŸ”

αž αžΎαž™αž”αž“αŸ’αž‘αžΆαž”αŸ‹αž˜αž€αž™αžΎαž„αžŸαž½αžšαžαŸ’αž›αž½αž“αž™αžΎαž„αžαžΆ: αžšαž”αŸ€αž”αž•αŸ’αž›αžΆαžŸαŸ‹αž”αŸ’αžαžΌαžšαž”αžŽαŸ’αžαžΆαž‰αžšαž„αž“αŸ…αž€αŸ’αž“αž»αž„αž…αž„αŸ’αž€αŸ„αž˜αžŠαŸ‚αž›αž˜αžΆαž“αžŸαŸ’αžšαžΆαž”αŸ‹?

αž€αžΆαžšαžŸαŸ’αžœαŸ‚αž„αžšαž€αž€αžΆαžšαžŸαž˜αŸ’αžšαŸαž…αž…αž·αžαŸ’αž

αž€αžΆαžšαž’αž“αž»αžœαžαŸ’αžαž‘αžΌαž‘αŸ…αž”αŸ†αž•αž»αžαž‚αžΊαž€αžΆαžšαž”αž„αŸ’αž€αžΎαžαž‘αžΎαž„αžœαž·αž‰ αž‘αžΆαŸ†αž„αž’αžŸαŸ‹ αžŸαŸαžœαžΆαž€αž˜αŸ’αž˜αžŠαŸ‚αž›αž˜αžΆαž“αž”αŸ’αžšαž—αŸαž‘ ClusterIP αŸ” αž‡αžΆαž‡αž˜αŸ’αžšαžΎαžŸαž˜αž½αž™ αž’αžΆαž…αžŽαŸ‚αž“αžΆαŸ† αž αžΎαž™β€‹αž“αŸαŸ‡:

αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαžαžΆαž„αž€αŸ’αžšαŸ„αž˜αž˜αžΆαž“αž”αž‰αŸ’αž αžΆαŸ– αž”αž“αŸ’αž‘αžΆαž”αŸ‹αž–αžΈαž’αŸ’αžœαžΈαŸ—αž”αžΆαž“αž€αŸ†αžŽαžαŸ‹αžšαž…αž“αžΆαžŸαž˜αŸ’αž–αŸαž“αŸ’αž’ αž•αžαžƒαŸ‚αžšαž˜αž€αž‡αžΆαž˜αž½αž™ IP αž…αžΆαžŸαŸ‹αž‡αžΆ DNS nameserver αž“αŸ…αž€αŸ’αž“αž»αž„ /etc/resolv.conf αŸ”
αžŠαŸ„αž™αžŸαžΆαžšαžαŸ’αž‰αž»αŸ†αž“αŸ…αžαŸ‚αžšαž€αž˜αž·αž“αžƒαžΎαž‰αžŠαŸ†αžŽαŸ„αŸ‡αžŸαŸ’αžšαžΆαž™ αžαŸ’αž‰αž»αŸ†αžαŸ’αžšαžΌαžœαž€αŸ†αžŽαžαŸ‹αž…αž„αŸ’αž€αŸ„αž˜αž‘αžΆαŸ†αž„αž˜αžΌαž›αž‘αžΎαž„αžœαž·αž‰αžŠαŸ„αž™αž”αŸ’αžšαžΎ kubeadm reset αž αžΎαž™αž”αž‰αŸ’αž…αžΌαž›αžœαžΆαž˜αŸ’αžαž„αž‘αŸ€αžαŸ”

αž”αŸ‰αž»αž“αŸ’αžαŸ‚β€‹αž“αŸαŸ‡β€‹αž˜αž·αž“β€‹αžŸαŸαž€αŸ’αžαž·αžŸαž˜β€‹αžŸαž˜αŸ’αžšαžΆαž”αŸ‹β€‹αž’αŸ’αž“αž€β€‹αžšαžΆαž›αŸ‹β€‹αž‚αŸ’αž“αžΆβ€‹αž‘αŸ... αž“αŸαŸ‡β€‹αž‡αžΆβ€‹αž€αžΆαžšβ€‹αžŽαŸ‚αž“αžΆαŸ†β€‹αž›αž˜αŸ’αž’αž·αžβ€‹αž”αž“αŸ’αžαŸ‚αž˜β€‹αž‘αŸ€αžβ€‹αžŸαž˜αŸ’αžšαžΆαž”αŸ‹β€‹αž€αžšαžŽαžΈβ€‹αžšαž”αžŸαŸ‹β€‹αž™αžΎαž„αŸ–

  • Flannel αžαŸ’αžšαžΌαžœαž”αžΆαž“αž”αŸ’αžšαžΎ;
  • αž˜αžΆαž“αž…αž„αŸ’αž€αŸ„αž˜αž‘αžΆαŸ†αž„αž“αŸ…αž€αŸ’αž“αž»αž„αž–αž–αž€ αž“αž·αž„αž“αŸ…αž›αžΎαž•αŸ’αž“αŸ‚αž€αžšαžΉαž„αŸ”
  • αžαŸ’αž‰αž»αŸ†αž…αž„αŸ‹αž‡αŸ€αžŸαžœαžΆαž„αž€αžΆαžšαžŠαžΆαž€αŸ‹αž±αŸ’αž™αž”αŸ’αžšαžΎαž”αŸ’αžšαžΆαžŸαŸ‹αž‘αžΎαž„αžœαž·αž‰αž“αžΌαžœαžŸαŸαžœαžΆαž€αž˜αŸ’αž˜αž‘αžΆαŸ†αž„αž’αžŸαŸ‹αž“αŸ…αž€αŸ’αž“αž»αž„αž…αž„αŸ’αž€αŸ„αž˜αŸ”
  • αž˜αžΆαž“αžαž˜αŸ’αžšαžΌαžœαž€αžΆαžšαž‡αžΆαž‘αžΌαž‘αŸ…αžŠαžΎαž˜αŸ’αž”αžΈαž’αŸ’αžœαžΎαž’αŸ’αžœαžΈαž‚αŸ’αžšαž”αŸ‹αž™αŸ‰αžΆαž„αž‡αžΆαž˜αž½αž™αž“αžΉαž„αž…αŸ†αž“αž½αž“αž’αž”αŸ’αž”αž”αžšαž˜αžΆαž“αŸƒαž”αž‰αŸ’αž αžΆ;
  • αž€αŸ†αžŽαŸ‚ Kubernetes αž‚αžΊ 1.16.6 (αž‘αŸ„αŸ‡αž‡αžΆαž™αŸ‰αžΆαž„αžŽαžΆαž€αŸαžŠαŸ„αž™ αž‡αŸ†αž αžΆαž“αž”αž“αŸ’αžαŸ‚αž˜αž‘αŸ€αžαž“αžΉαž„αžŸαŸ’αžšαžŠαŸ€αž„αž‚αŸ’αž“αžΆαžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž€αŸ†αžŽαŸ‚αž•αŸ’αžŸαŸαž„αž‘αŸ€αž);
  • αž—αžΆαžšαž€αž·αž…αŸ’αž…αž…αž˜αŸ’αž”αž„αž‚αžΊαžŠαžΎαž˜αŸ’αž”αžΈαž’αžΆαž“αžΆαžαžΆαž“αŸ…αž€αŸ’αž“αž»αž„αž…αž„αŸ’αž€αŸ„αž˜αžŠαŸ‚αž›αž”αžΆαž“αžŠαžΆαž€αŸ‹αž–αž„αŸ’αžšαžΆαž™αžŠαŸ„αž™αž”αŸ’αžšαžΎ kubeadm αž‡αžΆαž˜αž½αž™αž”αžŽαŸ’αžαžΆαž‰αžšαž„αžŸαŸαžœαžΆαž€αž˜αŸ’αž˜ 192.168.0.0/16αž‡αŸ†αž“αž½αžŸαžœαžΆαžŠαŸ„αž™ 172.24.0.0/16.

αž αžΎαž™β€‹αžœαžΆβ€‹αž‘αžΎαž”αžαŸ‚β€‹αž€αžΎαžβ€‹αž‘αžΎαž„β€‹αž‡αžΆβ€‹αž™αžΌαžšβ€‹αž˜αž€β€‹αž αžΎαž™β€‹αžŠαŸ‚αž›β€‹αž™αžΎαž„β€‹αž…αžΆαž”αŸ‹β€‹αž’αžΆαžšαž˜αŸ’αž˜αžŽαŸβ€‹αž‡αžΆβ€‹αž™αžΌαžšβ€‹αž˜αž€β€‹αž αžΎαž™β€‹αž€αŸ’αž“αž»αž„β€‹αž€αžΆαžšβ€‹αž˜αžΎαž›β€‹αž’αŸ’αžœαžΈβ€‹αž“αž·αž„β€‹αžšαž”αŸ€αž”β€‹αžŠαŸ‚αž›β€‹αž“αŸ…β€‹αž€αŸ’αž“αž»αž„ Kubernetes αžαŸ’αžšαžΌαžœβ€‹αž”αžΆαž“β€‹αžšαž€αŸ’αžŸαžΆβ€‹αž‘αž»αž€β€‹αž“αŸ…β€‹αž€αŸ’αž“αž»αž„ etcd αž’αŸ’αžœαžΈβ€‹αžŠαŸ‚αž›β€‹αž’αžΆαž…β€‹αž’αŸ’αžœαžΎβ€‹αž”αžΆαž“β€‹αž‡αžΆαž˜αž½αž™β€‹αžœαžΆ... αžŠαžΌαž…αŸ’αž“αŸαŸ‡β€‹αž™αžΎαž„β€‹αž‚αž·αžβ€‹αžαžΆβ€‹αŸ– Β«αž αŸαžαž»αž’αŸ’αžœαžΈαž˜αž·αž“αž‚αŸ’αžšαžΆαž“αŸ‹αžαŸ‚αž’αŸ’αžœαžΎαž”αž…αŸ’αž…αž»αž”αŸ’αž”αž“αŸ’αž“αž—αžΆαž–αž‘αž·αž“αŸ’αž“αž“αŸαž™αž“αŸ…αž€αŸ’αž“αž»αž„ etcd αžŠαŸ„αž™αž‡αŸ†αž“αž½αžŸαž’αžΆαžŸαž™αžŠαŸ’αž‹αžΆαž“ IP αž…αžΆαžŸαŸ‹ (αž”αžŽαŸ’αžαžΆαž‰αžšαž„) αž‡αžΆαž˜αž½αž™αžαŸ’αž˜αžΈαŸ”?

αžŠαŸ„αž™αž”αžΆαž“αžŸαŸ’αžœαŸ‚αž„αžšαž€αž§αž”αž€αžšαžŽαŸαžŠαŸ‚αž›αžαŸ’αžšαŸ€αž˜αžšαž½αž…αž‡αžΆαžŸαŸ’αžšαŸαž…αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž’αŸ’αžœαžΎαž€αžΆαžšαž‡αžΆαž˜αž½αž™αž‘αž·αž“αŸ’αž“αž“αŸαž™αž“αŸ…αž€αŸ’αž“αž»αž„ etcd αž™αžΎαž„αž˜αž·αž“αž”αžΆαž“αžšαž€αžƒαžΎαž‰αž’αŸ’αžœαžΈαžŠαŸ‚αž›αž’αžΆαž…αžŠαŸ„αŸ‡αžŸαŸ’αžšαžΆαž™αž”αž‰αŸ’αž αžΆαž”αžΆαž“αž‘αžΆαŸ†αž„αžŸαŸ’αžšαž»αž„αž“αŸ„αŸ‡αž‘αŸαŸ” (αžŠαŸ„αž™αžœαž·αž’αžΈαž“αŸαŸ‡ αž”αŸ’αžšαžŸαž·αž“αž”αžΎαž’αŸ’αž“αž€αžŠαžΉαž„αž’αŸ†αž–αžΈαž§αž”αž€αžšαžŽαŸαž”αŸ’αžšαžΎαž”αŸ’αžšαžΆαžŸαŸ‹αžŽαžΆαž˜αž½αž™αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž’αŸ’αžœαžΎαž€αžΆαžšαž‡αžΆαž˜αž½αž™αž‘αž·αž“αŸ’αž“αž“αŸαž™αžŠαŸ„αž™αž•αŸ’αž‘αžΆαž›αŸ‹αž“αŸ…αž€αŸ’αž“αž»αž„ etcd αž™αžΎαž„αž“αžΉαž„αž–αŸαž‰αž…αž·αžαŸ’αžαž…αŸ†αž–αŸ„αŸ‡αžαŸ†αžŽαž—αŸ’αž‡αžΆαž”αŸ‹αž“αŸαŸ‡αŸ” ) αž‘αŸ„αŸ‡αž™αŸ‰αžΆαž„αžŽαžΆαž€αŸαžŠαŸ„αž™ αž…αŸ†αžŽαž»αž…αž…αžΆαž”αŸ‹αž•αŸ’αžαžΎαž˜αžŠαŸαž›αŸ’αž’αž˜αž½αž™αž‚αžΊ etcdhelper αž–αžΈ OpenShift (αžŸαžΌαž˜αž’αžšαž‚αž»αžŽαžŠαž›αŸ‹αž’αŸ’αž“αž€αž“αž·αž–αž“αŸ’αž’!).

αž§αž”αž€αžšαžŽαŸαž”αŸ’αžšαžΎαž”αŸ’αžšαžΆαžŸαŸ‹αž“αŸαŸ‡αž’αžΆαž…αž—αŸ’αž‡αžΆαž”αŸ‹αž‘αŸ… etcd αžŠαŸ„αž™αž”αŸ’αžšαžΎαžœαž·αž‰αŸ’αž‰αžΆαž”αž“αž”αžαŸ’αžš αž“αž·αž„αž’αžΆαž“αž‘αž·αž“αŸ’αž“αž“αŸαž™αž–αžΈαž‘αžΈαž“αŸ„αŸ‡αžŠαŸ„αž™αž”αŸ’αžšαžΎαž–αžΆαž€αŸ’αž™αž”αž‰αŸ’αž‡αžΆ ls, get, dump.

αž”αž“αŸ’αžαŸ‚αž˜ etdhelper

αž‚αŸ†αž“αž·αžαž”αž“αŸ’αž‘αžΆαž”αŸ‹αž‚αžΊαž‘αžΌαž‡αžΈαžαž›αŸ– "αžαžΎαž’αŸ’αžœαžΈαž‘αŸ…αžŠαŸ‚αž›αžšαžΆαžšαžΆαŸ†αž„αž’αŸ’αž“αž€αž–αžΈαž€αžΆαžšαž”αž“αŸ’αžαŸ‚αž˜αž§αž”αž€αžšαžŽαŸαž”αŸ’αžšαžΎαž”αŸ’αžšαžΆαžŸαŸ‹αž“αŸαŸ‡αžŠαŸ„αž™αž”αž“αŸ’αžαŸ‚αž˜αžŸαž˜αžαŸ’αžαž—αžΆαž–αž€αŸ’αž“αž»αž„αž€αžΆαžšαžŸαžšαžŸαŸαžšαž‘αž·αž“αŸ’αž“αž“αŸαž™αž‘αŸ… etd?"

αžœαžΆαž”αžΆαž“αž€αŸ’αž›αžΆαž™αž‡αžΆαž€αŸ†αžŽαŸ‚αžŠαŸ‚αž›αž”αžΆαž“αž€αŸ‚αž”αŸ’αžšαŸ‚αžšαž”αžŸαŸ‹ etcdhelper αž‡αžΆαž˜αž½αž™αž“αžΉαž„αž˜αž»αžαž„αžΆαžšαžαŸ’αž˜αžΈαž–αžΈαžš changeServiceCIDR ΠΈ changePodCIDR. αž›αžΎαž“αžΆαž„ αž’αŸ’αž“αž€αž’αžΆαž…αžƒαžΎαž‰αž›αŸαžαž€αžΌαžŠ αž“αŸ…αž‘αžΈαž“αŸαŸ‡.

αžαžΎαž˜αž»αžαž„αžΆαžšαžαŸ’αž˜αžΈαž’αŸ’αžœαžΎαž’αŸ’αžœαžΈ? αž€αŸ’αž”αž½αž“αžŠαŸ„αŸ‡αžŸαŸ’αžšαžΆαž™ changeServiceCIDR:

  • αž”αž„αŸ’αž€αžΎαž deserializer αž˜αž½αž™;
  • αž…αž„αž€αŸ’αžšαž„αž€αž“αŸ’αžŸαŸ„αž˜αž’αž˜αŸ’αž˜αžαžΆαžŠαžΎαž˜αŸ’αž”αžΈαž‡αŸ†αž“αž½αžŸ CIDR;
  • αž™αžΎαž„αž†αŸ’αž›αž„αž€αžΆαžαŸ‹αžŸαŸαžœαžΆαž€αž˜αŸ’αž˜αž‘αžΆαŸ†αž„αž’αžŸαŸ‹αž‡αžΆαž˜αž½αž™αž“αžΉαž„αž”αŸ’αžšαž—αŸαž‘ ClusterIP αž“αŸ…αž€αŸ’αž“αž»αž„αž…αž„αŸ’αž€αŸ„αž˜αŸ–
    • αžŒαž·αž€αžΌαžŠαžαž˜αŸ’αž›αŸƒαž–αžΈ etcd αž…αžΌαž›αž‘αŸ…αž€αŸ’αž“αž»αž„αžœαžαŸ’αžαž» Go;
    • αžŠαŸ„αž™αž”αŸ’αžšαžΎαž€αž“αŸ’αžŸαŸ„αž˜αž’αž˜αŸ’αž˜αžαžΆ αž™αžΎαž„αž‡αŸ†αž“αž½αžŸαž–αžΈαžšαž”αŸƒαžŠαŸ†αž”αžΌαž„αž“αŸƒαž’αžΆαžŸαž™αžŠαŸ’αž‹αžΆαž“αŸ”
    • αž•αŸ’αžαž›αŸ‹αžŸαŸαžœαžΆαž€αž˜αŸ’αž˜αž’αžΆαžŸαž™αžŠαŸ’αž‹αžΆαž“ IP αž–αžΈαž”αžŽαŸ’αžαžΆαž‰αžšαž„αžαŸ’αž˜αžΈ;
    • αž”αž„αŸ’αž€αžΎαž serializer αž”αž˜αŸ’αž›αŸ‚αž„αžœαžαŸ’αžαž» Go αž‘αŸ…αž‡αžΆ protobuf αžŸαžšαžŸαŸαžšαž‘αž·αž“αŸ’αž“αž“αŸαž™αžαŸ’αž˜αžΈαž‘αŸ…αž‡αžΆ αž›αŸ”

αž˜αž»αžαž„αžΆαžš changePodCIDR αžŸαŸ†αžαžΆαž“αŸ‹αžŸαŸ’αžšαžŠαŸ€αž„αž‚αŸ’αž“αžΆ changeServiceCIDR - αž‡αŸ†αž“αž½αžŸαž±αŸ’αž™αž€αžΆαžšαž€αŸ‚αžŸαž˜αŸ’αžšαž½αž›αž€αžΆαžšαž”αž‰αŸ’αž‡αžΆαž€αŸ‹αžŸαŸαžœαžΆαž€αž˜αŸ’αž˜ αž™αžΎαž„αž’αŸ’αžœαžΎαžœαžΆαžŸαž˜αŸ’αžšαžΆαž”αŸ‹αžαŸ’αž“αžΆαŸ†αž„ αž“αž·αž„αž€αžΆαžšαž•αŸ’αž›αžΆαžŸαŸ‹αž”αŸ’αžαžΌαžš .spec.PodCIDR αž‘αŸ…αž”αžŽαŸ’αžαžΆαž‰αžšαž„αžαŸ’αž˜αžΈαŸ”

αž’αž“αž»αžœαžαŸ’αž

αž•αŸ’αž›αžΆαžŸαŸ‹αž”αŸ’αžαžΌαžšαžŸαŸαžœαžΆαž€αž˜αŸ’αž˜ CIDR

αž•αŸ‚αž“αž€αžΆαžšαžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž€αžΆαžšαž’αž“αž»αžœαžαŸ’αžαž—αžΆαžšαž€αž·αž…αŸ’αž…αž‚αžΊαžŸαžΆαž˜αž‰αŸ’αž‰αžŽαžΆαžŸαŸ‹ αž”αŸ‰αž»αž“αŸ’αžαŸ‚αžœαžΆαž–αžΆαž€αŸ‹αž–αŸαž“αŸ’αž’αž“αžΉαž„αž–αŸαž›αžœαŸαž›αžΆαžšαž„αž…αžΆαŸ†αž“αŸ…αž–αŸαž›αž“αŸƒαž€αžΆαžšαž”αž„αŸ’αž€αžΎαžαž‘αžΎαž„αžœαž·αž‰αž“αžΌαžœαž•αžαž‘αžΆαŸ†αž„αž’αžŸαŸ‹αž“αŸ…αž€αŸ’αž“αž»αž„αž…αž„αŸ’αž€αŸ„αž˜αŸ” αž”αž“αŸ’αž‘αžΆαž”αŸ‹αž–αžΈαž€αžΆαžšαž–αž·αž–αžŽαŸŒαž“αžΆαž’αŸ†αž–αžΈαž‡αŸ†αž αžΆαž“αžŸαŸ†αžαžΆαž“αŸ‹αŸ— αž™αžΎαž„αž€αŸαž“αžΉαž„αž…αŸ‚αž€αžšαŸ†αž›αŸ‚αž€αž‚αŸ†αž“αž·αžαž’αŸ†αž–αžΈαžšαž”αŸ€αž”αžŠαŸ‚αž›αžαžΆαž˜αž‘αŸ’αžšαžΉαžŸαŸ’αžαžΈ αž–αŸαž›αžœαŸαž›αžΆαžšαž„αž…αžΆαŸ†αž“αŸαŸ‡αž’αžΆαž…αž”αž„αŸ’αžšαž½αž˜αž’αž”αŸ’αž”αž”αžšαž˜αžΆαŸ”

αž‡αŸ†αž αžΆαž“αžαŸ’αžšαŸ€αž˜αžšαŸ€αž”αž…αŸ†αŸ–

  • αžŠαŸ†αž‘αžΎαž„αž€αž˜αŸ’αž˜αžœαž·αž’αžΈαž…αžΆαŸ†αž”αžΆαž…αŸ‹ αž“αž·αž„αžŠαŸ†αž‘αžΎαž„ patched etcdhelper;
  • αž€αžΆαžšαž”αž˜αŸ’αžšαž»αž„αž‘αž»αž€ αž›αŸ” αž“αž·αž„ /etc/kubernetes.

αž•αŸ‚αž“αž€αžΆαžšαžŸαž€αž˜αŸ’αž˜αž—αžΆαž–αžŸαž„αŸ’αžαŸαž”αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž€αžΆαžšαž•αŸ’αž›αžΆαžŸαŸ‹αž”αŸ’αžαžΌαžšαžŸαŸαžœαžΆαž€αž˜αŸ’αž˜CIDRαŸ–

  • αž€αžΆαžšαž•αŸ’αž›αžΆαžŸαŸ‹αž”αŸ’αžαžΌαžš apiserver αž“αž·αž„ controller-manager manifests;
  • αž€αžΆαžšαž…αŸαž‰αžœαž·αž‰αŸ’αž‰αžΆαž”αž“αž”αžαŸ’αžš;
  • αž€αžΆαžšαž•αŸ’αž›αžΆαžŸαŸ‹αž”αŸ’αžαžΌαžšαžŸαŸαžœαžΆαž€αž˜αŸ’αž˜ ClusterIP αž“αŸ…αž€αŸ’αž“αž»αž„ etcd;
  • αž…αžΆαž”αŸ‹αž•αŸ’αžαžΎαž˜αž‘αžΎαž„αžœαž·αž‰αž“αŸƒαž•αžαž‘αžΆαŸ†αž„αž’αžŸαŸ‹αž“αŸ…αž€αŸ’αž“αž»αž„αž…αž„αŸ’αž€αŸ„αž˜αŸ”

αžαžΆαž„αž€αŸ’αžšαŸ„αž˜β€‹αž“αŸαŸ‡β€‹αž‡αžΆβ€‹αž›αŸ†αžŠαžΆαž”αŸ‹β€‹αžŸαž€αž˜αŸ’αž˜αž—αžΆαž–β€‹αž™αŸ‰αžΆαž„β€‹αž›αž˜αŸ’αž’αž·αžαŸ”

1. αžŠαŸ†αž‘αžΎαž„ etcd-client αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž€αžΆαžšαž”αŸ„αŸ‡αž…αŸ„αž›αž‘αž·αž“αŸ’αž“αž“αŸαž™αŸ–

apt install etcd-client

2. Build etdhelper:

  • αžŠαŸ†αž‘αžΎαž„ golang:
    GOPATH=/root/golang
    mkdir -p $GOPATH/local
    curl -sSL https://dl.google.com/go/go1.14.1.linux-amd64.tar.gz | tar -xzvC $GOPATH/local
    echo "export GOPATH="$GOPATH"" >> ~/.bashrc
    echo 'export GOROOT="$GOPATH/local/go"' >> ~/.bashrc
    echo 'export PATH="$PATH:$GOPATH/local/go/bin"' >> ~/.bashrc
  • αž™αžΎαž„αžŸαž“αŸ’αžŸαŸ†αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αžαŸ’αž›αž½αž“αž™αžΎαž„ etcdhelper.goαž‘αžΆαž‰αž™αž€αž—αžΆαž–αž’αžΆαžŸαŸ’αžšαŸαž™ αž”αŸ’αžšαž˜αžΌαž›αŸ–
    wget https://raw.githubusercontent.com/flant/examples/master/2020/04-etcdhelper/etcdhelper.go
    go get go.etcd.io/etcd/clientv3 k8s.io/kubectl/pkg/scheme k8s.io/apimachinery/pkg/runtime
    go build -o etcdhelper etcdhelper.go

3. αž’αŸ’αžœαžΎαž€αžΆαžš Backup αž‡αžΆαžŠαžΎαž˜αŸ”

backup_dir=/root/backup
mkdir ${backup_dir}
cp -rL /etc/kubernetes ${backup_dir}
ETCDCTL_API=3 etcdctl --cacert=/etc/kubernetes/pki/etcd/ca.crt --key=/etc/kubernetes/pki/etcd/server.key --cert=/etc/kubernetes/pki/etcd/server.crt --endpoints https://192.168.199.100:2379 snapshot save ${backup_dir}/etcd.snapshot

4. αž•αŸ’αž›αžΆαžŸαŸ‹αž”αŸ’αžαžΌαžšαž”αžŽαŸ’αžαžΆαž‰αžšαž„αžŸαŸαžœαžΆαž€αž˜αŸ’αž˜αž“αŸ…αž€αŸ’αž“αž»αž„αž™αž“αŸ’αžαž αŸ„αŸ‡αž‚αŸ’αžšαž”αŸ‹αž‚αŸ’αžšαž„ Kubernetes manifests αŸ” αž“αŸ…αž€αŸ’αž“αž»αž„αž―αž€αžŸαžΆαžš /etc/kubernetes/manifests/kube-apiserver.yaml ΠΈ /etc/kubernetes/manifests/kube-controller-manager.yaml αž•αŸ’αž›αžΆαžŸαŸ‹αž”αŸ’αžαžΌαžšαž”αŸ‰αžΆαžšαŸ‰αžΆαž˜αŸ‰αŸ‚αžαŸ’αžš --service-cluster-ip-range αž‘αŸ…αž€αžΆαž“αŸ‹αž”αžŽαŸ’αžαžΆαž‰αžšαž„αžαŸ’αž˜αžΈαŸ– 172.24.0.0/16 αž‡αŸ†αž“αž½αžŸαž±αŸ’αž™αŸ” 192.168.0.0/16.

5. αžŠαŸ„αž™αžŸαžΆαžšαž™αžΎαž„αž€αŸ†αž–αž»αž„αž•αŸ’αž›αžΆαžŸαŸ‹αž”αŸ’αžαžΌαžšαž”αžŽαŸ’αžαžΆαž‰αžšαž„αžŸαŸαžœαžΆαž€αž˜αŸ’αž˜αžŠαŸ‚αž› kubeadm αž…αŸαž‰αžœαž·αž‰αŸ’αž‰αžΆαž”αž“αž”αžαŸ’αžšαžŸαž˜αŸ’αžšαžΆαž”αŸ‹ apiserver (αžšαž½αž˜αž‘αžΆαŸ†αž„) αž–αž½αž€αž‚αŸαž…αžΆαŸ†αž”αžΆαž…αŸ‹αžαŸ’αžšαžΌαžœαž…αŸαž‰αž˜αŸ’αžαž„αž‘αŸ€αžαŸ–

  1. αžŸαžΌαž˜αž˜αžΎαž›αžŠαŸ‚αž“ αž“αž·αž„αž’αžΆαžŸαž™αžŠαŸ’αž‹αžΆαž“ IP αžŠαŸ‚αž›αžœαž·αž‰αŸ’αž‰αžΆαž”αž“αž”αžαŸ’αžšαž”αž…αŸ’αž…αž»αž”αŸ’αž”αž“αŸ’αž“αžαŸ’αžšαžΌαžœαž”αžΆαž“αž…αŸαž‰αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αŸ–
    openssl x509 -noout -ext subjectAltName </etc/kubernetes/pki/apiserver.crt
    X509v3 Subject Alternative Name:
        DNS:dev-1-master, DNS:kubernetes, DNS:kubernetes.default, DNS:kubernetes.default.svc, DNS:kubernetes.default.svc.cluster.local, DNS:apiserver, IP Address:192.168.0.1, IP Address:10.0.0.163, IP Address:192.168.199.100
  2. αžαŸ„αŸ‡αžšαŸ€αž”αž…αŸ†αž€αžΆαžšαž€αŸ†αžŽαžαŸ‹αž’αž”αŸ’αž”αž”αžšαž˜αžΆαžŸαž˜αŸ’αžšαžΆαž”αŸ‹ kubeadmαŸ–
    cat kubeadm-config.yaml
    apiVersion: kubeadm.k8s.io/v1beta1
    kind: ClusterConfiguration
    networking:
      podSubnet: "10.244.0.0/16"
      serviceSubnet: "172.24.0.0/16"
    apiServer:
      certSANs:
      - "192.168.199.100" # IP-адрСс мастСр ΡƒΠ·Π»Π°
  3. αžαŸ„αŸ‡αž›αž»αž” crt αž“αž·αž„αžŸαŸ„αž…αžΆαžŸαŸ‹ αž–αŸ’αžšαŸ„αŸ‡αž”αžΎαž‚αŸ’αž˜αžΆαž“αžœαžΆαž‘αŸ αžœαž·αž‰αŸ’αž‰αžΆαž”αž“αž”αžαŸ’αžšαžαŸ’αž˜αžΈαž“αžΉαž„αž˜αž·αž“αžαŸ’αžšαžΌαžœαž”αžΆαž“αž…αŸαž‰αž‘αŸαŸ–
    rm /etc/kubernetes/pki/apiserver.{key,crt}
  4. αžαŸ„αŸ‡αž…αŸαž‰αžœαž·αž‰αŸ’αž‰αžΆαž”αž“αž”αžαŸ’αžšαž‘αžΎαž„αžœαž·αž‰αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž˜αŸ‰αžΆαžŸαŸŠαžΈαž“αž˜αŸ APIαŸ–
    kubeadm init phase certs apiserver --config=kubeadm-config.yaml
  5. αžŸαžΌαž˜αž–αž·αž“αž·αžαŸ’αž™αž˜αžΎαž›αžαžΆαžœαž·αž‰αŸ’αž‰αžΆαž”αž“αž”αžαŸ’αžšαžαŸ’αžšαžΌαžœαž”αžΆαž“αž…αŸαž‰αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž”αžŽαŸ’αžαžΆαž‰αžšαž„αžαŸ’αž˜αžΈαŸ–
    openssl x509 -noout -ext subjectAltName </etc/kubernetes/pki/apiserver.crt
    X509v3 Subject Alternative Name:
        DNS:kube-2-master, DNS:kubernetes, DNS:kubernetes.default, DNS:kubernetes.default.svc, DNS:kubernetes.default.svc.cluster.local, IP Address:172.24.0.1, IP Address:10.0.0.163, IP Address:192.168.199.100
  6. αž”αž“αŸ’αž‘αžΆαž”αŸ‹αž–αžΈαž…αŸαž‰αžœαž·αž‰αŸ’αž‰αžΆαž”αž“αž”αžαŸ’αžšαž˜αŸ‰αžΆαžŸαŸŠαžΈαž“αž˜αŸ API αž‘αžΎαž„αžœαž·αž‰ αžŸαžΌαž˜αž…αžΆαž”αŸ‹αž•αŸ’αžαžΎαž˜αž€αž»αž„αžαžΊαž“αŸαžšαžšαž”αžŸαŸ‹αžœαžΆαž‘αžΎαž„αžœαž·αž‰αŸ–
    docker ps | grep k8s_kube-apiserver | awk '{print $1}' | xargs docker restart
  7. αžαŸ„αŸ‡αž”αž„αŸ’αž€αžΎαž config αž‘αžΎαž„αžœαž·αž‰ admin.conf:
    kubeadm alpha certs renew admin.conf
  8. αžαŸ„αŸ‡αž€αŸ‚αžŸαž˜αŸ’αžšαž½αž›αž‘αž·αž“αŸ’αž“αž“αŸαž™αž€αŸ’αž“αž»αž„ etcdαŸ–
    ./etcdhelper -cacert /etc/kubernetes/pki/etcd/ca.crt -cert /etc/kubernetes/pki/etcd/server.crt -key /etc/kubernetes/pki/etcd/server.key -endpoint https://127.0.0.1:2379 change-service-cidr 172.24.0.0/16 

    αžŸαžΌαž˜αž”αŸ’αžšαž™αŸαžαŸ’αž“! αž“αŸ…αž–αŸαž›αž“αŸαŸ‡ αžŠαŸ†αžŽαŸ„αŸ‡αžŸαŸ’αžšαžΆαž™αžŠαŸ‚αž“αžˆαž”αŸ‹αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαž“αŸ…αž€αŸ’αž“αž»αž„αž…αž„αŸ’αž€αŸ„αž˜ αž…αžΆαž”αŸ‹αžαžΆαŸ†αž„αž–αžΈαž“αŸ…αž€αŸ’αž“αž»αž„αž•αžαžŠαŸ‚αž›αž˜αžΆαž“αžŸαŸ’αžšαžΆαž”αŸ‹ /etc/resolv.conf αž’αžΆαžŸαž™αžŠαŸ’αž‹αžΆαž“ CoreDNS αž…αžΆαžŸαŸ‹ (kube-dns) αžαŸ’αžšαžΌαžœαž”αžΆαž“αž…αž»αŸ‡αžˆαŸ’αž˜αŸ„αŸ‡ αž αžΎαž™ kube-proxy αž•αŸ’αž›αžΆαžŸαŸ‹αž”αŸ’αžαžΌαžšαž…αŸ’αž”αžΆαž”αŸ‹ iptables αž–αžΈ subnet αž…αžΆαžŸαŸ‹αž‘αŸ…αžαŸ’αž˜αžΈαŸ” αž›αžΎαžŸαž–αžΈαž“αŸαŸ‡αž‘αŸ€αžαž“αŸ…αž€αŸ’αž“αž»αž„αž’αžαŸ’αžαž”αž‘αžœαžΆαžαŸ’αžšαžΌαžœαž”αžΆαž“αžŸαžšαžŸαŸαžšαž’αŸ†αž–αžΈαž‡αž˜αŸ’αžšαžΎαžŸαžŠαŸ‚αž›αž’αžΆαž…αž’αŸ’αžœαžΎαž‘αŸ…αž”αžΆαž“αžŠαžΎαž˜αŸ’αž”αžΈαž€αžΆαžαŸ‹αž”αž“αŸ’αžαž™αž–αŸαž›αžœαŸαž›αžΆαžšαž„αž…αžΆαŸ†αŸ”

  9. αžαŸ„αŸ‡αž‡αž½αžŸαž‡αž»αž› ConfigMap's αž“αŸ…αž€αŸ’αž“αž»αž„ namespace kube-system:
    kubectl -n kube-system edit cm kubelet-config-1.16

    - αž‡αŸ†αž“αž½αžŸαž“αŸ…αž‘αžΈαž“αŸαŸ‡ clusterDNS αž‘αŸ…αž’αžΆαžŸαž™αžŠαŸ’αž‹αžΆαž“ IP αžαŸ’αž˜αžΈαž“αŸƒαžŸαŸαžœαžΆαž€αž˜αŸ’αž˜ kube-dnsαŸ– kubectl -n kube-system get svc kube-dns.

    kubectl -n kube-system edit cm kubeadm-config

    - αž™αžΎαž„αž“αžΉαž„αž‡αž½αžŸαž‡αž»αž›αžœαžΆαŸ” data.ClusterConfiguration.networking.serviceSubnet αž‘αŸ…αž”αžŽαŸ’αžαžΆαž‰αžšαž„αžαŸ’αž˜αžΈαŸ”

  10. αžŠαŸ„αž™αžŸαžΆαžšαž’αžΆαžŸαž™αžŠαŸ’αž‹αžΆαž“ kube-dns αž”αžΆαž“αž•αŸ’αž›αžΆαžŸαŸ‹αž”αŸ’αžαžΌαžš αž…αžΆαŸ†αž”αžΆαž…αŸ‹αžαŸ’αžšαžΌαžœαž’αŸ’αžœαžΎαž”αž…αŸ’αž…αž»αž”αŸ’αž”αž“αŸ’αž“αž—αžΆαž–αž€αžΆαžšαž€αŸ†αžŽαžαŸ‹αžšαž…αž“αžΆαžŸαž˜αŸ’αž–αŸαž“αŸ’αž’ kubelet αž“αŸ…αž›αžΎαžαŸ’αž“αžΆαŸ†αž„αž‘αžΆαŸ†αž„αž’αžŸαŸ‹αŸ–
    kubeadm upgrade node phase kubelet-config && systemctl restart kubelet
  11. αž’αŸ’αžœαžΈαžŠαŸ‚αž›αž“αŸ…αžŸαž›αŸ‹αž‚αžΊαžαŸ’αžšαžΌαžœαž…αžΆαž”αŸ‹αž•αŸ’αžαžΎαž˜αž•αžαž‘αžΆαŸ†αž„αž’αžŸαŸ‹αž‘αžΎαž„αžœαž·αž‰αž“αŸ…αž€αŸ’αž“αž»αž„αž…αž„αŸ’αž€αŸ„αž˜αŸ–
    kubectl get pods --no-headers=true --all-namespaces |sed -r 's/(S+)s+(S+).*/kubectl --namespace 1 delete pod 2/e'

αž€αžΆαžαŸ‹αž”αž“αŸ’αžαž™αž–αŸαž›αžœαŸαž›αžΆαžˆαž”αŸ‹αžŸαž˜αŸ’αžšαžΆαž€

αž‚αŸ†αž“αž·αžαž’αŸ†αž–αžΈαžšαž”αŸ€αž”αž€αžΆαžαŸ‹αž”αž“αŸ’αžαž™αž–αŸαž›αžœαŸαž›αžΆαžšαž„αž…αžΆαŸ†αŸ–

  1. αž”αž“αŸ’αž‘αžΆαž”αŸ‹β€‹αž–αžΈβ€‹αž€αžΆαžšβ€‹αž•αŸ’αž›αžΆαžŸαŸ‹β€‹αž”αŸ’αžαžΌβ€‹αžšβ€‹αž™αž“αŸ’αžαž αŸ„αŸ‡β€‹αž”αž‰αŸ’αž‡αžΆ manifests αžŸαžΌαž˜β€‹αž”αž„αŸ’αž€αžΎαžβ€‹αžŸαŸαžœαžΆ kube-dns αžαŸ’αž˜αžΈβ€‹αž‡αžΆβ€‹αž§αž‘αžΆαž αžšαžŽαŸβ€‹αž‡αžΆαž˜αž½αž™β€‹αž“αžΉαž„β€‹αžˆαŸ’αž˜αŸ„αŸ‡β€‹ kube-dns-tmp αž“αž·αž„αž’αžΆαžŸαž™αžŠαŸ’αž‹αžΆαž“αžαŸ’αž˜αžΈαŸ” 172.24.0.10.
  2. αžŠαžΎαž˜αŸ’αž”αžΈαž”αž„αŸ’αž€αžΎαž if αž“αŸ…αž€αŸ’αž“αž»αž„ etcdhelper αžŠαŸ‚αž›αž“αžΉαž„αž˜αž·αž“αž€αŸ‚αž”αŸ’αžšαŸ‚αžŸαŸαžœαžΆαž€αž˜αŸ’αž˜ kube-dns αž‘αŸαŸ”
  3. αž‡αŸ†αž“αž½αžŸαž’αžΆαžŸαž™αžŠαŸ’αž‹αžΆαž“αž“αŸ…αž€αŸ’αž“αž»αž„ kubelets αž‘αžΆαŸ†αž„αž’αžŸαŸ‹αŸ” ClusterDNS αž‘αŸ…αž€αžΆαž“αŸ‹αžŸαŸαžœαžΆαž€αž˜αŸ’αž˜αžαŸ’αž˜αžΈ αžαžŽαŸˆαž–αŸαž›αžŠαŸ‚αž›αžŸαŸαžœαžΆαž€αž˜αŸ’αž˜αž…αžΆαžŸαŸ‹αž“αžΉαž„αž”αž“αŸ’αžαžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαž€αŸ’αž“αž»αž„αž–αŸαž›αžŠαŸ†αžŽαžΆαž›αž‚αŸ’αž“αžΆαž‡αžΆαž˜αž½αž™αž“αžΉαž„αžŸαŸαžœαžΆαž€αž˜αŸ’αž˜αžαŸ’αž˜αžΈαŸ”
  4. αžšαž„αŸ‹αž…αžΆαŸ†αžšαž αžΌαžαž‘αžΆαž›αŸ‹αžαŸ‚αž•αžαžŠαŸ‚αž›αž˜αžΆαž“αž€αž˜αŸ’αž˜αžœαž·αž’αžΈαžšαž˜αŸ€αž›αž‘αžΎαž„αžŠαŸ„αž™αžαŸ’αž›αž½αž“αž―αž„αžŠαŸ„αž™αž αŸαžαž»αž•αž›αž’αž˜αŸ’αž˜αž‡αžΆαžαž· αž¬αžαžΆαž˜αž–αŸαž›αžœαŸαž›αžΆαžŠαŸ‚αž›αž”αžΆαž“αž–αŸ’αžšαž˜αž–αŸ’αžšαŸ€αž„αŸ”
  5. αž›αž»αž”αžŸαŸαžœαžΆαž€αž˜αŸ’αž˜ kube-dns-tmp αž“αž·αž„αž•αŸ’αž›αžΆαžŸαŸ‹αž”αŸ’αžαžΌαžš serviceSubnetCIDR αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αžŸαŸαžœαžΆαž€αž˜αŸ’αž˜ kube-dns αŸ”

αž•αŸ‚αž“αž€αžΆαžšαž“αŸαŸ‡αž“αžΉαž„αž’αž“αž»αž‰αŸ’αž‰αžΆαžαž±αŸ’αž™αž’αŸ’αž“αž€αž€αžΆαžαŸ‹αž”αž“αŸ’αžαž™αž–αŸαž›αžœαŸαž›αžΆαžšαž„αž…αžΆαŸ†αžŠαž›αŸ‹ ~ αž˜αž½αž™αž“αžΆαž‘αžΈ αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αžšαž™αŸˆαž–αŸαž›αž“αŸƒαž€αžΆαžšαžŠαž€αžŸαŸαžœαžΆαž€αž˜αŸ’αž˜αž…αŸαž‰ kube-dns-tmp αž“αž·αž„αž•αŸ’αž›αžΆαžŸαŸ‹αž”αŸ’αžαžΌαžšαž”αžŽαŸ’αžαžΆαž‰αžšαž„αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αžŸαŸαžœαžΆαž€αž˜αŸ’αž˜ kube-dns.

αž€αžΆαžšαž€αŸ‚αž”αŸ’αžšαŸ‚ podNetwork

αž€αŸ’αž“αž»αž„αž–αŸαž›αž‡αžΆαž˜αž½αž™αž‚αŸ’αž“αžΆαž“αŸαŸ‡ αž™αžΎαž„αž”αžΆαž“αžŸαž˜αŸ’αžšαŸαž…αž…αž·αžαŸ’αžαž˜αžΎαž›αž–αžΈαžšαž”αŸ€αž”αž€αŸ‚αž”αŸ’αžšαŸ‚ podNetwork αžŠαŸ„αž™αž”αŸ’αžšαžΎ etcdhelper αž›αž‘αŸ’αž’αž•αž›αŸ” αž›αŸ†αžŠαžΆαž”αŸ‹αž“αŸƒαžŸαž€αž˜αŸ’αž˜αž—αžΆαž–αž˜αžΆαž“αžŠαžΌαž…αžαžΆαž„αž€αŸ’αžšαŸ„αž˜αŸ–

  • αž‡αž½αžŸαž‡αž»αž›αž€αžΆαžšαž€αŸ†αžŽαžαŸ‹αž“αŸ…αž€αŸ’αž“αž»αž„ kube-system;
  • αž‡αž½αžŸαž‡αž»αž›αž€αžΆαžšαž”αž„αŸ’αž αžΆαž‰ Kube-controller-manager;
  • αž•αŸ’αž›αžΆαžŸαŸ‹αž”αŸ’αžαžΌαžš podCIDR αžŠαŸ„αž™αž•αŸ’αž‘αžΆαž›αŸ‹αž“αŸ…αž€αŸ’αž“αž»αž„ etcd;
  • αž…αžΆαž”αŸ‹αž•αŸ’αžŠαžΎαž˜αžαŸ’αž“αžΆαŸ†αž„αž…αž„αŸ’αž€αŸ„αž˜αž‘αžΆαŸ†αž„αž’αžŸαŸ‹αž‘αžΎαž„αžœαž·αž‰αŸ”

αž₯αž‘αžΌαžœαž“αŸαŸ‡αž”αž“αŸ’αžαŸ‚αž˜αž’αŸ†αž–αžΈαžŸαž€αž˜αŸ’αž˜αž—αžΆαž–αž‘αžΆαŸ†αž„αž“αŸαŸ‡αŸ–

1. αž€αŸ‚αž”αŸ’αžšαŸ‚ ConfigMap's αž€αŸ’αž“αž»αž„ namespace kube-system:

kubectl -n kube-system edit cm kubeadm-config

- αž€αžΆαžšαž€αŸ‚αžαž˜αŸ’αžšαžΌαžœ data.ClusterConfiguration.networking.podSubnet αž‘αŸ…αž”αžŽαŸ’αžαžΆαž‰αžšαž„αžαŸ’αž˜αžΈαŸ” 10.55.0.0/16.

kubectl -n kube-system edit cm kube-proxy

- αž€αžΆαžšαž€αŸ‚αžαž˜αŸ’αžšαžΌαžœ data.config.conf.clusterCIDR: 10.55.0.0/16.

2. αž€αŸ‚αž”αŸ’αžšαŸ‚ manifest αžšαž”αžŸαŸ‹ controller-managerαŸ–

vim /etc/kubernetes/manifests/kube-controller-manager.yaml

- αž€αžΆαžšαž€αŸ‚αžαž˜αŸ’αžšαžΌαžœ --cluster-cidr=10.55.0.0/16.

3. αž˜αžΎαž›αžαž˜αŸ’αž›αŸƒαž”αž…αŸ’αž…αž»αž”αŸ’αž”αž“αŸ’αž“ .spec.podCIDR, .spec.podCIDRs, .InternalIP, .status.addresses αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αžαŸ’αž“αžΆαŸ†αž„αž…αž„αŸ’αž€αŸ„αž˜αž‘αžΆαŸ†αž„αž’αžŸαŸ‹αŸ–

kubectl get no -o json | jq '[.items[] | {"name": .metadata.name, "podCIDR": .spec.podCIDR, "podCIDRs": .spec.podCIDRs, "InternalIP": (.status.addresses[] | select(.type == "InternalIP") | .address)}]'

[
  {
    "name": "kube-2-master",
    "podCIDR": "10.244.0.0/24",
    "podCIDRs": [
      "10.244.0.0/24"
    ],
    "InternalIP": "192.168.199.2"
  },
  {
    "name": "kube-2-master",
    "podCIDR": "10.244.0.0/24",
    "podCIDRs": [
      "10.244.0.0/24"
    ],
    "InternalIP": "10.0.1.239"
  },
  {
    "name": "kube-2-worker-01f438cf-579f9fd987-5l657",
    "podCIDR": "10.244.1.0/24",
    "podCIDRs": [
      "10.244.1.0/24"
    ],
    "InternalIP": "192.168.199.222"
  },
  {
    "name": "kube-2-worker-01f438cf-579f9fd987-5l657",
    "podCIDR": "10.244.1.0/24",
    "podCIDRs": [
      "10.244.1.0/24"
    ],
    "InternalIP": "10.0.4.73"
  }
]

4. αž‡αŸ†αž“αž½αžŸ podCIDR αžŠαŸ„αž™αž’αŸ’αžœαžΎαž€αžΆαžšαž•αŸ’αž›αžΆαžŸαŸ‹αž”αŸ’αžαžΌαžšαžŠαŸ„αž™αž•αŸ’αž‘αžΆαž›αŸ‹αž‘αŸ… etcd:

./etcdhelper -cacert /etc/kubernetes/pki/etcd/ca.crt -cert /etc/kubernetes/pki/etcd/server.crt -key /etc/kubernetes/pki/etcd/server.key -endpoint https://127.0.0.1:2379 change-pod-cidr 10.55.0.0/16

5. αžŸαžΌαž˜αž–αž·αž“αž·αžαŸ’αž™αž˜αžΎαž›αžαžΆ podCIDR αž–αž·αžαž‡αžΆαž”αžΆαž“αž•αŸ’αž›αžΆαžŸαŸ‹αž”αŸ’αžαžΌαžšαŸ–

kubectl get no -o json | jq '[.items[] | {"name": .metadata.name, "podCIDR": .spec.podCIDR, "podCIDRs": .spec.podCIDRs, "InternalIP": (.status.addresses[] | select(.type == "InternalIP") | .address)}]'

[
  {
    "name": "kube-2-master",
    "podCIDR": "10.55.0.0/24",
    "podCIDRs": [
      "10.55.0.0/24"
    ],
    "InternalIP": "192.168.199.2"
  },
  {
    "name": "kube-2-master",
    "podCIDR": "10.55.0.0/24",
    "podCIDRs": [
      "10.55.0.0/24"
    ],
    "InternalIP": "10.0.1.239"
  },
  {
    "name": "kube-2-worker-01f438cf-579f9fd987-5l657",
    "podCIDR": "10.55.1.0/24",
    "podCIDRs": [
      "10.55.1.0/24"
    ],
    "InternalIP": "192.168.199.222"
  },
  {
    "name": "kube-2-worker-01f438cf-579f9fd987-5l657",
    "podCIDR": "10.55.1.0/24",
    "podCIDRs": [
      "10.55.1.0/24"
    ],
    "InternalIP": "10.0.4.73"
  }
]

6. αžαŸ„αŸ‡αž…αžΆαž”αŸ‹αž•αŸ’αžαžΎαž˜αžαŸ’αž“αžΆαŸ†αž„αž…αž„αŸ’αž€αŸ„αž˜αž‘αžΆαŸ†αž„αž’αžŸαŸ‹αž‘αžΎαž„αžœαž·αž‰αž˜αŸ’αžαž„αž˜αž½αž™αŸ—αŸ”

7. αž”αŸ’αžšαžŸαž·αž“αž”αžΎαž’αŸ’αž“αž€αž…αžΆαž€αž…αŸαž‰αž–αžΈαžαŸ’αž“αžΆαŸ†αž„αž™αŸ‰αžΆαž„αž αŸ„αž…αžŽαžΆαžŸαŸ‹αž˜αž½αž™αŸ” podCIDR αž…αžΆαžŸαŸ‹αž”αž“αŸ’αž‘αžΆαž”αŸ‹αž˜αž€ kube-controller-manager αž“αžΉαž„αž˜αž·αž“αž’αžΆαž…αž…αžΆαž”αŸ‹αž•αŸ’αžαžΎαž˜αž”αžΆαž“αž‘αŸ αž αžΎαž™ pods αž“αŸ…αž€αŸ’αž“αž»αž„ cluster αž“αžΉαž„αž˜αž·αž“αžαŸ’αžšαžΌαžœαž”αžΆαž“αž€αŸ†αžŽαžαŸ‹αž–αŸαž›αž‘αŸαŸ”

αžαžΆαž˜αž–αž·αžαž€αžΆαžšαž•αŸ’αž›αžΆαžŸαŸ‹αž”αŸ’αžαžΌαžš podCIDR αž’αžΆαž…αž’αŸ’αžœαžΎαž”αžΆαž“αž€αžΆαž“αŸ‹αžαŸ‚αžŸαžΆαž˜αž‰αŸ’αž‰ (αž§αž‘αžΆαž αžšαžŽαŸ αžŠαžΌαž…αŸ’αž“αŸαŸ‡) αž”αŸ‰αž»αž“αŸ’αžαŸ‚αž™αžΎαž„αž…αž„αŸ‹αžšαŸ€αž“αž–αžΈαžšαž”αŸ€αž”αž’αŸ’αžœαžΎαž€αžΆαžšαž‡αžΆαž˜αž½αž™ etcd αžŠαŸ„αž™αž•αŸ’αž‘αžΆαž›αŸ‹ αž–αžΈαž–αŸ’αžšαŸ„αŸ‡αž˜αžΆαž“αž€αžšαžŽαžΈαž‡αžΆαž…αŸ’αžšαžΎαž“αž“αŸ…αž–αŸαž›αž€αŸ‚αžŸαž˜αŸ’αžšαž½αž›αžœαžαŸ’αžαž» Kubernetes αž“αŸ…αž€αŸ’αž“αž»αž„ etcd - αžαŸ‚αž˜αž½αž™αž‚αžαŸ‹ αžœαŸ‰αžΆαžšαŸ’αž™αŸ‰αž„αŸ‹αžŠαŸ‚αž›αž’αžΆαž…αž’αŸ’αžœαžΎαž”αžΆαž“αŸ” (αž§αž‘αžΆαž αžšαžŽαŸ αž’αŸ’αž“αž€β€‹αž˜αž·αž“β€‹αž’αžΆαž…β€‹αž‚αŸ’αžšαžΆαž“αŸ‹β€‹αžαŸ‚β€‹αž•αŸ’αž›αžΆαžŸαŸ‹β€‹αž”αŸ’αžαžΌβ€‹αžšβ€‹αžœαžΆαž›β€‹αžŸαŸαžœαžΆβ€‹αžŠαŸ„αž™β€‹αž‚αŸ’αž˜αžΆαž“β€‹αž–αŸαž›β€‹αžœαŸαž›αžΆβ€‹ spec.clusterIP.)

αž›αž‘αŸ’αž’αž•αž›

αž’αžαŸ’αžαž”αž‘αž–αž·αž—αžΆαž€αŸ’αžŸαžΆαž’αŸ†αž–αžΈαž›αž‘αŸ’αž’αž—αžΆαž–αž“αŸƒαž€αžΆαžšαž’αŸ’αžœαžΎαž€αžΆαžšαž‡αžΆαž˜αž½αž™αž‘αž·αž“αŸ’αž“αž“αŸαž™αž“αŸ…αž€αŸ’αž“αž»αž„ etcd αžŠαŸ„αž™αž•αŸ’αž‘αžΆαž›αŸ‹ i.e. αž†αŸ’αž›αž„αž€αžΆαžαŸ‹ Kubernetes API αŸ” αž‡αž½αž“αž€αžΆαž›αžœαž·αž’αžΈαžŸαžΆαžŸαŸ’αžšαŸ’αžαž“αŸαŸ‡αž’αž“αž»αž‰αŸ’αž‰αžΆαžαž±αŸ’αž™αž’αŸ’αž“αž€αž’αŸ’αžœαžΎ "αžšαžΏαž„αž–αž·αž”αžΆαž€" αŸ” αž™αžΎαž„αž”αžΆαž“αžŸαžΆαž€αž›αŸ’αž”αž„αž”αŸ’αžšαžαž·αž”αžαŸ’αžαž·αž€αžΆαžšαžŠαŸ‚αž›αž”αžΆαž“αž•αŸ’αžαž›αŸ‹αž±αŸ’αž™αž“αŸ…αž€αŸ’αž“αž»αž„αž’αžαŸ’αžαž”αž‘αž“αŸ…αž›αžΎαž…αž„αŸ’αž€αŸ„αž˜ K8s αž–αž·αžαž”αŸ’αžšαžΆαž€αžŠαŸ” αž‘αŸ„αŸ‡αž‡αžΆαž™αŸ‰αžΆαž„αžŽαžΆαž€αŸαžŠαŸ„αž™αžŸαŸ’αžαžΆαž“αž—αžΆαž–αž“αŸƒαž€αžΆαžšαžαŸ’αžšαŸ€αž˜αžαŸ’αž›αž½αž“αžšαž”αžŸαŸ‹αž–αž½αž€αž‚αŸαžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž€αžΆαžšαž”αŸ’αžšαžΎαž”αŸ’αžšαžΆαžŸαŸ‹αž™αŸ‰αžΆαž„αž‘αžΌαž›αŸ†αž‘αžΌαž›αžΆαž™αž‚αžΊ PoC (αž—αžŸαŸ’αžαž»αžαžΆαž„αž“αŸƒαž‚αŸ†αž“αž·αž). αžŠαžΌαž…αŸ’αž“αŸαŸ‡ αž”αŸ’αžšαžŸαž·αž“αž”αžΎαž’αŸ’αž“αž€αž…αž„αŸ‹αž”αŸ’αžšαžΎαž€αŸ†αžŽαŸ‚αžŠαŸ‚αž›αž”αžΆαž“αž€αŸ‚αž”αŸ’αžšαŸ‚αž“αŸƒαž§αž”αž€αžšαžŽαŸαž”αŸ’αžšαžΎαž”αŸ’αžšαžΆαžŸαŸ‹ etcdhelper αž“αŸ…αž›αžΎαž…αž„αŸ’αž€αŸ„αž˜αžšαž”αžŸαŸ‹αž’αŸ’αž“αž€ αž’αŸ’αžœαžΎαžŠαžΌαž…αŸ’αž“αŸαŸ‡αžŠαŸ„αž™αž αžΆαž“αž·αž—αŸαž™αž•αŸ’αž‘αžΆαž›αŸ‹αžαŸ’αž›αž½αž“αžšαž”αžŸαŸ‹αž’αŸ’αž“αž€αŸ”

PS

αžŸαžΌαž˜αž’αžΆαž“αž•αž„αžŠαŸ‚αžšαž“αŸ…αž›αžΎαž”αŸ’αž›αž€αŸ‹αžšαž”αžŸαŸ‹αž™αžΎαž„αŸ–

αž”αŸ’αžšαž—αž–: www.habr.com

αž”αž“αŸ’αžαŸ‚αž˜αž˜αžαž·αž™αŸ„αž”αž›αŸ‹