Äú¿ÉÒÔ¾èÖú£¬Ö§³ÖÎÒÃǵĹ«ÒæÊÂÒµ¡£

1Ôª 10Ôª 50Ôª





ÈÏÖ¤Â룺  ÑéÖ¤Âë,¿´²»Çå³þ?Çëµã»÷Ë¢ÐÂÑéÖ¤Âë ±ØÌî



  ÇóÖª ÎÄÕ ÎÄ¿â Lib ÊÓÆµ iPerson ¿Î³Ì ÈÏÖ¤ ×Éѯ ¹¤¾ß ½²×ù Modeler   Code  
»áÔ±   
 
   
 
 
     
   
 ¶©ÔÄ
  ¾èÖú
DockerÈÕÖ¾×Ô¶¯»¯: ElasticSearch¡¢Logstash
 
À´Ô´£º51CTO ·¢²¼ÓÚ 2015-7-6
  3796  次浏览      31
 

±¾ÎÄÖ÷Òª½éÉÜÁËÈçºÎʹÓÃElasticSearch¡¢Logstash¡¢KibanaºÍLogspout¼¼ÊõÕ»À´²¿Êð×Ô¶¯»¯µÄÈÕ־ϵͳ¡£

You, too, could Logstash.

¿ìËÙÄîÎå±éÕâ¸öÌâÄ¿£¡²»¹ý˵ʵ»°£¬ÎÒÆäʵ²¢²»È·¶¨¸Ã¸øÕâÆªÎÄÕÂÆð¸öʲôÑùµÄÃû×Ö²ÅÄÜÈ·±£ÈËÃÇ¿ÉÒÔÕÒµ½Ëü¡£

ÕâÆªÎÄÕÂÊÇ»ùÓÚ Evan Hazlett¡¯s article on running the ELK stack in Docker ºÍ ClusterHQ¡¯s article on doing it with Fig/Docker Compose and FlockerÕâÁ½ÆªÎÄÕµġ£±¾ÎÄͬʱҲÊܵ½ÁË Borg paperµÄÓ°Ï죬ËüÔÚÌÖÂÛʹÓằê×¼Õ»¡»×öÊÂÇéµÄʱºòÌá³öÁËÎÒÃǸÐÐËȤµÄµÄһЩ¹¤¾ß¡£

ÎÊÌâ

ÏàÐŲ»ÓÃÎÒ˵ÄãÒ²Ã÷°×ΪʲôҪ¶ÔÍ×ÉÆ´¦ÀíÈÕÖ¾£¬ÈÕÖ¾¿ÉÒÔ°ïÖúÎÒÃÇÅŲé´íÎ󣬷ÖÎöÎÊÌâ¡£

µ±È»£¬Ò²ÓкܶàÈÕÖ¾µÄ½â¾ö·½°¸£¬ÆäÖаüÀ¨LogstashÕâÑù·Ç³£¿É°®µÄ¼¼Êõ¡£¶øºóÓÖ³öÏÖÁ˸ü¶àʵÓõļ¼Êõ¡£

ÎÒÃǶ¼ÖªµÀÈÕÖ¾µÄÖØÒªÐÔ£¬ËùÒÔ£¬Ëæ×ŶÔDockerÐËȤµÄÔö¼Ó£¬ÈÃÈËÃÇ·è¿ñµÄÒ»¼þÊÂÇé¾ÍÊÇÈçºÎÔÚDockerµÄÊÀ½ç´¦ÀíÈÕÖ¾¡£

ÓÐÁËDocker£¬ÈËÃÇͻȻ±»ÆÈÐèÒªÓÃÁíÒ»ÖÖ·½Ê½À´¿¼ÂÇÈÕÖ¾¡£ÔÚ²¿ÊðÒ»¸ö´«Í³µÄLinuxʱ£¬Ó¦ÓóÌÐò»òÕ߼ܹ¹¼Ç¼ÈÕÖ¾µÄ·½Ê½Í¨³£¼Ç¼µ½ÎļþÀ Ò»°ã£¨µ«²»Ò»¶¨£©»á¼Ç¼µ½/var/logĿ¼Ï¡£µÄÈ·£¬ÎÒÓÐһЩ¹ØÓÚ¼ì²éPHPÈÕÖ¾¡°²»´í¡±£¨ÒëÕß×¢£ºÔ­ÎÄÊÇ´øÒýºÅµÄfond£¬Ó¦¸ÃÊÇ·´ÓïµÄÒâ˼£©µÄ»Ø Ò䣬ÔÚÄǸöÏîÄ¿ÖУ¬ÈÕÖ¾ÊÇ·ÅÔÚÏîÄ¿µÄĿ¼Ï£¬µ±³öÏÖ´íÎóµÄʱºòÄÚÖõÄÓ¦ÓóÌÐòÈÕÖ¾²¢²»ÄÜÌṩÈκÎÓÐÓõĶ«Î÷¡£ÎÒÆäʵ²¢²»Ï²»¶°ÑÈÕÖ¾²ð·Ö³ÉÄÇÑù£¨¸ü¶à¿ÉÒÆ¶¯ µÄ²¿·ÖÒâζןüÄѵ÷ÊÔ£©£¬¿ÉÄܸüºÃµÄʵ¼ùÊÇÓÐÒ»¸öͳһ·ÃÎÊÈÕÖ¾µÄ·½Ê½¡£µÄÈ·£¬ÓÐһƪ¹ØÓÚÕâ¸öÏë·¨£¨¡°Í³Ò»ÈÕÖ¾²ã¡±£©µÄÓÐȤµÄ ÎÄÕ£¬×÷ÕßÊÇÀ´×Ô FluentdµÄKiyoto Tamura£¬ÕâÊǸöÀàËÆLogstashµÄ¹¤¾ß¡£

ÄǶÔÓÚDockerÓÐʲô²»Í¬ÄØ£¿Í»È»¼ä£¬²»Í¬ÓÚÒÔÍù½«ËùÓÐÈÕÖ¾·ÅÔÚÖ÷»úϵͳµÄͳһλÖã¬Èç½ñÈÕÖ¾·ÖÉ¢Ôںܶ಻ͬÈÝÆ÷µÄÏ໥¸ôÀëµÄ»·¾³ÖС£°¡Å¶£¬ÌýÆðÀ´ºÃÏñ¸úÎÒÃÇÏëÒªµÄ¸ÕºÃÏà·´¡£

