k9s యొక్క అవలోకనం - Kubernetes కోసం ఒక అధునాతన టెర్మినల్ ఇంటర్‌ఫేస్

k9s యొక్క అవలోకనం - Kubernetes కోసం ఒక అధునాతన టెర్మినల్ ఇంటర్‌ఫేస్

K9లు Kubernetes క్లస్టర్‌లతో పరస్పర చర్య చేయడానికి టెర్మినల్ వినియోగదారు ఇంటర్‌ఫేస్‌ను అందిస్తుంది. K8sలో అప్లికేషన్‌లను నావిగేట్ చేయడం, పర్యవేక్షించడం మరియు నిర్వహించడం సులభతరం చేయడం ఈ ఓపెన్ సోర్స్ ప్రాజెక్ట్ యొక్క లక్ష్యం. K9s నిరంతరం Kubernetes లో మార్పులను పర్యవేక్షిస్తుంది మరియు పర్యవేక్షించబడిన వనరులతో పని చేయడానికి శీఘ్ర ఆదేశాలను అందిస్తుంది.

ప్రాజెక్ట్ గోలో వ్రాయబడింది మరియు దాదాపు ఒకటిన్నర సంవత్సరాలుగా ఉంది: మొదటి కమిట్ ఫిబ్రవరి 1, 2019న చేయబడింది. వ్రాసే సమయానికి, 9000+ నక్షత్రాలు ఆన్‌లో ఉన్నాయి గ్యాలరీలు మరియు సుమారు 80 మంది సహాయకులు. k9s ఏమి చేయగలదో చూద్దాం?

ఇన్‌స్టాలేషన్ మరియు లాంచ్

ఇది క్లయింట్ (కుబెర్నెటెస్ క్లస్టర్‌కు సంబంధించి) అప్లికేషన్, ఇది డాకర్ ఇమేజ్‌గా అమలు చేయడానికి సులభమైనది:

docker run --rm -it -v $KUBECONFIG:/root/.kube/config quay.io/derailed/k9s

కొన్ని Linux పంపిణీలు మరియు ఇతర ఆపరేటింగ్ సిస్టమ్‌ల కోసం, ఇన్‌స్టాల్ చేయడానికి సిద్ధంగా ఉన్నాయి ప్యాకేజీలు. సాధారణంగా, Linux సిస్టమ్స్ కోసం, మీరు బైనరీ ఫైల్‌ను ఇన్‌స్టాల్ చేయవచ్చు:

sudo wget -qO- https://github.com/derailed/k9s/releases/download/v0.22.0/k9s_Linux_x86_64.tar.gz | tar zxvf -  -C /tmp/
sudo mv /tmp/k9s /usr/local/bin

K8s క్లస్టర్‌కు నిర్దిష్ట అవసరాలు లేవు. సమీక్షలను బట్టి చూస్తే, అప్లికేషన్ 1.12 వంటి కుబెర్నెట్స్ యొక్క పాత వెర్షన్‌లతో కూడా పని చేస్తుంది.

అప్లికేషన్ ప్రామాణిక కాన్ఫిగరేషన్ ఉపయోగించి ప్రారంభించబడింది .kube/config - ఇది ఎలా చేస్తుందో అదే విధంగా ఉంటుంది kubectl.

పేజీకి సంబంధించిన లింకులు

డిఫాల్ట్‌గా, సందర్భం కోసం పేర్కొన్న డిఫాల్ట్ నేమ్‌స్పేస్‌తో విండో తెరవబడుతుంది. అంటే, మీరు వ్రాసినట్లయితే kubectl config set-context --current --namespace=test, అప్పుడు నేమ్‌స్పేస్ తెరవబడుతుంది test. (సందర్భాలు/నేమ్‌స్పేస్‌లను మార్చడం కోసం దిగువన చూడండి.)

k9s యొక్క అవలోకనం - Kubernetes కోసం ఒక అధునాతన టెర్మినల్ ఇంటర్‌ఫేస్

కు వెళ్ళండి కమాండ్ మోడ్ ":" నొక్కడం ద్వారా జరుగుతుంది. ఆ తర్వాత, మీరు ఆదేశాలను ఉపయోగించి k9s యొక్క ఆపరేషన్‌ను నియంత్రించవచ్చు - ఉదాహరణకు, స్టేట్‌ఫుల్‌సెట్‌ల జాబితాను వీక్షించడానికి (ప్రస్తుత నేమ్‌స్పేస్‌లో), మీరు నమోదు చేయవచ్చు :sts.

