αž€αžΆαžšαžšαž½αž˜αž”αž‰αŸ’αž…αžΌαž›αž‚αŸ’αž“αžΆαž“αŸƒαž•αŸ’αž‘αžΆαŸ†αž„αž‚αŸ’αžšαž”αŸ‹αž‚αŸ’αžšαž„ Kubernetes αž“αž·αž„αž’αŸ’αž“αž€αž”αŸ’αžšαžΎαž”αŸ’αžšαžΆαžŸαŸ‹ GitLab

αž€αžΆαžšαžšαž½αž˜αž”αž‰αŸ’αž…αžΌαž›αž‚αŸ’αž“αžΆαž“αŸƒαž•αŸ’αž‘αžΆαŸ†αž„αž‚αŸ’αžšαž”αŸ‹αž‚αŸ’αžšαž„ Kubernetes αž“αž·αž„αž’αŸ’αž“αž€αž”αŸ’αžšαžΎαž”αŸ’αžšαžΆαžŸαŸ‹ GitLab

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

αž αŸαžαž»αž’αŸ’αžœαžΈαž”αžΆαž“αž‡αžΆαž“αŸαŸ‡?

αž’αŸ’αž“αž€αž’αž—αž·αžœαžŒαŸ’αžαž“αŸαžŠαŸ„αž™αž•αŸ’αž‘αžΆαž›αŸ‹αž”αŸ’αžšαž αŸ‚αž›αž‡αžΆαž…αžΆαž”αŸ‹αž’αžΆαžšαž˜αŸ’αž˜αžŽαŸαž›αžΎαž§αž”αž€αžšαžŽαŸαžŠαžΌαž…αž‡αžΆ K8s Dashboard αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž”αŸ†αž”αžΆαžαŸ‹αž€αŸ†αž αž»αžŸαŸ” αž–αŸαž›αžαŸ’αž›αŸ‡αž’αŸ’αž“αž€αž…αž„αŸ‹αž˜αžΎαž›αž€αŸ†αžŽαžαŸ‹αž αŸαžαž» αž“αž·αž„αž’αž“αž’αžΆαž“ αž αžΎαž™αž‡αž½αž“αž€αžΆαž›αžŸαž˜αŸ’αž›αžΆαž”αŸ‹αž•αž αž’αŸ’αžœαžΎαž˜αžΆαžαŸ’αžšαžŠαŸ’αž‹αžΆαž“ αž€αžΆαžšαžŠαžΆαž€αŸ‹αž–αž„αŸ’αžšαžΆαž™/αž€αžΆαžšαž€αŸ†αžŽαžαŸ‹αžŸαŸ’αžαžΆαž“αž—αžΆαž– αž“αž·αž„αžŸαžΌαž˜αŸ’αž”αžΈαžαŸ‚αž…αžΌαž›αž‘αŸ…αž€αžΆαž“αŸ‹αž€αž»αž„αžŸαžΌαž›αž€αž»αž„αžαžΊαž“αŸαžš (αž€αŸαž˜αžΆαž“αžŸαŸ†αžŽαžΎαž•αž„αžŠαŸ‚αžš αžŠαŸ‚αž›αž‘αŸ„αŸ‡αž‡αžΆαž™αŸ‰αžΆαž„αžŽαžΆ αž˜αžΆαž“αžœαž·αž’αžΈαž˜αž½αž™αž•αŸ’αžŸαŸαž„αž‘αŸ€αž - αž§αž‘αžΆαž αžšαžŽαŸ αžαžΆαž˜αžšαž™αŸˆ kubectl-αž”αŸ†αž”αžΆαžαŸ‹αž€αŸ†αž αž»αžŸ).

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

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

αžαŸ’αž‰αž»αŸ†αž€αŸαž“αžΉαž„αž€αžαŸ‹αžŸαž˜αŸ’αž‚αžΆαž›αŸ‹αž•αž„αžŠαŸ‚αžšαžαžΆαž™αžΎαž„αž”αŸ’αžšαžΎ NGINX Ingress αŸ” αž”αŸ’αžšαžŸαž·αž“αž”αžΎαž’αŸ’αž“αž€αž’αŸ’αžœαžΎαž€αžΆαžšαž‡αžΆαž˜αž½αž™αž’αŸ’αž“αž€αžŠαž‘αŸƒ αžŠαŸ†αžŽαŸ„αŸ‡αžŸαŸ’αžšαžΆαž™ ingressαž’αŸ’αž“αž€αž“αžΉαž„αžαŸ’αžšαžΌαžœαžŸαŸ’αžœαŸ‚αž„αžšαž€αžŠαŸ„αž™αž―αž€αžšαžΆαž‡αŸ’αž™αž“αžΌαžœ analogues αž“αŸƒαž…αŸ†αžŽαžΆαžšαž–αž“αŸ’αž™αž›αŸ‹αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž€αžΆαžšαž’αž“αž»αž‰αŸ’αž‰αžΆαžαŸ”

αž€αŸ†αž–αž»αž„αž–αŸ’αž™αžΆαž™αžΆαž˜αžšαž½αž˜αž”αž‰αŸ’αž…αžΌαž›

αž€αžΆαžšαžŠαŸ†αž‘αžΎαž„αž•αŸ’αž‘αžΆαŸ†αž„αž‚αŸ’αžšαž”αŸ‹αž‚αŸ’αžšαž„

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

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

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

