<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
  <title>Continuous Learning</title>
  
  <subtitle>浮云一别后，流水十年间</subtitle>
  <link href="/atom.xml" rel="self"/>
  
  <link href="http://blog.decbug.com/"/>
  <updated>2018-04-23T01:39:07.608Z</updated>
  <id>http://blog.decbug.com/</id>
  
  <author>
    <name>CodeJuan</name>
    
  </author>
  
  <generator uri="http://hexo.io/">Hexo</generator>
  
  <entry>
    <title>闲扯资源利用率</title>
    <link href="http://blog.decbug.com/tco/"/>
    <id>http://blog.decbug.com/tco/</id>
    <published>2018-04-22T16:00:00.000Z</published>
    <updated>2018-04-23T01:39:07.608Z</updated>
    
    <content type="html"><![CDATA[<p>先看一段<a href="https://www.gartner.com/it-glossary/total-cost-of-ownership-tco" target="_blank" rel="external">Gartner</a>对于TCO的定义</p><blockquote><p>Gartner defines total cost of ownership (TCO) a comprehensive assessment of information technology (IT) or other costs across enterprise boundaries over time. For IT, TCO includes hardware and software acquisition, management and support, communications, end-user expenses and the opportunity cost of downtime, training and other productivity losses.</p></blockquote><a id="more"></a><p>试想一下，如果我们采购服务器的渠道被掐断，那么就只能通过不断提升现有机器的利用率，才能应对日益扩大的业务规模。</p><p><a href="https://en.wikipedia.org/wiki/Total_cost_of_ownership" target="_blank" rel="external">wiki描述</a><br>Technology deployment can include the following as part of TCO:</p><ul><li>Computer hardware and programs<ul><li>Network hardware and software</li><li>Server hardware and software</li><li>Workstation hardware and software</li><li>Installation and integration of hardware and software</li><li>Purchasing research</li><li>Warranties and licenses</li><li>License tracking - compliance</li><li>Migration expenses</li><li>Risks: susceptibility to vulnerabilities, availability of upgrades, patches and future licensing policies, etc.</li></ul></li><li>Operation expenses<ul><li>Infrastructure (floor space)</li><li>Electricity (for related equipment, cooling, backup power)</li><li>Testing costs</li><li>Downtime, outage and failure expenses</li><li>Diminished performance (i.e. users having to wait, diminished money-making ability)</li><li>Security (including breaches, loss of reputation, recovery and prevention)</li><li>Backup and recovery process</li><li>Technology training</li><li>Audit (internal and external)</li><li>Insurance</li><li>Information technology personnel</li><li>Corporate management time</li></ul></li><li>Long term expenses<ul><li>Replacement</li><li>Future upgrade or scalability expenses</li><li>Decommissioning</li></ul></li></ul>]]></content>
    
    <summary type="html">
    
      &lt;p&gt;先看一段&lt;a href=&quot;https://www.gartner.com/it-glossary/total-cost-of-ownership-tco&quot;&gt;Gartner&lt;/a&gt;对于TCO的定义&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Gartner defines total cost of ownership (TCO) a comprehensive assessment of information technology (IT) or other costs across enterprise boundaries over time. For IT, TCO includes hardware and software acquisition, management and support, communications, end-user expenses and the opportunity cost of downtime, training and other productivity losses.&lt;/p&gt;