k9s యొక్క అవలోకనం - Kubernetes కోసం ఒక అధునాతన టెర్మినల్ ఇంటర్‌ఫేస్

కొన్ని ఇతర కుబెర్నెట్స్ వనరుల కోసం:

  • :ns - నేమ్‌స్పేస్‌లు;
  • :deploy - విస్తరణలు;
  • :ing - ప్రవేశాలు;
  • :svc - సేవలు.

వీక్షించడానికి అందుబాటులో ఉన్న వనరుల రకాల పూర్తి జాబితాను ప్రదర్శించడానికి, ఒక ఆదేశం ఉంది :aliases.

ప్రస్తుత విండోలో హాట్ కీ కలయికల ద్వారా అందుబాటులో ఉన్న ఆదేశాల జాబితాను వీక్షించడం కూడా సౌకర్యవంతంగా ఉంటుంది: దీన్ని చేయడానికి, కేవలం "?"పై క్లిక్ చేయండి.

k9s యొక్క అవలోకనం - Kubernetes కోసం ఒక అధునాతన టెర్మినల్ ఇంటర్‌ఫేస్

k9s లో కూడా ఉంది శోధన మోడ్, దానికి వెళ్లాలంటే "/"ని నమోదు చేస్తే సరిపోతుంది. దానితో, ప్రస్తుత "విండో" యొక్క విషయాలపై శోధన జరుగుతుంది. మీరు ఇంతకు ముందు ప్రవేశించినట్లయితే చెప్పండి :ns, మీరు నేమ్‌స్పేస్‌ల జాబితాను తెరిచారు. వాటిలో చాలా ఎక్కువ ఉంటే, ఎక్కువసేపు క్రిందికి స్క్రోల్ చేయకుండా ఉండటానికి, నేమ్‌స్పేస్‌లతో విండోలో నమోదు చేస్తే సరిపోతుంది. /mynamespace.

లేబుల్‌ల ద్వారా శోధించడానికి, మీరు కోరుకున్న నేమ్‌స్పేస్‌లోని అన్ని పాడ్‌లను ఎంచుకోవచ్చు, ఆపై నమోదు చేయండి, ఉదాహరణకు, / -l app=whoami. మేము ఈ లేబుల్‌తో పాడ్‌ల జాబితాను పొందుతాము:

k9s యొక్క అవలోకనం - Kubernetes కోసం ఒక అధునాతన టెర్మినల్ ఇంటర్‌ఫేస్

శోధన లాగ్‌లు, YAML మానిఫెస్ట్‌లను చూడటం మరియు అన్ని రకాల విండోలలో పని చేస్తుంది describe వనరుల కోసం - ఈ లక్షణాలపై మరిన్ని వివరాల కోసం దిగువన చూడండి.

మొత్తం నావిగేషన్ ఫ్లో ఎలా ఉంటుంది?

ఆదేశంతో :ctx మీరు సందర్భాన్ని ఎంచుకోవచ్చు:

k9s యొక్క అవలోకనం - Kubernetes కోసం ఒక అధునాతన టెర్మినల్ ఇంటర్‌ఫేస్

నేమ్‌స్పేస్‌ను ఎంచుకోవడానికి, ఇప్పటికే పేర్కొన్న ఆదేశం ఉంది :ns, ఆపై మీరు కోరుకున్న స్థలం కోసం శోధనను ఉపయోగించవచ్చు: /test.

ఇప్పుడు మనకు ఆసక్తి ఉన్న వనరును ఎంచుకుంటే (ఉదాహరణకు, అదే స్టేట్‌ఫుల్‌సెట్), సంబంధిత సమాచారం దాని కోసం కనిపిస్తుంది: వాటి గురించి సంక్షిప్త సమాచారంతో ఎన్ని పాడ్‌లు నడుస్తున్నాయి.

k9s యొక్క అవలోకనం - Kubernetes కోసం ఒక అధునాతన టెర్మినల్ ఇంటర్‌ఫేస్