$ ./ctl.sh  
Usage: ctl.sh [OPTION]... --gitlab-url GITLAB_URL --oauth2-id ID --oauth2-secret SECRET --dashboard-url DASHBOARD_URL
Install kubernetes-dashboard to Kubernetes cluster.
Mandatory arguments:
 -i, --install                install into 'kube-system' namespace
 -u, --upgrade                upgrade existing installation, will reuse password and host names
 -d, --delete                 remove everything, including the namespace
     --gitlab-url             set gitlab url with schema (https://gitlab.example.com)
     --oauth2-id              set OAUTH2_PROXY_CLIENT_ID from gitlab
     --oauth2-secret          set OAUTH2_PROXY_CLIENT_SECRET from gitlab
     --dashboard-url          set dashboard url without schema (dashboard.example.com)
Optional arguments:
 -h, --help                   output this message

αž‘αŸ„αŸ‡αž™αŸ‰αžΆαž„αžŽαžΆαž€αŸαžŠαŸ„αž™ αž˜αž»αž“αž“αžΉαž„αž”αŸ’αžšαžΎαžœαžΆ αž’αŸ’αž“αž€αžαŸ’αžšαžΌαžœαž…αžΌαž›αž‘αŸ…αž€αžΆαž“αŸ‹ GitLab: Admin area β†’ Applications - αž αžΎαž™αž”αž“αŸ’αžαŸ‚αž˜αž€αž˜αŸ’αž˜αžœαž·αž’αžΈαžαŸ’αž˜αžΈαžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž”αž“αŸ’αž‘αŸ‡αž“αžΆαž–αŸαž›αž’αž“αžΆαž‚αžαŸ” αž…αžΌαžšαž αŸ…αžœαžΆαžαžΆ "αž•αŸ’αž‘αžΆαŸ†αž„αž‚αŸ’αžšαž”αŸ‹αž‚αŸ’αžšαž„ Kubernetes"αŸ–

αž€αžΆαžšαžšαž½αž˜αž”αž‰αŸ’αž…αžΌαž›αž‚αŸ’αž“αžΆαž“αŸƒαž•αŸ’αž‘αžΆαŸ†αž„αž‚αŸ’αžšαž”αŸ‹αž‚αŸ’αžšαž„ Kubernetes αž“αž·αž„αž’αŸ’αž“αž€αž”αŸ’αžšαžΎαž”αŸ’αžšαžΆαžŸαŸ‹ GitLab

αž‡αžΆαž›αž‘αŸ’αž’αž•αž›αž“αŸƒαž€αžΆαžšαž”αž“αŸ’αžαŸ‚αž˜αžœαžΆ GitLab αž“αžΉαž„αž•αŸ’αžαž›αŸ‹αž“αžΌαžœαžŸαž‰αŸ’αž‰αžΆαžŸαž˜αŸ’αž‚αžΆαž›αŸ‹αŸ–

αž€αžΆαžšαžšαž½αž˜αž”αž‰αŸ’αž…αžΌαž›αž‚αŸ’αž“αžΆαž“αŸƒαž•αŸ’αž‘αžΆαŸ†αž„αž‚αŸ’αžšαž”αŸ‹αž‚αŸ’αžšαž„ Kubernetes αž“αž·αž„αž’αŸ’αž“αž€αž”αŸ’αžšαžΎαž”αŸ’αžšαžΆαžŸαŸ‹ GitLab

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

$ ./ctl.sh -i --gitlab-url https://gitlab.example.com --oauth2-id 6a52769e… --oauth2-secret 6b79168f… --dashboard-url dashboard.example.com

αž”αž“αŸ’αž‘αžΆαž”αŸ‹αž–αžΈαž“αŸ„αŸ‡αžŸαžΌαž˜αž–αž·αž“αž·αžαŸ’αž™αž˜αžΎαž›αžαžΆαž’αŸ’αžœαžΈαž‚αŸ’αžšαž”αŸ‹αž™αŸ‰αžΆαž„αž”αžΆαž“αž…αžΆαž”αŸ‹αž•αŸ’αžαžΎαž˜:

$ kubectl -n kube-system get pod | egrep '(dash|oauth)'
kubernetes-dashboard-76b55bc9f8-xpncp   1/1       Running   0          14s
oauth2-proxy-5586ccf95c-czp2v           1/1       Running   0          14s

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

αž”αž‰αŸ’αž αžΆβ€‹αžαŸ’αžšαžΌαžœβ€‹αž”αžΆαž“β€‹αžŠαŸ„αŸ‡αžŸαŸ’αžšαžΆαž™β€‹αžŠαŸ„αž™β€‹αž€αžΆαžšβ€‹αž”αž„αŸ’αž€αžΎαžβ€‹αžšαžΌαž”αž—αžΆαž– oauth αž•αŸ’αž‘αžΆαž›αŸ‹β€‹αžαŸ’αž›αž½αž“β€‹αžšαž”αžŸαŸ‹β€‹αž’αŸ’αž“αž€β€‹αž‡αžΆαž˜αž½αž™β€‹αž“αžΉαž„β€‹αž”αŸ†αžŽαŸ‡αŸ”

Patch Oauth αž“αž·αž„αžŠαŸ†αž‘αžΎαž„αž‘αžΎαž„αžœαž·αž‰

αžŠαžΎαž˜αŸ’αž”αžΈαž’αŸ’αžœαžΎαžŠαžΌαž…αž“αŸαŸ‡αž™αžΎαž„αž“αžΉαž„αž”αŸ’αžšαžΎ Dockerfile αžαžΆαž„αž€αŸ’αžšαŸ„αž˜αŸ–

FROM golang:1.9-alpine3.7
WORKDIR /go/src/github.com/bitly/oauth2_proxy

RUN apk --update add make git build-base curl bash ca-certificates wget 
&& update-ca-certificates 
&& curl -sSO https://raw.githubusercontent.com/pote/gpm/v1.4.0/bin/gpm 
&& chmod +x gpm 
&& mv gpm /usr/local/bin
RUN git clone https://github.com/bitly/oauth2_proxy.git . 
&& git checkout bfda078caa55958cc37dcba39e57fc37f6a3c842  
ADD rd.patch .
RUN patch -p1 < rd.patch 
&& ./dist.sh

FROM alpine:3.7
RUN apk --update add curl bash  ca-certificates && update-ca-certificates
COPY --from=0 /go/src/github.com/bitly/oauth2_proxy/dist/ /bin/

EXPOSE 8080 4180
ENTRYPOINT [ "/bin/oauth2_proxy" ]
CMD [ "--upstream=http://0.0.0.0:8080/", "--http-address=0.0.0.0:4180" ]

αž αžΎαž™αž“αŸαŸ‡αž‚αžΊαž‡αžΆαž’αŸ’αžœαžΈαžŠαŸ‚αž›αž”αŸ†αžŽαŸ‡ rd.patch αžαŸ’αž›αž½αž“αžœαžΆαž˜αžΎαž›αž‘αŸ…αžŠαžΌαž…

diff --git a/dist.sh b/dist.sh
index a00318b..92990d4 100755
--- a/dist.sh
+++ b/dist.sh
@@ -14,25 +14,13 @@ goversion=$(go version | awk '{print $3}')
sha256sum=()
 
echo "... running tests"
-./test.sh
+#./test.sh
 
-for os in windows linux darwin; do
-    echo "... building v$version for $os/$arch"
-    EXT=
-    if [ $os = windows ]; then
-        EXT=".exe"
-    fi
-    BUILD=$(mktemp -d ${TMPDIR:-/tmp}/oauth2_proxy.XXXXXX)
-    TARGET="oauth2_proxy-$version.$os-$arch.$goversion"
-    FILENAME="oauth2_proxy-$version.$os-$arch$EXT"
-    GOOS=$os GOARCH=$arch CGO_ENABLED=0 
-        go build -ldflags="-s -w" -o $BUILD/$TARGET/$FILENAME || exit 1
-    pushd $BUILD/$TARGET
-    sha256sum+=("$(shasum -a 256 $FILENAME || exit 1)")
-    cd .. && tar czvf $TARGET.tar.gz $TARGET
-    mv $TARGET.tar.gz $DIR/dist
-    popd
-done
+os='linux'
+echo "... building v$version for $os/$arch"
+TARGET="oauth2_proxy-$version.$os-$arch.$goversion"
+GOOS=$os GOARCH=$arch CGO_ENABLED=0 
+    go build -ldflags="-s -w" -o ./dist/oauth2_proxy || exit 1
  
checksum_file="sha256sum.txt"
cd $DIR/dists
diff --git a/oauthproxy.go b/oauthproxy.go
index 21e5dfc..df9101a 100644
--- a/oauthproxy.go
+++ b/oauthproxy.go
@@ -381,7 +381,9 @@ func (p *OAuthProxy) SignInPage(rw http.ResponseWriter, req *http.Request, code
       if redirect_url == p.SignInPath {
               redirect_url = "/"
       }
-
+       if req.FormValue("rd") != "" {
+               redirect_url = req.FormValue("rd")
+       }
       t := struct {
               ProviderName  string
               SignInMessage string

αž₯αž‘αžΌαžœαž“αŸαŸ‡αž’αŸ’αž“αž€αž’αžΆαž…αž”αž„αŸ’αž€αžΎαžαžšαžΌαž”αž—αžΆαž–αž αžΎαž™αžšαž»αž‰αžœαžΆαž…αžΌαž›αž‘αŸ…αž€αŸ’αž“αž»αž„ GitLab αžšαž”αžŸαŸ‹αž™αžΎαž„αŸ” αž”αž“αŸ’αž‘αžΆαž”αŸ‹αž“αŸ…αž€αŸ’αž“αž»αž„ manifests/kube-dashboard-oauth2-proxy.yaml αž…αž„αŸ’αž’αž»αž›αž”αž„αŸ’αž αžΆαž‰αž€αžΆαžšαž”αŸ’αžšαžΎαž”αŸ’αžšαžΆαžŸαŸ‹αžšαžΌαž”αž—αžΆαž–αžŠαŸ‚αž›αž’αŸ’αž“αž€αž…αž„αŸ‹αž”αžΆαž“ (αž‡αŸ†αž“αž½αžŸαžœαžΆαžŠαŸ„αž™αžαŸ’αž›αž½αž“αž’αŸ’αž“αž€)αŸ–

 image: docker.io/colemickens/oauth2_proxy:latest

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

      imagePullSecrets:
     - name: gitlab-registry

... αž αžΎαž™αž”αž“αŸ’αžαŸ‚αž˜αž’αžΆαžαŸŒαž€αŸ†αž”αžΆαŸ†αž„αžŠαŸ„αž™αžαŸ’αž›αž½αž“αž―αž„αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž€αžΆαžšαž…αž»αŸ‡αž”αž‰αŸ’αž‡αžΈαŸ–

---
apiVersion: v1
data:
 .dockercfg: eyJyZWdpc3RyeS5jb21wYW55LmNvbSI6IHsKICJ1c2VybmFtZSI6ICJvYXV0aDIiLAogInBhc3N3b3JkIjogIlBBU1NXT1JEIiwKICJhdXRoIjogIkFVVEhfVE9LRU4iLAogImVtYWlsIjogIm1haWxAY29tcGFueS5jb20iCn0KfQoK
=
kind: Secret
metadata:
 annotations:
 name: gitlab-registry
 namespace: kube-system
type: kubernetes.io/dockercfg

αž’αŸ’αž“αž€αž’αžΆαž“αžŠαŸ‚αž›αž™αž€αž…αž·αžαŸ’αžαž‘αž»αž€αžŠαžΆαž€αŸ‹αž“αžΉαž„αžƒαžΎαž‰αžαžΆαžαŸ’αžŸαŸ‚αžœαŸ‚αž„αžαžΆαž„αž›αžΎαž‚αžΊ base64 αž–αžΈαž€αžΆαžšαž€αŸ†αžŽαžαŸ‹αŸ–

{"registry.company.com": {
 "username": "oauth2",
 "password": "PASSWORD",
 "auth": "AUTH_TOKEN",
 "email": "[email protected]"
}
}

αž“αŸαŸ‡αž‚αžΊαž‡αžΆαž‘αž·αž“αŸ’αž“αž“αŸαž™αž’αŸ’αž“αž€αž”αŸ’αžšαžΎαž”αŸ’αžšαžΆαžŸαŸ‹αž“αŸ…αž€αŸ’αž“αž»αž„ GitLab αž›αŸαžαž€αžΌαžŠ Kubernetes αž“αžΉαž„αž‘αžΆαž‰αžšαžΌαž”αž—αžΆαž–αž…αŸαž‰αž–αžΈαž”αž‰αŸ’αž‡αžΈαžˆαŸ’αž˜αŸ„αŸ‡αŸ”

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

$ ./ctl.sh -d

... αž αžΎαž™αžŠαŸ†αž‘αžΎαž„αž’αŸ’αžœαžΈαŸ—αž‚αŸ’αžšαž”αŸ‹αž™αŸ‰αžΆαž„αž˜αŸ’αžαž„αž‘αŸ€αžαŸ–

$ ./ctl.sh -i --gitlab-url https://gitlab.example.com --oauth2-id 6a52769e… --oauth2-secret 6b79168f… --dashboard-url dashboard.example.com

αžœαžΆαžŠαž›αŸ‹αž–αŸαž›αžŠαŸ‚αž›αžαŸ’αžšαžΌαžœαž…αžΌαž›αž‘αŸ…αž€αžΆαž“αŸ‹αž•αŸ’αž‘αžΆαŸ†αž„αž‚αŸ’αžšαž”αŸ‹αž‚αŸ’αžšαž„ αž αžΎαž™αžŸαŸ’αžœαŸ‚αž„αžšαž€αž”αŸŠαžΌαžαž»αž„αž…αžΌαž›αžŠαŸ‚αž›αž˜αžΆαž“αž›αž€αŸ’αžαžŽαŸˆαž”αž»αžšαžΆαžŽαŸ–

αž€αžΆαžšαžšαž½αž˜αž”αž‰αŸ’αž…αžΌαž›αž‚αŸ’αž“αžΆαž“αŸƒαž•αŸ’αž‘αžΆαŸ†αž„αž‚αŸ’αžšαž”αŸ‹αž‚αŸ’αžšαž„ Kubernetes αž“αž·αž„αž’αŸ’αž“αž€αž”αŸ’αžšαžΎαž”αŸ’αžšαžΆαžŸαŸ‹ GitLab

αž”αž“αŸ’αž‘αžΆαž”αŸ‹αž–αžΈαž…αž»αž…αž›αžΎαžœαžΆ GitLab αž“αžΉαž„αžŸαŸ’αžœαžΆαž‚αž˜αž“αŸαž™αžΎαž„αžŠαŸ„αž™αž•αŸ’αžαž›αŸ‹αž±αŸ’αž™αž™αžΎαž„αž…αžΌαž›αž‘αŸ…αž€αŸ’αž“αž»αž„αž‘αŸ†αž–αŸαžšαž’αž˜αŸ’αž˜αžαžΆαžšαž”αžŸαŸ‹αžœαžΆ (αž‡αžΆαž€αžΆαžšαž–αž·αžαžŽαžΆαžŸαŸ‹αž”αŸ’αžšαžŸαž·αž“αž”αžΎαž™αžΎαž„αž˜αž·αž“αž”αžΆαž“αž…αžΌαž›αž–αžΈαž˜αž»αž“αž‘αŸ):

αž€αžΆαžšαžšαž½αž˜αž”αž‰αŸ’αž…αžΌαž›αž‚αŸ’αž“αžΆαž“αŸƒαž•αŸ’αž‘αžΆαŸ†αž„αž‚αŸ’αžšαž”αŸ‹αž‚αŸ’αžšαž„ Kubernetes αž“αž·αž„αž’αŸ’αž“αž€αž”αŸ’αžšαžΎαž”αŸ’αžšαžΆαžŸαŸ‹ GitLab

αž™αžΎαž„αž…αžΌαž›αžŠαŸ„αž™αž”αŸ’αžšαžΎαž–αŸαžαŸŒαž˜αžΆαž“αžŸαž˜αŸ’αž„αžΆαžαŸ‹ GitLab αž αžΎαž™αž’αŸ’αžœαžΈαŸ—αž‚αŸ’αžšαž”αŸ‹αž™αŸ‰αžΆαž„αžšαž½αž…αžšαžΆαž›αŸ‹αŸ–

αž€αžΆαžšαžšαž½αž˜αž”αž‰αŸ’αž…αžΌαž›αž‚αŸ’αž“αžΆαž“αŸƒαž•αŸ’αž‘αžΆαŸ†αž„αž‚αŸ’αžšαž”αŸ‹αž‚αŸ’αžšαž„ Kubernetes αž“αž·αž„αž’αŸ’αž“αž€αž”αŸ’αžšαžΎαž”αŸ’αžšαžΆαžŸαŸ‹ GitLab

αž’αŸ†αž–αžΈαž˜αž»αžαž„αžΆαžšαžšαž”αžŸαŸ‹αž•αŸ’αž‘αžΆαŸ†αž„αž‚αŸ’αžšαž”αŸ‹αž‚αŸ’αžšαž„

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

αžŠαŸ†αž”αžΌαž„αž’αŸ’αž“αž€αž’αžΆαž…αžƒαžΎαž‰αžαžΆ "αž’αŸ’αžœαžΈαž‚αŸ’αžšαž”αŸ‹αž™αŸ‰αžΆαž„αž‚αžΊαž–αžŽαŸŒαž”αŸƒαžαž„":

αž€αžΆαžšαžšαž½αž˜αž”αž‰αŸ’αž…αžΌαž›αž‚αŸ’αž“αžΆαž“αŸƒαž•αŸ’αž‘αžΆαŸ†αž„αž‚αŸ’αžšαž”αŸ‹αž‚αŸ’αžšαž„ Kubernetes αž“αž·αž„αž’αŸ’αž“αž€αž”αŸ’αžšαžΎαž”αŸ’αžšαžΆαžŸαŸ‹ GitLab

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

αž€αžΆαžšαžšαž½αž˜αž”αž‰αŸ’αž…αžΌαž›αž‚αŸ’αž“αžΆαž“αŸƒαž•αŸ’αž‘αžΆαŸ†αž„αž‚αŸ’αžšαž”αŸ‹αž‚αŸ’αžšαž„ Kubernetes αž“αž·αž„αž’αŸ’αž“αž€αž”αŸ’αžšαžΎαž”αŸ’αžšαžΆαžŸαŸ‹ GitLab

αž€αžΆαžšαžŠαžΆαž€αŸ‹αž–αž„αŸ’αžšαžΆαž™αž˜αžΆαž“αžŸαŸ’αžαžΆαž“αž—αžΆαž–αžŠαŸ‚αž›αž’αžΆαž…αž˜αžΎαž›αžƒαžΎαž‰αŸ–

αž€αžΆαžšαžšαž½αž˜αž”αž‰αŸ’αž…αžΌαž›αž‚αŸ’αž“αžΆαž“αŸƒαž•αŸ’αž‘αžΆαŸ†αž„αž‚αŸ’αžšαž”αŸ‹αž‚αŸ’αžšαž„ Kubernetes αž“αž·αž„αž’αŸ’αž“αž€αž”αŸ’αžšαžΎαž”αŸ’αžšαžΆαžŸαŸ‹ GitLab

... αž“αž·αž„αž–αŸαžαŸŒαž˜αžΆαž“αž›αž˜αŸ’αž’αž·αžαž•αŸ’αžŸαŸαž„αž‘αŸ€αžαŸ–

αž€αžΆαžšαžšαž½αž˜αž”αž‰αŸ’αž…αžΌαž›αž‚αŸ’αž“αžΆαž“αŸƒαž•αŸ’αž‘αžΆαŸ†αž„αž‚αŸ’αžšαž”αŸ‹αž‚αŸ’αžšαž„ Kubernetes αž“αž·αž„αž’αŸ’αž“αž€αž”αŸ’αžšαžΎαž”αŸ’αžšαžΆαžŸαŸ‹ GitLab

... αž αžΎαž™β€‹αž€αŸβ€‹αž˜αžΆαž“β€‹αžŸαž˜αžαŸ’αžαž—αžΆαž–β€‹αž€αŸ’αž“αž»αž„β€‹αž€αžΆαžšβ€‹αž’αŸ’αžœαžΎβ€‹αž˜αžΆαžαŸ’αžšαžŠαŸ’αž‹αžΆαž“β€‹αž€αžΆαžšβ€‹αžŠαžΆαž€αŸ‹β€‹αž–αž„αŸ’αžšαžΆαž™αŸ–

αž€αžΆαžšαžšαž½αž˜αž”αž‰αŸ’αž…αžΌαž›αž‚αŸ’αž“αžΆαž“αŸƒαž•αŸ’αž‘αžΆαŸ†αž„αž‚αŸ’αžšαž”αŸ‹αž‚αŸ’αžšαž„ Kubernetes αž“αž·αž„αž’αŸ’αž“αž€αž”αŸ’αžšαžΎαž”αŸ’αžšαžΆαžŸαŸ‹ GitLab

αž›αž‘αŸ’αž’αž•αž›αž“αŸƒαž”αŸ’αžšαžαž·αž”αžαŸ’αžαž·αž€αžΆαžšαž“αŸαŸ‡αŸ–

αž€αžΆαžšαžšαž½αž˜αž”αž‰αŸ’αž…αžΌαž›αž‚αŸ’αž“αžΆαž“αŸƒαž•αŸ’αž‘αžΆαŸ†αž„αž‚αŸ’αžšαž”αŸ‹αž‚αŸ’αžšαž„ Kubernetes αž“αž·αž„αž’αŸ’αž“αž€αž”αŸ’αžšαžΎαž”αŸ’αžšαžΆαžŸαŸ‹ GitLab

αž€αŸ’αž“αž»αž„αž…αŸ†αžŽαŸ„αž˜αž˜αž»αžαž„αžΆαžšαž˜αžΆαž“αž”αŸ’αžšαž™αŸ„αž‡αž“αŸαž•αŸ’αžŸαŸαž„αž‘αŸ€αžαžŠαŸ‚αž›αž”αžΆαž“αžšαŸ€αž”αžšαžΆαž”αŸ‹αžšαž½αž…αž αžΎαž™αž“αŸ…αžŠαžΎαž˜αž’αžαŸ’αžαž”αž‘αž‚αžΊαž€αžΆαžšαž˜αžΎαž›αž€αŸ†αžŽαžαŸ‹αž αŸαžαž»αŸ–

αž€αžΆαžšαžšαž½αž˜αž”αž‰αŸ’αž…αžΌαž›αž‚αŸ’αž“αžΆαž“αŸƒαž•αŸ’αž‘αžΆαŸ†αž„αž‚αŸ’αžšαž”αŸ‹αž‚αŸ’αžšαž„ Kubernetes αž“αž·αž„αž’αŸ’αž“αž€αž”αŸ’αžšαžΎαž”αŸ’αžšαžΆαžŸαŸ‹ GitLab

... αž“αž·αž„αž˜αž»αžαž„αžΆαžšαžŠαžΎαž˜αŸ’αž”αžΈαž…αžΌαž›αž‘αŸ…αž€αŸ’αž“αž»αž„αž€αž»αž„αžŸαžΌαž›αž€αž»αž„αžαžΊαž“αŸαžšαž“αŸƒαž•αžαžŠαŸ‚αž›αž”αžΆαž“αž‡αŸ’αžšαžΎαžŸαžšαžΎαžŸαŸ–

αž€αžΆαžšαžšαž½αž˜αž”αž‰αŸ’αž…αžΌαž›αž‚αŸ’αž“αžΆαž“αŸƒαž•αŸ’αž‘αžΆαŸ†αž„αž‚αŸ’αžšαž”αŸ‹αž‚αŸ’αžšαž„ Kubernetes αž“αž·αž„αž’αŸ’αž“αž€αž”αŸ’αžšαžΎαž”αŸ’αžšαžΆαžŸαŸ‹ GitLab

αž§αž‘αžΆαž αžšαžŽαŸ αž’αŸ’αž“αž€αž€αŸαž’αžΆαž…αž˜αžΎαž›αžŠαŸ‚αž“αž€αŸ†αžŽαžαŸ‹/αžŸαŸ†αžŽαžΎαž“αŸ…αž›αžΎαžαŸ’αž“αžΆαŸ†αž„αŸ–

αž€αžΆαžšαžšαž½αž˜αž”αž‰αŸ’αž…αžΌαž›αž‚αŸ’αž“αžΆαž“αŸƒαž•αŸ’αž‘αžΆαŸ†αž„αž‚αŸ’αžšαž”αŸ‹αž‚αŸ’αžšαž„ Kubernetes αž“αž·αž„αž’αŸ’αž“αž€αž”αŸ’αžšαžΎαž”αŸ’αžšαžΆαžŸαŸ‹ GitLab

αž‡αžΆαž€αžΆαžšαž–αž·αžαžŽαžΆαžŸαŸ‹ αž‘αžΆαŸ†αž„αž“αŸαŸ‡αž˜αž·αž“αž˜αŸ‚αž“αž‡αžΆαžŸαž˜αžαŸ’αžαž—αžΆαž–αž‘αžΆαŸ†αž„αž’αžŸαŸ‹αžšαž”αžŸαŸ‹αž”αž“αŸ’αž‘αŸ‡αž“αŸ„αŸ‡αž‘αŸ αž”αŸ‰αž»αž“αŸ’αžαŸ‚αžαŸ’αž‰αž»αŸ†αžŸαž„αŸ’αžƒαžΉαž˜αžαžΆαž’αŸ’αž“αž€αž‘αž‘αž½αž›αž”αžΆαž“αž‚αŸ†αž“αž·αžαž‘αžΌαž‘αŸ…αŸ”

αž‚αž»αžŽαžœαž·αž”αžαŸ’αžαž·αž“αŸƒαž€αžΆαžšαžšαž½αž˜αž”αž‰αŸ’αž…αžΌαž›αž“αž·αž„αž•αŸ’αž‘αžΆαŸ†αž„αž‚αŸ’αžšαž”αŸ‹αž‚αŸ’αžšαž„

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

αž€αŸ’αž“αž»αž„αž…αŸ†αžŽαŸ„αž˜αž‚αž»αžŽαžœαž·αž”αžαŸ’αžαž·αžŠαŸ‚αž›αž‚αž½αžšαž±αŸ’αž™αž€αžαŸ‹αžŸαž˜αŸ’αž‚αžΆαž›αŸ‹αž“αŸ…αž€αŸ’αž“αž»αž„ Dashboard αžαŸ’αž›αž½αž“αžœαžΆαž•αŸ’αž‘αžΆαž›αŸ‹ αžαŸ’αž‰αž»αŸ†αž€αžαŸ‹αžŸαž˜αŸ’αž‚αžΆαž›αŸ‹αžŠαžΌαž…αžαžΆαž„αž€αŸ’αžšαŸ„αž˜:

  • αžœαžΆαž˜αž·αž“αž’αžΆαž…αž‘αŸ…αžšαž½αž…αž‘αŸαž€αŸ’αž“αž»αž„αž€αžΆαžšαž…αžΌαž›αž‘αŸ…αž€αŸ’αž“αž»αž„αž€αž»αž„αžŸαžΌαž›αž“αŸƒαž’αž»αž„ init;
  • αžœαžΆαž˜αž·αž“αž’αžΆαž…αž‘αŸ…αžšαž½αž…αž‘αŸαž€αŸ’αž“αž»αž„αž€αžΆαžšαž€αŸ‚αžŸαž˜αŸ’αžšαž½αž› Deployments αž“αž·αž„ StatefulSets αž‘αŸ„αŸ‡αž”αžΈαž‡αžΆαžœαžΆαž’αžΆαž…αžαŸ’αžšαžΌαžœαž”αžΆαž“αž‡αž½αžŸαž‡αž»αž›αž“αŸ…αž€αŸ’αž“αž»αž„ ClusterRole αž€αŸαžŠαŸ„αž™αŸ”
  • αž—αžΆαž–αž†αž”αž‚αŸ’αž“αžΆαžšαž”αžŸαŸ‹αž•αŸ’αž‘αžΆαŸ†αž„αž‚αŸ’αžšαž”αŸ‹αž‚αŸ’αžšαž„αž‡αžΆαž˜αž½αž™αž“αžΉαž„αž€αŸ†αžŽαŸ‚αž…αž»αž„αž€αŸ’αžšαŸ„αž™αž”αŸ†αž•αž»αžαžšαž”αžŸαŸ‹ Kubernetes αž“αž·αž„αž’αž“αžΆαž‚αžαž“αŸƒαž‚αž˜αŸ’αžšαŸ„αž„αž”αž„αŸ’αž€αžΎαžαž‡αžΆαžŸαŸ†αžŽαž½αžšαŸ”

αž”αž‰αŸ’αž αžΆαž…αž»αž„αž€αŸ’αžšαŸ„αž™αžŸαž˜αž“αžΉαž„αž‘αž‘αž½αž›αž”αžΆαž“αž€αžΆαžšαž™αž€αž…αž·αžαŸ’αžαž‘αž»αž€αžŠαžΆαž€αŸ‹αž‡αžΆαž–αž·αžŸαŸαžŸαŸ”

αžŸαŸ’αžαžΆαž“αž—αžΆαž–αž•αŸ’αž‘αžΆαŸ†αž„αž‚αŸ’αžšαž”αŸ‹αž‚αŸ’αžšαž„ αž“αž·αž„αž‡αž˜αŸ’αžšαžΎαžŸαž‡αŸ†αž“αž½αžŸ

αžαžΆαžšαžΆαž„αž—αžΆαž–αž†αž”αž‚αŸ’αž“αžΆαž“αŸƒαž•αŸ’αž‘αžΆαŸ†αž„αž‚αŸ’αžšαž”αŸ‹αž‚αŸ’αžšαž„αž‡αžΆαž˜αž½αž™αž“αžΉαž„αž€αžΆαžšαž…αŸαž‰αž•αŸ’αžŸαžΆαž™ Kubernetes αžŠαŸ‚αž›αž”αž„αŸ’αž αžΆαž‰αž“αŸ…αž€αŸ’αž“αž»αž„αž€αŸ†αžŽαŸ‚αž…αž»αž„αž€αŸ’αžšαŸ„αž™αž”αŸ†αž•αž»αžαž“αŸƒαž‚αž˜αŸ’αžšαŸ„αž„ (v1.10.1), αž˜αž·αž“αžŸαž”αŸ’αž”αžΆαž™αž…αž·αžαŸ’αžαžαŸ’αž›αžΆαŸ†αž„αžŽαžΆαžŸαŸ‹:

αž€αžΆαžšαžšαž½αž˜αž”αž‰αŸ’αž…αžΌαž›αž‚αŸ’αž“αžΆαž“αŸƒαž•αŸ’αž‘αžΆαŸ†αž„αž‚αŸ’αžšαž”αŸ‹αž‚αŸ’αžšαž„ Kubernetes αž“αž·αž„αž’αŸ’αž“αž€αž”αŸ’αžšαžΎαž”αŸ’αžšαžΆαžŸαŸ‹ GitLab

αž”αžΎαž‘αŸ„αŸ‡αž”αžΈαž‡αžΆαž“αŸαŸ‡, αž˜αžΆαž“ (αž’αž“αž»αž˜αŸαžαžšαž½αž…αž αžΎαž™αž“αŸ…αž€αŸ’αž“αž»αž„αžαŸ‚αž˜αž€αžšαžΆ) PR # 3476αžŠαŸ‚αž›αž”αŸ’αžšαž€αžΆαžŸαž€αžΆαžšαž‚αžΆαŸ†αž‘αŸ’αžšαžŸαž˜αŸ’αžšαžΆαž”αŸ‹ K8s 1.13 αŸ” αž›αžΎαžŸαž–αžΈαž“αŸαŸ‡αž‘αŸ€αž αž€αŸ’αž“αž»αž„αž…αŸ†αžŽαŸ„αž˜αž”αž‰αŸ’αž αžΆαž‚αž˜αŸ’αžšαŸ„αž„ αž’αŸ’αž“αž€αž’αžΆαž…αžŸαŸ’αžœαŸ‚αž„αžšαž€αž―αž€αžŸαžΆαžšαž™αŸ„αž„αž‘αŸ…αž€αžΆαž“αŸ‹αž’αŸ’αž“αž€αž”αŸ’αžšαžΎαž”αŸ’αžšαžΆαžŸαŸ‹αžŠαŸ‚αž›αž’αŸ’αžœαžΎαž€αžΆαžšαž‡αžΆαž˜αž½αž™αž”αž“αŸ’αž‘αŸ‡αž“αŸ…αž€αŸ’αž“αž»αž„ K8s 1.14 αŸ” αž‘αžΈαž”αŸ†αž•αž»αž αž”αŸ’αžαŸαž‡αŸ’αž‰αžΆ αž…αžΌαž›αž‘αŸ…αž€αŸ’αž“αž»αž„αž˜αžΌαž›αžŠαŸ’αž‹αžΆαž“αž€αžΌαžŠαžšαž”αžŸαŸ‹αž‚αž˜αŸ’αžšαŸ„αž„αž˜αž·αž“αž”αž‰αŸ’αžˆαž”αŸ‹αŸ” αžŠαžΌαž…αŸ’αž“αŸαŸ‡ (αž™αŸ‰αžΆαž„αž αŸ„αž…αžŽαžΆαžŸαŸ‹!) αžŸαŸ’αžαžΆαž“αž—αžΆαž–αž‡αžΆαž€αŸ‹αžŸαŸ’αžαŸ‚αž„αž“αŸƒαž‚αž˜αŸ’αžšαŸ„αž„αž‚αžΊαž˜αž·αž“αž’αžΆαž€αŸ’αžšαž€αŸ‹αžŠαžΌαž…αžŠαŸ‚αž›αžœαžΆαž αžΆαž€αŸ‹αžŠαžΌαž…αž‡αžΆαžŠαŸ†αž”αžΌαž„αž–αžΈαžαžΆαžšαžΆαž„αž—αžΆαž–αžαŸ’αžšαžΌαžœαž‚αŸ’αž“αžΆαž‡αžΆαž•αŸ’αž›αžΌαžœαž€αžΆαžšαŸ”

αž‘αžΈαž”αŸ†αž•αž»αžαž˜αžΆαž“αž‡αž˜αŸ’αžšαžΎαžŸαž‡αŸ†αž“αž½αžŸ Dashboard αŸ” αž€αŸ’αž“αž»αž„αž…αŸ†αžŽαŸ„αž˜β€‹αž–αž½αž€αž‚αŸ:

  1. K8Dash - αž…αŸ†αžŽαž»αž…αž”αŸ’αžšαž‘αžΆαž€αŸ‹αžœαŸαž™αž€αŸ’αž˜αŸαž„ (αž€αžΆαžšαž”αŸ’αžαŸαž‡αŸ’αž‰αžΆαž…αž·αžαŸ’αžαžŠαŸ†αž”αžΌαž„αž˜αžΆαž“αž€αžΆαž›αž”αžšαž·αž…αŸ’αž†αŸαž‘αžαŸ’αžšαž‘αž”αŸ‹αž‘αŸ…αžαŸ‚αž˜αžΈαž“αžΆαž“αŸƒαž†αŸ’αž“αžΆαŸ†αž“αŸαŸ‡) αžŠαŸ‚αž›αž•αŸ’αžαž›αŸ‹αž“αžΌαžœαž›αž€αŸ’αžαžŽαŸˆαž–αž·αžŸαŸαžŸαž›αŸ’αž’αžšαž½αž…αž‘αŸ…αž αžΎαž™ αžŠαžΌαž…αž‡αžΆαž€αžΆαžšαž”αž„αŸ’αž αžΆαž‰αžšαžΌαž”αž—αžΆαž–αž“αŸƒαžŸαŸ’αžαžΆαž“αž—αžΆαž–αž”αž…αŸ’αž…αž»αž”αŸ’αž”αž“αŸ’αž“αž“αŸƒαž…αž„αŸ’αž€αŸ„αž˜ αž“αž·αž„αž€αžΆαžšαž‚αŸ’αžšαž”αŸ‹αž‚αŸ’αžšαž„αžœαžαŸ’αžαž»αžšαž”αžŸαŸ‹αžœαžΆαŸ” αžαŸ’αžšαžΌαžœαž”αžΆαž“αžŠαžΆαž€αŸ‹αž‡αžΆ "αž…αŸ†αžŽαž»αž…αž”αŸ’αžšαž‘αžΆαž€αŸ‹αž–αŸαž›αžœαŸαž›αžΆαž–αž·αž" αž–αžΈαž–αŸ’αžšαŸ„αŸ‡ αž’αŸ’αžœαžΎαž”αž…αŸ’αž…αž»αž”αŸ’αž”αž“αŸ’αž“αž—αžΆαž–αž‘αž·αž“αŸ’αž“αž“αŸαž™αžŠαŸ‚αž›αž”αžΆαž“αž”αž„αŸ’αž αžΆαž‰αžŠαŸ„αž™αžŸαŸ’αžœαŸαž™αž”αŸ’αžšαžœαžαŸ’αžαž·αžŠαŸ„αž™αž˜αž·αž“αžαž˜αŸ’αžšαžΌαžœαž±αŸ’αž™αž’αŸ’αž“αž€αž’αŸ’αžœαžΎαž”αž…αŸ’αž…αž»αž”αŸ’αž”αž“αŸ’αž“αž—αžΆαž–αž‘αŸ†αž–αŸαžšαž“αŸ…αž€αŸ’αž“αž»αž„αž€αž˜αŸ’αž˜αžœαž·αž’αžΈαžšαž»αž€αžšαž€αŸ”
  2. αž€αž»αž„αžŸαžΌαž› OpenShift - αž…αŸ†αžŽαž»αž…αž”αŸ’αžšαž‘αžΆαž€αŸ‹αž”αžŽαŸ’αžŠαžΆαž‰αž–αžΈ Red Hat OpenShift αžŠαŸ‚αž›αž“αžΉαž„αž“αžΆαŸ†αž˜αž€αž“αžΌαžœαž€αžΆαžšαž’αž—αž·αžœαžŒαŸ’αžαž“αŸαž•αŸ’αžŸαŸαž„αž‘αŸ€αžαž“αŸƒαž‚αž˜αŸ’αžšαŸ„αž„αž‘αŸ…αž€αžΆαž“αŸ‹αž…αž„αŸ’αž€αŸ„αž˜αžšαž”αžŸαŸ‹αž’αŸ’αž“αž€ αžŠαŸ‚αž›αž˜αž·αž“αžŸαž˜αžšαž˜αŸ’αž™αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž˜αž“αž»αžŸαŸ’αžŸαž‚αŸ’αžšαž”αŸ‹αž‚αŸ’αž“αžΆαŸ”
  3. Kubernator αž‚αžΊαž‡αžΆαž‚αž˜αŸ’αžšαŸ„αž„αž‚αž½αžšαž±αŸ’αž™αž…αžΆαž”αŸ‹αž’αžΆαžšαž˜αŸ’αž˜αžŽαŸαž˜αž½αž™ αžŠαŸ‚αž›αž”αž„αŸ’αž€αžΎαžαž‡αžΆαž…αŸ†αžŽαž»αž…αž”αŸ’αžšαž‘αžΆαž€αŸ‹αž€αž˜αŸ’αžšαž·αžαž‘αžΆαž” (αž‡αžΆαž„αž•αŸ’αž‘αžΆαŸ†αž„αž‚αŸ’αžšαž”αŸ‹αž‚αŸ’αžšαž„) αž‡αžΆαž˜αž½αž™αž“αžΉαž„αžŸαž˜αžαŸ’αžαž—αžΆαž–αž€αŸ’αž“αž»αž„αž€αžΆαžšαž˜αžΎαž›αžœαžαŸ’αžαž»αž…αž„αŸ’αž€αŸ„αž˜αž‘αžΆαŸ†αž„αž’αžŸαŸ‹αŸ” αž‘αŸ„αŸ‡αž™αŸ‰αžΆαž„αžŽαžΆαž€αŸαžŠαŸ„αž™ αžœαžΆαž αžΆαž€αŸ‹αžŠαžΌαž…αž‡αžΆαž€αžΆαžšαž’αž—αž·αžœαžŒαŸ’αžαž“αŸαžšαž”αžŸαŸ‹αžœαžΆαž”αžΆαž“αžˆαž”αŸ‹αž αžΎαž™αŸ”
  4. αž”αŸ‰αžΌαž›αžΊαžšαžΈ - αž‘αžΎαž”αžαŸ‚αžαŸ’αž„αŸƒαž˜αž»αž“αŸ” αž”αžΆαž“αž”αŸ’αžšαž€αžΆαžŸ αž‚αž˜αŸ’αžšαŸ„αž„αžŠαŸ‚αž›αžšαž½αž˜αž”αž‰αŸ’αž…αžΌαž›αž‚αŸ’αž“αžΆαž“αžΌαžœαž˜αž»αžαž„αžΆαžšαž“αŸƒαž”αž“αŸ’αž‘αŸ‡αž˜αž½αž™ (αž”αž„αŸ’αž αžΆαž‰αžŸαŸ’αžαžΆαž“αž—αžΆαž–αž”αž…αŸ’αž…αž»αž”αŸ’αž”αž“αŸ’αž“αž“αŸƒαž…αž„αŸ’αž€αŸ„αž˜ αž”αŸ‰αž»αž“αŸ’αžαŸ‚αž˜αž·αž“αž‚αŸ’αžšαž”αŸ‹αž‚αŸ’αžšαž„αžœαžαŸ’αžαž»αžšαž”αžŸαŸ‹αžœαžΆ) αž“αž·αž„ "αžŸαž»αž–αž›αž—αžΆαž–αž“αŸƒαž€αžΆαžšαž’αž“αž»αžœαžαŸ’αžαž›αŸ’αž’αž”αŸ†αž•αž»αž" αžŠαŸ„αž™αžŸαŸ’αžœαŸαž™αž”αŸ’αžšαžœαžαŸ’αžαž· (αž–αž·αž“αž·αžαŸ’αž™αž˜αžΎαž›αž…αž„αŸ’αž€αŸ„αž˜αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž—αžΆαž–αžαŸ’αžšαžΉαž˜αžαŸ’αžšαžΌαžœαž“αŸƒαž€αžΆαžšαž€αŸ†αžŽαžαŸ‹αžšαž…αž“αžΆαžŸαž˜αŸ’αž–αŸαž“αŸ’αž’αž“αŸƒαž€αžΆαžšαžŠαžΆαž€αŸ‹αž–αž„αŸ’αžšαžΆαž™αžŠαŸ‚αž›αž€αŸ†αž–αž»αž„αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαž“αŸ…αž€αŸ’αž“αž»αž„αžœαžΆ)αŸ”

αž‡αŸ†αž“αž½αžŸαž±αŸ’αž™αž€αžΆαžšαžŸαž“αŸ’αž“αž·αžŠαŸ’αž‹αžΆαž“

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

Kubernetes Dashboard αž‡αžΆαž‘αŸ€αž„αž‘αžΆαžαŸ‹αž˜αžΆαž“αž‡αž˜αŸ’αžšαžΎαžŸαž–αžΈαžŸαž αž‚αž˜αž“αŸαž”αŸ’αžšαž—αž–αž”αžΎαž€αž…αŸ†αž  (αž αžΎαž™αž™αžΎαž„αžšαžΈαž€αžšαžΆαž™αž€αŸ’αž“αž»αž„αž€αžΆαžšαž–αž·αž…αžΆαžšαžŽαžΆαž–αž½αž€αžœαžΆ) αž”αŸ‰αž»αž“αŸ’αžαŸ‚αž“αŸ…αžŠαŸ†αžŽαžΆαž€αŸ‹αž€αžΆαž›αž“αŸαŸ‡ αž™αžΎαž„αž“αŸ…αžαŸ‚αž˜αžΆαž“αžŠαŸ†αžŽαŸ„αŸ‡αžŸαŸ’αžšαžΆαž™αž“αŸαŸ‡αŸ”

PS

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

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

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