DockerÒÔÍù´¦ÀíÈÕÖ¾µÄ·½·¨ÊÇͨ¹ýdocker logsÃüÁî - Docker²¶×½Ã¿Ò»¸öÈÝÆ÷½ø³ÌµÄSTDOUTºÍSTDERR£¬±£´æÔÚ´ÅÅÌÉÏ£¬È»ºóÓû§¾ÍÄÜʹÓÃdocker logs <container>À´½øÐвéѯ¡£Èç¹ûÓÃÓÚ¿ª·¢£¬ÄãÖ»ÊÇÏëÍùÖÕ¶ËÆÁÄ»ÉÏ´òӡһЩÊä³ö²¢¿ìËٵõ½½á¹û£¬ÄÇôÕâÖÖ·½Ê½¹¤×÷µÄ»¹²»´í£»µ«Êǵ±Ä㿼 ÂÇÔÚ¸ü¸´ÔӵĻ·¾³ÏÂʹÓÃDocker£¬»òÕßÏëÒª²é¿´¸ü¶à´«Í³¼Ü¹¹µÄUnixºǫ́³ÌÐòµÄÈÕÖ¾£¬¶øÕâЩ³ÌÐòÔËÐÐÔÚºǫ́²¢ÇÒÈÕÖ¾¼Ç¼ÔÚÈÝÆ÷µÄÄÚ²¿´ÅÅÌÉϵÄʱºò£¬ Âé·³¾ÍÀ´ÁË¡£ÕâÖÖÇé¿öÏ£¬ÎÊÌâÖ÷ÒªÊÇ£º

1.¿É·¢ÏÖÐÔ£¨discoverability£© - Èç¹ûÈÝÆ÷Ö»ÊǶÌÔݵĴæÔÚ£¬ÄÇôÊÔͼÓÃÎÒÏëÒªµÄÈÕÖ¾¸ú×ÙËü£¬²¢ÇÒʹÓÃgrepÀ´½âÎöËü£¬ÕâÖÖ·½Ê½ºÃÏñ²»ÊÇÄÇôÓÐȤ£»

2.ÈÕÖ¾ÂÖת£¨log rotation£© - ÓÐЩ·þÎñ³ÌÐòÌØ±ð½¡Ì¸£¨ÒëÕß×¢£ºÔ­ÎÄÊÇchatty£¬Òâ˼ÊÇÕâЩ³ÌÐò»áÓкܶàÊä³ö£©£¬Òà»òÊÇ»áÔËÐкܳ¤Ê±¼ä¡£ÄÇôÎÒÃǾÍÐèÒªÒ»ÖÖ·½Ê½£¬µ±ÏµÍ³ÔËÐÐÒ»¶Îʱ¼ä ºó£¬¶ÔÈÕÖ¾½øÐÐÒ»´ÎÇåÀí£¬À´È·±£´ÅÅ̲»»á±»ÄÇЩÎÒÃDz»ÔÙʹÓõÄÈÕÖ¾ËùÌî³ä¡£¾ÝÎÒËùÖª£¬ÏÖÓеÄDocker»¹²»Ö§³ÖÕâÖÖÌØÐÔ¡£

ÔÚÕâÆ¬ÎÄÕÂÖÐÎÒÔÝÇÒ²»Ì¸¹ØÓÚÈÕÖ¾ÂÖתµÄÄÚÈÝ£¬ÒòΪÄÇÊÇÁíÒ»¸ö¹Þ¹ÞÀïµÄ³æ×Ó£¬µ«ÊÇÎÒ»áÔÚÕâÀïÃèÊö¸Ã¼¼ÊõÕ»£¨ÒëÕß×¢£ºÔ­ÎÄÊÇstack£¬²»ÖªµÀÒë³É¼¼ÊõÕ»ÊÇ·ñÕýÈ·£©µÄÂÖÀª£¬Ö÷ÒªÊÇΪÁË»º½â´¦ÀíµÚÒ»¸öÎÊÌâµÄ¹ý³Ì¡£

¶ÔÓÚÄÇЩ°ÑÈÕÖ¾¼Ç¼ÔÚÈÝÆ÷ÄÚ²¿´ÅÅ̵Ľø³Ì£¬Èç¹ûÏëҪΪËüÃǼǼ±êÇ©£¬ÓкܶàÖÖ·½·¨¿ÉÒÔÈÃËü¹¤×÷¡£ÎÒ×îϲ»¶µÄÒ»ÖÖ·½Ê½¡ª¡ªËäÈ»²¢Ã»ÓÐÔÚÕâÀïÕæÕýÁгöÀ´£¬µ«ÔÚÎÒ¿´À´·Ç³£ÓÐÓ᪡ªÊǽ«Ô­Ê¼ÈÝÆ÷ÈÕÖ¾¼Ç¼µÄĿ¼×÷Ϊһ¸ö¾í£¨ volume£©£¬ ²¢ÇÒÈÃÆäËûÈÝÆ÷ʹÓÃ--volumes-fromÑ¡ÏîÀ´¼Ì³ÐÕâ¸ö¾í¡£È»ºóËûÃǾͿÉÒÔʹÓÃtail -f /var/log/foo/access.log»òһЩÆäËû·½·¨À´²é¿´ÈÕÖ¾ÁË¡£ÔÚÎÒ¿´À´Õâ´Ù½øÁËÒ»¸öÏ൱ºÃµÄ¹Ø×¢µãµÄ·ÖÀ룬ÒòΪÄã½øÐмàÊÓÈÕÖ¾µÄÈÝÆ÷Óëд ÈÕÖ¾µÄÈÝÆ÷µÄ²»Í¬µÄ£¬ÁíÍ⣨²¢²»³ä·Ö£©Äã¿ÉÒÔÈÆ¿ªunionÎļþϵͳÀ´½øÐвÙ×÷£¨¾ÍÏñ²Ù×÷Ò»¸öÊý¾Ý¿âÒ»Ñù£©¡£µ«ÕæµÄûÓбØÒªÔÚ¾µÏñÖиú×ÙÈÕÖ¾£¨×´Ì¬£©¡£