పాడ్‌లు మాత్రమే ఆసక్తిని కలిగి ఉండవచ్చు - అప్పుడు ప్రవేశించడానికి సరిపోతుంది :pod. ConfigMaps విషయంలో (:cm - ఈ వనరుల జాబితా కోసం), మీరు ఆసక్తి ఉన్న వస్తువును ఎంచుకుని, "u"పై క్లిక్ చేయవచ్చు, ఆ తర్వాత K9s దీన్ని ప్రత్యేకంగా ఎవరు ఉపయోగిస్తారో మీకు తెలియజేస్తుంది (ఈ CM).

వనరులను వీక్షించడానికి మరొక సులభ లక్షణం వారిది "x-ray" (Xray వీక్షణ). ఈ మోడ్ కమాండ్ ద్వారా పిలువబడుతుంది :xray RESOURCE మరియు ... వివరించడం కంటే ఇది ఎలా పని చేస్తుందో చూపడం సులభం. స్టేట్‌ఫుల్‌సెట్‌ల కోసం ఇక్కడ ఒక ఉదాహరణ ఉంది:

k9s యొక్క అవలోకనం - Kubernetes కోసం ఒక అధునాతన టెర్మినల్ ఇంటర్‌ఫేస్
(ఈ వనరులలో ప్రతి ఒక్కటి సవరించవచ్చు, మార్చవచ్చు, తయారు చేయవచ్చు describe.)

మరియు ప్రవేశంతో విస్తరణ ఇక్కడ ఉంది:

k9s యొక్క అవలోకనం - Kubernetes కోసం ఒక అధునాతన టెర్మినల్ ఇంటర్‌ఫేస్

వనరులతో పని చేస్తోంది

మీరు YAML లేదా దానిలో ప్రతి వనరు గురించి సమాచారాన్ని పొందవచ్చు describe సంబంధిత కీబోర్డ్ సత్వరమార్గాలను నొక్కడం ద్వారా (వరుసగా "y" మరియు "d"). వాస్తవానికి, మరిన్ని ప్రాథమిక కార్యకలాపాలు ఉన్నాయి: ఇంటర్‌ఫేస్‌లోని అనుకూలమైన “హెడర్” కారణంగా వాటి జాబితా మరియు కీబోర్డ్ సత్వరమార్గాలు ఎల్లప్పుడూ కనిపిస్తాయి (Ctrl + e నొక్కడం ద్వారా దాచబడతాయి).

k9s యొక్క అవలోకనం - Kubernetes కోసం ఒక అధునాతన టెర్మినల్ ఇంటర్‌ఫేస్

ఏదైనా వనరును సవరించేటప్పుడు ("e" దాని ఎంపిక తర్వాత), పర్యావరణ వేరియబుల్స్‌లో నిర్వచించబడిన టెక్స్ట్ ఎడిటర్ తెరవబడుతుంది (export EDITOR=vim).

మరియు వనరు యొక్క వివరణాత్మక వివరణ ఎలా ఉంటుందో ఇక్కడ ఉంది (describe):

k9s యొక్క అవలోకనం - Kubernetes కోసం ఒక అధునాతన టెర్మినల్ ఇంటర్‌ఫేస్

ఈ అవుట్‌పుట్ (లేదా YAML రిసోర్స్ మానిఫెస్ట్‌ను వీక్షించే అవుట్‌పుట్) సుపరిచితమైన కీబోర్డ్ సత్వరమార్గం Ctrl + s ఉపయోగించి సేవ్ చేయబడుతుంది. ఇది ఎక్కడ సేవ్ చేయబడుతుందో K9s సందేశం నుండి తెలుస్తుంది:

Log /tmp/k9s-screens-root/kubernetes/Describe-1601244920104133900.yml saved successfully!

సిస్టమ్ లేబుల్‌లు మరియు ఉల్లేఖనాలను తీసివేసిన తర్వాత మీరు సృష్టించిన బ్యాకప్ ఫైల్‌ల నుండి వనరులను కూడా పునరుద్ధరించవచ్చు. దీన్ని చేయడానికి, మీరు వారితో డైరెక్టరీకి వెళ్లాలి (:dir /tmp), ఆపై కావలసిన ఫైల్‌ని ఎంచుకుని, దరఖాస్తు చేసుకోండి apply.