&lt;/blockquote&gt;
    
    </summary>
    
      <category term="code" scheme="http://blog.decbug.com/categories/code/"/>
    
    
      <category term="Container" scheme="http://blog.decbug.com/tags/Container/"/>
    
  </entry>
  
  <entry>
    <title>迟到的2017总结</title>
    <link href="http://blog.decbug.com/2017_summary/"/>
    <id>http://blog.decbug.com/2017_summary/</id>
    <published>2018-03-30T17:00:00.000Z</published>
    <updated>2018-04-23T01:39:07.600Z</updated>
    
    <content type="html"><![CDATA[<p>从12月底就打算写的，但实在是太忙了，一直拖到现在。。。汗<br>不知不觉间，就到了18年的3月底，实在是不能再拖下去。顺便不能免俗一下，按照阿里财年做一次总结吧。<br><a id="more"></a></p><h1 id="工作"><a href="#工作" class="headerlink" title="工作"></a>工作</h1><h2 id="离开华为"><a href="#离开华为" class="headerlink" title="离开华为"></a>离开华为</h2><p>最终还是去了阿里。主要是两个原因</p><ol><li>在华为呆的时间越久，就让我越恐慌，觉得自己在慢慢丧失竞争力。其实在华为，我的绩效还可以，1A，3B+，3B，待遇也不错。如果继续干下去，也不是不可以。只是周围同事的一些遭遇，让我觉得很害怕，害怕自己也会步其后尘。</li><li>在容器这一块，阿里算是做的比较深的，规模也比较大。技术栈，和我之前的项目比较接近。</li></ol><h2 id="阿里"><a href="#阿里" class="headerlink" title="阿里"></a>阿里</h2><p>工作还是做容器相关的，感觉很难，很累，很痛苦。果然是如马老师所说，在阿里的每一天，都会特别不舒服，特别的委屈。</p><ol><li>规模太大，每天都很忙，压力很大。</li><li>阿里的代码质量，也不像外界看到的那么光彩夺目。每个牛逼项目的背后，都有码农的血和泪。</li><li>太忙了，除了吃饭睡觉如厕之外，就是在工作。希望等我理顺了手头的工作之后，能抽出点时间看书。</li><li>一不小心，背了一个故障，级别还不低的故障，此处应有泪水。说起来，我这回算是无端背锅。<ul><li>有bug的代码是我入职之前就有，是别的同学写的。</li><li>这个有问题的版本，是在我负责这个项目之前就发出去了的。但没有办法，我现在是负责人，总不能让级别比我低的同学去扛吧，只能我来扛了。</li><li>如果因为这个被打3.25，唉。。。。</li></ul></li></ol><p>除了这些不舒服，其实收获也挺大</p><ol><li>docker的源码（1.9和1.12）都撸了一遍，虽然谈不上特别熟悉，但至少把整个流程都趟了一遍。</li><li>终于有机会搞几万台机器了，随便一行代码的变更，都有可能带来很大的收益，或者是搞挂很多的服务。</li><li>有机会接触到内核方面的知识了，虽然目前还只是皮毛，但已然比以前要深入一些。</li><li>以前虽然做过一点k8s，swarm，但都比较浅。在这边耳濡目染，听了很多关于调度方面的知识，希望以后可以用到。</li></ol><h2 id="华为与阿里的区别"><a href="#华为与阿里的区别" class="headerlink" title="华为与阿里的区别"></a>华为与阿里的区别</h2><p>打卡，之类的表面问题姑且不提，就说几个事情吧。<br>在华为，有一个故障，是同事引入的一个bug。板子主要打在这位写代码的同事身上，而他的主管，则不痛不痒。我觉得，主管应该背同样的责任吧，作为主管，才会更加关注小弟们的产出。<br>在阿里，也出了一个故障，是一位同学误操作导致的，影响范围还不小。最后处罚，干活的同学最轻，直接主管次之，大老板最重。<br>还有另一个故障，事后邮件里有一句话给我留下了很深刻的印象，原文记不清了，大概是：“我们不知道谁操作的，也完全没有必要去知道。我们要调查的是整个过程有哪些漏洞，会让同学们误操作。只有我们的流程规范了，那么无论哪个同学来做这个事情，都不会再犯错误”。</p><h1 id="学习"><a href="#学习" class="headerlink" title="学习"></a>学习</h1><ul><li>做的事情比较杂，但好在都是和容器相关的，也不算荒废。</li><li>英语自然是没有丢下，如今在github厮混，或者是看英文文档毫无压力。但写起来依然还是会有语法错误，但恬不知耻的我毫不在意，只要别人能看懂就行。</li></ul><h1 id="生活"><a href="#生活" class="headerlink" title="生活"></a>生活</h1><p>这一年，生活的改变还是挺大的。</p><ul><li>父亲还是离我而去。刚离开的那一段时间里，我总是避免去想这个事情。但后来，时不时会想起，会做奇怪的梦。</li><li>脑子发热，买了一辆BBA。应该拿这个钱再买一套房的。</li><li>。。。。不写了，希望18年会更好。</li></ul><hr><p><code>本博客欢迎转发,但请保留原作者信息</code><br>github:<a href="https://github.com/CodeJuan" target="_blank" rel="external">codejuan</a><br>博客地址:<a href="http://blog.decbug.com/">http://blog.decbug.com/</a></p>]]></content>
    
    <summary type="html">
    
      &lt;p&gt;从12月底就打算写的，但实在是太忙了，一直拖到现在。。。汗&lt;br&gt;不知不觉间，就到了18年的3月底，实在是不能再拖下去。顺便不能免俗一下，按照阿里财年做一次总结吧。&lt;br&gt;
    
    </summary>
    
      <category term="mumble" scheme="http://blog.decbug.com/categories/mumble/"/>
    
    
      <category term="essay" scheme="http://blog.decbug.com/tags/essay/"/>
    
  </entry>
  
  <entry>
    <title>容器内reboot导致网卡丢失</title>
    <link href="http://blog.decbug.com/container_nic_losted/"/>
    <id>http://blog.decbug.com/container_nic_losted/</id>
    <published>2017-05-27T17:00:00.000Z</published>
    <updated>2018-04-23T01:39:07.604Z</updated>
    
    <content type="html"><![CDATA[<h1 id="问题描述"><a href="#问题描述" class="headerlink" title="问题描述"></a>问题描述</h1><p>在搞docker和lxc的结合体，也叫system container或machine container<a href="http://blog.decbug.com/lxc_docker/">http://blog.decbug.com/lxc_docker/</a></p><p>其实阿里在16年就已经做了类似的工作，结合lxc和docker完成了alidocker，有时候真心觉得互联网公司好厉害啊，技术领先了我等很多年。</p><p>闲话休提，言归正传。话说在改造之后，可以在容器内执行reboot。但是，在reboot之后，发现网卡丢了。</p><a id="more"></a><h1 id="先讲一下挂网卡的方案"><a href="#先讲一下挂网卡的方案" class="headerlink" title="先讲一下挂网卡的方案"></a>先讲一下挂网卡的方案</h1><p>我是基于openstack来发放容器，网络方案自然是用neutron了<br><figure class="highlight gherkin"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br></pre></td><td class="code"><pre><span class="line">+----------------------------------+</span><br><span class="line">|<span class="string">         container                </span>|</span><br><span class="line">|<span class="string">                                  </span>|</span><br><span class="line">|<span class="string">                                  </span>|</span><br><span class="line">|<span class="string">                                  </span>|</span><br><span class="line">|<span class="string">                                  </span>|</span><br><span class="line">|<span class="string">                                  </span>|</span><br><span class="line">|<span class="string">       +---------------+          </span>|</span><br><span class="line">|<span class="string">       </span>|<span class="string">  veth pair    </span>|<span class="string">          </span>|</span><br><span class="line">|<span class="string">       </span>|<span class="string">  ns-xxxxxxx   </span>|<span class="string">          </span>|</span><br><span class="line">+-------+------+--------+----------+</span><br><span class="line">               |<span class="string"></span><br><span class="line">               </span>|</span><br><span class="line">               |<span class="string"></span><br><span class="line">               </span>|</span><br><span class="line">        +------+--------+</span><br><span class="line">        |<span class="string"> veth pair     </span>|</span><br><span class="line">        |<span class="string"> tap-xxxxx     </span>|</span><br><span class="line">     +--+---------------+---+</span><br><span class="line">     |<span class="string">                      </span>|</span><br><span class="line">     |<span class="string">      qbr-xxxxx       </span>|</span><br><span class="line">     +----------+-----------+</span><br><span class="line">                |<span class="string"></span><br><span class="line">                </span>|</span><br><span class="line">     +----------+----------+</span><br><span class="line">     |<span class="string">  qvo,qvb,ply,plm    </span>|</span><br><span class="line">     |<span class="string">  与本文无关不细说      </span>|</span><br><span class="line">     +----------+----------+</span><br><span class="line">                |<span class="string"></span><br><span class="line">                </span>|</span><br><span class="line">                |<span class="string"></span><br><span class="line">      +---------+----------+</span><br><span class="line">      </span>|<span class="string">                    </span>|</span><br><span class="line">      |<span class="string">    br-tun          </span>|</span><br><span class="line">      +--------------------+</span><br></pre></td></tr></table></figure></p><h1 id="分析"><a href="#分析" class="headerlink" title="分析"></a>分析</h1><p>用十万个为什么来探究答案</p><ul><li>为何ns-xxxxx网卡会丢？那么对应的tap-xxxx是不是也丢了？</li><li>通过ip a查看宿主机上的设备，tap不见了。原因在于veth pair是成对出现的，丢一个就等于丢一对。那么qbr还在不在呢？</li><li>brctl show，qbr还在</li><li>在容器内执行reboot引起网卡丢失，reboot会停止init进程，使得容器的网络命名空间消失</li><li>When a IPC namespace is destroyed(i.e., When the last process that is a member of the namespace terminates), all IPC objects In the namespace are automatical destroyed.</li><li>When a network namespace is freed, its physical network devices are moved back to the initial network namespace. But how about the virtual network device?经过试验，虚拟设备会消失</li><li>这样就可以解释为何veth pair丢失的原因了</li></ul><h1 id="解决办法"><a href="#解决办法" class="headerlink" title="解决办法"></a>解决办法</h1><h2 id="失败的尝试"><a href="#失败的尝试" class="headerlink" title="失败的尝试"></a>失败的尝试</h2><p>有同事提到，可以参考虚拟机的做法，只创一个tap在qbr上，然后把tap挂到容器的namespace。据我看来，这个是不可行的，当tap设备从宿主机namespace挂到容器namespace，此tap与qbr的连接就会断开，网络就中断了。<br>虽然我有理论依据，但还是需要实际验证一下，方法如下：</p><ul><li>创一个tap,挂到docker0，ip addr add设置IP并up</li><li>在docker0上的另一个容器里ping这个tap，可以通</li><li>ip link set dev tap netns xxx，挂到netns xxx</li><li>ip netns exec xxx ip addr add 设置同样的IP</li><li>ip netns exec xxx ip route add default via <docker0 ip=""></docker0></li><li>在docker0上的另一个容器里ping这个tap，不通</li></ul><h2 id="参考lxc的做法"><a href="#参考lxc的做法" class="headerlink" title="参考lxc的做法"></a>参考lxc的做法</h2><blockquote><p>lxc在lxc.conf，保存了veth的Mac，IP，名字以及接到哪个qbr上</p></blockquote><p>我们在挂网卡的时候，也保存类似的配置，在容器start的时候，会检测是否有网卡，如果没有则挂上。</p><hr><p><code>本博客欢迎转发,但请保留原作者信息</code><br>github:<a href="https://github.com/CodeJuan" target="_blank" rel="external">codejuan</a><br>博客地址:<a href="http://blog.decbug.com/">http://blog.decbug.com/</a></p>]]></content>
    
    <summary type="html">
    
      &lt;h1 id=&quot;问题描述&quot;&gt;&lt;a href=&quot;#问题描述&quot; class=&quot;headerlink&quot; title=&quot;问题描述&quot;&gt;&lt;/a&gt;问题描述&lt;/h1&gt;&lt;p&gt;在搞docker和lxc的结合体，也叫system container或machine container&lt;a href=&quot;http://blog.decbug.com/lxc_docker/&quot;&gt;http://blog.decbug.com/lxc_docker/&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;其实阿里在16年就已经做了类似的工作，结合lxc和docker完成了alidocker，有时候真心觉得互联网公司好厉害啊，技术领先了我等很多年。&lt;/p&gt;
&lt;p&gt;闲话休提，言归正传。话说在改造之后，可以在容器内执行reboot。但是，在reboot之后，发现网卡丢了。&lt;/p&gt;
    
    </summary>
    
      <category term="code" scheme="http://blog.decbug.com/categories/code/"/>
    
    
      <category term="container" scheme="http://blog.decbug.com/tags/container/"/>
    
      <category term="network" scheme="http://blog.decbug.com/tags/network/"/>
    
  </entry>
  
  <entry>
    <title>用openstack管容器</title>
    <link href="http://blog.decbug.com/openstack_container/"/>
    <id>http://blog.decbug.com/openstack_container/</id>
    <published>2017-05-26T17:00:00.000Z</published>
    <updated>2018-04-23T01:39:07.608Z</updated>
    
    <content type="html"><![CDATA[<h1 id="与nova的结合"><a href="#与nova的结合" class="headerlink" title="与nova的结合"></a>与nova的结合</h1><p>做了个具有lxc特性的docker的结合，称之为系统容器，对外接口则是完全用docker daemon，更因为系统容器的对外呈现形式与虚拟机极为相似，所以选用nova-docker来管理容器生命周期。</p><p>参考之前写的<a href="http://blog.decbug.com/nova-lxd-lxc/">nova-lxd分析</a>，就不多涉及nova-docker的源码分析，大同小异。</p><p>主要记录下ceilometer与docker</p><a id="more"></a><h1 id="ceilometer的架构"><a href="#ceilometer的架构" class="headerlink" title="ceilometer的架构"></a>ceilometer的架构</h1><p>ceilometer架构<br><img src="https://cloud.githubusercontent.com/assets/5423628/26526506/4bd6cf18-43b0-11e7-8139-692ae54db511.png" alt=""></p><h2 id="控制节点"><a href="#控制节点" class="headerlink" title="控制节点"></a>控制节点</h2><ul><li>agent-central, 采集openstack其他组件的信息</li><li>alarm，报警</li><li>notification，通知</li><li>collector，从MQ上取指标，然后持久化</li></ul><h2 id="计算节点"><a href="#计算节点" class="headerlink" title="计算节点"></a>计算节点</h2><ul><li>agent-compute，采集实例的指标，比如kvm虚拟机，xen虚拟机，lxc容器</li><li>agent-hardware，采集物理机指标</li></ul><h2 id="inspector"><a href="#inspector" class="headerlink" title="inspector"></a>inspector</h2><ul><li>对于不同的虚拟化形态，需要用不同的inspector</li><li>流程： compute-&gt;pollster-&gt;get_samples-&gt;inspector-&gt;inspect_memory,inspect_cpu,inspect_nics,inspect_disk</li></ul><h3 id="kvm"><a href="#kvm" class="headerlink" title="kvm"></a>kvm</h3><ul><li>virsh dumpxml</li><li>virsh domvifstat</li><li>virsh dommemstat</li></ul><h3 id="xen"><a href="#xen" class="headerlink" title="xen"></a>xen</h3><p>有自己的API</p><h1 id="自己写的ceilometer-lxd"><a href="#自己写的ceilometer-lxd" class="headerlink" title="自己写的ceilometer-lxd"></a>自己写的ceilometer-lxd</h1><p>之前做用docker之前，弄的是lxd，也写了一个ceilometer-lxd</p><p>用于监控容器</p><ul><li>entry_points, lxd=xx.xx.</li><li>修改ceilometer-agent-compute.conf，inspector改为lxd</li><li>看pollster里的get_samples，会调用inspector里的get_cpu, get_memory等等</li><li>通过lxd daemon的restful api获取信息。config api可以得到cpu.limit，state api可以得到usage</li></ul><p>以inspect_cpu为例</p><ul><li>cgroup/cpuset/cpuset/usage</li><li>lxd restful api: container/<name>/state，获取当前CPU时间</name></li><li>container/<name>, config里有limit.cpu</name></li></ul><h1 id="自己写的ceilometer-docker"><a href="#自己写的ceilometer-docker" class="headerlink" title="自己写的ceilometer-docker"></a>自己写的ceilometer-docker</h1><h2 id="cpu"><a href="#cpu" class="headerlink" title="cpu"></a>cpu</h2><p>通过docker daemon的<a href="https://docs.docker.com/engine/api/v1.28/#operation/ContainerStats" target="_blank" rel="external">stat API</a>获取cpu_stats和precpu_stats，然后参考docker client源码中计算cpu百分比</p><h2 id="内存"><a href="#内存" class="headerlink" title="内存"></a>内存</h2><p>内存限额<br><figure class="highlight gradle"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="regexp">/sys/</span>fs<span class="regexp">/cgroup/m</span>emory<span class="regexp">/docker/</span>&lt;contaier ID&gt;<span class="regexp">/memory.limit_in_bytes</span></span><br></pre></td></tr></table></figure></p><p>内存用量<br><figure class="highlight gradle"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="regexp">/sys/</span>fs<span class="regexp">/cgroup/m</span>emory<span class="regexp">/docker/</span>&lt;contaier ID&gt;<span class="regexp">/memory.usage_in_bytes</span></span><br></pre></td></tr></table></figure></p><h2 id="网卡"><a href="#网卡" class="headerlink" title="网卡"></a>网卡</h2><ol><li>inspect获取到容器的Pid</li><li><p>/proc/<pid>/net/dev</pid></p><figure class="highlight cpp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line">Inter-|   Receive                                                |  Transmit</span><br><span class="line"> face |bytes    packets errs drop fifo frame compressed multicast|bytes    packets errs drop fifo colls carrier compressed</span><br><span class="line">    lo: <span class="number">6515790</span>   <span class="number">19839</span>    <span class="number">0</span>    <span class="number">0</span>    <span class="number">0</span>     <span class="number">0</span>          <span class="number">0</span>         <span class="number">0</span>  <span class="number">6515790</span>   <span class="number">19839</span>    <span class="number">0</span>    <span class="number">0</span>    <span class="number">0</span>     <span class="number">0</span>       <span class="number">0</span>          <span class="number">0</span></span><br><span class="line"> wlan1: <span class="number">535376943</span>  <span class="number">386866</span>    <span class="number">0</span> <span class="number">39847</span>    <span class="number">0</span>     <span class="number">0</span>          <span class="number">0</span>         <span class="number">0</span> <span class="number">30927899</span>  <span class="number">288216</span>    <span class="number">0</span> <span class="number">1996</span>    <span class="number">0</span>     <span class="number">0</span>       <span class="number">0</span>          <span class="number">0</span></span><br><span class="line">virbr0:       <span class="number">0</span>       <span class="number">0</span>    <span class="number">0</span>    <span class="number">0</span>    <span class="number">0</span>     <span class="number">0</span>          <span class="number">0</span>         <span class="number">0</span>        <span class="number">0</span>       <span class="number">0</span>    <span class="number">0</span>    <span class="number">0</span>    <span class="number">0</span>     <span class="number">0</span>       <span class="number">0</span>          <span class="number">0</span></span><br><span class="line">docker0:       <span class="number">0</span>       <span class="number">0</span>    <span class="number">0</span>    <span class="number">0</span>    <span class="number">0</span>     <span class="number">0</span>          <span class="number">0</span>         <span class="number">0</span>        <span class="number">0</span>       <span class="number">0</span>    <span class="number">0</span>    <span class="number">0</span>    <span class="number">0</span>     <span class="number">0</span>       <span class="number">0</span>          <span class="number">0</span></span><br><span class="line">  eth0:       <span class="number">0</span>       <span class="number">0</span>    <span class="number">0</span>    <span class="number">0</span>    <span class="number">0</span>     <span class="number">0</span>          <span class="number">0</span>         <span class="number">0</span>        <span class="number">0</span>       <span class="number">0</span>    <span class="number">0</span>    <span class="number">0</span>    <span class="number">0</span>     <span class="number">0</span>       <span class="number">0</span>          <span class="number">0</span></span><br></pre></td></tr></table></figure></li><li><p>解析出每个网卡收发字节数，包数</p></li></ol><h2 id="磁盘"><a href="#磁盘" class="headerlink" title="磁盘"></a>磁盘</h2><ol><li>inspect得到pid</li><li>/sys/fs/cgroup/blkio/docker/<pid>/blkio.io_service_bytes_recursive，得到IO字节数</pid></li><li>/sys/fs/cgroup/blkio/user/blkio.io_serviced_recursive，得到IO次数</li></ol><hr><p><code>本博客欢迎转发,但请保留原作者信息</code><br>github:<a href="https://github.com/CodeJuan" target="_blank" rel="external">codejuan</a><br>博客地址:<a href="http://blog.decbug.com/">http://blog.decbug.com/</a></p>]]></content>
    
    <summary type="html">
    
      &lt;h1 id=&quot;与nova的结合&quot;&gt;&lt;a href=&quot;#与nova的结合&quot; class=&quot;headerlink&quot; title=&quot;与nova的结合&quot;&gt;&lt;/a&gt;与nova的结合&lt;/h1&gt;&lt;p&gt;做了个具有lxc特性的docker的结合，称之为系统容器，对外接口则是完全用docker daemon，更因为系统容器的对外呈现形式与虚拟机极为相似，所以选用nova-docker来管理容器生命周期。&lt;/p&gt;
&lt;p&gt;参考之前写的&lt;a href=&quot;http://blog.decbug.com/nova-lxd-lxc/&quot;&gt;nova-lxd分析&lt;/a&gt;，就不多涉及nova-docker的源码分析，大同小异。&lt;/p&gt;
&lt;p&gt;主要记录下ceilometer与docker&lt;/p&gt;
    
    </summary>
    
      <category term="code" scheme="http://blog.decbug.com/categories/code/"/>
    
    
      <category term="LXC" scheme="http://blog.decbug.com/tags/LXC/"/>
    
      <category term="container" scheme="http://blog.decbug.com/tags/container/"/>
    
      <category term="docker" scheme="http://blog.decbug.com/tags/docker/"/>
    
      <category term="openstack" scheme="http://blog.decbug.com/tags/openstack/"/>
    
  </entry>
  
  <entry>
    <title>docker daemon调试套路</title>
    <link href="http://blog.decbug.com/docker_debug/"/>
    <id>http://blog.decbug.com/docker_debug/</id>
    <published>2017-05-22T16:00:00.000Z</published>
    <updated>2018-04-23T01:39:07.604Z</updated>
    
    <content type="html"><![CDATA[<p>容器突然退出？shim进程却还在？runc也在？daemon有句柄没释放？mount还在？这个该如何定位？<br>简单记录下常用方法<br><a id="more"></a></p><h1 id="daemon的调用过程"><a href="#daemon的调用过程" class="headerlink" title="daemon的调用过程"></a>daemon的调用过程</h1><figure class="highlight elixir"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">docker daemon -&gt; containerd -&gt; shim -&gt; runc</span><br></pre></td></tr></table></figure><h1 id="套路"><a href="#套路" class="headerlink" title="套路"></a>套路</h1><h2 id="看docker-daemon-log"><a href="#看docker-daemon-log" class="headerlink" title="看docker daemon log"></a>看docker daemon log</h2><ul><li>centos系是systemd启动的，location is <code></code>/var/log/message`</li><li>ubuntu是upstart， 在 <code>/var/log/upstart/docker</code></li></ul><p>如果需要更详细的log，在启动daemon的时候加上-D，即调试模式</p><h2 id="containerd-event"><a href="#containerd-event" class="headerlink" title="containerd event"></a>containerd event</h2><ul><li>/var/run/docker/libcontainerd/containerd/event</li></ul><h2 id="看shim进程"><a href="#看shim进程" class="headerlink" title="看shim进程"></a>看shim进程</h2><ul><li>ps，注意container ID</li></ul><h2 id="看句柄"><a href="#看句柄" class="headerlink" title="看句柄"></a>看句柄</h2><ul><li>打开的句柄，lsof -p $(cat /var/run/docker.pid)</li><li>泄漏, ls /proc/<pid>/fd -l</pid></li></ul><h2 id="看runc"><a href="#看runc" class="headerlink" title="看runc"></a>看runc</h2><ul><li>docker-ruc list</li></ul><h2 id="看stack"><a href="#看stack" class="headerlink" title="看stack"></a>看stack</h2><p>cat /proc/<pid>/stack</pid></p><h2 id="看容器的mount点"><a href="#看容器的mount点" class="headerlink" title="看容器的mount点"></a>看容器的mount点</h2><ul><li>mount</li><li>/proc/pid/mount</li></ul><h2 id="pprof"><a href="#pprof" class="headerlink" title="pprof"></a>pprof</h2><ul><li>daemon提供了pprof接口</li></ul><h2 id="实在不行，就只能fmt-print调试了"><a href="#实在不行，就只能fmt-print调试了" class="headerlink" title="实在不行，就只能fmt.print调试了"></a>实在不行，就只能fmt.print调试了</h2><p>还可以strace</p><hr><p><code>本博客欢迎转发,但请保留原作者信息</code><br>github:<a href="https://github.com/CodeJuan" target="_blank" rel="external">codejuan</a><br>博客地址:<a href="http://blog.decbug.com/">http://blog.decbug.com/</a></p>]]></content>
    
    <summary type="html">
    
      &lt;p&gt;容器突然退出？shim进程却还在？runc也在？daemon有句柄没释放？mount还在？这个该如何定位？&lt;br&gt;简单记录下常用方法&lt;br&gt;
    
    </summary>
    
      <category term="code" scheme="http://blog.decbug.com/categories/code/"/>
    
    
      <category term="debug" scheme="http://blog.decbug.com/tags/debug/"/>
    
      <category term="docker" scheme="http://blog.decbug.com/tags/docker/"/>
    
  </entry>
  
  <entry>
    <title>pinpoint分析</title>
    <link href="http://blog.decbug.com/pinpoint/"/>
    <id>http://blog.decbug.com/pinpoint/</id>
    <published>2017-05-05T17:00:00.000Z</published>
    <updated>2018-04-23T01:39:07.608Z</updated>
    
    <content type="html"><![CDATA[<p><img src="https://github.com/naver/pinpoint/raw/master/doc/img/ss_server-map.png" alt=""></p><p>pinpoint，不用侵入到用户代码，在JVM插入agent实现调用链。与鹰眼，zipkin等白盒方式不同的是，pinpoint不要侵入代码，可以称之为灰盒（论文将调用链分为三种，白盒灰盒，黑盒）。</p><a id="more"></a><p><img src="https://github.com/naver/pinpoint/raw/master/doc/img/ss_call-stack.png" alt=""></p><h1 id="架构"><a href="#架构" class="headerlink" title="架构"></a>架构</h1><p><img src="https://github.com/naver/pinpoint/raw/master/doc/img/pinpoint-architecture.png" alt=""><br>分为三个组件，agent（最重要，核心功能），collector（收集，大家的做法都差不多），UI</p><h1 id="agent说明"><a href="#agent说明" class="headerlink" title="agent说明"></a>agent说明</h1><blockquote><p>Pinpoint Agent attaches itself to a host application (such as Tomcat) as a java agent to instrument various classes for tracing. When a class marked for tracing is loaded into the JVM, the Agent injects code around pre-defined methods to collect and send trace data to the Collector.<br>  In addition to trace data, the agent also collects various information about the host application such as JVM arguments, loaded libraries, CPU usage, Memory Usage and Garbage Collection.</p></blockquote><p>在JVM层插入agent，在指定方法外包一层自定义代码，加上trace data和JVM usage等信息</p><p><img src="https://cloud.githubusercontent.com/assets/8037461/13870778/0073df06-ed22-11e5-97a3-ebe116186947.jpg" alt=""><br>如图所示</p><ul><li>从FrountEnd出来的原始message之外被agent加上了transaction ID, span ID等等trace data，关于这些ID的作用，可以查看dapper的定义</li><li>BackEnd收到消息后，先由agent把trace data解析出来，然后再把原始message交给BackEnd的方法</li></ul><h2 id="原理"><a href="#原理" class="headerlink" title="原理"></a>原理</h2><p>在<a href="https://github.com/naver/pinpoint/blob/master/doc/installation.md#installation-3" target="_blank" rel="external">安装文档</a>上可以看到</p><blockquote><p>To wire up the agent, pass $AGENT_PATH/pinpoint-bootstrap-$VERSION.jar to the -javaagent JVM argument when running the application:</p><ul><li>-javaagent:$AGENT_PATH/pinpoint-bootstrap-$VERSION.jar<br>Additionally, Pinpoint Agent requires 2 command-line arguments in order to identify itself in the distributed system:</li><li>-Dpinpoint.agentId - uniquely identifies the application instance in which the agent is running on</li><li>-Dpinpoint.applicationName - groups a number of identical application instances as a single service</li></ul></blockquote><p>说明用的是JVM agent的方式,你假笨的<a href="http://www.infoq.com/cn/articles/javaagent-illustrated" target="_blank" rel="external">JVM源码分析之javaagent原理完全解读</a>对此有过分析。<br>大概就是，采用类似hook的机制，修改指定类某些方法，使之执行我的附加代码。在pinpoint则是，进行trace相关的操作</p><h2 id="插件示例"><a href="#插件示例" class="headerlink" title="插件示例"></a>插件示例</h2><p><a href="https://github.com/naver/pinpoint-plugin-sample/blob/master/plugin/src/main/java/com/navercorp/pinpoint/plugin/sample/_13_RPC_Client/Sample_13_RPC_Client.java#L38" target="_blank" rel="external">Sample_13_RPC_Client.java</a></p><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">public</span> <span class="keyword">byte</span>[] doInTransform(Instrumentor instrumentor, ClassLoader classLoader, String className, Class&lt;?&gt; classBeingRedefined, ProtectionDomain protectionDomain, <span class="keyword">byte</span>[] classfileBuffer) <span class="keyword">throws</span> InstrumentException &#123;</span><br><span class="line">    InstrumentClass target = instrumentor.getInstrumentClass(classLoader, className, classfileBuffer);</span><br><span class="line"></span><br><span class="line">    target.addGetter(<span class="string">"com.navercorp.pinpoint.plugin.sample._13_RPC_Client.ServerAddressGetter"</span>, <span class="string">"serverAddress"</span>);</span><br><span class="line">    target.addGetter(<span class="string">"com.navercorp.pinpoint.plugin.sample._13_RPC_Client.ServerPortGetter"</span>, <span class="string">"serverPort"</span>);</span><br><span class="line"></span><br><span class="line">    <span class="comment">// 这里在com.navercorp.plugin.sample.target.TargetClass13_Request的sendRequest增加了Interceptor</span></span><br><span class="line">    target.getDeclaredMethod(<span class="string">"sendRequest"</span>, <span class="string">"com.navercorp.plugin.sample.target.TargetClass13_Request"</span>).addInterceptor(<span class="string">"com.navercorp.pinpoint.plugin.sample._13_RPC_Client.SendRequestInterceptor"</span>);</span><br><span class="line"></span><br><span class="line">    <span class="keyword">return</span> target.toBytecode();</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>Interceptor有两个方法before和after<br><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br></pre></td><td class="code"><pre><span class="line"><span class="annotation">@Override</span></span><br><span class="line"><span class="function"><span class="keyword">public</span> <span class="keyword">void</span> <span class="title">before</span><span class="params">(Object target, Object arg0)</span> </span>&#123;</span><br><span class="line">    Trace trace = traceContext.currentTraceObject();</span><br><span class="line">    <span class="keyword">if</span> (trace == <span class="keyword">null</span>) &#123;</span><br><span class="line">        <span class="keyword">return</span>;</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    TargetClass13_Request request = (TargetClass13_Request) arg0;</span><br><span class="line"></span><br><span class="line">    <span class="keyword">if</span> (trace.canSampled()) &#123;</span><br><span class="line">        SpanEventRecorder recorder = trace.traceBlockBegin();</span><br><span class="line"></span><br><span class="line">        <span class="comment">// RPC call trace have to be recorded with a service code in RPC client code range.</span></span><br><span class="line">        recorder.recordServiceType(SamplePluginConstants.MY_RPC_CLIENT_SERVICE_TYPE);</span><br><span class="line"></span><br><span class="line">        <span class="comment">// You have to issue a TraceId the receiver of this request will use.</span></span><br><span class="line">        TraceId nextId = trace.getTraceId().getNextTraceId();</span><br><span class="line"></span><br><span class="line">        <span class="comment">// Then record it as next span id.</span></span><br><span class="line">        recorder.recordNextSpanId(nextId.getSpanId());</span><br><span class="line"></span><br><span class="line">        <span class="comment">// Finally, pass some tracing data to the server.</span></span><br><span class="line">        <span class="comment">// How to put them in a message is protocol specific.</span></span><br><span class="line">        <span class="comment">// This example assumes that the target protocol message can include any metadata (like HTTP headers).</span></span><br><span class="line">        request.addMetadata(SamplePluginConstants.META_TRANSACTION_ID, nextId.getTransactionId());</span><br><span class="line">        request.addMetadata(SamplePluginConstants.META_SPAN_ID, Long.toString(nextId.getSpanId()));</span><br><span class="line">        request.addMetadata(SamplePluginConstants.META_PARENT_SPAN_ID, Long.toString(nextId.getParentSpanId()));</span><br><span class="line">        request.addMetadata(SamplePluginConstants.META_PARENT_APPLICATION_TYPE, Short.toString(traceContext.getServerTypeCode()));</span><br><span class="line">        request.addMetadata(SamplePluginConstants.META_PARENT_APPLICATION_NAME, traceContext.getApplicationName());</span><br><span class="line">        request.addMetadata(SamplePluginConstants.META_FLAGS, Short.toString(nextId.getFlags()));</span><br><span class="line">    &#125; <span class="keyword">else</span> &#123;</span><br><span class="line">        <span class="comment">// If sampling this transaction is disabled, pass only that infomation to the server.</span></span><br><span class="line">        request.addMetadata(SamplePluginConstants.META_DO_NOT_TRACE, <span class="string">"1"</span>);</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure></p><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br></pre></td><td class="code"><pre><span class="line"><span class="annotation">@Override</span></span><br><span class="line"><span class="function"><span class="keyword">public</span> <span class="keyword">void</span> <span class="title">after</span><span class="params">(Object target, Object arg0, Object result, Throwable throwable)</span> </span>&#123;</span><br><span class="line">    Trace trace = traceContext.currentTraceObject();</span><br><span class="line">    <span class="keyword">if</span> (trace == <span class="keyword">null</span>) &#123;</span><br><span class="line">        <span class="keyword">return</span>;</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="keyword">try</span> &#123;</span><br><span class="line">        SpanEventRecorder recorder = trace.currentSpanEventRecorder();</span><br><span class="line"></span><br><span class="line">        recorder.recordApi(descriptor);</span><br><span class="line"></span><br><span class="line">        <span class="keyword">if</span> (throwable == <span class="keyword">null</span>) &#123;</span><br><span class="line">            <span class="comment">// RPC client have to record end point (server address)</span></span><br><span class="line">            String serverAddress = ((ServerAddressGetter) target)._$PREFIX$_getServerAddress();</span><br><span class="line">            <span class="keyword">int</span> port = ((ServerPortGetter) target)._$PREFIX$_getServerPort();</span><br><span class="line">            recorder.recordEndPoint(serverAddress + <span class="string">":"</span> + port);</span><br><span class="line"></span><br><span class="line">            TargetClass13_Request request = (TargetClass13_Request) arg0;</span><br><span class="line">            <span class="comment">// Optionally, record the destination id (logical name of server. e.g. DB name)</span></span><br><span class="line">            recorder.recordDestinationId(request.getNamespace());</span><br><span class="line">            recorder.recordAttribute(SamplePluginConstants.MY_RPC_PROCEDURE_ANNOTATION_KEY, request.getProcedure());</span><br><span class="line">            recorder.recordAttribute(SamplePluginConstants.MY_RPC_ARGUMENT_ANNOTATION_KEY, request.getArgument());</span><br><span class="line">            recorder.recordAttribute(SamplePluginConstants.MY_RPC_RESULT_ANNOTATION_KEY, result);</span><br><span class="line">        &#125; <span class="keyword">else</span> &#123;</span><br><span class="line">            recorder.recordException(throwable);</span><br><span class="line">        &#125;</span><br><span class="line">    &#125; <span class="keyword">finally</span> &#123;</span><br><span class="line">        trace.traceBlockEnd();</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>分别会在sendRequest的前后执行，完成生成trace data和record</p><hr><p><code>本博客欢迎转发,但请保留原作者信息</code><br>github:<a href="https://github.com/CodeJuan" target="_blank" rel="external">codejuan</a><br>博客地址:<a href="http://blog.decbug.com/">http://blog.decbug.com/</a></p>]]></content>
    
    <summary type="html">
    
      &lt;p&gt;&lt;img src=&quot;https://github.com/naver/pinpoint/raw/master/doc/img/ss_server-map.png&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;pinpoint，不用侵入到用户代码，在JVM插入agent实现调用链。与鹰眼，zipkin等白盒方式不同的是，pinpoint不要侵入代码，可以称之为灰盒（论文将调用链分为三种，白盒灰盒，黑盒）。&lt;/p&gt;
    
    </summary>
    
      <category term="code" scheme="http://blog.decbug.com/categories/code/"/>
    
    
      <category term="tracing" scheme="http://blog.decbug.com/tags/tracing/"/>
    
  </entry>
  
  <entry>
    <title>docker源码分析--create,update</title>
    <link href="http://blog.decbug.com/dockerd-containerd-runc/"/>
    <id>http://blog.decbug.com/dockerd-containerd-runc/</id>
    <published>2017-04-27T17:00:00.000Z</published>
    <updated>2018-04-23T01:39:07.604Z</updated>
    
    <content type="html"><![CDATA[<p>1.11大重构之后，和1.6不一样了，简单看下流程，记个笔记</p><a id="more"></a><h1 id="docker-create"><a href="#docker-create" class="headerlink" title="docker create"></a>docker create</h1><p><img src="https://cloud.githubusercontent.com/assets/5423628/25509115/2d5fe742-2be9-11e7-8afa-833f4a5e1f4f.png" alt="image"></p><p><img src="https://cloud.githubusercontent.com/assets/5423628/25509046/aa1979b6-2be8-11e7-9c2a-8406a1012687.png" alt="image"></p><p><img src="https://cloud.githubusercontent.com/assets/5423628/25509038/962cdb82-2be8-11e7-8805-c26317e2776b.png" alt="image"></p><p><img src="https://cloud.githubusercontent.com/assets/5423628/25509071/e8495f3a-2be8-11e7-8699-d4a501191b15.png" alt="image"></p><h1 id="docker-update"><a href="#docker-update" class="headerlink" title="docker update"></a>docker update</h1><p><img src="https://cloud.githubusercontent.com/assets/5423628/25508941/e683a26a-2be7-11e7-84eb-3710d7872f05.png" alt="image"></p><hr><p><code>本博客欢迎转发,但请保留原作者信息</code><br>github:<a href="https://github.com/CodeJuan" target="_blank" rel="external">codejuan</a><br>博客地址:<a href="http://blog.decbug.com/">http://blog.decbug.com/</a></p>]]></content>
    
    <summary type="html">
    
      &lt;p&gt;1.11大重构之后，和1.6不一样了，简单看下流程，记个笔记&lt;/p&gt;
    
    </summary>
    
      <category term="code" scheme="http://blog.decbug.com/categories/code/"/>
    
    
      <category term="container" scheme="http://blog.decbug.com/tags/container/"/>
    
      <category term="docker" scheme="http://blog.decbug.com/tags/docker/"/>
    
  </entry>
  
  <entry>
    <title>向运行的容器加设备</title>
    <link href="http://blog.decbug.com/attach_device_to_running_container/"/>
    <id>http://blog.decbug.com/attach_device_to_running_container/</id>
    <published>2017-04-26T17:00:00.000Z</published>
    <updated>2018-04-23T01:39:07.600Z</updated>
    
    <content type="html"><![CDATA[<p>创建容器的时候，可以通过-device，-v来加设备加path，也可以加网卡，但是缺乏向运行时的容器加设备的方法</p><a id="more"></a><p><img src="https://cloud.githubusercontent.com/assets/5423628/25509049/b7c78df0-2be8-11e7-8149-3182dacf6d03.png" alt=""></p><hr><p><code>本博客欢迎转发,但请保留原作者信息</code><br>github:<a href="https://github.com/CodeJuan" target="_blank" rel="external">codejuan</a><br>博客地址:<a href="http://blog.decbug.com/">http://blog.decbug.com/</a></p>]]></content>
    
    <summary type="html">
    
      &lt;p&gt;创建容器的时候，可以通过-device，-v来加设备加path，也可以加网卡，但是缺乏向运行时的容器加设备的方法&lt;/p&gt;
    
    </summary>
    
      <category term="code" scheme="http://blog.decbug.com/categories/code/"/>
    
    
      <category term="container" scheme="http://blog.decbug.com/tags/container/"/>
    
      <category term="docker" scheme="http://blog.decbug.com/tags/docker/"/>
    
  </entry>
  
  <entry>
    <title>CloudInsightAgent源码分析</title>
    <link href="http://blog.decbug.com/cloudinght_agent_src/"/>
    <id>http://blog.decbug.com/cloudinght_agent_src/</id>
    <published>2017-03-31T16:00:00.000Z</published>
    <updated>2018-04-23T01:39:07.600Z</updated>
    
    <content type="html"><![CDATA[<p>之前模仿sysdig做了个容器性能监控平台，<a href="http://blog.decbug.com/2016/12/06/sysdig_knockoff/">链接在此</a>，虽然有一些基础的功能，但是还不完善，</p><p>恰好看到cloud insight开源了他的agent，看过之后，和我的思路差不多，就简单记录一下，避免遗忘。</p><a id="more"></a><h1 id="代码"><a href="#代码" class="headerlink" title="代码"></a>代码</h1><p><a href="https://github.com/cloudinsight/cloudinsight-agent" target="_blank" rel="external">https://github.com/cloudinsight/cloudinsight-agent</a></p><p>据说之前是python，后来切换到go</p><h1 id="整体结构"><a href="#整体结构" class="headerlink" title="整体结构"></a>整体结构</h1><figure class="highlight sh"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line">├── agent</span><br><span class="line">├── collector</span><br><span class="line">│   ├── conf.d          <span class="comment"># plugins的配置文件，比如MySQL的连接串</span></span><br><span class="line">│   └── plugins         <span class="comment"># plugin的代码，有docker，MySQL等</span></span><br><span class="line">├── common              <span class="comment"># 公共包</span></span><br><span class="line">├── forwarder           <span class="comment"># 发到cloud insight服务器</span></span><br><span class="line">├── statsd</span><br><span class="line">└── vendor              <span class="comment"># 三方包</span></span><br></pre></td></tr></table></figure><h1 id="整体流程"><a href="#整体流程" class="headerlink" title="整体流程"></a>整体流程</h1><p>init的时候会加载cloudinsight-agent/collector/plugins的插件</p><figure class="highlight gherkin"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br></pre></td><td class="code"><pre><span class="line">+------------------------------------------+</span><br><span class="line">|<span class="string"> main                                     </span>|</span><br><span class="line">|<span class="string">                                          </span>|</span><br><span class="line">|<span class="string">                                          </span>|</span><br><span class="line">|<span class="string">                                          </span>|</span><br><span class="line">|<span class="string">      +-------------------+               </span>|</span><br><span class="line">|<span class="string">      </span>|<span class="string">config.NewConfig   </span>|<span class="string">               </span>|</span><br><span class="line">|<span class="string">      </span>|<span class="string">                   </span>|<span class="string">               </span>|</span><br><span class="line">|<span class="string">      +-------------------+               </span>|</span><br><span class="line">|<span class="string">                                          </span>|</span><br><span class="line">|<span class="string">                                          </span>|</span><br><span class="line">|<span class="string">      +-------------------+               </span>|</span><br><span class="line">|<span class="string">      </span>|<span class="string">startAgent         </span>|<span class="string">               </span>|</span><br><span class="line">|<span class="string">      </span>|<span class="string">                   </span>|<span class="string">               </span>|</span><br><span class="line">|<span class="string">      +-------------------+               </span>|</span><br><span class="line">|<span class="string">                                          </span>|</span><br><span class="line">|<span class="string">                                          </span>|</span><br><span class="line">|<span class="string">      +-------------------+               </span>|</span><br><span class="line">|<span class="string">      </span>|<span class="string">startForwarder     </span>|<span class="string">               </span>|</span><br><span class="line">|<span class="string">      </span>|<span class="string">                   </span>|<span class="string">               </span>|</span><br><span class="line">|<span class="string">      +-------------------+               </span>|</span><br><span class="line">|<span class="string">                                          </span>|</span><br><span class="line">|<span class="string">                                          </span>|</span><br><span class="line">|<span class="string">      +-------------------+               </span>|</span><br><span class="line">|<span class="string">      </span>|<span class="string">startStatsd        </span>|<span class="string">               </span>|</span><br><span class="line">|<span class="string">      </span>|<span class="string">                   </span>|<span class="string">               </span>|</span><br><span class="line">|<span class="string">      +-------------------+               </span>|</span><br><span class="line">|<span class="string">                                          </span>|</span><br><span class="line">|<span class="string">                                          </span>|</span><br><span class="line">|<span class="string">                                          </span>|</span><br><span class="line">|<span class="string">                                          </span>|</span><br><span class="line">+------------------------------------------+</span><br></pre></td></tr></table></figure><h1 id="agent"><a href="#agent" class="headerlink" title="agent"></a>agent</h1><p>collector</p><h2 id="plugins"><a href="#plugins" class="headerlink" title="plugins"></a>plugins</h2><h2 id="config"><a href="#config" class="headerlink" title="config"></a>config</h2><h2 id="以docker为例"><a href="#以docker为例" class="headerlink" title="以docker为例"></a>以docker为例</h2><p>Check接口，调用docker daemon的rest api采集</p><hr><p><code>本博客欢迎转发,但请保留原作者信息</code><br>github:<a href="https://github.com/CodeJuan" target="_blank" rel="external">codejuan</a><br>博客地址:<a href="http://blog.decbug.com/">http://blog.decbug.com/</a></p>]]></content>
    
    <summary type="html">
    
      &lt;p&gt;之前模仿sysdig做了个容器性能监控平台，&lt;a href=&quot;http://blog.decbug.com/2016/12/06/sysdig_knockoff/&quot;&gt;链接在此&lt;/a&gt;，虽然有一些基础的功能，但是还不完善，&lt;/p&gt;
&lt;p&gt;恰好看到cloud insight开源了他的agent，看过之后，和我的思路差不多，就简单记录一下，避免遗忘。&lt;/p&gt;
    
    </summary>
    
      <category term="code" scheme="http://blog.decbug.com/categories/code/"/>
    
    
      <category term="APM" scheme="http://blog.decbug.com/tags/APM/"/>
    
      <category term="monitoring" scheme="http://blog.decbug.com/tags/monitoring/"/>
    
  </entry>
  
  <entry>
    <title>云计算网络安全</title>
    <link href="http://blog.decbug.com/cloud_network_security/"/>
    <id>http://blog.decbug.com/cloud_network_security/</id>
    <published>2017-03-02T16:00:00.000Z</published>
    <updated>2018-04-23T01:39:07.600Z</updated>
    
    <content type="html"><![CDATA[<p>近日关于云计算安全的问题，闹的沸沸扬扬。某不才，也算是云计算入门人士，便结合自身经历分析一番。</p><a id="more"></a><h1 id="也曾被黑过"><a href="#也曾被黑过" class="headerlink" title="也曾被黑过"></a>也曾被黑过</h1><p>当时用的阿里云华北1，只有经典网络。那时候很天真，以为即使是经典网络，那么也是租户隔离的。为了便于几台机器互相调用，于是把安全组设置为内网入，所有协议，所有IP，所有端口都允许。</p><p>然而几天以后，某个机器无法SSH上去，通过vnc一看，不得了，竟然内核都被人改了。当时百思不得其解，我这个机器完全没有连外网啊，怎么会被黑呢？怎么会呢？</p><p>后来才知道经典网络是互通的，相互之间的隔离是通过安全组。默认的安全组是全部拒绝的，如果不是我手贱，就不会那么容易被黑。</p><h1 id="也谈VPC"><a href="#也谈VPC" class="headerlink" title="也谈VPC"></a>也谈VPC</h1><p>具体细节不谈了，之前也看过VxLan的原理。如果想深入，看看neurtron的组网就明白了，net，subnet，port</p><p>所谓VPC，就是隔离隔离隔离，简单来说，就是对于虚拟机所看到的网络，和别人的网络是不通的。如果当时用的VPC，就已经和其他租户隔离了，被黑的概率大为降低。</p><h1 id="阿里云容器服务"><a href="#阿里云容器服务" class="headerlink" title="阿里云容器服务"></a>阿里云容器服务</h1><p>分析清除了之前被黑的原因，便看了看我阿里云下的安全组，发现竟然有两条不是我自己创的。看了下名字以及创建时间，想起来是之前用容器服务的时候创建的。</p><p>再打开规则一看，一看吓一跳</p><table><thead><tr><th>授权策略</th><th>协议类型</th><th>端口范围</th><th>授权类型</th><th>授权对象</th><th>优先级</th><th>操作</th></tr></thead><tbody><tr><td>允许</td><td>全部</td><td>-1/-1</td><td>地址段访问</td><td>0.0.0.0/0</td><td>1</td><td>克隆 删除</td></tr></tbody></table><p>竟然是全部允许。后来联系阿里云容器服务的易立大侠，报告这个安全问题，得知这个问题早已修复。</p><h1 id="小结"><a href="#小结" class="headerlink" title="小结"></a>小结</h1><p>能用VPC就用VPC，虽然会稍微复杂一点，但安全性大为提高。</p><p>另外再问一句，为啥阿里云华北1只有经典网络？就因为比其他region便宜10%？</p><h1 id="备份"><a href="#备份" class="headerlink" title="备份"></a>备份</h1><p><a href="https://www.v2ex.com/t/343762?from=groupmessage&amp;isappinstalled=0" target="_blank" rel="external">云舒：给小白的租户隔离科普文</a><br><a href="http://weibo.com/ttarticle/p/show?id=2309404079443999097225" target="_blank" rel="external">左耳朵耗子：科普一下公有云的网络</a></p><hr><p><code>本博客欢迎转发,但请保留原作者信息</code><br>github:<a href="https://github.com/CodeJuan" target="_blank" rel="external">codejuan</a><br>博客地址:<a href="http://blog.decbug.com/">http://blog.decbug.com/</a></p>]]></content>
    
    <summary type="html">
    
      &lt;p&gt;近日关于云计算安全的问题，闹的沸沸扬扬。某不才，也算是云计算入门人士，便结合自身经历分析一番。&lt;/p&gt;
    
    </summary>
    
      <category term="code" scheme="http://blog.decbug.com/categories/code/"/>
    
    
      <category term="cloud" scheme="http://blog.decbug.com/tags/cloud/"/>
    
      <category term="security" scheme="http://blog.decbug.com/tags/security/"/>
    
  </entry>
  
  <entry>
    <title>Run a full OpenStack in a LXD container</title>
    <link href="http://blog.decbug.com/openstack_in_lxc/"/>
    <id>http://blog.decbug.com/openstack_in_lxc/</id>
    <published>2017-02-25T16:00:00.000Z</published>
    <updated>2018-04-23T01:39:07.608Z</updated>
    
    <content type="html"><![CDATA[<p>鉴于lxc容器特别像虚拟机的特点，rackspace，都有把openstack部署到lxc容器里的实践，恰好lxc也有类似教程，打算自己跑一遍，看看是怎样一种体验</p><p>how to run a full OpenStack, using LXD containers instead of VMs and running all of this inside a LXD container (nesting!).</p><a id="more"></a><h1 id="安装lxd"><a href="#安装lxd" class="headerlink" title="安装lxd"></a>安装lxd</h1><p>还是ubuntu好，直接apt就行了，不像在centos上，需要从头开始编译liblxc,lxd<a href="https://github.com/CodeJuan/lxc_lxd" target="_blank" rel="external">试验记录</a>。更可怕的是，AppArmor/SeLinux/Seccomp/user namespace/都需要另外安装，如果不安装，就需要在编译liblxc时disable掉</p><figure class="highlight sh"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">sudo apt-get update</span><br><span class="line">sudo apt -t trusty-backports install lxd</span><br></pre></td></tr></table></figure><p>安装完成后，查看版本<br><figure class="highlight elixir"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">i3<span class="variable">@i3</span><span class="symbol">:~</span><span class="variable">$ </span>lxc --version</span><br><span class="line"><span class="number">2.0</span>.<span class="number">8</span></span><br><span class="line">i3<span class="variable">@i3</span><span class="symbol">:~</span><span class="variable">$ </span>lxd --version</span><br><span class="line"><span class="number">2.0</span>.<span class="number">8</span></span><br></pre></td></tr></table></figure></p><h2 id="安装ZFS"><a href="#安装ZFS" class="headerlink" title="安装ZFS"></a>安装ZFS</h2><table><thead><tr><th style="text-align:left">Feature</th><th style="text-align:left">Directory</th><th style="text-align:left">Btrfs</th><th style="text-align:left">LVM</th><th style="text-align:left">ZFS</th></tr></thead><tbody><tr><td style="text-align:left">Optimized image storage</td><td style="text-align:left">no</td><td style="text-align:left">yes</td><td style="text-align:left">yes</td><td style="text-align:left">yes</td></tr><tr><td style="text-align:left">Optimized container creation</td><td style="text-align:left">no</td><td style="text-align:left">yes</td><td style="text-align:left">yes</td><td style="text-align:left">yes</td></tr><tr><td style="text-align:left">Optimized snapshot creation</td><td style="text-align:left">no</td><td style="text-align:left">yes</td><td style="text-align:left">yes</td><td style="text-align:left">yes</td></tr><tr><td style="text-align:left">Optimized image transfer</td><td style="text-align:left">no</td><td style="text-align:left">yes</td><td style="text-align:left">no</td><td style="text-align:left">yes</td></tr><tr><td style="text-align:left">Optimized container transfer</td><td style="text-align:left">no</td><td style="text-align:left">yes</td><td style="text-align:left">no</td><td style="text-align:left">yes</td></tr><tr><td style="text-align:left">Copy on write</td><td style="text-align:left">no</td><td style="text-align:left">yes</td><td style="text-align:left">yes</td><td style="text-align:left">yes</td></tr><tr><td style="text-align:left">Block based</td><td style="text-align:left">no</td><td style="text-align:left">no</td><td style="text-align:left">yes</td><td style="text-align:left">no</td></tr><tr><td style="text-align:left">Instant cloning</td><td style="text-align:left">no</td><td style="text-align:left">yes</td><td style="text-align:left">yes</td><td style="text-align:left">yes</td></tr><tr><td style="text-align:left">Nesting support</td><td style="text-align:left">yes</td><td style="text-align:left">yes</td><td style="text-align:left">no</td><td style="text-align:left">no</td></tr><tr><td style="text-align:left">Restore from older snapshots (not latest)</td><td style="text-align:left">yes</td><td style="text-align:left">yes</td><td style="text-align:left">yes</td><td style="text-align:left">no</td></tr><tr><td style="text-align:left">Storage quotas</td><td style="text-align:left">no</td><td style="text-align:left">yes</td><td style="text-align:left">no</td><td style="text-align:left">yes</td></tr></tbody></table><p>lxc支持的存储后端，看来ZFS不错，打算用他</p><figure class="highlight vim"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">sudo apt-<span class="built_in">add</span>-repository <span class="keyword">pp</span><span class="variable">a:zfs</span>-native/stable</span><br><span class="line">sudo apt <span class="keyword">update</span></span><br><span class="line">sudo apt install ubuntu-zfs</span><br></pre></td></tr></table></figure><h2 id="init-lxd"><a href="#init-lxd" class="headerlink" title="init lxd"></a>init lxd</h2><figure class="highlight nginx"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="title">sudo</span> lxd init</span><br></pre></td></tr></table></figure><p>需要注意：如果是想在嵌套容器里跑openstack，那么网络只选择IPV4和存储后端用DIR</p><p>完成后<br><figure class="highlight xquery"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="variable">$brctl</span> show</span><br><span class="line">lxdbr<span class="number">0</span><span class="number">8000.000000000000</span>no</span><br></pre></td></tr></table></figure></p><p>多了一个linux桥</p><h2 id="启动容器"><a href="#启动容器" class="headerlink" title="启动容器"></a>启动容器</h2><figure class="highlight xml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br></pre></td><td class="code"><pre><span class="line">sudo lxc launch ubuntu:16.04 first</span><br><span class="line"></span><br><span class="line"># 进入到容器</span><br><span class="line">sudo lxc exec first -- bash</span><br><span class="line"></span><br><span class="line">root@first:~# curl aliyun.com</span><br><span class="line"><span class="doctype">&lt;!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN"&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="title">html</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="title">head</span>&gt;</span><span class="tag">&lt;<span class="title">title</span>&gt;</span>301 Moved Permanently<span class="tag">&lt;/<span class="title">title</span>&gt;</span><span class="tag">&lt;/<span class="title">head</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="title">body</span> <span class="attribute">bgcolor</span>=<span class="value">"white"</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="title">h1</span>&gt;</span>301 Moved Permanently<span class="tag">&lt;/<span class="title">h1</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="title">p</span>&gt;</span>The requested resource has been assigned a new permanent URI.<span class="tag">&lt;/<span class="title">p</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="title">hr</span>/&gt;</span>Powered by Tengine/Aserver<span class="tag">&lt;/<span class="title">body</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;/<span class="title">html</span>&gt;</span></span><br></pre></td></tr></table></figure><h2 id="resource-control"><a href="#resource-control" class="headerlink" title="resource control"></a>resource control</h2><p><a href="https://stgraber.org/2016/03/26/lxd-2-0-resource-control-412/" target="_blank" rel="external">https://stgraber.org/2016/03/26/lxd-2-0-resource-control-412/</a></p><h3 id="cpu"><a href="#cpu" class="headerlink" title="cpu"></a>cpu</h3><figure class="highlight elixir"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line">i3<span class="variable">@i3</span><span class="symbol">:~</span><span class="variable">$ </span>sudo lxc config set first limits.cpu <span class="number">1</span></span><br><span class="line">i3<span class="variable">@i3</span><span class="symbol">:~</span><span class="variable">$ </span>sudo lxc exec first -- bash</span><br><span class="line">root<span class="variable">@first</span><span class="symbol">:~</span><span class="comment"># cat /proc/cpuinfo</span></span><br><span class="line">processor<span class="symbol">:</span> <span class="number">0</span></span><br><span class="line"></span><br><span class="line">只能看到一个核</span><br></pre></td></tr></table></figure><h3 id="内存"><a href="#内存" class="headerlink" title="内存"></a>内存</h3><figure class="highlight tcl"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line">root@first:~# cat /<span class="keyword">proc</span>/meminfo<span class="symbol"></span><br><span class="line">MemTotal:</span>       16095260<span class="symbol"> kB</span></span><br><span class="line"><span class="symbol"></span><br><span class="line">i3@i3:~$</span> sudo<span class="symbol"> lxc</span> config<span class="symbol"> set</span> first<span class="symbol"> limits.memory</span> 512MB<span class="symbol"></span><br><span class="line">i3@i3:~$</span> sudo<span class="symbol"> lxc</span> exec<span class="symbol"> first</span> --<span class="symbol"> bash</span></span><br><span class="line">root@first:~#<span class="symbol"> cat</span> /<span class="keyword">proc</span>/meminfo<span class="symbol"></span><br><span class="line">MemTotal:</span>         524288<span class="symbol"> kB</span></span><br></pre></td></tr></table></figure><h1 id="openstack"><a href="#openstack" class="headerlink" title="openstack"></a>openstack</h1><h2 id="容器已经成功创建，开始尝试openstack"><a href="#容器已经成功创建，开始尝试openstack" class="headerlink" title="容器已经成功创建，开始尝试openstack"></a>容器已经成功创建，开始尝试openstack</h2><figure class="highlight swift"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">sudo lxc <span class="keyword">init</span> ubuntu:<span class="number">16.04</span> openstack -<span class="built_in">c</span> security.privileged=<span class="literal">true</span> -<span class="built_in">c</span> security.nesting=<span class="literal">true</span> -<span class="built_in">c</span> <span class="string">"linux.kernel_modules=iptable_nat, ip6table_nat, ebtables, openvswitch, nbd"</span></span><br><span class="line">printf <span class="string">"lxc.cap.drop=\nlxc.aa_profile=unconfined\n"</span> | sudo lxc config <span class="keyword">set</span> openstack raw.lxc -</span><br><span class="line">sudo lxc config device add openstack mem unix-char path=/dev/mem</span><br><span class="line">sudo lxc start openstack</span><br></pre></td></tr></table></figure><h2 id="可以看到openstack容器已经运行"><a href="#可以看到openstack容器已经运行" class="headerlink" title="可以看到openstack容器已经运行"></a>可以看到openstack容器已经运行</h2><figure class="highlight asciidoc"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line"><span class="header">i3@i3:~$ sudo lxc list</span><br><span class="line">+-----------+---------+----------------------+------+------------+-----------+</span></span><br><span class="line"><span class="header">|   NAME    |  STATE  |         IPV4         | IPV6 |    TYPE    | SNAPSHOTS |</span><br><span class="line">+-----------+---------+----------------------+------+------------+-----------+</span></span><br><span class="line"><span class="header">| openstack | RUNNING | 10.84.103.125 (eth0) |      | PERSISTENT | 0         |</span><br><span class="line">+-----------+---------+----------------------+------+------------+-----------+</span></span><br></pre></td></tr></table></figure><h2 id="安装juju"><a href="#安装juju" class="headerlink" title="安装juju"></a>安装juju</h2><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line">sudo lxc <span class="built_in">exec</span> openstack -- apt update</span><br><span class="line">sudo lxc <span class="built_in">exec</span> openstack -- apt dist-upgrade -y</span><br><span class="line">sudo lxc <span class="built_in">exec</span> openstack -- apt install squashfuse -y</span><br><span class="line">sudo lxc <span class="built_in">exec</span> openstack -- ln <span class="operator">-s</span> /bin/<span class="literal">true</span> /usr/<span class="built_in">local</span>/bin/udevadm</span><br><span class="line">sudo lxc <span class="built_in">exec</span> openstack -- snap install conjure-up --classic</span><br></pre></td></tr></table></figure><p>初始化容器里的lxd<br><figure class="highlight applescript"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">sudo lxc exec openstack <span class="comment">-- lxd init</span></span><br></pre></td></tr></table></figure></p><h1 id="参考"><a href="#参考" class="headerlink" title="参考"></a>参考</h1><p><a href="https://stgraber.org/2016/10/26/lxd-2-0-lxd-and-openstack-1112/" target="_blank" rel="external">https://stgraber.org/2016/10/26/lxd-2-0-lxd-and-openstack-1112/</a><br><a href="https://stgraber.org/2016/03/15/lxd-2-0-installing-and-configuring-lxd-212/" target="_blank" rel="external">https://stgraber.org/2016/03/15/lxd-2-0-installing-and-configuring-lxd-212/</a></p><hr><p><code>本博客欢迎转发,但请保留原作者信息</code><br>github:<a href="https://github.com/CodeJuan" target="_blank" rel="external">codejuan</a><br>博客地址:<a href="http://blog.decbug.com/">http://blog.decbug.com/</a></p>]]></content>
    
    <summary type="html">
    
      &lt;p&gt;鉴于lxc容器特别像虚拟机的特点，rackspace，都有把openstack部署到lxc容器里的实践，恰好lxc也有类似教程，打算自己跑一遍，看看是怎样一种体验&lt;/p&gt;
&lt;p&gt;how to run a full OpenStack, using LXD containers instead of VMs and running all of this inside a LXD container (nesting!).&lt;/p&gt;
    
    </summary>
    
      <category term="code" scheme="http://blog.decbug.com/categories/code/"/>
    
    
      <category term="APM" scheme="http://blog.decbug.com/tags/APM/"/>
    
  </entry>
  
  <entry>
    <title>cloud-init</title>
    <link href="http://blog.decbug.com/cloud-init/"/>
    <id>http://blog.decbug.com/cloud-init/</id>
    <published>2017-02-23T16:00:00.000Z</published>
    <updated>2018-04-23T01:39:07.600Z</updated>
    
    <content type="html"><![CDATA[<p>刚创出来的虚拟机，要如何设置初始密码？如何添加环境变量？如何进行一系列的预置操作？<br>答案就是cloud-init。<br>当前正在搞openstack+lxc，也需要在创容器的时候注入一些信息，比如初始密码，开启SSH密码登录，允许root等等，就顺手记录cloud-init一下。</p><a id="more"></a><p>对于open stack来说，cloud-init可以通过两种方式获取数据</p><ol><li>config drive</li><li>通过meta-data服务获取</li></ol><h1 id="config-drive"><a href="#config-drive" class="headerlink" title="config drive"></a>config drive</h1><p>大概原理及流程</p><ol><li>生成相关的meta-data.json, user-data</li><li>制作iso9xxx格式的iso</li><li>挂载到/dev/vdb</li><li>cloud-init配置datasource为config drive</li><li>cloud-init读取，进行配置</li></ol><h1 id="meta-data"><a href="#meta-data" class="headerlink" title="meta-data"></a>meta-data</h1><ol><li>nova有个meta-data服务</li><li>创虚拟机的时候，配置一条路由169.254.169.254</li><li>cloud-init配置datasource为openstack</li><li>从<a href="http://169.254.169.254/openstack获取meta-data.json" target="_blank" rel="external">http://169.254.169.254/openstack获取meta-data.json</a></li><li>进行配置</li></ol><h1 id="user-data"><a href="#user-data" class="headerlink" title="user-data"></a>user-data</h1><p>nova boot –user-data config.txt</p><figure class="highlight avrasm"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br></pre></td><td class="code"><pre><span class="line"><span class="preprocessor">#cloud-config</span></span><br><span class="line"><span class="label">chpasswd:</span></span><br><span class="line">  list: |</span><br><span class="line">    root:root</span><br><span class="line">    abc:password1</span><br><span class="line"><span class="label">pwauth:</span> True</span><br><span class="line"><span class="label">sshpasswd:</span> yes</span><br><span class="line"></span><br><span class="line"><span class="label">writefiles:</span></span><br><span class="line">  PermitRoot: yes</span><br></pre></td></tr></table></figure><h1 id="参考"><a href="#参考" class="headerlink" title="参考"></a>参考</h1><p><a href="https://help.ubuntu.com/community/CloudInit" target="_blank" rel="external">https://help.ubuntu.com/community/CloudInit</a><br><a href="http://www.ibm.com/developerworks/cn/cloud/library/1509_liukg_openstackmeta/index.html" target="_blank" rel="external">http://www.ibm.com/developerworks/cn/cloud/library/1509_liukg_openstackmeta/index.html</a><br><a href="http://www.chenshake.com/openstack-mirror-and-password/" target="_blank" rel="external">http://www.chenshake.com/openstack-mirror-and-password/</a></p><hr><p><code>本博客欢迎转发,但请保留原作者信息</code><br>github:<a href="https://github.com/CodeJuan" target="_blank" rel="external">codejuan</a><br>博客地址:<a href="http://blog.decbug.com/">http://blog.decbug.com/</a></p>]]></content>
    
    <summary type="html">
    
      &lt;p&gt;刚创出来的虚拟机，要如何设置初始密码？如何添加环境变量？如何进行一系列的预置操作？&lt;br&gt;答案就是cloud-init。&lt;br&gt;当前正在搞openstack+lxc，也需要在创容器的时候注入一些信息，比如初始密码，开启SSH密码登录，允许root等等，就顺手记录cloud-init一下。&lt;/p&gt;
    
    </summary>
    
      <category term="code" scheme="http://blog.decbug.com/categories/code/"/>
    
    
      <category term="openstack" scheme="http://blog.decbug.com/tags/openstack/"/>
    
  </entry>
  
  <entry>
    <title>LXC,docker</title>
    <link href="http://blog.decbug.com/lxc_docker/"/>
    <id>http://blog.decbug.com/lxc_docker/</id>
    <published>2017-02-10T16:00:00.000Z</published>
    <updated>2018-04-23T01:39:07.604Z</updated>
    
    <content type="html"><![CDATA[<p>docker偏向于应用，LXC偏向于资源，其产品形态更像是一台虚拟机，所以其有个名字叫系统容器/机器容器。<br>然而，在当前docker大势已成，虚拟机经久不衰的形势下，lxc的优势和劣势都有哪些？</p><a id="more"></a><h1 id="LXC-vs-VM"><a href="#LXC-vs-VM" class="headerlink" title="LXC vs. VM"></a>LXC vs. VM</h1><table><thead><tr><th>对比</th><th>LXC</th><th>VM</th></tr></thead><tbody><tr><td>hyper层</td><td>用namespace,cgroup,无</td><td>有，KVM/XEN</td></tr><tr><td>内核</td><td>共用host</td><td>有guest</td></tr><tr><td>启动</td><td>秒</td><td>分</td></tr></tbody></table><p>可以说，docker的优点，LXC都有，然而其形态却更像虚拟机</p><h1 id="LXC-vs-docker"><a href="#LXC-vs-docker" class="headerlink" title="LXC vs. docker"></a>LXC vs. docker</h1><table><thead><tr><th>对比</th><th>LXC</th><th>docker</th></tr></thead><tbody><tr><td>init进程</td><td>有systemd作为init进程</td><td>entrypoint或cmd里的进程，其实就是业务进程，如果业务进程挂了，容器也跟着消失</td></tr><tr><td>行为</td><td>可以shutdown，reboot等等</td><td>业务进程的生命周期</td></tr><tr><td>网络</td><td>也是veth peer接到网络命名空间</td><td>同</td></tr><tr><td>存储</td><td>多种，默认dir后端则是直接用host上的文件夹,/var/lib/lxd/containers/xxxx/rootfs</td><td>aufs,devicemapper</td></tr><tr><td>生态</td><td>与openstack比较紧密，nova-lxd,nova-libvirtdriver-libvirtlxc</td><td>k8s,</td></tr></tbody></table><h1 id="总结"><a href="#总结" class="headerlink" title="总结"></a>总结</h1><ul><li>轻应用，新应用都是微服务化，做docker化改造不算难</li><li>传统重应用，已然在虚机/物理机上跑得好好的，如果没有足够的收益，不足以说服去迁移到lxc</li><li>现实的问题，由于docker太火，很多应用都已经docker化了</li><li>lxc主要的场景，就在于虚拟机和docker的夹缝之中<ol><li>需要用到物理机设备的重型应用，比如GPU？虚拟机的虚拟化层需要做适配，docker则对此类重型应用水土不服。</li><li>经过测试LXC的IO，网络性能与物理机基本一致，性能比虚拟机要好。</li><li>比docker更像虚拟机，比虚拟机更轻量性能更好？</li></ol></li></ul><hr><p><code>本博客欢迎转发,但请保留原作者信息</code><br>github:<a href="https://github.com/CodeJuan" target="_blank" rel="external">codejuan</a><br>博客地址:<a href="http://blog.decbug.com/">http://blog.decbug.com/</a></p>]]></content>
    
    <summary type="html">
    
      &lt;p&gt;docker偏向于应用，LXC偏向于资源，其产品形态更像是一台虚拟机，所以其有个名字叫系统容器/机器容器。&lt;br&gt;然而，在当前docker大势已成，虚拟机经久不衰的形势下，lxc的优势和劣势都有哪些？&lt;/p&gt;
    
    </summary>
    
      <category term="code" scheme="http://blog.decbug.com/categories/code/"/>
    
    
      <category term="LXC" scheme="http://blog.decbug.com/tags/LXC/"/>
    
      <category term="docker" scheme="http://blog.decbug.com/tags/docker/"/>
    
  </entry>
  
  <entry>
    <title>lxd,lxc,nova-lxd</title>
    <link href="http://blog.decbug.com/nova-lxd-lxc/"/>
    <id>http://blog.decbug.com/nova-lxd-lxc/</id>
    <published>2017-02-10T16:00:00.000Z</published>
    <updated>2018-04-23T01:39:07.604Z</updated>
    
    <content type="html"><![CDATA[<p>分析一下lxc, lxd, nova-lxd的关系以及源码</p><ul><li><a href="https://github.com/openstack/nova-lxd" target="_blank" rel="external">nova-lxd</a>,An OpenStack Compute driver for LXD</li><li><a href="https://github.com/lxc/lxd" target="_blank" rel="external">lxd</a>，lxd daemon和lxd client</li><li><a href="https://github.com/lxc/lxc" target="_blank" rel="external">lxc</a>，liblxc和lxc-tools</li></ul><h1 id="关系"><a href="#关系" class="headerlink" title="关系"></a>关系</h1><figure class="highlight sh"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br></pre></td><td class="code"><pre><span class="line">                              +---------------+</span><br><span class="line">+----------+                  |               |</span><br><span class="line">| lxc      |                  |   nova-lxd    |</span><br><span class="line">| lxd-client+---+      +------+               |</span><br><span class="line">+----------+    |      |      |               |</span><br><span class="line">                |      |      +---------------+</span><br><span class="line">                |      |</span><br><span class="line">                |      |</span><br><span class="line">             +--v------v---------+</span><br><span class="line">             |     lxd           |</span><br><span class="line">             |                   |</span><br><span class="line">             |Daemon based on    |</span><br><span class="line">             |liblxc offering    |</span><br><span class="line">             |a REST API         |                  +-------------------------+</span><br><span class="line">             |to manage containers                  |                         |</span><br><span class="line">             +--------+----------+                  |   lxc/lxc               |</span><br><span class="line">                      |                             |   tools to              |</span><br><span class="line">                      |                             |   manage containers     |</span><br><span class="line">                      |                             |                         |</span><br><span class="line">             +--------v----------+                  |                         |</span><br><span class="line">             |                   |                  |                         |</span><br><span class="line">             |      go-lxc./v2   |                  +--------+----------------+</span><br><span class="line">             |                   |                           |</span><br><span class="line">             |                   |                           |</span><br><span class="line">             |                   |                           |</span><br><span class="line">             +----------+--------+                           |</span><br><span class="line">                        |                                    |</span><br><span class="line">                        |                                    |</span><br><span class="line">                        |                                    |</span><br><span class="line">                        |                                    |</span><br><span class="line">              +---------v------------------------------------v---------+</span><br><span class="line">              |                                                        |</span><br><span class="line">              |                                                        |</span><br><span class="line">              |                    liblxc.so                           |</span><br><span class="line">              |                                                        |</span><br><span class="line">              +-------------------------+------------------------------+</span><br><span class="line">                                        |</span><br><span class="line">                                        |</span><br><span class="line">                                        |</span><br><span class="line">              +-------------------------v------------------------------+</span><br><span class="line">              |                                                        |</span><br><span class="line">              |                                                        |</span><br><span class="line">              |                kernel                                  |</span><br><span class="line">              |                namespace, cgroups                      |</span><br><span class="line">              |                                                        |</span><br><span class="line">              |                                                        |</span><br><span class="line">              |                                                        |</span><br><span class="line">              +--------------------------------------------------------+</span><br></pre></td></tr></table></figure><a id="more"></a><h1 id="lxd分析"><a href="#lxd分析" class="headerlink" title="lxd分析"></a>lxd分析</h1><p>包含两部分</p><ul><li>lxd, 类似docker daemon，对外提供restful api</li><li>lxc, lxd daemon的客户端</li></ul><p>lxd daemon通过<code>go lxc v2</code>来调用<code>liblxc.so</code>，其中用到了cgo以及lxc的头文件，所以要先编译liblxc</p><h1 id="lxc-tools"><a href="#lxc-tools" class="headerlink" title="lxc-tools"></a>lxc-tools</h1><p><a href="(https://github.com/lxc/lxc/tree/master/src/lxc/tools">lxc-tools</a>)只是<a href="https://github.com/lxc/lxc" target="_blank" rel="external">lxc/lxc</a>的一部分，提供可执行文件用于管理lxc容器。<br>lxc/lxc最重要的部分还是liblxc.so</p><h1 id="nova-lxd"><a href="#nova-lxd" class="headerlink" title="nova-lxd"></a>nova-lxd</h1><p>nova-compute的一个driver，类似以前看过的nova-docker</p><ul><li>相比docker，lxc的行为上更像虚拟机，所以更适合用来和openstack一起玩<a href="http://blog.decbug.com/2017/02/11/lxc_docker/">http://blog.decbug.com/2017/02/11/lxc_docker/</a></li><li>北向: 提供spawn, plug-network等接口给nova-compute</li><li>南向: 调用lxd daemon管理容器</li></ul><h2 id="基本功能及流程"><a href="#基本功能及流程" class="headerlink" title="基本功能及流程"></a>基本功能及流程</h2><h3 id="创容器"><a href="#创容器" class="headerlink" title="创容器"></a>创容器</h3><figure class="highlight py"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># Check to see if LXD already has a copy of the image. If not,</span></span><br><span class="line"><span class="comment"># fetch it.</span></span><br><span class="line">_sync_glance_image_to_lxd</span><br><span class="line"></span><br><span class="line"><span class="comment"># Plug in the network</span></span><br><span class="line">plug_vifs(instance, network_info)</span><br><span class="line"></span><br><span class="line"><span class="comment"># Create the profile(including devices, flavor, )</span></span><br><span class="line">container = self.client.containers.create(</span><br><span class="line">                container_config, wait=<span class="keyword">True</span>)</span><br><span class="line"></span><br><span class="line"><span class="comment"># start</span></span><br><span class="line">container.start(wait=<span class="keyword">True</span>)</span><br></pre></td></tr></table></figure><h3 id="镜像"><a href="#镜像" class="headerlink" title="镜像"></a>镜像</h3><figure class="highlight py"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br></pre></td><td class="code"><pre><span class="line">image = IMAGE_API.get(context, image_ref)</span><br><span class="line">IMAGE_API.download(context, image_ref, dest_path=image_file)</span><br><span class="line"></span><br><span class="line"><span class="comment"># generate metadata.yaml</span></span><br><span class="line">            metadata = &#123;</span><br><span class="line">                <span class="string">'architecture'</span>: image.get(</span><br><span class="line">                    <span class="string">'hw_architecture'</span>, obj_fields.Architecture.from_host()),</span><br><span class="line">                <span class="string">'creation_date'</span>: int(os.stat(image_file).st_ctime)&#125;</span><br><span class="line">            metadata_yaml = json.dumps(</span><br><span class="line">                metadata, sort_keys=<span class="keyword">True</span>, indent=<span class="number">4</span>,</span><br><span class="line">                separators=(<span class="string">','</span>, <span class="string">': '</span>),</span><br><span class="line"></span><br><span class="line"><span class="comment"># add metadata.yaml to tar.gz</span></span><br><span class="line">            tarball = tarfile.open(manifest_file, <span class="string">"w:gz"</span>)</span><br><span class="line">            tarinfo = tarfile.TarInfo(name=<span class="string">'metadata.yaml'</span>)</span><br><span class="line">            tarinfo.size = len(metadata_yaml)</span><br><span class="line">            tarball.addfile(tarinfo, io.BytesIO(metadata_yaml))</span><br><span class="line">            tarball.close()</span><br><span class="line"></span><br><span class="line"><span class="comment"># upload tar.gz to local lxd image registry</span></span><br><span class="line">image = client.images.create(</span><br><span class="line">                        image.read(), metadata=manifest.read(),</span><br><span class="line">                        wait=<span class="keyword">True</span>)</span><br><span class="line">            image.add_alias(image_ref, <span class="string">''</span>)</span><br></pre></td></tr></table></figure><h3 id="网络"><a href="#网络" class="headerlink" title="网络"></a>网络</h3><p><a href="https://github.com/openstack/nova-lxd/blob/master/nova/virt/lxd/vif.py" target="_blank" rel="external">https://github.com/openstack/nova-lxd/blob/master/nova/virt/lxd/vif.py</a></p><ul><li>plug</li><li>unplug</li><li>brctl创建linux桥，以及addif</li><li>ovs-vsctl创建ovs桥，以及add port(pvo pvi)</li></ul><hr><p><code>本博客欢迎转发,但请保留原作者信息</code><br>github:<a href="https://github.com/CodeJuan" target="_blank" rel="external">codejuan</a><br>博客地址:<a href="http://blog.decbug.com/">http://blog.decbug.com/</a></p>]]></content>
    
    <summary type="html">
    
      &lt;p&gt;分析一下lxc, lxd, nova-lxd的关系以及源码&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/openstack/nova-lxd&quot;&gt;nova-lxd&lt;/a&gt;,An OpenStack Compute driver for LXD&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/lxc/lxd&quot;&gt;lxd&lt;/a&gt;，lxd daemon和lxd client&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/lxc/lxc&quot;&gt;lxc&lt;/a&gt;，liblxc和lxc-tools&lt;/li&gt;
&lt;/ul&gt;
&lt;h1 id=&quot;关系&quot;&gt;&lt;a href=&quot;#关系&quot; class=&quot;headerlink&quot; title=&quot;关系&quot;&gt;&lt;/a&gt;关系&lt;/h1&gt;&lt;figure class=&quot;highlight sh&quot;&gt;&lt;table&gt;&lt;tr&gt;&lt;td class=&quot;gutter&quot;&gt;&lt;pre&gt;&lt;span class=&quot;line&quot;&gt;1&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;2&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;3&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;4&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;5&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;6&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;7&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;8&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;9&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;10&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;11&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;12&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;13&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;14&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;15&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;16&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;17&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;18&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;19&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;20&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;21&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;22&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;23&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;24&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;25&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;26&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;27&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;28&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;29&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;30&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;31&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;32&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;33&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;34&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;35&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;36&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;37&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;38&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;39&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;40&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;41&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;42&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;43&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;44&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;45&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;46&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;47&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;48&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;td class=&quot;code&quot;&gt;&lt;pre&gt;&lt;span class=&quot;line&quot;&gt;                              +---------------+&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;+----------+                  |               |&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;| lxc      |                  |   nova-lxd    |&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;| lxd-client+---+      +------+               |&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;+----------+    |      |      |               |&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;                |      |      +---------------+&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;                |      |&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;                |      |&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;             +--v------v---------+&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;             |     lxd           |&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;             |                   |&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;             |Daemon based on    |&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;             |liblxc offering    |&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;             |a REST API         |                  +-------------------------+&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;             |to manage containers                  |                         |&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;             +--------+----------+                  |   lxc/lxc               |&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;                      |                             |   tools to              |&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;                      |                             |   manage containers     |&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;                      |                             |                         |&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;             +--------v----------+                  |                         |&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;             |                   |                  |                         |&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;             |      go-lxc./v2   |                  +--------+----------------+&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;             |                   |                           |&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;             |                   |                           |&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;             |                   |                           |&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;             +----------+--------+                           |&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;                        |                                    |&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;                        |                                    |&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;                        |                                    |&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;                        |                                    |&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;              +---------v------------------------------------v---------+&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;              |                                                        |&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;              |                                                        |&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;              |                    liblxc.so                           |&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;              |                                                        |&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;              +-------------------------+------------------------------+&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;                                        |&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;                                        |&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;                                        |&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;              +-------------------------v------------------------------+&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;              |                                                        |&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;              |                                                        |&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;              |                kernel                                  |&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;              |                namespace, cgroups                      |&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;              |                                                        |&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;              |                                                        |&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;              |                                                        |&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;              +--------------------------------------------------------+&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;
    
    </summary>
    
      <category term="code" scheme="http://blog.decbug.com/categories/code/"/>
    
    
      <category term="LXC" scheme="http://blog.decbug.com/tags/LXC/"/>
    
      <category term="container" scheme="http://blog.decbug.com/tags/container/"/>
    
      <category term="openstack" scheme="http://blog.decbug.com/tags/openstack/"/>
    
  </entry>
  
  <entry>
    <title>网络笔记--docker,neutron</title>
    <link href="http://blog.decbug.com/network_intro/"/>
    <id>http://blog.decbug.com/network_intro/</id>
    <published>2017-02-09T16:00:00.000Z</published>
    <updated>2018-04-23T01:39:07.604Z</updated>
    
    <content type="html"><![CDATA[<p>简单记录之前搞容器网络用的基础知识<br><a id="more"></a></p><h1 id="ip命令"><a href="#ip命令" class="headerlink" title="ip命令"></a>ip命令</h1><ul><li>ip addr</li><li>ip route</li><li>ip a</li><li>ip veth peer</li><li>ip link set xxx up</li></ul><h1 id="brctl"><a href="#brctl" class="headerlink" title="brctl"></a>brctl</h1><p>linux bridge</p><ul><li>brctl add</li><li>brctl addif</li><li>brctl show</li></ul><h1 id="ovs"><a href="#ovs" class="headerlink" title="ovs"></a>ovs</h1><p>open flow</p><ul><li>ovs-vsctl</li><li>dump file</li><li>ovs-ofctl</li></ul><h1 id="neutron"><a href="#neutron" class="headerlink" title="neutron"></a>neutron</h1><ul><li>neutron net-CRUD</li><li>neutron subnet-CRUD</li><li>neutron port-CRUD<br>tap-qbr(linux桥)-brint(ovs桥)</li></ul><hr><p><code>本博客欢迎转发,但请保留原作者信息</code><br>github:<a href="https://github.com/CodeJuan" target="_blank" rel="external">codejuan</a><br>博客地址:<a href="http://blog.decbug.com/">http://blog.decbug.com/</a></p>]]></content>
    
    <summary type="html">
    
      &lt;p&gt;简单记录之前搞容器网络用的基础知识&lt;br&gt;
    
    </summary>
    
      <category term="code" scheme="http://blog.decbug.com/categories/code/"/>
    
    
      <category term="docker" scheme="http://blog.decbug.com/tags/docker/"/>
    
      <category term="neutron" scheme="http://blog.decbug.com/tags/neutron/"/>
    
      <category term="ovs" scheme="http://blog.decbug.com/tags/ovs/"/>
    
  </entry>
  
  <entry>
    <title>KVM的几种缓存模式</title>
    <link href="http://blog.decbug.com/KVM_cache/"/>
    <id>http://blog.decbug.com/KVM_cache/</id>
    <published>2017-01-16T17:00:00.000Z</published>
    <updated>2018-04-23T01:39:07.600Z</updated>
    
    <content type="html"><![CDATA[<p>现象：</p><ol><li>虚拟机的IO性能比物理机/容器好？</li><li>容器和物理机差不多，这个很好理解，如果没有做IO limit，肯定和物理机相近</li><li>用的virsh disk-attach宿主机上的一个/dev/sdxxx，用的是default</li><li>顺序读写完爆物理机</li><li>随机读写从1K，4K，16K到1M都比物理机强，唯有64M的写比物理机差</li></ol><p>比较奇怪，需要分析一下</p><a id="more"></a><h1 id="改cache-mode"><a href="#改cache-mode" class="headerlink" title="改cache mode"></a>改cache mode</h1><blockquote><p>writethrough<br>writethrough mode is the default caching mode. With caching set to writethrough mode, the host page cache is enabled, but the disk write cache is disabled for the guest. Consequently, this caching mode ensures data integrity even if the applications and storage stack in the guest do not transfer data to permanent storage properly (either through fsync operations or file system barriers). Because the host page cache is enabled in this mode, the read performance for applications running in the guest is generally better. However, the write performance might be reduced because the disk write cache is disabled.<br>默认模式，认为host page开启，没有用disk cache，会保证数据可靠，写性能会差，读性能会好？</p></blockquote><blockquote><p>writeback<br>With caching set to writeback mode, both the host page cache and the disk write cache are enabled for the guest. Because of this, the I/O performance for applications running in the guest is good, but the data is not protected in a power failure. As a result, this caching mode is recommended only for temporary data where potential data loss is not a concern.<br>host page和disk cache都开启，性能最好，但在掉电时会有丢数据的风险</p></blockquote><blockquote><p>none<br>With caching mode set to none, the host page cache is disabled, but the disk write cache is enabled for the guest. In this mode, the write performance in the guest is optimal because write operations bypass the host page cache and go directly to the disk write cache. If the disk write cache is battery-backed, or if the applications or storage stack in the guest transfer data properly (either through fsync operations or file system barriers), then data integrity can be ensured. However, because the host page cache is disabled, the read performance in the guest would not be as good as in the modes where the host page cache is enabled, such as writethrough mode.<br>只开disk cache，不开host page，号称写性能最强，读一般</p></blockquote><blockquote><p>unsafe<br>Caching mode of unsafe ignores cache transfer operations completely. As its name implies, this caching mode should be used only for temporary data where data loss is not a concern. This mode can be useful for speeding up guest installations, but you should switch to another caching mode in production environments.<br>只写到缓存，不落盘，建议只保存临时数据</p></blockquote><p>改成none试了下，竟然性能都变差？按理说写性能会提升啊？</p><h1 id="host-page-cache对性能的影响"><a href="#host-page-cache对性能的影响" class="headerlink" title="host page cache对性能的影响"></a>host page cache对性能的影响</h1><ul><li>64M性能下降是因为cache被打穿？对于大块用direct IO性能更好？即使改成direct IO，那么也是只绕过guest os的page cache啊？此时用none会更好？然而实际上，none的性能不好。</li><li>只要有空闲，系统的cache buffer都会很大。物理机是128G内存，所以虚拟机的读写操作都在内存里完成？</li><li>小块性能好，因为都在内存里？</li></ul><h1 id="结论"><a href="#结论" class="headerlink" title="结论"></a>结论</h1><p>真的是缓存的原因？大丈夫？</p><h1 id="参考"><a href="#参考" class="headerlink" title="参考"></a>参考</h1><p><a href="http://www.slideshare.net/meituan/kvmopt-osforce-27669119" target="_blank" rel="external">美团技术团队 - KVM性能优化</a><br><a href="https://www.ibm.com/support/knowledgecenter/linuxonibm/liaat/liaatbpkvmguestcache.htm" target="_blank" rel="external">Best practice: KVM guest caching modes</a><br><a href="http://www.cnblogs.com/jusonalien/p/4772618.html" target="_blank" rel="external">qemu-kvm磁盘读写的缓冲(cache)的五种模式</a></p><hr><p><code>本博客欢迎转发,但请保留原作者信息</code><br>github:<a href="https://github.com/CodeJuan" target="_blank" rel="external">codejuan</a><br>博客地址:<a href="http://blog.decbug.com/">http://blog.decbug.com/</a></p>]]></content>
    
    <summary type="html">
    
      &lt;p&gt;现象：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;虚拟机的IO性能比物理机/容器好？&lt;/li&gt;
&lt;li&gt;容器和物理机差不多，这个很好理解，如果没有做IO limit，肯定和物理机相近&lt;/li&gt;
&lt;li&gt;用的virsh disk-attach宿主机上的一个/dev/sdxxx，用的是default&lt;/li&gt;
&lt;li&gt;顺序读写完爆物理机&lt;/li&gt;
&lt;li&gt;随机读写从1K，4K，16K到1M都比物理机强，唯有64M的写比物理机差&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;比较奇怪，需要分析一下&lt;/p&gt;
    
    </summary>
    
      <category term="code" scheme="http://blog.decbug.com/categories/code/"/>
    
    
      <category term="KVM" scheme="http://blog.decbug.com/tags/KVM/"/>
    
      <category term="cache" scheme="http://blog.decbug.com/tags/cache/"/>
    
  </entry>
  
  <entry>
    <title>Neutron与容器网络</title>
    <link href="http://blog.decbug.com/container_neutron/"/>
    <id>http://blog.decbug.com/container_neutron/</id>
    <published>2017-01-14T17:00:00.000Z</published>
    <updated>2018-04-23T01:39:07.600Z</updated>
    
    <content type="html"><![CDATA[<p>容器用Neutron组网，比Flannel和VPC router强的地方在于</p><ul><li>多租户，不同租户的容器可以运行在同一个宿主机上。<ol><li>Flannel没有租户隔离，</li><li>阿里云则是先用租户开虚拟机，利用I层的隔离，同一个虚拟机只能跑一个租户的容器</li></ol></li><li>性能，如果是部署在openstack发放的虚拟机上，则不用在overlay一层</li></ul><a id="more"></a><h1 id="大概原理"><a href="#大概原理" class="headerlink" title="大概原理"></a>大概原理</h1><p>记录一下</p><ol><li>neutron create port</li><li>docker network create bridge xxxx， docker run -net=xxxx</li><li>管理xxxx的CIDR</li><li>bridge veth pair   <---> (port IP MAC) veth pair port的qbr上</---></li><li>dvr add : xxxx的CIDR nexthop 是一个neutron port</li></ol><p>在这个图上稍作修改<br><img src="http://img.blog.csdn.net/20141208150804139?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvY2FueGluZ2hlbg==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="neutron组网"></p><hr><p><code>本博客欢迎转发,但请保留原作者信息</code><br>github:<a href="https://github.com/CodeJuan" target="_blank" rel="external">codejuan</a><br>博客地址:<a href="http://blog.decbug.com/">http://blog.decbug.com/</a></p>]]></content>
    
    <summary type="html">
    
      &lt;p&gt;容器用Neutron组网，比Flannel和VPC router强的地方在于&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;多租户，不同租户的容器可以运行在同一个宿主机上。&lt;ol&gt;
&lt;li&gt;Flannel没有租户隔离，&lt;/li&gt;
&lt;li&gt;阿里云则是先用租户开虚拟机，利用I层的隔离，同一个虚拟机只能跑一个租户的容器&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;性能，如果是部署在openstack发放的虚拟机上，则不用在overlay一层&lt;/li&gt;
&lt;/ul&gt;
    
    </summary>
    
      <category term="code" scheme="http://blog.decbug.com/categories/code/"/>
    
    
      <category term="docker" scheme="http://blog.decbug.com/tags/docker/"/>
    
      <category term="network" scheme="http://blog.decbug.com/tags/network/"/>
    
      <category term="neutron" scheme="http://blog.decbug.com/tags/neutron/"/>
    
      <category term="openstack" scheme="http://blog.decbug.com/tags/openstack/"/>
    
  </entry>
  
  <entry>
    <title>conver socks5 to http proxy</title>
    <link href="http://blog.decbug.com/socks5_http/"/>
    <id>http://blog.decbug.com/socks5_http/</id>
    <published>2017-01-09T16:00:00.000Z</published>
    <updated>2018-04-23T01:39:07.608Z</updated>
    
    <content type="html"><![CDATA[<p>go get, but connect to golang.org timeout!!!</p><a id="more"></a><h1 id="polipo"><a href="#polipo" class="headerlink" title="polipo"></a>polipo</h1><figure class="highlight actionscript"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">apt-<span class="keyword">get</span> install polipo</span><br></pre></td></tr></table></figure><h2 id="etc-polipo-config"><a href="#etc-polipo-config" class="headerlink" title="/etc/polipo/config"></a>/etc/polipo/config</h2><figure class="highlight ini"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><span class="line"><span class="setting">logSyslog = <span class="value"><span class="keyword">true</span></span></span></span><br><span class="line"><span class="setting">logFile = <span class="value">/var/log/polipo/polipo.log</span></span></span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="setting">proxyAddress = <span class="value"><span class="string">"10.164.28.139"</span></span></span></span><br><span class="line"><span class="setting">proxyPort = <span class="value"><span class="number">8118</span></span></span></span><br><span class="line"><span class="setting">socksParentProxy = <span class="value"><span class="string">"127.0.0.1:1080"</span></span></span></span><br><span class="line"><span class="setting">socksProxyType = <span class="value">socks5</span></span></span><br><span class="line"><span class="setting">allowedClients = <span class="value">[]</span></span></span><br></pre></td></tr></table></figure><hr><p><code>本博客欢迎转发,但请保留原作者信息</code><br>github:<a href="https://github.com/CodeJuan" target="_blank" rel="external">codejuan</a><br>博客地址:<a href="http://blog.decbug.com/">http://blog.decbug.com/</a></p>]]></content>
    
    <summary type="html">
    
      &lt;p&gt;go get, but connect to golang.org timeout!!!&lt;/p&gt;
    
    </summary>
    
      <category term="code" scheme="http://blog.decbug.com/categories/code/"/>
    
    
      <category term="proxy" scheme="http://blog.decbug.com/tags/proxy/"/>
    
  </entry>
  
  <entry>
    <title>一次容器网络问题debug</title>
    <link href="http://blog.decbug.com/container_network_debug/"/>
    <id>http://blog.decbug.com/container_network_debug/</id>
    <published>2017-01-02T17:00:00.000Z</published>
    <updated>2018-04-23T01:39:07.600Z</updated>
    
    <content type="html"><![CDATA[<p>基于neutron做了一个容器网络方案，需要测试性能，用的iperf，但是在测试过程中，tcp/udp无法抵达跨节点的容器中</p><a id="more"></a><h1 id="问题描述"><a href="#问题描述" class="headerlink" title="问题描述"></a>问题描述</h1><p>网络组好之后，跨宿主机的容器相互可以ping通，但是在用iperf测试的时候</p><ol><li>tcp：client端一直显示带宽为0，server端显示建立连接，但是一直显示收到0字节</li><li>udp：client端显示12G的带宽，server端只显示建立连接，但没有其他响应。</li></ol><p>顺便说一下一直以来对于VxLan的一个疑惑，VxLan是通过udp发送，那么如何保证数据可靠传输呢？是不是udp里封了tcp的包，如果udp丢失了数据</p><h1 id="定位过程"><a href="#定位过程" class="headerlink" title="定位过程"></a>定位过程</h1><ol><li>在容器A里起一个python SimpleHTTPServer，在容器B里curl这个server。A容器收到请求，并且响应，但是B容器没有收到响应</li><li>猜测是不是安全组的问题？于是neutron secure-group-create 端口从1到65535，ingress egress，tcp udp都加上，再次curl，还是不通</li><li>用tcpdump同时在server端和client端抓包，保存起来</li><li>在两个宿主机起python server，也curl一次并抓包</li><li>用wireshark对比两次的包，发现容器里curl多了一个1518 length的包，于是猜测是不是MTU的问题？因为之前在看flannel的时候，需要在docker启动参数上设置MTU为1450</li><li>分别在两个容器都设置mtu：ip netns 容器网络命名空间 ifconfig eth0 mtu 1400</li><li>再次curl，容器B收到响应</li><li>继续iperf，tcp的可以测通，性能和用neutron的虚拟机相似</li><li>但是udp还是不通</li><li>继续抓两个容器的docker0，可以收到数据</li><li>两个veth，也可以收到</li><li>但是在容器的eth0却收不到。按理说是veth pair，一端收到，另一端就肯定能收到。</li></ol><p>看来还有问题，需要继续定位</p><hr><p><code>本博客欢迎转发,但请保留原作者信息</code><br>github:<a href="https://github.com/CodeJuan" target="_blank" rel="external">codejuan</a><br>博客地址:<a href="http://blog.decbug.com/">http://blog.decbug.com/</a></p>]]></content>
    
    <summary type="html">
    
      &lt;p&gt;基于neutron做了一个容器网络方案，需要测试性能，用的iperf，但是在测试过程中，tcp/udp无法抵达跨节点的容器中&lt;/p&gt;
    
    </summary>
    
      <category term="code" scheme="http://blog.decbug.com/categories/code/"/>
    
    
      <category term="docker" scheme="http://blog.decbug.com/tags/docker/"/>
    
      <category term="network" scheme="http://blog.decbug.com/tags/network/"/>
    
  </entry>
  
  <entry>
    <title>山寨版sysdig cloud</title>
    <link href="http://blog.decbug.com/sysdig_knockoff/"/>
    <id>http://blog.decbug.com/sysdig_knockoff/</id>
    <published>2016-12-05T16:00:00.000Z</published>
    <updated>2018-04-23T01:39:07.608Z</updated>
    
    <content type="html"><![CDATA[<p>调用链分析有三种模式：</p><ol><li>白盒，zipkin</li><li>灰盒，pinpoint，往JVM里注入</li><li>黑盒，优点是难度大，精度一般，优点是不用改代码</li></ol><p>之前分析的sysdig就算是黑盒,<a href="http://blog.decbug.com/2016/10/12/sysdig/">http://blog.decbug.com/2016/10/12/sysdig/</a>，恰好有需求说想不改代码，由容器云平台提供调用链分析。</p><p>参考了几篇论文及业内快讯之后，</p><ul><li>IBM的<a href="http://www.spark.tc/real-time-application-performance-profiling-using-spark/" target="_blank" rel="external">Real-time Performance Profiling &amp; Analytics for Microservices using Apache </a></li><li>MIT的<a href="https://pdos.csail.mit.edu/~athicha/papers/blackboxes:sosp03.pdf" target="_blank" rel="external">Performance Debugging for Distributed Systems of Black Boxes</a></li></ul><p>花了一周时间在k8s上做出来了，当然，由于缺乏算法支持，目前只做到了点对点的调用topo及http,memcached的时延，后面有空再补齐MySQL等等。</p><a id="more"></a><h1 id="方案"><a href="#方案" class="headerlink" title="方案"></a>方案</h1><ul><li>用开源sysdig做采集</li><li>参考http_log和memorycache，自己写了个Chisel做过滤分析</li><li>过滤后的日志print到std output，然后打到起了syslog的logstash容器</li><li>logstack到elastic search</li><li>之后写个可视化的web服务，根据用户的查询条件，把对应的topo及时延画出来，就可以辅助诊断性能问题</li></ul><hr><p><code>本博客欢迎转发,但请保留原作者信息</code><br>github:<a href="https://github.com/CodeJuan" target="_blank" rel="external">codejuan</a><br>博客地址:<a href="http://blog.decbug.com/">http://blog.decbug.com/</a></p>]]></content>
    
    <summary type="html">
    
      &lt;p&gt;调用链分析有三种模式：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;白盒，zipkin&lt;/li&gt;
&lt;li&gt;灰盒，pinpoint，往JVM里注入&lt;/li&gt;
&lt;li&gt;黑盒，优点是难度大，精度一般，优点是不用改代码&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;之前分析的sysdig就算是黑盒,&lt;a href=&quot;http://blog.decbug.com/2016/10/12/sysdig/&quot;&gt;http://blog.decbug.com/2016/10/12/sysdig/&lt;/a&gt;，恰好有需求说想不改代码，由容器云平台提供调用链分析。&lt;/p&gt;
&lt;p&gt;参考了几篇论文及业内快讯之后，&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;IBM的&lt;a href=&quot;http://www.spark.tc/real-time-application-performance-profiling-using-spark/&quot;&gt;Real-time Performance Profiling &amp;amp; Analytics for Microservices using Apache &lt;/a&gt;&lt;/li&gt;
&lt;li&gt;MIT的&lt;a href=&quot;https://pdos.csail.mit.edu/~athicha/papers/blackboxes:sosp03.pdf&quot;&gt;Performance Debugging for Distributed Systems of Black Boxes&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;花了一周时间在k8s上做出来了，当然，由于缺乏算法支持，目前只做到了点对点的调用topo及http,memcached的时延，后面有空再补齐MySQL等等。&lt;/p&gt;
    
    </summary>
    
      <category term="code" scheme="http://blog.decbug.com/categories/code/"/>
    
    
      <category term="APM" scheme="http://blog.decbug.com/tags/APM/"/>
    
      <category term="tracing" scheme="http://blog.decbug.com/tags/tracing/"/>
    
  </entry>
  
</feed>