ÄǹØÓÚdiscoverabilityÄãÒª×öÐ©Ê²Ã´ÄØ£¿ÎÒÃǽ«»áÔÚDockerÄÚÔËÐÐÒ»¸ö ELK stack£¬²¢ÇÒʹÓà logspout¹¤ ¾ßÀ´×Ô¶¯½«ÈÝÆ÷µÄÈÕ־·Óɵ½Logstash¡£ÎÒÕæÐľõµÃÔÚδÀ´ÕâÖÖ·½·¨»áÓ¦ÓÃÔÚºÜ¶à·½Ãæ - Èç¹ûÄ㽫ҪÔËÐÐÈÝÆ÷¡¢Í£Ö¹ËüÃÇ¡¢É¾³ýËüÃÇ»òÕ߯äËü£¬ÄÇôÄã¿ÉÄÜÒ²»á¶Ô±¾µØÊ¼þ¸ÐÐËȤ,²¢ÇÒ»áÈÃÈÝÆ÷µÄÉúÃüÖÜÆÚ¿ÉÒÔ×·×ٺͼàÊÓ¡£Ö®ºóÄãµÄ»ù´¡ÉèÊ©¾Í¿ÉÒÔÖØÐ ¼¤»î¶ø²»ÔÙÐèÒªÈ˹¤¸ÉÔ¤¡£Í¬Ñù¶ÔÓÚÏñ¸ºÔØÆ½ºâ£¬·þÎñ·¢Ïֵȴ˷½·¨Ò²ÊÇ¿ÉÓõ쬵«Äǽ«ÊÇÁíһƪÎÄÕµÄÄÚÈÝÁË¡£

·½·¨

ÒÔÏÂÊÇEvanºÍClusterHQµÄ·½·¨£¬ÎÒÃǽ«»áÔËÐУº

ÓÃElasticSearchÀ´Ë÷ÒýÊÕ¼¯µÄÈÕÖ¾Êý¾Ý²¢Ê¹Ëü¸üÒ×ÓÚ²éѯ

ʹÓÃLogstash×÷ΪԶ³ÌsyslogÀ´ÊÕ¼¯À´×ÔÈÝÆ÷µÄÈÕÖ¾

ʹÓÃLogspoutÀ´ÏòLogstash·¢ËÍÈÝÆ÷µÄÈÕÖ¾

ʹÓÃKibana×÷ΪÓëÊÕ¼¯À´µÄÊý¾Ý½øÐн»»¥µÄÒ»¸öƯÁÁµÄǰ¶Ë

Cadvisor£¬Ò»¸ö¼àÊÓÈÝÆ÷×ÊÔ´µÄÖ¸±êµÄÒDZíÅÌ£¬Õâ¸ö´¿Êô¸öÈËϲºÃ(Ô­ÎÄ£ºfor kicks)

Èç¹ûËüÃÇÌýÆðÀ´ÏñÊÇ»áÔËÐÐÏÅÈËÊýÁ¿µÄ³ÌÐò£¬ÇëÊÔ×Ų»ÒªÄÇô·³ÄÕ - ÎÒÃǽ«»áÖ±½ÓʹÓà Docker ComposeÀ´¿ªÊ¼ÕâЩ¹¤×÷¡£

ËùÒÔ£¬Èç¹ûÄãÏëÔÚ¼Ò¸úËæÎÒÒ»ÆðÀ´×ö£¬Äã¿ÉÒÔÔËÐÐÒÔÏÂÃüÁîÀ´¿ªÊ¼ (ÄãÐèÒª°²×°×îа汾µÄDockerºÍDocker Compose):

$ git clone https://github.com/nathanleclaire/elk
$ cd elk
$ docker-compose -f docker-compose-quickstart.yml up

Õâ»áÔÚ´ÓDocker HubÉÏ»ñµÃµÄÈÝÆ÷»¯ºÃµÄ¾µÏñÉÏÆô¶¯Ó¦ÓóÌÐò£¬¶øÇÒÄãµÄKibanaǰ¶Ë»á´Ó80ºÅ¶Ë¿Ú½øÐлñÈ¡¶ø²»¹ÜÖ÷»úµÄDOCKER_HOSTÖ¸ÏòʲôµØ·½¡£

¶ÔÎÒ¶øÑÔ£¬ÎÒϲ»¶²¿Êð£¨ÒëÕß×¢£ºÔ­ÎÄkick up£¬²»È·¶¨ÊÇ·ñÄÜÒë³É²¿Êð£©Ò»¸ö DigitalOcean droplet£¨ÒëÕß×¢£ºDigitalOceanÌṩÁËIaaS·þÎñ£¬dropletsÊÇDigitalOcean¹«Ë¾×¨ÓеÄÔÆ·þÎñÆ÷ÊõÓ»òÕߵȼ۵ÄʹÓà Docker MachineÀ´×öÕâÑùµÄ¹¤×÷£¬ÒòΪÀ­¾µÏñËùÐèµÄ´ø¿íÏë±Ø±ÈÁ¬½ÓÄãÁÚ¾ÓµÄWiFiµÄÒªÇó¸ü¸ßһЩ¡£Èç¹ûÄãÒ²ÏëÕâô×ö£¬ÄÇôÏÂÃæµÄÃüÁî¿ÉÒÔ´´½¨Äã×Ô¼ºµÄ·þÎñÆ÷£¨ÔÙ´ÎÇ¿µ÷£¬È·±£°²×°ÁË×îа汾µÄÈí¼þ£©:

$ export DIGITALOCEAN_ACCESS_TOKEN=MY_SECRET_API_TOKEN
$ docker-machine create -d digitalocean \
--digitalocean-size 4gb \
--digitalocean-image docker \
droplet
....
....
....
To point your Docker client at it, run this in your shell: eval "$(docker-machine env droplet)"
$ eval "$(docker-machine env droplet)"

ÎÒͨ³£½¨ÒéʹÓÃÉÏÎÄÌáµ½µÄÌåÃæ½áʵµÄ·þÎñÆ÷£¬ÒòΪÕâЩ½ø³Ì¿ÉÄÜ»áÏûºÄ´óÁ¿µÄÄÚ´æ¡£ËüÔÚ±¾µØ¹¤×÷µÄ»¹²»´í£¬µ«ÊÇpulls²Ù×÷»áÓеãÂý£¬³ý·ÇÄãʹÓõÄÊǹâÏË¡£

Èç¹ûÄã²»ÊǺÜϲ»¶ÔËÐв»ÊÜÐÅÈξµÏñ£¨»òÕßÄã½ö½öÊÇÐ޸IJ¢¹¹½¨×Ô¼ºµÄ¾µÏñ£©£¬Ã»ÓÐÎÊÌ⣺·¢ÐаæÖÐĬÈϵÄdocker-compose.ymlÊÇ»ùÓÚ¹¹½¨²ÎÊýµÄ£¬ËùÒÔÄã¿ÉÒÔ×Ô¼º¹¹½¨¾µÏñ£º

$ docker-compose build
$ docker-compose up

µ±Äã°ÑÈÝÆ÷Æô¶¯ºó£¬ÄãµÄÖÕ¶ËÉÏ»áÓÐÀàËÆµÄÊä³ö£º