మార్గం ద్వారా, ప్రస్తుత రెప్లికాసెట్‌లో సమస్యలు ఉన్నట్లయితే మీరు ఎప్పుడైనా మునుపటి రెప్లికాసెట్‌కి తిరిగి వెళ్లవచ్చు. దీన్ని చేయడానికి, కావలసిన RS (:rs వారి జాబితా కోసం):

k9s యొక్క అవలోకనం - Kubernetes కోసం ఒక అధునాతన టెర్మినల్ ఇంటర్‌ఫేస్

... మరియు Ctrl + lతో రోల్‌బ్యాక్ చేయండి. ప్రతిదీ సరిగ్గా జరిగిందని మేము నోటిఫికేషన్ పొందాలి:

k9s/whoami-5cfbdbb469 successfully rolled back

మరియు ప్రతిరూపాలను స్కేల్ చేయడానికి, కేవలం "s" (స్కేల్) పై క్లిక్ చేసి, కావలసిన సంఖ్యలో సందర్భాలను ఎంచుకోండి:

k9s యొక్క అవలోకనం - Kubernetes కోసం ఒక అధునాతన టెర్మినల్ ఇంటర్‌ఫేస్

మీరు షెల్ ఉపయోగించి ఏదైనా కంటైనర్‌లను నమోదు చేయవచ్చు: దీన్ని చేయడానికి, కావలసిన పాడ్‌కి వెళ్లి, "s" (షెల్) పై క్లిక్ చేసి, కంటైనర్‌ను ఎంచుకోండి.

ఇతర లక్షణాలు

వాస్తవానికి, లాగ్‌లను వీక్షించడానికి కూడా మద్దతు ఉంది (ఎంచుకున్న వనరు కోసం "l"). మరియు కొత్త లాగ్‌లను చూడటానికి, ఎంటర్‌ను నిరంతరం నొక్కడం అవసరం లేదు: (“m”) గుర్తు పెట్టడానికి సరిపోతుంది, ఆపై కొత్త సందేశాలను మాత్రమే ట్రాక్ చేయండి.

k9s యొక్క అవలోకనం - Kubernetes కోసం ఒక అధునాతన టెర్మినల్ ఇంటర్‌ఫేస్

అదే విండోలో, మీరు లాగ్‌ల అవుట్‌పుట్ కోసం సమయ పరిధిని ఎంచుకోవచ్చు:

  • కీ "1" - 1 నిమిషం కోసం;
  • "2" - 5 నిమిషాలు;
  • "3" - 15 నిమిషాలు;
  • "4" - 30 నిమిషాలు;
  • "5" - 1 గంట;
  • "0" - పాడ్ యొక్క మొత్తం జీవితకాలం కోసం.

ప్రత్యేక ఆపరేటింగ్ మోడ్ పల్స్ (కమాండ్ :pulse) కుబెర్నెట్స్ క్లస్టర్ గురించి సాధారణ సమాచారాన్ని చూపుతుంది:

k9s యొక్క అవలోకనం - Kubernetes కోసం ఒక అధునాతన టెర్మినల్ ఇంటర్‌ఫేస్

అందులో మీరు వనరుల సంఖ్య మరియు వాటి స్థితిని చూడవచ్చు (ఆకుపచ్చ స్థితిని కలిగి ఉన్న వాటిని చూపుతుంది Running).

K9s యొక్క మరొక అద్భుతమైన ఫీచర్ అంటారు పొపాయ్. ఇది ఖచ్చితత్వం యొక్క నిర్దిష్ట ప్రమాణాల కోసం అన్ని వనరులను తనిఖీ చేస్తుంది మరియు ఫలిత "రేటింగ్"ని వివరణలతో ప్రదర్శిస్తుంది. ఉదాహరణకు, తగినంత నమూనాలు లేదా పరిమితులు లేవని మీరు చూడవచ్చు మరియు కొన్ని కంటైనర్లు రూట్‌గా అమలు చేయగలవు ...

k9s యొక్క అవలోకనం - Kubernetes కోసం ఒక అధునాతన టెర్మినల్ ఇంటర్‌ఫేస్

ప్రాథమిక హెల్మ్ మద్దతు ఉంది. ఉదాహరణకు, క్లస్టర్‌లో అమలు చేయబడిన విడుదలలను మీరు ఈ విధంగా చూడవచ్చు:

:helm all # все
:helm $namespace # в конкретном пространстве имен

బెంచ్మార్క్