Äã¿ÉÄܻῴµ½¹ØÓÚLogspoutδÄÜÁ´½Óµ½syslogµÄ´íÎ󣬲»¹ýÕâûʲôÎÊÌ⣬ºÜÕý³£¡£¸Ã´íÎóÊÇÒòΪLogstashÈÝÆ÷»¹Ã»ÓÐÆô¶¯¡£µ±°ÑËüÔËÐÐÖ®ºó£¬ÉÏÃæµÄ´íÎó¾Í»áÍ£Ö¹ÁË¡£

ÏÖÔÚµ±Äã²é¿´Æô¶¯ÁËÒ»×éÈÝÆ÷µÄËÞÖ÷»úµÄ80ºÅ¶Ë¿Úʱ£¬ÄãÓ¦¸Ã»á¿´µ½KibanaµÄ»¶Ó­½çÃæ£º

µã»÷ÉÏͼÖмýͷָʾµÄ ¡°Logstash dashboard¡± Á´½Ó£¬»òÖ±½Ó·ÃÎÊ<machineIp>/#/dashboard/file/default.json£¬Äã»á±»´øµ½Äãн¨µÄDockerÈÕ Ö¾¼Ü¹¹µÄÒ³Ãæ£¨ÒëÕß×¢£ºÕæµÄ²»Ïë°ÑdashboardÒë³ÉÒDZíÅÌ£©£¡

ÎÒÒ»Ö±ÔÚÇ¿µ÷£¬¹ØÓÚÈÝÆ÷×î»ù±¾µÄ¡°¼¼ÊõÕ»¡±ÔÚEvanµÄÎÄÕÂÀï±»Ö±½ÓºöÂÔÁË£¬ÕⲢûÓÐʲô²»ºÃ£¬µ«Êǵ±ÎÒ×Ô¼ºÏëҪʵÏÖÕâЩ¼¼ÊõµÄʱºò£¬Óöµ½ÁËһЩÎÊÌ⣺

1.Logspout·¢Ë͵ÄÊý¾Ý¸ñʽ¸úEvanÔ­ÎÄÖÐÌáµ½µÄLogstashµÄgrok¹ýÂËÆ÷ÓÐÂÔ΢µÄ²»Í¬/¸ñʽÖоµÏñÊÇÐèÒªµÄ£¬ËùÒÔ£º

2.ÔÚÈÕÖ¾ÖлáÓкܶàgrok½âÎöʧ°ÜµÄ´íÎó£¨ÕâÒâζ×ÅLogstashÊÔͼȥƥÅäÒ»¸öËüÖªµÀµÄÈÕÖ¾ÐÅϢģʽȴ²»ÄÜÕýÈ·½âÎö£©¡£¶ÔÓÚËü×Ô¼ºÀ´ËµÕâ²¢²»ÊÇʲô´óÎÊÌ⣬µ«ÊÇ£º

3.ÓÉÓÚLogstashÊÇÒ»¸ö±»Logspout¼àÊÓµÄÈÝÆ÷£¬¶øLogspout»á½«LogstashËùÓеÄÈÕ־ת·¢¸øLogstash£¬Õâ»áÔì³ÉÒ»¸ö·è¿ñµÄ ×ÔÐýÑ­»·²¢ÇÒ¼¸ºõ»áºÄ¾¡ÈÝÆ÷ÄÚËùÓеÄCPU×ÊÔ´£¨docker stats£¬Ò»¸ö·Ç³£ÓÐÓõÄÃüÁ¿ÉÒÔʵʱ±¨¸æÈÝÆ÷×ÊÔ´µÄʹÓÃÇé¿ö£¬ÎÒ¾ÍÊÇÓÃËüÀ´²¶×½µ½ÁËÉÏÊöµÄÎÊÌ⣩¡£

This can't be good.

ÄÇÒ»¸öºÚ¿Í»á×öÐ©Ê²Ã´ÄØ£¿µ±È»ÊǺڣ¨ÒëÕß×¢£ºÕâÀïÓ¦¸ÃÊǽâ¾öÎÊÌâµÄÒâ˼£©ËüÁË£¡ÎÒ¸´ÖÆ£¨fork£©ÁËEvanµÄԭʼµÄ Dockerfiles/repos²¢¸ü¸ÄÁËһЩ¶«Î÷¡£µÚÒ»²½£¬ÎÒ°ÑËùÓÐÈÝÆ÷ÈÓ½øÁËÒ»¸ödocker-compose.ymlÎļþµÄ·þÎñÖУ¬Èç´ËÒÔ±ã¿ìËÙ ²Î¿¼£¨ÕâÑùµ±ÎÒÏëÔÙ´ÎÆô¶¯docker¼¼ÊõÕ»µÄʱºò¾Í²»±ØÖظ´ÊäÈëËùÓÐdocker runÃüÁîÁË£©¡£ÎÒÔÚ the Logspout Github repoµÄÎĵµÖÐ×¢Òâµ½Äã¿ÉÒÔΪÈÝÆ÷Ö¸Ã÷Ò»¸ö»·¾³±äÁ¿À´ÈÃËüµÄÈÕÖ¾²»Òª×ª·¢¸øLogspout¡£ËùÒÔ£¬ÎÒÔÚLogstashÈÝÆ÷ÖÐÉèÖÃÁËÕâ¸ö»·¾³±äÁ¿£ºLOGSPOUT=ignore¡£

¶ÁÊéÒ²Ó¦¸Ã»á×¢Òâµ½£¬gliderlabs/logspout¾µÏñÏÖÔÚÏëÒªDockerÌ×½Ó×Ö¹ÒÔØµ½/var/run/docker.sock (¾­µäµÄλÖÃ), ¶ø²»ÊÇÒÔǰµÄ/tmp/docker.sock - ÔÚÎÒÒâʶµ½Õâµã֮ǰ£¬ÎÒÖð×ÖʹÓÃÁËEvanÎÄÕÂÖиø³öµÄÃüÁ¶øÕâÕâ¸øÎÒÔì³ÉÁ˺ܴóµÄÂé·³¡£ËùÒÔÇë×¢ÒâÕâ¸öÎÊÌ⣡£¡

ÏÖÔÚÕâ¸ö»·¾³£¨stack£©²»ÔÙ³öÏÖÄǸöÎÞÏÞÑ­»·À´±ÞÌ¢ÎÒµÄCPUÁË¡£²»¹ý»¹ÓÐÒ»¸öÌôÕ½£ºÄÇЩÔÚÈÕÖ¾ÖÐgrok½âÎöʧ°ÜµÄÏûÏ¢¡£ÎÄÕÂÖÐÌṩµÄ LogstashÅäÖÃÀý×Ó²»ÄÜºÜºÃµØÆ¥Å䣨ÒëÕß×¢£ºÔ­ÎÄjive well£¬²»ÖªµÀÒÔΪƥÅäÊÇ·ñºÏÊÊ£©logspoutµÄÊä³ö¡£ËùÒÔ£¬ÎªÁ˸üºÃµØÕÆÎÕ·¢ÉúÁËʲô£¬ÎÒ×öÁËÔÚÕâÖÖÇé¿öÏÂËùÓÐÈ˶¼»á×öÊÂÇ飺ÔĶÁ LogspoutÔ´Âë¡£

û¹ý¶à¾ÃÎÒżȻ·¢ÏÖÁËÕâ¸ö block of code related to the syslog adapter:

func NewSyslogAdapter(route *router.Route) (router.LogAdapter, error) {
transport, found := router.AdapterTransports.Lookup(route.AdapterTransport("udp"))
if !found {
return nil, errors.New("bad transport: " + route.Adapter)
}
conn, err := transport.Dial(route.Address, route.Options)
if err != nil {
return nil, err
}

format := getopt("SYSLOG_FORMAT", "rfc5424")
priority := getopt("SYSLOG_PRIORITY", "{{.Priority}}")
hostname := getopt("SYSLOG_HOSTNAME", "{{.Container.Config.Hostname}}")
pid := getopt("SYSLOG_PID", "{{.Container.State.Pid}}")
tag := getopt("SYSLOG_TAG", "{{.ContainerName}}"+route.Options["append_tag"])
structuredData := getopt("SYSLOG_STRUCTURED_DATA", "")
if route.Options["structured_data"] != "" {
structuredData = route.Options["structured_data"]
}
data := getopt("SYSLOG_DATA", "{{.Data}}")

var tmplStr string
switch format {
case "rfc5424":
tmplStr = fmt.Sprintf("<%s>1 {{.Timestamp}} %s %s %s - [%s] %s\n",
priority, hostname, tag, pid, structuredData, data)
case "rfc3164":
tmplStr = fmt.Sprintf("<%s>{{.Timestamp}} %s %s[%s]: %s\n",
priority, hostname, tag, pid, data)
default:
return nil, errors.New("unsupported syslog format: " + format)
}
tmpl, err := template.New("syslog").Parse(tmplStr)
if err != nil {
return nil, err
}
return &SyslogAdapter{
route: route,
conn: conn,
tmpl: tmpl,
}, nil

Ô­À´ÔÚÎÒµÄÀý×ÓÖÐLogspout°´ÕÕ syslog RFC5424±ê×¼À´×ª·¢ÈÕÖ¾µÄ£¨Äã¿ÉÒÔÔÚÉÏÃæµÄ´úÂëÖв鿴ĬÈϵÄÖµ£©¡£ÎÒ»¨ÁËһЩʱ¼äÔڷdz£ºÃÍæµÄ Logstash grok parse test appÉÏ£¬µ«Ö®ºóÎ񼆼̮æÍøÉÏÊÇ·ñÒѾ­Óнâ¾öÕâ¸öÎÊÌâµÄÏÖÓеÄ×ÊÔ´ÁË¡£ÎҺܿìµÄ¹È¸èÁËһϣ¬·¢ÏÖÁËÕâÆª ÎÄÕ£¬·Ç³£³öÉ«µÄÃèÊöÁËgrok parse filter,¶øÕâÕýÊÇÎÒÏëÒªµÄ¡£ÎÒ½ö½ö¸ÄÁ˲¿·Ö´úÂ루±ÈÈ磬ÎÒ°Ñ¡°app¡±¸ÄΪÁË¡°containername¡±£©¾ÍºÜ¿ìÉϵÀÁË - °ÑLogspoutµÄÈÕÖ¾½âÎöΪÓÐÓõÄÊý¾ÝÁË¡£

ÎÒ×îÖÕµÄLogstashÅäÖÃÎļþ¿´ÆðÀ´ÊÇÕâÑùµÄ£º

input {
tcp {
port => 5000
type => syslog
}
udp {
port => 5000
type => syslog
}
}

filter {
if [type] == "syslog" {
grok {
match => { "message" => "%{SYSLOG5424PRI}%{NONNEGINT:ver} +(?:%{TIMESTAMP_ISO8601:ts}|-) +(?:%{HOSTNAME:containerid}|-) +(?:%{NOTSPACE:containername}|-) +(?:%{NOTSPACE:proc}|-) +(?:%{WORD:msgid}|-) +(?:%{SYSLOG5424SD:sd}|-|) +%{GREEDYDATA:msg}" }
}
syslog_pri { }
date {
match => [ "syslog_timestamp", "MMM d HH:mm:ss", "MMM dd HH:mm:ss" ]
}
if !("_grokparsefailure" in [tags]) {
mutate {
replace => [ "@source_host", "%{syslog_hostname}" ]
replace => [ "@message", "%{syslog_message}" ]
}
}
mutate {
remove_field => [ "syslog_hostname", "syslog_message", "syslog_timestamp" ]
}
}
}

output {
elasticsearch { host => "elasticsearch" }
stdout { codec => rubydebug }

Ò²Ðí»¹ÓкܴóµÄ¸Ä½ø¿Õ¼ä£¬µ«Ê×ÏÈÎÒ»¹Ðë¸ü³ä·ÖµØÁ˽âLogstash ;P

So what?

ÏÖÔÚÎҵõ½ÁËÓÐÒâÒåµÄ¸ñʽµÄÈÕÖ¾ÁË£¬¶øÇÒÕⲢûÓжÔCPU²úÉú¶à´óµÄÓ°Ï죬̫°ôÁË£¡Ã¿µ±ÎÒÔÚÄÇ̨Ö÷»úÉÏÔËÐÐÒ»¸öÈÝÆ÷£¬ÈÕÖ¾¾Í»á×Ô¶¯µØÔÚ ElasticSearchÖб»Ë÷Òý²¢ÇÒ¿ÉÒÔÔÚKibanaÖнøÐвéѯ£¡Logstash¹ýÂËÆ÷¸ºÔð½«Ô­Ê¼µÄϵͳÈÕÖ¾ÏûÏ¢½âÎöΪ¸üÓÐÓõıêÇ©ÐÅÏ¢¡£Õâ°üÀ¨ ÉÏÎÄÌáµ½¹ýµÄ£¬À´×ÔÔËÐиü¼ÊõÕ»µÄÈÝÆ÷µÄÈÕÖ¾£¨³ýÁËLogstash - ²»È·¶¨ÈçºÎ´¦ÀíËü£¬»òÎÒÊÇ·ñÓ¦¸Ãµ£ÐÄËü¡£¿ÉÄÜÒ»¸ö¸½¼ÓµÄÅäÖòÎÊý¿ÉÒÔÈÃËü½ö´òÓ¡×ÔÉíµÄÈÕÖ¾µ½STDOUT¶ø²»ÊÇËùÓÐÈÝÆ÷µÄÈÕÖ¾£©¡£ÏëÏóÒ»ÏÂÕâÀà×Ô¶¯»¯ÈÝÆ÷ ÈÕÖ¾½«»áÊǶàôÓÐÓ㬵±Ëü´¦ÀíÀàËÆ RancherOSÕâÑùµÄËùÓÐϵͳ·þÎñ¶¼ÔËÐÐÔÚDockerÈÝÆ÷ÄÚ²¿µÄʱºò¡£

Äã¿ÉÒÔ¾ö¶¨ÔÚÈÕÖ¾ÐÅÏ¢ÖÐÏÔʾÄÄЩ×Ö¶ÎÒÔ±ãÀ´¿ìËٲ鿴ÄãµÄÓ¦ÓóÌÐò²úÉúµÄÈÕÖ¾¡£ÕâÑù¾Í¿ÉÒÔʵʱ¸ÐÊܵ½ÔÚÈÝÆ÷Öз¢ÉúµÄÊÂÇé¡£KibanaÓгä·ÖÄÜÁ¦ºÍ¿ÉÅäÖÃÐÔ£¬ÔÊÐíÄãͨ¹ýÄãËùÓµÓеIJ»Í¬×Ö¶ÎÀ´½øÐÐÅÅÐò£¬²éѯÒÔ¼°¹ýÂË¡£

Logs which are nice and easy to read and query!

³¢ÊÔÔÚÒ»¸öÅäÖÃÁËELK¼¼ÊõÕ»£¨ÒëÕß×¢£º°üÀ¨Elasticsearch£¬LogstashºÍKibana£©µÄÖ÷»úÉÏÔËÐÐÒ»¸öÈÝÆ÷£¬È»ºóÀ´²é¿´×Ô¶¯ÏÔʾÔÚKibanaÉϵÄÈÕÖ¾£¨Äã¿ÉÄÜÐèҪˢÐÂÄãµÄä¯ÀÀÆ÷»òµã»÷KibanaÉÏ¡°Ë¢Ð¡±µÄˢа´Å¥£©¡£

$ docker run -d --name number_spitter debian:jessie bash -c 'for i in {0..2000}; do echo $i; done'

ÄãÏÖÔÚ¿ÉÒÔ¿´µ½ÈÕÖ¾Öдó¶àÏûÏ¢À´×Ônumber_spitterÈÝÆ÷£¬ËüºÜ×ÔÈ»µØbash¹ö¶¯Ìõ£¨ÒëÕß×¢£ºÓ¦¸ÃÊÇÖ¸ÏÂͼ×îϱߵÄÄÇÒ»ÐУ©ÖÐÔÚͳöÁËÒ»´®Êý×Ö¡£

Whaaaaat! The Number Spitter container is so chatty!

Äã¿ÉÒÔÔÚÕâЩ»ù±¾µÄÉèÖÃÖ®ÉÏ×öºÜ¶à²»¿É˼ÒéµÄÊÂÇé¡£×ÔÈ»µØ£¬ÓÐÒ»¸ö¿ÉÒÔÓÃ×÷ÈÝÆ÷»î¶¯µÄ¿ÉÊÓ»¯±íʾµÄʱ¼äÐòÁÐͼ£¬¿ÉÒÔÈÃÄã·¢ÏÖÈȵ㣬²¢¿ìËÙÖªµÀ·¢ÉúÁËʲô£¬ÒÔ¼°ÎªÊ²Ã´»á·¢Éú¡£

What the hell happened here? I don't know, but I can find out.

ÏÔʾ£ºElasticSearchÈÝÆ÷µÄÕæÊµÊ¼þ¡£

ÓдóÁ¿µÄÊÂÇé¿ÉÒÔ²¢ÇÒÓ¦¸ÃÔÚÅäÖÃÁËLogstashÖ®ºóÀ´½øÐÐ - ÕâÀïÌÖÂÛµÄÅäÖÃÎļþ½ö½öÊÇÒ»¸ö¿ªÊ¼¡£ÓÐЩÈÝÆ÷ʹÓÃËüÃÇ×Ô¼ºµÄÈÕÖ¾¸ñʽ£¬ËüÃÇÐèÒª½øÒ»²½µÄ½øÐнâÎö¡£ÀýÈ磬ÔÚÉÏͼÖÐÏÔʾµÄKibanaÈÝÆ÷µÄ¡°±í¸ñʽ¡±¾ÍÓÐ Ëü×Ô¼ºµÄʱ¼ä´Á£¬ÒÔ¼°ÄÄЩIPµØÖ··ÃÎÊÄÄЩÎļþµÄÐÅÏ¢£¬HTTPÏìÓ¦µÄ״̬Â룬µÈ¡£

ËùÒÔ£¬ÕâЩ¸½¼ÓµÄÐÅÏ¢¾ø¶Ô¿ÉÒÔ±»½âÎöΪ¸üÓÐÓõĽṹ¸ñʽÖУ¬¶øÇÒÕâЩÊÂÇéÓ¦¸ÃÕë¶Ôÿ¸öÓ¦ÓóÌÐòÀ´×ö£¨on per-app basis£©¡£Í¬Ñù£¬Äã¿ÉÒÔÏëÏóһϣ¬µ±ÄãµÄÏûÏ¢ÒÔ¸ü¸ßµÄ¹æ¸ñµÄ»ú¹¹À´³ÊÏÖ£¬ËüÃÇ¿ÉÒÔÆ¥ÅäÒ»¸öģʽÀ´¸æËßÄãÊÇ·ñÓÐÓ¦ÓóÌÐò´ÓpanicÖÐÆô¶¯£¬»òÕßÔÚ´úÂë Ö´Ðз¾¶ÖÐÓöµ½ÁË¿ÕÖ¸ÕëÒì³££¬Òà»òÊDz»ÄÜÁ´½ÓÊý¾Ý¿âµÈ£¬¶¼»áÒÔÒ»¶¨µÄÓÅÏȼ¶ÔÚÈÕÖ¾ÖбíÏÖ³öÀ´£¬ÕâÓ¦¸ÃÊÇÒ»¼þºÜ¿áµÄÊÂÇé°É¡£

²¢ÇÒ£¬Èç¹ûLogspout°ÑDockerµÄʼþ£¨ÎÒ²»Çå³þÊÇ·ñÖ§³ÖÕâÑùµÄ¹¦ÄÜ£¬ÒòΪÎÒËÆºõ¼ÇµÃ¿´µ½Ò»Ð©ÈÝÆ÷µÄɾ³ýʵ«²¢Ã»ÓгöÏÖÆäËû±ðµÄ¶«Î÷£© ºÍ/»òDockerµÄºǫ́ÈÕ־Ҳת·¢¸øÁËLogstash ½«ÊÇÒ»¼þºÜÇÉÃîµÄÊÂÇé¡£¿ÉÄÜÓÐÒ»ÖÖ¿ÉÒÔÌæ´úLogstashµÄ¸ü¼òµ¥µÄ·½Ê½¡£

´ËÍ⣬Docker 1.6 µÄ log drivers¿É ÄÜ»áÒÔÉÔ΢²»Í¬¹ýµÄ·½Ê½À´×öÀàËÆµÄÊÂÇ飬ËùÒÔÎÒºÜºÃÆæµ±°Ñlog driver¿¼ÂǽøÀ´µÄ»°Õâ¸öÅäÖûáÓÐʲô±ä»¯¡£ÎÒ²»ÊǺÜÇå³þLogspoutµÄÄÚ²¿Ï¸½Ú£¬ËùÒÔÒ²²»ÖªµÀÊÇ·ñ¿ÉÒÔʹÓÃ--log-driver=none ²ÎÊýÀ´½ûµôlog driver,È»ºó¼ÌÐøÊ¹ÓÃLogspoutÀ´×ª·¢ÈÕÖ¾¡£Äǽ«»áºÜ¿áÒòΪÄãÖ»ÐèÒª¸úÖÐElasticSearchÖеÄÊý¾Ý£¬¶ø²»ÊǼÈÓÐ ElasticSearchÓÖÓÐ--log-driver=json¸ñʽµÄÊý¾Ý¡£

ÎÒÒ²²»ÊǺÜÈ·¶¨LogstashÊÇ·ñÖ§³Öʼþ£¨ÀýÈ磬¸øÒ»¸öÕýÔÚ´òµç»°µÄÈË·¢ËÍÓʼþ»ò¶ÌÐÅÊÇ·ñ»áÔÚÓÐÏÞʱ¼äÄÚÊÕµ½´óÁ¿µÄ´íÎ󣩣¬ÄÇÊÇÁíÒ»¸öDZÔÚµÄ Óÿò£¨ÒëÕß×¢£º±±¾©´óѧµÄÉÛάÖÒÀÏʦ¸æ½ëÎÒÃÇuse caseÓ¦¸ÃÒëΪÓÿò£©£¨Èç¹ûÕâÑùµÄÊÂÇ黹ûÓеõ½ºÜºÃÖ§³ÖÎÒ»á¸Ðµ½ºÜ³Ô¾ª£©¡£ÏëÏë¿´£¬ÕâÖÖÊÂÇéͬʱȷʵǿÁÒµØÐèÒªËÉÉ¢µÄ¼¯³É - ÀýÈ磬ÿ´ÎÎÒÃǹرÕÒ»¸ö·Ç½Ó´¥¶©ÔĵÄʱºò»á֪ͨÏúÊÛÆµµÀ£¬ÎÒÃÇÖªµÀÕâЩÊÂÇ飬ÒòΪËü±»ÓмǼÁËÏÂÀ´¡£²»¹ýÕâЩÅÜÌâÁË¡£

˵µ½ÅÜÌ⣬ÑÝʾ³ÌÐòͬʱ°üº¬ÁËÒ»¸ö cAdvisorµÄʵÀý£¬ÕâÊÇÒ»¸ö·Ç³£ÓÐÓõŤ¾ß£¬Ëü¿ÉÒÔ¼àÊÓÄãÈÝÆ÷ÖÐ×ÊÔ´µÄʹÓÃÇé¿ö¡£Äã¿ÉÒÔÔÚÔÚÄ㹤×÷µÄÖ÷»úµÄ8080ºÅ¶Ë¿Ú·ÃÎÊËü£º

Pretty graphs for your containers

ºÃÁË¡£ÎÒÓ¦¸ÃÂíÉÏ¿ªÊ¼Ê¹ÓÃÕâ¸öÂð£¿

Èç¹ûÄãÏë²»¼ÓÈκÎÐ޸IJ¢Á¢¼´ÔÚÉú²úÖÐʹÓÃÕâ¸öÅäÖã¬ÄÇÕâ²¢²»ÊÇÄãËùÒªµÄ£¬¾¡¹ÜËü¿´ÆðÀ´¾ø¶Ô±È¡°docker run, ¿ÉÄÜÖ®ºó»¹»áÓÃdocker logsÊÖ¶¯¼ì²é¡±ºÃºÜ¶à¡£ÐèÒª¿¼ÂÇһЩ¶îÍâµÄ¶«Î÷£¬²»·ÖÏȺó£º

1.ElasticSearch¸±±¾£ºÔÚ¶à¸ö½Úµã±£´æÊý¾ÝÀ´Ö§³ÖÈßÓà¡£ÒòΪ»á·¢ÉúÆæ¹ÖµÄÊÂÇ飬½Úµã»á¹Òµô£¬ÀíÏëÇé¿öÏÂÄãµÄ»ù´¡ÉèʩӦ¸Ã¿ÉÒÔÆ½ »¬µÄ´¦ÀíÕâÀà¹ÊÕÏ¡£Í¬Ñù£¬µ±ÄãÓжà¸öÖ÷»ú£¬ÔÚÿ¸ö½ÚµãÅäÖÃLogspoutʵÀýÀ´Ïò¡°master¡±Logstash£¨ÎÒ²»È·¶¨Ó¦¸ÃÈçºÎ´¦ÀíÕâÖÖDZÔÚµÄ¹Ê ÕϵãµÄÈßÓࣩÀ´×ª·¢Ö÷»úµÄÈÕÖ¾ÊÇÄãÐèÒª´¦ÀíµÄÊÂÇé¡£

2.±¸·Ý£¨Backing up£©ºÍÂÖת´æ´¢ÔÚElasticSearchÖеÄÈÕÖ¾Êý¾Ý¡£ÒªÊµÏÖÕâ¸ö£¬ÎÒÈ·¶¨ClusterHQ£¨×Ô³ÆÎª¡°container data people¡±£©½«»áÖúÄãÒ»±ÛÖ®Á¦;)

3.È·±£·ÃÎʽӿڱ»Ô¼ÊøÔÚÍøÂçºÍÓû§¼¶£¨ÑÝʾ³ÌÐò°ÑËùÓеĽӿڶ¼´ò¿ªÁË£¬ËùÒÔÈç¹ûÄãÔÚ¹«ÓÐÍøÂçÔËÐÐËüµÄʱºò£¬ËùÓÐÈ˶¼ÊÇ¿ÉÒÔ¿´µ½Ëü²¢¶ÔËü×öЩʲô£©

4.Ìí¼ÓÈÝÆ÷ÖØÆô²ßÂÔÒÔ¼°¼à¿Ø£¬À´È·±£·þÎñµÄ½¡¿µºÍÕý³£ÔËÐС£

5.ʹÓõÍȨÏÞÓû§À´ÔËÐÐÈÝÆ÷£¬ÕâÑù¿ÉÒÔÈ·±£¸üºÃµÄ°²È«ÐÔ

ËùÒÔ£¬ÔÚÏÖʵÖÐʹÓÃËüµÄʱºòÈÔÈ»ÓкܶàÊÂÇéÐèҪȥ¿¼ÂÇ£¬µ«ÎÒÏ£ÍûÎÒËù½²µÄÕâЩ¶«Î÷»á¶ÔÄãÓÐËùÆô·¢£¬¾ÍÏñÎÒ°ïÄãÔÚÄãµÄÍ·ÄÔÁ˰²×°Ò»Ð©Ð¡Ð¡³ÝÂÖ£¬Íƶ¯ ÄãÍê³ÉÕâÏ×÷¡£ÎÒÏëÏÖÔÚÒ»¸ö·Ç³£Ð¡µÄ´´Òµ¹«Ë¾¶¼ÊÇ¿ÉÒÔÔËÐÐÕâЩ¹¤¾ßµÄ£¬¶øÇÒÎÒºÜÐË·ÜÏñÕâÑùÊÀ½ç¼¶µÄ¹¤¾ß±äµÃÔ½À´Ô½¶àÁË¡£²»¹ÜÊÇÏÖÔÚ»¹Êǽ«À´£¬¶ÔÒ»¸öÍÅ¶Ó À´Ëµ×îÖÕËü¶¼»áʹÖÁ¹ØÖØÒªµÄ£¬ÒòΪËûÃÇÐèÒª½«Ê¹ÓÃÒ»¸öÃüÁîÀ´´¦Àí¶ą̀»úÆ÷(SRE)£¨ÒëÕß×¢£º²»ÖªµÀSREÊÇʲôÒâ˼£©, ÕýÊÇÕâÀ๤¾ßÈÃÕâһĿ±ê±äµÃ¸ü¾ß¿ÉÐÐÐÔ¡£

½áÓï

ÅóÓÑÃÇ£¬¸Ï½ô¶¯ÊÖÈ¥¼Ç¼ÈÕÖ¾°É£¡£¡Èç¹ûÄãÓÐʲôÏë·¨»ò½¨Ò飬¸æËßÎÒ¡£ÎÒÏ£Íû¿´µ½ÔÚ¹ØÓÚÕâÀàÊÂÇéµÄºóÐøÎÄÕ£¬¿ÉÄÜÄã¾ÍÊÇÏÂÒ»¸ö¡£

   
3796 ´Îä¯ÀÀ       31
 
Ïà¹ØÎÄÕÂ

ÔÆ¼ÆËãµÄ¼Ü¹¹
¶ÔÔÆ¼ÆËã·þÎñÄ£ÐÍ
ÔÆ¼ÆËãºËÐļ¼ÊõÆÊÎö
Á˽âÔÆ¼ÆËãµÄ©¶´
 
Ïà¹ØÎĵµ

ÔÆ¼ÆËã¼ò½é
ÔÆ¼ÆËã¼ò½éÓëÔÆ°²È«
ÏÂÒ»´úÍøÂç¼ÆËã--ÔÆ¼ÆËã
ÈídzÎöÔÆ¼ÆËã
 
Ïà¹Ø¿Î³Ì

ÔÆ¼ÆËãÔ­ÀíÓëÓ¦ÓÃ
ÔÆ¼ÆËãÓ¦ÓÃÓ뿪·¢
CMMIÌåϵÓëʵ¼ù
»ùÓÚCMMI±ê×¼µÄÈí¼þÖÊÁ¿±£Ö¤
×îл¼Æ»®
DeepSeekÔÚÈí¼þ²âÊÔÓ¦ÓÃʵ¼ù 4-12[ÔÚÏß]
DeepSeek´óÄ£ÐÍÓ¦Óÿª·¢Êµ¼ù 4-19[ÔÚÏß]
UAF¼Ü¹¹ÌåϵÓëʵ¼ù 4-11[±±¾©]
AIÖÇÄÜ»¯Èí¼þ²âÊÔ·½·¨Óëʵ¼ù 5-23[ÉϺ£]
»ùÓÚ UML ºÍEA½øÐзÖÎöÉè¼Æ 4-26[±±¾©]
ÒµÎñ¼Ü¹¹Éè¼ÆÓ뽨ģ 4-18[±±¾©]

ר¼ÒÊӽǿ´ITÓë¼Ü¹¹
Èí¼þ¼Ü¹¹Éè¼Æ
ÃæÏò·þÎñÌåϵ¼Ü¹¹ºÍÒµÎñ×é¼þµÄ˼¿¼
ÈËÈËÍøÒÆ¶¯¿ª·¢¼Ü¹¹
¼Ü¹¹¸¯»¯Ö®ÃÕ
̸ƽ̨¼´·þÎñPaaS
Ïà¹ØÅàѵ¿Î³Ì

ÔÆ¼ÆËãÔ­ÀíÓëÓ¦ÓÃ
Windows Azure ÔÆ¼ÆËãÓ¦ÓÃ

ĦÍÐÂÞÀ­ ÔÆÆ½Ì¨µÄ¹¹½¨ÓëÓ¦ÓÃ
ͨÓù«Ë¾GE DockerÔ­ÀíÓëʵ¼ù
ijÑз¢ÖÐÐÄ Openstackʵ¼ù
ÖªÃûµç×Ó¹«Ë¾ ÔÆÆ½Ì¨¼Ü¹¹ÓëÓ¦ÓÃ
ijµçÁ¦ÐÐÒµ »ùÓÚÔÆÆ½Ì¨¹¹½¨ÔÆ·þÎñ
ÔÆ¼ÆËãÓëWindows AzureÅàѵ
±±¾© ÔÆ¼ÆËãÔ­ÀíÓëÓ¦ÓÃ