K9 లలో కూడా నిర్మించబడింది హే ఒక సాధారణ HTTP సర్వర్ లోడ్ జనరేటర్, బాగా తెలిసిన ab (ApacheBench)కి ప్రత్యామ్నాయం.

దీన్ని ప్రారంభించడానికి, మీరు పాడ్‌లో పోర్ట్-ఫార్వర్డ్‌ని ప్రారంభించాలి. దీన్ని చేయడానికి, పాడ్‌ని ఎంచుకుని, Shift + f నొక్కండి, "pf" అలియాస్‌ని ఉపయోగించి పోర్ట్-ఫార్వర్డ్ సబ్‌మెనుకి వెళ్లండి.

k9s యొక్క అవలోకనం - Kubernetes కోసం ఒక అధునాతన టెర్మినల్ ఇంటర్‌ఫేస్

పోర్ట్‌ని ఎంచుకుని, Ctrl + b నొక్కిన తర్వాత, బెంచ్‌మార్క్ కూడా ప్రారంభమవుతుంది. అతని పని యొక్క ఫలితాలు ఇక్కడ నిల్వ చేయబడ్డాయి /tmp మరియు K9sలో తర్వాత వీక్షించడానికి అందుబాటులో ఉన్నాయి.

k9s యొక్క అవలోకనం - Kubernetes కోసం ఒక అధునాతన టెర్మినల్ ఇంటర్‌ఫేస్
k9s యొక్క అవలోకనం - Kubernetes కోసం ఒక అధునాతన టెర్మినల్ ఇంటర్‌ఫేస్

బెంచ్‌మార్క్ కాన్ఫిగరేషన్‌ను మార్చడానికి, మీరు ఫైల్‌ను సృష్టించాలి $HOME/.k9s/bench-<my_context>.yml (ప్రతి క్లస్టర్ కోసం నిర్ణయించబడుతుంది).

NB: డైరెక్టరీలోని అన్ని YAML ఫైల్‌ల పొడిగింపు ముఖ్యం .k9s అది ఖచ్చితంగా ఉంది .yml (.yaml సరిగ్గా పని చేయదు).

కాన్ఫిగరేషన్ ఉదాహరణ:

benchmarks:
  defaults:
    # Количество потоков
    concurrency: 2
    # Количество запросов
    requests: 1000
  containers:
    # Настройки для контейнера с бенчмарком
    # Контейнер определяется как namespace/pod-name:container-name
    default/nginx:nginx:
      concurrency: 2
      requests: 10000
      http:
        path: /
        method: POST
        body:
          {"foo":"bar"}
        header:
          Accept:
            - text/html
          Content-Type:
            - application/json
 services:
    # Можно проводить бенчмарк на сервисах типа NodePort и LoadBalancer
    # Синтаксис: namespace/service-name
    default/nginx:
      concurrency: 5
      requests: 500
      http:
        method: GET
        path: /auth
      auth:
        user: flant
        password: s3cr3tp455w0rd

ఇంటర్ఫేస్

వనరుల జాబితాల కోసం నిలువు వరుసల రూపాన్ని ఫైల్ సృష్టించడం ద్వారా సవరించబడుతుంది $HOME/.k9s/views.yml. దాని కంటెంట్ యొక్క ఉదాహరణ:

k9s:
 views:
   v1/pods:
     columns:
       - AGE
       - NAMESPACE
       - NAME
       - IP
       - NODE
       - STATUS
       - READY
   v1/services:
     columns:
       - AGE
       - NAMESPACE
       - NAME
       - TYPE
       - CLUSTER-IP

నిజమే, లేబుల్‌ల కోసం తగినంత కాలమ్ లేదు, దాని కోసం ఉంది ప్రాజెక్ట్ లో సమస్య.

నిలువు వరుసల ద్వారా క్రమబద్ధీకరణ కీబోర్డ్ సత్వరమార్గాల ద్వారా నిర్వహించబడుతుంది:

  • Shift + n - పేరుతో;
  • Shift + o - నోడ్స్ ద్వారా;
  • Shift + i - IP ద్వారా;
  • Shift + a - కంటైనర్ జీవితకాలం ద్వారా;
  • Shift + t - పునఃప్రారంభాల సంఖ్య ద్వారా;
  • Shift + r - సంసిద్ధత స్థితి ద్వారా;
  • Shift + c - CPU వినియోగం ద్వారా;
  • Shift + m - మెమరీ వినియోగం ద్వారా.

ఎవరైనా డిఫాల్ట్ కలర్ స్కీమ్ నచ్చకపోతే, K9s కూడా సపోర్ట్ చేస్తుంది తొక్కలు. రెడీమేడ్ ఉదాహరణలు (7 ముక్కలు) అందుబాటులో ఉన్నాయి ఇక్కడ. ఈ తొక్కలలో ఒకదానికి ఉదాహరణ ఇక్కడ ఉంది (నేవీలో):

k9s యొక్క అవలోకనం - Kubernetes కోసం ఒక అధునాతన టెర్మినల్ ఇంటర్‌ఫేస్

ప్లగిన్లు

చివరకు, ప్లగిన్లు K9ల సామర్థ్యాలను విస్తరించేందుకు మిమ్మల్ని అనుమతిస్తుంది. నేను నా పనిలో వాటిలో ఒకదాన్ని మాత్రమే ఉపయోగించాను - kubectl get all -n $namespace.

ఇది ఇలా కనిపిస్తుంది. ఫైల్‌ను సృష్టించండి $HOME/.k9s/plugin.yml ఇలాంటి కంటెంట్‌తో:

plugin:
 get-all:
   shortCut: g    
   confirm: false    
   description: get all
   scopes:
   - all
   command: sh
   background: false
   args:
   - -c
   - "kubectl -n $NAMESPACE get all -o wide | less"

ఇప్పుడు మీరు నేమ్‌స్పేస్‌కి వెళ్లి సంబంధిత కమాండ్‌తో అమలు చేయడానికి "g" నొక్కండి:

k9s యొక్క అవలోకనం - Kubernetes కోసం ఒక అధునాతన టెర్మినల్ ఇంటర్‌ఫేస్

ప్లగిన్‌లలో, ఉదాహరణకు, kubectl-jqతో ఇంటిగ్రేషన్‌లు మరియు లాగ్‌లను వీక్షించడానికి ఒక యుటిలిటీ ఉన్నాయి. దృఢమైన.

తీర్మానం

నా అభిరుచి కోసం, K9 లు పని చేయడానికి చాలా సౌకర్యవంతంగా మారాయి: మీరు దాన్ని ఉపయోగించకుండానే మీకు అవసరమైన ప్రతిదాని కోసం వెతకడం త్వరగా అలవాటు చేసుకోవచ్చు. kubectl. లాగ్‌ల వీక్షణ మరియు వాటి పొదుపు, వనరుల శీఘ్ర సవరణ, సాధారణంగా పని వేగం *, పొపాయ్ మోడ్ ఉపయోగకరంగా మారడంతో నేను సంతోషించాను. మీ అవసరాలకు సరిపోయేలా ప్లగిన్‌లను సృష్టించడం మరియు అప్లికేషన్‌ను సవరించగల సామర్థ్యం ప్రత్యేక ప్రస్తావన.

* అయినప్పటికీ, పెద్ద మొత్తంలో లాగ్‌లతో, నేను K9ల నెమ్మదిగా పని చేయడాన్ని కూడా గమనించాను. అటువంటి సందర్భాలలో, యుటిలిటీ ఇంటెల్ జియాన్ E2xx నుండి 312 కోర్లను "తిన్నది" మరియు స్తంభింపజేయవచ్చు.

ప్రస్తుతానికి ఏమి లేదు? డైరెక్టరీకి వెళ్లకుండానే మునుపటి సంస్కరణకు త్వరిత రోల్‌బ్యాక్ (మేము RS గురించి మాట్లాడటం లేదు). అదనంగా, రికవరీ కోసం మాత్రమే జరుగుతుంది మాత్రమే వనరు: మీరు ఉల్లేఖనాన్ని లేదా లేబుల్‌ను తొలగిస్తే, మీరు మొత్తం వనరును తొలగించి, పునరుద్ధరించవలసి ఉంటుంది (ఇక్కడే మీరు డైరెక్టరీకి వెళ్లాలి). మరొక చిన్నవిషయం - అటువంటి సేవ్ చేయబడిన "బ్యాకప్" కోసం తగినంత తేదీ లేదు.

PS

మా బ్లాగులో కూడా చదవండి:

మూలం: www.habr.com

ఒక వ్యాఖ్యను జోడించండి