<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
  <title>Simble的小站</title>
  
  <subtitle>晒晒狗 vs 练练手</subtitle>
  <link href="/atom.xml" rel="self"/>
  
  <link href="http://www.isimble.com/"/>
  <updated>2020-12-23T06:42:47.687Z</updated>
  <id>http://www.isimble.com/</id>
  
  <author>
    <name>Simble</name>
    
  </author>
  
  <generator uri="https://hexo.io/">Hexo</generator>
  
  <entry>
    <title>K8s Python SDK</title>
    <link href="http://www.isimble.com/2020/12/23/k8s-python-sdk-usage/"/>
    <id>http://www.isimble.com/2020/12/23/k8s-python-sdk-usage/</id>
    <published>2020-12-23T06:40:21.000Z</published>
    <updated>2020-12-23T06:42:47.687Z</updated>
    
    <content type="html"><![CDATA[<h2 id="用户及授权"><a class="markdownIt-Anchor" href="#用户及授权"></a> 用户及授权</h2><h3 id="创建用户"><a class="markdownIt-Anchor" href="#创建用户"></a> 创建用户</h3><ul><li><code>script_sc_rolebinding.yml</code></li></ul><figure class="highlight yml"><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></pre></td><td class="code"><pre><span class="line"><span class="attr">apiVersion:</span> <span class="string">v1</span></span><br><span class="line"><span class="attr">kind:</span> <span class="string">ServiceAccount</span></span><br><span class="line"><span class="attr">metadata:</span></span><br><span class="line">  <span class="attr">name:</span> <span class="string">script-admin</span></span><br><span class="line">  <span class="attr">namespace:</span> <span class="string">kube-system</span></span><br><span class="line"></span><br><span class="line"><span class="meta">---</span></span><br><span class="line"><span class="attr">apiVersion:</span> <span class="string">rbac.authorization.k8s.io/v1</span></span><br><span class="line"><span class="attr">kind:</span> <span class="string">ClusterRoleBinding</span></span><br><span class="line"><span class="attr">metadata:</span></span><br><span class="line">  <span class="attr">name:</span> <span class="string">script-admin</span></span><br><span class="line"><span class="attr">roleRef:</span></span><br><span class="line">  <span class="attr">apiGroup:</span> <span class="string">rbac.authorization.k8s.io</span></span><br><span class="line">  <span class="attr">kind:</span> <span class="string">ClusterRole</span></span><br><span class="line">  <span class="attr">name:</span> <span class="string">cluster-admin</span></span><br><span class="line"><span class="attr">subjects:</span></span><br><span class="line"><span class="bullet">-</span> <span class="attr">kind:</span> <span class="string">ServiceAccount</span></span><br><span class="line">  <span class="attr">name:</span> <span class="string">script-admin</span></span><br><span class="line">  <span class="attr">namespace:</span> <span class="string">kube-system</span></span><br></pre></td></tr></table></figure><a id="more"></a><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">$ kubectl apply -f script_sc_rolebinding.yml</span><br></pre></td></tr></table></figure><h3 id="获取token"><a class="markdownIt-Anchor" href="#获取token"></a> 获取token</h3><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><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></pre></td><td class="code"><pre><span class="line">$ kubectl get secret -n kube-system | grep script-admin</span><br><span class="line">script-admin-token-9rkpl                         kubernetes.io/service-account-token   3      4m23s</span><br><span class="line">$ kubectl describe secret -n kube-system script-admin-token-9rkpl</span><br><span class="line">Name:         script-admin-token-9rkpl</span><br><span class="line">Namespace:    kube-system</span><br><span class="line">Labels:       &lt;none&gt;</span><br><span class="line">Annotations:  kubernetes.io/service-account.name: script-admin</span><br><span class="line">              kubernetes.io/service-account.uid: 9071a506-ae74-4b52-b3d7-25381349fd8b</span><br><span class="line"></span><br><span class="line">Type:  kubernetes.io/service-account-token</span><br><span class="line"></span><br><span class="line">Data</span><br><span class="line">====</span><br><span class="line">ca.crt:     1070 bytes</span><br><span class="line">namespace:  11 bytes</span><br><span class="line">token:      eyJhbGciOiJSUzI1NiIsImtpZCI6Ikt4SWlabUpwY3U0NWQ4eHY0UWdGNmE0Rm5IRnBtZUMxMjRIV0YzM1kwUFUifQ.eyJpc3MiOiJrdWJlcm5ldGVzL3NlcnZpY2VhY2NvdW50Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9uYW1lc3BhY2UiOiJrdWJlLXN5c3RlbSIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VjcmV0Lm5hbWUiOiJzY3JpcHQtYWRtaW4tdG9rZW4tOXJrcGwiLCJrdWJlcm5ldGVzLmlvL3NlcnZpY2VhY2NvdW50L3NlcnZpY2UtYWNjb3VudC5uYW1lIjoic2NyaXB0LWFkbWluIiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9zZXJ2aWNlLWFjY291bnQudWlkIjoiOTA3MWE1MDYtYWU3NC00YjUyLWIzZDctMjUzODEzNDlmZDhiIiwic3ViIjoic3lzdGVtOnNlcnZpY2VhY2NvdW50Omt1YmUtc3lzdGVtOnNjcmlwdC1hZG1pbiJ9.gnSMNViPwf53aG66qn_vUGkMMLKcSIsug2uZPqxH-Lwq7dgAHK7Xen01xWGA9l51xq2wH88xylLP7j6BeZVhtX40DIs3hquxCvX4U7lEollG3AUybxvgeo3Et8G290-eurt6YLS2F1AbSd5qB5SsTfoshVP2UzOqe-gQY1JhPSUK-2CgDH2jMnxLY2qHWbaHB0VY0E8A8keBrHxctetRzyIXHnpbFxCHTLQwEl5rIfoHdZyNn1Q3ALefvpgk_XYijPrbcAFObNtM2HG8Ethrrw0vQuyb1EBHu07RXN_qNsn-QGjEwj_B3k9fbkNA3AxoYN26szPIkpCzhuVeulk5vw</span><br></pre></td></tr></table></figure><h2 id="使用python-sdk"><a class="markdownIt-Anchor" href="#使用python-sdk"></a> 使用python sdk</h2><h3 id="安装python-sdk"><a class="markdownIt-Anchor" href="#安装python-sdk"></a> 安装python sdk</h3><p>参考https://github.com/kubernetes-client/python</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">$ pip install kubernetes</span><br></pre></td></tr></table></figure><h3 id="demo"><a class="markdownIt-Anchor" href="#demo"></a> Demo</h3><figure class="highlight python"><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></pre></td><td class="code"><pre><span class="line"><span class="keyword">import</span> requests</span><br><span class="line">requests.packages.urllib3.disable_warnings()</span><br><span class="line"><span class="keyword">from</span> kubernetes <span class="keyword">import</span> client, config</span><br><span class="line"><span class="keyword">from</span> kubernetes.client.rest <span class="keyword">import</span> ApiException</span><br><span class="line"></span><br><span class="line">token = <span class="string">"eyJhbGciOiJSUzI1NiIsImtpZCI6Ikt4SWlabUpwY3U0NWQ4eHY0UWdGNmE0Rm5IRnBtZUMxMjRIV0YzM1kwUFUifQ.eyJpc3MiOiJrdWJlcm5ldGVzL3NlcnZpY2VhY2NvdW50Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9uYW1lc3BhY2UiOiJrdWJlLXN5c3RlbSIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VjcmV0Lm5hbWUiOiJzY3JpcHQtYWRtaW4tdG9rZW4tOXJrcGwiLCJrdWJlcm5ldGVzLmlvL3NlcnZpY2VhY2NvdW50L3NlcnZpY2UtYWNjb3VudC5uYW1lIjoic2NyaXB0LWFkbWluIiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9zZXJ2aWNlLWFjY291bnQudWlkIjoiOTA3MWE1MDYtYWU3NC00YjUyLWIzZDctMjUzODEzNDlmZDhiIiwic3ViIjoic3lzdGVtOnNlcnZpY2VhY2NvdW50Omt1YmUtc3lzdGVtOnNjcmlwdC1hZG1pbiJ9.gnSMNViPwf53aG66qn_vUGkMMLKcSIsug2uZPqxH-Lwq7dgAHK7Xen01xWGA9l51xq2wH88xylLP7j6BeZVhtX40DIs3hquxCvX4U7lEollG3AUybxvgeo3Et8G290-eurt6YLS2F1AbSd5qB5SsTfoshVP2UzOqe-gQY1JhPSUK-2CgDH2jMnxLY2qHWbaHB0VY0E8A8keBrHxctetRzyIXHnpbFxCHTLQwEl5rIfoHdZyNn1Q3ALefvpgk_XYijPrbcAFObNtM2HG8Ethrrw0vQuyb1EBHu07RXN_qNsn-QGjEwj_B3k9fbkNA3AxoYN26szPIkpCzhuVeulk5vw"</span></span><br><span class="line">configuration = client.Configuration()</span><br><span class="line">configuration.api_key_prefix[<span class="string">'authorization'</span>] = <span class="string">'Bearer'</span></span><br><span class="line">configuration.api_key[<span class="string">'authorization'</span>] = token</span><br><span class="line">configuration.verify_ssl = <span class="literal">False</span></span><br><span class="line">configuration.host = <span class="string">"https://10.160.12.184:6443"</span></span><br><span class="line"></span><br><span class="line">api_client = client.ApiClient(configuration)</span><br><span class="line">api_instance = client.CoreV1Api(api_client)</span><br><span class="line"><span class="comment"># create a namespace</span></span><br><span class="line">ns_name = <span class="string">"script-test"</span></span><br><span class="line">body = &#123;<span class="string">"apiVersion"</span>: <span class="string">"v1"</span>, <span class="string">"kind"</span>: <span class="string">"Namespace"</span>, <span class="string">"metadata"</span>: &#123;<span class="string">"name"</span>: ns_name&#125;&#125;</span><br><span class="line"><span class="keyword">try</span>:</span><br><span class="line">    res = api_instance.create_namespace(body)</span><br><span class="line">    <span class="keyword">if</span> res.status.phase == <span class="string">"Active"</span>:</span><br><span class="line">        print(<span class="string">"Namespace '&#123;&#125;' create success."</span>.format(ns_name))</span><br><span class="line"><span class="keyword">except</span> ApiException <span class="keyword">as</span> e:</span><br><span class="line">    print(<span class="string">"Namespace '&#123;&#125;' create failed: &#123;&#125;"</span>.format(ns_name, e))</span><br><span class="line"></span><br><span class="line"><span class="comment"># get namespace list</span></span><br><span class="line"><span class="keyword">try</span>:</span><br><span class="line">    res = api_instance.list_namespace()</span><br><span class="line">    <span class="keyword">for</span> ns <span class="keyword">in</span> res.items:</span><br><span class="line">        print(ns.metadata.name)</span><br><span class="line"><span class="keyword">except</span> ApiException <span class="keyword">as</span> e:</span><br><span class="line">    print(<span class="string">"Get namespace list failed: &#123;&#125;"</span>.format(e))</span><br><span class="line"></span><br><span class="line"><span class="comment"># delete namespace</span></span><br><span class="line"><span class="keyword">try</span>:</span><br><span class="line">    api_instance.delete_namespace(ns_name)</span><br><span class="line">    print(<span class="string">"Namespace '&#123;&#125;' delete success."</span>.format(ns_name))</span><br><span class="line"><span class="keyword">except</span> ApiException <span class="keyword">as</span> e:</span><br><span class="line">    print(<span class="string">"Namespace '&#123;&#125;' delete failed: &#123;&#125;"</span>.format(ns_name, e))</span><br></pre></td></tr></table></figure><ul><li>Output</li></ul><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><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line">Namespace <span class="string">'script-test'</span> create success.</span><br><span class="line">default</span><br><span class="line">kube-public</span><br><span class="line">kube-system</span><br><span class="line">script-test</span><br><span class="line">Namespace <span class="string">'script-test'</span> delete success.</span><br></pre></td></tr></table></figure><h2 id="后记"><a class="markdownIt-Anchor" href="#后记"></a> 后记</h2><p>看了https://github.com/kubernetes-client/python/blob/master/kubernetes/README.md中的api列表，可以看到有一些方法是用<code>CoreV1Api</code>，有些是<code>BatchApi</code>。</p><p>平日里大部分时间使用yaml文件来部署的，包括<code>v1</code>,<code>AppsV1Api</code>,<code>BatchV1Api</code>等，也是同yaml文件中。也就是说，不同的资源需要使用不同的api instance来进行操作。</p>]]></content>
    
    <summary type="html">
    
      &lt;h2 id=&quot;用户及授权&quot;&gt;&lt;a class=&quot;markdownIt-Anchor&quot; href=&quot;#用户及授权&quot;&gt;&lt;/a&gt; 用户及授权&lt;/h2&gt;
&lt;h3 id=&quot;创建用户&quot;&gt;&lt;a class=&quot;markdownIt-Anchor&quot; href=&quot;#创建用户&quot;&gt;&lt;/a&gt; 创建用户&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;script_sc_rolebinding.yml&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;figure class=&quot;highlight yml&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;/pre&gt;&lt;/td&gt;&lt;td class=&quot;code&quot;&gt;&lt;pre&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;attr&quot;&gt;apiVersion:&lt;/span&gt; &lt;span class=&quot;string&quot;&gt;v1&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;attr&quot;&gt;kind:&lt;/span&gt; &lt;span class=&quot;string&quot;&gt;ServiceAccount&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;attr&quot;&gt;metadata:&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;  &lt;span class=&quot;attr&quot;&gt;name:&lt;/span&gt; &lt;span class=&quot;string&quot;&gt;script-admin&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;  &lt;span class=&quot;attr&quot;&gt;namespace:&lt;/span&gt; &lt;span class=&quot;string&quot;&gt;kube-system&lt;/span&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 class=&quot;meta&quot;&gt;---&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;attr&quot;&gt;apiVersion:&lt;/span&gt; &lt;span class=&quot;string&quot;&gt;rbac.authorization.k8s.io/v1&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;attr&quot;&gt;kind:&lt;/span&gt; &lt;span class=&quot;string&quot;&gt;ClusterRoleBinding&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;attr&quot;&gt;metadata:&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;  &lt;span class=&quot;attr&quot;&gt;name:&lt;/span&gt; &lt;span class=&quot;string&quot;&gt;script-admin&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;attr&quot;&gt;roleRef:&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;  &lt;span class=&quot;attr&quot;&gt;apiGroup:&lt;/span&gt; &lt;span class=&quot;string&quot;&gt;rbac.authorization.k8s.io&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;  &lt;span class=&quot;attr&quot;&gt;kind:&lt;/span&gt; &lt;span class=&quot;string&quot;&gt;ClusterRole&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;  &lt;span class=&quot;attr&quot;&gt;name:&lt;/span&gt; &lt;span class=&quot;string&quot;&gt;cluster-admin&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;attr&quot;&gt;subjects:&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;bullet&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;attr&quot;&gt;kind:&lt;/span&gt; &lt;span class=&quot;string&quot;&gt;ServiceAccount&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;  &lt;span class=&quot;attr&quot;&gt;name:&lt;/span&gt; &lt;span class=&quot;string&quot;&gt;script-admin&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;  &lt;span class=&quot;attr&quot;&gt;namespace:&lt;/span&gt; &lt;span class=&quot;string&quot;&gt;kube-system&lt;/span&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="k8s" scheme="http://www.isimble.com/categories/k8s/"/>
    
      <category term="python" scheme="http://www.isimble.com/categories/k8s/python/"/>
    
    
      <category term="python" scheme="http://www.isimble.com/tags/python/"/>
    
      <category term="Kubernetes" scheme="http://www.isimble.com/tags/Kubernetes/"/>
    
  </entry>
  
  <entry>
    <title>K8s学习笔记——Job与CronJob</title>
    <link href="http://www.isimble.com/2020/08/25/kubernetesLearning22/"/>
    <id>http://www.isimble.com/2020/08/25/kubernetesLearning22/</id>
    <published>2020-08-25T05:55:16.000Z</published>
    <updated>2020-08-25T05:56:56.847Z</updated>
    
    <content type="html"><![CDATA[<blockquote><p>学习极客时间上的<a href="https://time.geekbang.org/column/intro/116" target="_blank" rel="noopener">《深入剖析Kubernetes》</a></p><p>秉持眼过千遍不如手过一遍的原则。动手实践并记录结果</p><p>对应章节：<a href="https://time.geekbang.org/column/article/41607" target="_blank" rel="noopener">22 | 撬动离线业务：Job与CronJob</a></p></blockquote><a id="more"></a><h2 id="job"><a class="markdownIt-Anchor" href="#job"></a> Job</h2><h3 id="创建job"><a class="markdownIt-Anchor" href="#创建job"></a> 创建Job</h3><figure class="highlight yaml"><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="attr">apiVersion:</span> <span class="string">batch/v1</span></span><br><span class="line"><span class="attr">kind:</span> <span class="string">Job</span></span><br><span class="line"><span class="attr">metadata:</span></span><br><span class="line">  <span class="attr">name:</span> <span class="string">my-job</span></span><br><span class="line"><span class="attr">spec:</span></span><br><span class="line">  <span class="attr">template:</span></span><br><span class="line">    <span class="attr">spec:</span></span><br><span class="line">      <span class="attr">containers:</span></span><br><span class="line">      <span class="bullet">-</span> <span class="attr">name:</span> <span class="string">hello</span></span><br><span class="line">        <span class="attr">image:</span> <span class="string">busybox</span></span><br><span class="line">        <span class="attr">imagePullPolicy:</span> <span class="string">IfNotPresent</span></span><br><span class="line">        <span class="attr">command:</span> <span class="string">["echo",</span> <span class="string">" hello, Job"</span><span class="string">]</span></span><br><span class="line">      <span class="attr">restartPolicy:</span> <span class="string">Never</span></span><br></pre></td></tr></table></figure><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></pre></td><td class="code"><pre><span class="line">$ kubectl get <span class="built_in">jobs</span> -o wide</span><br><span class="line">NAME     COMPLETIONS   DURATION   AGE    CONTAINERS   IMAGES    SELECTOR</span><br><span class="line">my-job   1/1           3s         102s   hello        busybox   controller-uid=c85adfa3-f52f-40f7-a772-cab087df71cf</span><br></pre></td></tr></table></figure><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></pre></td><td class="code"><pre><span class="line">$ kubectl get pod</span><br><span class="line">NAME                READY   STATUS      RESTARTS   AGE</span><br><span class="line">my-job-d4rnl        0/1     Completed   0          2m4s</span><br></pre></td></tr></table></figure><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><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><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br></pre></td><td class="code"><pre><span class="line">$ kubectl describe pod my-job-d4rnl</span><br><span class="line">Name:         my-job-d4rnl</span><br><span class="line">Namespace:    default</span><br><span class="line">Priority:     0</span><br><span class="line">Node:         k8s-node4/10.160.18.184</span><br><span class="line">Start Time:   Mon, 03 Aug 2020 14:05:42 +0800</span><br><span class="line">Labels:       controller-uid=c85adfa3-f52f-40f7-a772-cab087df71cf</span><br><span class="line">              job-name=my-job</span><br><span class="line">Annotations:  &lt;none&gt;</span><br><span class="line">Status:       Succeeded</span><br><span class="line">IP:           172.1.3.12</span><br><span class="line">IPs:</span><br><span class="line">  IP:           172.1.3.12</span><br><span class="line">Controlled By:  Job/my-job</span><br><span class="line">...</span><br><span class="line">Events:</span><br><span class="line">  Type    Reason     Age    From                Message</span><br><span class="line">  ----    ------     ----   ----                -------</span><br><span class="line">  Normal  Scheduled  2m43s  default-scheduler   Successfully assigned default/my-job-d4rnl to k8s-node4</span><br><span class="line">  Normal  Pulled     2m42s  kubelet, k8s-node4  Container image <span class="string">"busybox"</span> already present on machine</span><br><span class="line">  Normal  Created    2m41s  kubelet, k8s-node4  Created container hello</span><br><span class="line">  Normal  Started    2m41s  kubelet, k8s-node4  Started container hello</span><br><span class="line">  </span><br><span class="line">$ kubectl describe <span class="built_in">jobs</span> my-job</span><br><span class="line">Name:           my-job</span><br><span class="line">Namespace:      default</span><br><span class="line">Selector:       controller-uid=c85adfa3-f52f-40f7-a772-cab087df71cf</span><br><span class="line">Labels:         controller-uid=c85adfa3-f52f-40f7-a772-cab087df71cf</span><br><span class="line">                job-name=my-job</span><br><span class="line">Annotations:    Parallelism:  1</span><br><span class="line">Completions:    1</span><br><span class="line">Start Time:     Mon, 03 Aug 2020 14:05:41 +0800</span><br><span class="line">Completed At:   Mon, 03 Aug 2020 14:05:44 +0800</span><br><span class="line">Duration:       3s</span><br><span class="line">Pods Statuses:  0 Running / 1 Succeeded / 0 Failed</span><br><span class="line">Pod Template:</span><br><span class="line">  Labels:  controller-uid=c85adfa3-f52f-40f7-a772-cab087df71cf</span><br><span class="line">           job-name=my-job</span><br><span class="line">  Containers:</span><br><span class="line">   hello:</span><br><span class="line">    Image:      busybox</span><br><span class="line">    Port:       &lt;none&gt;</span><br><span class="line">    Host Port:  &lt;none&gt;</span><br><span class="line">    Command:</span><br><span class="line">      <span class="built_in">echo</span></span><br><span class="line">       hello, Job</span><br><span class="line">    Environment:  &lt;none&gt;</span><br><span class="line">    Mounts:       &lt;none&gt;</span><br><span class="line">  Volumes:        &lt;none&gt;</span><br><span class="line">Events:</span><br><span class="line">  Type    Reason            Age    From            Message</span><br><span class="line">  ----    ------            ----   ----            -------</span><br><span class="line">  Normal  SuccessfulCreate  3m56s  job-controller  Created pod: my-job-d4rnl</span><br><span class="line">  Normal  Completed         3m54s  job-controller  Job completed</span><br><span class="line"></span><br><span class="line">$ kubectl logs my-job-d4rnl</span><br><span class="line"> hello, Job</span><br></pre></td></tr></table></figure><h3 id="分析"><a class="markdownIt-Anchor" href="#分析"></a> 分析</h3><p>Job创建后，pod模版中添加了一个controller-uid为一个随机字符串的label，而job则拥有一个同样id的selector</p><p>而job完成后，进入了completed的状态</p><h3 id="删除对应的pod"><a class="markdownIt-Anchor" href="#删除对应的pod"></a> 删除对应的pod</h3><figure class="highlight bash"><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">$ kubectl delete pod my-job-d4rnl</span><br><span class="line">pod <span class="string">"my-job-d4rnl"</span> deleted</span><br></pre></td></tr></table></figure><p>删除对应的pod后，会发现没有再创建新的pod</p><h3 id="错误的job"><a class="markdownIt-Anchor" href="#错误的job"></a> 错误的job</h3><figure class="highlight yaml"><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="attr">apiVersion:</span> <span class="string">batch/v1</span></span><br><span class="line"><span class="attr">kind:</span> <span class="string">Job</span></span><br><span class="line"><span class="attr">metadata:</span></span><br><span class="line">  <span class="attr">name:</span> <span class="string">my-job</span></span><br><span class="line"><span class="attr">spec:</span></span><br><span class="line">  <span class="attr">template:</span></span><br><span class="line">    <span class="attr">spec:</span></span><br><span class="line">      <span class="attr">containers:</span></span><br><span class="line">      <span class="bullet">-</span> <span class="attr">name:</span> <span class="string">hello</span></span><br><span class="line">        <span class="attr">image:</span> <span class="string">busybox</span></span><br><span class="line">        <span class="attr">imagePullPolicy:</span> <span class="string">IfNotPresent</span></span><br><span class="line">        <span class="attr">command:</span> <span class="string">["exit</span> <span class="number">1</span><span class="string">"]</span></span><br><span class="line"><span class="string">      restartPolicy: Never</span></span><br></pre></td></tr></table></figure><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><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></pre></td><td class="code"><pre><span class="line">$ kubectl get <span class="built_in">jobs</span> -o wide</span><br><span class="line">NAME     COMPLETIONS   DURATION   AGE   CONTAINERS   IMAGES    SELECTOR</span><br><span class="line">my-job   0/1           54s        54s   hello        busybox   controller-uid=9ac8a40c-1548-4683-bbd6-870a236199bf</span><br><span class="line">$ kubectl describe job my-job</span><br><span class="line">Name:           my-job</span><br><span class="line">Namespace:      default</span><br><span class="line">Selector:       controller-uid=9ac8a40c-1548-4683-bbd6-870a236199bf</span><br><span class="line">Labels:         controller-uid=9ac8a40c-1548-4683-bbd6-870a236199bf</span><br><span class="line">                job-name=my-job</span><br><span class="line">Annotations:    Parallelism:  1</span><br><span class="line">Completions:    1</span><br><span class="line">Start Time:     Mon, 03 Aug 2020 14:21:59 +0800</span><br><span class="line">Pods Statuses:  1 Running / 0 Succeeded / 4 Failed</span><br><span class="line">Pod Template:</span><br><span class="line">  Labels:  controller-uid=9ac8a40c-1548-4683-bbd6-870a236199bf</span><br><span class="line">           job-name=my-job</span><br><span class="line">  Containers:</span><br><span class="line">   hello:</span><br><span class="line">    Image:      busybox</span><br><span class="line">    Port:       &lt;none&gt;</span><br><span class="line">    Host Port:  &lt;none&gt;</span><br><span class="line">    Command:</span><br><span class="line">      <span class="built_in">exit</span> 1</span><br><span class="line">    Environment:  &lt;none&gt;</span><br><span class="line">    Mounts:       &lt;none&gt;</span><br><span class="line">  Volumes:        &lt;none&gt;</span><br><span class="line">Events:</span><br><span class="line">  Type    Reason            Age   From            Message</span><br><span class="line">  ----    ------            ----  ----            -------</span><br><span class="line">  Normal  SuccessfulCreate  77s   job-controller  Created pod: my-job-n8qf2</span><br><span class="line">  Normal  SuccessfulCreate  75s   job-controller  Created pod: my-job-j484w</span><br><span class="line">  Normal  SuccessfulCreate  65s   job-controller  Created pod: my-job-576nv</span><br><span class="line">  Normal  SuccessfulCreate  45s   job-controller  Created pod: my-job-xdk29</span><br><span class="line">  Normal  SuccessfulCreate  5s    job-controller  Created pod: my-job-ghfcv</span><br></pre></td></tr></table></figure><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><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line">$ kubectl get pods</span><br><span class="line">NAME               READY   STATUS               RESTARTS   AGE</span><br><span class="line">my-job-576nv       0/1     ContainerCannotRun   0          109s</span><br><span class="line">my-job-ghfcv       0/1     ContainerCannotRun   0          49s</span><br><span class="line">my-job-j484w       0/1     ContainerCannotRun   0          119s</span><br><span class="line">my-job-n8qf2       0/1     ContainerCannotRun   0          2m1s</span><br><span class="line">my-job-xdk29       0/1     ContainerCannotRun   0          89s</span><br></pre></td></tr></table></figure><p>由于<code>restartPolicy=Never</code>，可以看到，对应的pod的RESTARTS始终为0，job-controller会不停的创建新的pod。</p><p>现在，讲restartPolicy改为<code>OnFailure</code></p><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><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></pre></td><td class="code"><pre><span class="line">$ kubectl describe job my-job</span><br><span class="line">Name:           my-job</span><br><span class="line">Namespace:      default</span><br><span class="line">Selector:       controller-uid=d404af28-5d83-4943-85cf-301c2910d967</span><br><span class="line">Labels:         controller-uid=d404af28-5d83-4943-85cf-301c2910d967</span><br><span class="line">                job-name=my-job</span><br><span class="line">Annotations:    Parallelism:  1</span><br><span class="line">Completions:    1</span><br><span class="line">Start Time:     Mon, 03 Aug 2020 14:28:45 +0800</span><br><span class="line">Pods Statuses:  1 Running / 0 Succeeded / 0 Failed</span><br><span class="line">Pod Template:</span><br><span class="line">  Labels:  controller-uid=d404af28-5d83-4943-85cf-301c2910d967</span><br><span class="line">           job-name=my-job</span><br><span class="line">  Containers:</span><br><span class="line">   hello:</span><br><span class="line">    Image:      busybox</span><br><span class="line">    Port:       &lt;none&gt;</span><br><span class="line">    Host Port:  &lt;none&gt;</span><br><span class="line">    Command:</span><br><span class="line">      <span class="built_in">exit</span> 1</span><br><span class="line">    Environment:  &lt;none&gt;</span><br><span class="line">    Mounts:       &lt;none&gt;</span><br><span class="line">  Volumes:        &lt;none&gt;</span><br><span class="line">Events:</span><br><span class="line">  Type    Reason            Age    From            Message</span><br><span class="line">  ----    ------            ----   ----            -------</span><br><span class="line">  Normal  SuccessfulCreate  2m50s  job-controller  Created pod: my-job-2ndzd</span><br><span class="line">$ kubectl get pod</span><br><span class="line">NAME             READY   STATUS             RESTARTS   AGE</span><br><span class="line">my-job-2ndzd     0/1     CrashLoopBackOff   3          96s</span><br></pre></td></tr></table></figure><p>可以看到，对应的pod在不断的重启</p><h3 id="并行作业"><a class="markdownIt-Anchor" href="#并行作业"></a> 并行作业</h3><figure class="highlight yaml"><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></pre></td><td class="code"><pre><span class="line"><span class="attr">apiVersion:</span> <span class="string">batch/v1</span></span><br><span class="line"><span class="attr">kind:</span> <span class="string">Job</span></span><br><span class="line"><span class="attr">metadata:</span></span><br><span class="line">  <span class="attr">name:</span> <span class="string">my-job</span></span><br><span class="line"><span class="attr">spec:</span></span><br><span class="line">  <span class="attr">parallelism:</span> <span class="number">2</span></span><br><span class="line">  <span class="attr">completions:</span> <span class="number">4</span></span><br><span class="line">  <span class="attr">template:</span></span><br><span class="line">    <span class="attr">metadata:</span></span><br><span class="line">      <span class="attr">labels:</span></span><br><span class="line">        <span class="attr">name:</span> <span class="string">my-job</span></span><br><span class="line">    <span class="attr">spec:</span></span><br><span class="line">      <span class="attr">containers:</span></span><br><span class="line">      <span class="bullet">-</span> <span class="attr">name:</span> <span class="string">my-job</span></span><br><span class="line">        <span class="attr">image:</span> <span class="string">busybox</span></span><br><span class="line">        <span class="attr">imagePullPolicy:</span> <span class="string">IfNotPresent</span></span><br><span class="line">        <span class="attr">command:</span> <span class="string">["echo",</span> <span class="string">"hello Job"</span><span class="string">]</span></span><br><span class="line">      <span class="attr">restartPolicy:</span> <span class="string">Never</span></span><br></pre></td></tr></table></figure><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><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line">$ kubectl get pods -l name=my-job</span><br><span class="line">NAME           READY   STATUS      RESTARTS   AGE</span><br><span class="line">my-job-2x4lc   0/1     Completed   0          10s</span><br><span class="line">my-job-lnhxx   0/1     Completed   0          7s</span><br><span class="line">my-job-md4nr   0/1     Completed   0          10s</span><br><span class="line">my-job-s5znf   0/1     Completed   0          7s</span><br></pre></td></tr></table></figure><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></pre></td><td class="code"><pre><span class="line">$ kubectl get <span class="built_in">jobs</span></span><br><span class="line">NAME     COMPLETIONS   DURATION   AGE</span><br><span class="line">my-job   4/4           5s         16s</span><br></pre></td></tr></table></figure><p>可以根据pod的时间看出，<code>my-job-2x4lc</code>和<code>my-job-md4nr</code>是同一时间创建的，而另外两个pod则在其之后3s创建的。</p><h2 id="cronjob"><a class="markdownIt-Anchor" href="#cronjob"></a> CronJob</h2><figure class="highlight yaml"><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></pre></td><td class="code"><pre><span class="line"><span class="attr">apiVersion:</span> <span class="string">batch/v1beta1</span></span><br><span class="line"><span class="attr">kind:</span> <span class="string">CronJob</span></span><br><span class="line"><span class="attr">metadata:</span></span><br><span class="line">  <span class="attr">name:</span> <span class="string">hello</span></span><br><span class="line"><span class="attr">spec:</span></span><br><span class="line">  <span class="attr">schedule:</span> <span class="string">"*/1 * * * *"</span></span><br><span class="line">  <span class="attr">jobTemplate:</span></span><br><span class="line">    <span class="attr">spec:</span></span><br><span class="line">      <span class="attr">template:</span></span><br><span class="line">        <span class="attr">spec:</span></span><br><span class="line">          <span class="attr">containers:</span></span><br><span class="line">          <span class="bullet">-</span> <span class="attr">name:</span> <span class="string">hello</span></span><br><span class="line">            <span class="attr">image:</span> <span class="string">busybox</span></span><br><span class="line">            <span class="attr">imagePullPolicy:</span> <span class="string">IfNotPresent</span></span><br><span class="line">            <span class="attr">args:</span></span><br><span class="line">            <span class="bullet">-</span> <span class="string">/bin/sh</span></span><br><span class="line">            <span class="bullet">-</span> <span class="string">-c</span></span><br><span class="line">            <span class="bullet">-</span> <span class="string">date;</span> <span class="string">echo</span> <span class="string">Hello</span> <span class="string">from</span> <span class="string">Kubernetes</span> <span class="string">Cluster</span></span><br><span class="line">          <span class="attr">restartPolicy:</span> <span class="string">OnFailure</span></span><br></pre></td></tr></table></figure><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><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></pre></td><td class="code"><pre><span class="line">$ kubectl get cronjobs.batch</span><br><span class="line">NAME    SCHEDULE      SUSPEND   ACTIVE   LAST SCHEDULE   AGE</span><br><span class="line">hello   */1 * * * *   False     0        46s             2m39s</span><br><span class="line">$ kubectl get <span class="built_in">jobs</span></span><br><span class="line">NAME               COMPLETIONS   DURATION   AGE</span><br><span class="line">hello-1596438780   1/1           2s         2m38s</span><br><span class="line">hello-1596438840   1/1           1s         98s</span><br><span class="line">hello-1596438900   1/1           2s         38s</span><br><span class="line">$ kubectl get pods</span><br><span class="line">NAME                     READY   STATUS      RESTARTS   AGE</span><br><span class="line">hello-1596438720-2j5t4   0/1     Completed   0          3s</span><br><span class="line">hello-1596438780-lbwnz   0/1     Completed   0          12s</span><br></pre></td></tr></table></figure><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><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">$ kubectl describe pod hello-1596438960-4c5ft</span><br><span class="line">Name:         hello-1596438960-4c5ft</span><br><span class="line">Namespace:    default</span><br><span class="line">Priority:     0</span><br><span class="line">Node:         k8s-node4/10.160.18.184</span><br><span class="line">Start Time:   Mon, 03 Aug 2020 15:16:03 +0800</span><br><span class="line">Labels:       controller-uid=e421bffd-df9f-4342-8c3f-a852076deb6e</span><br><span class="line">              job-name=hello-1596438960</span><br><span class="line">Annotations:  &lt;none&gt;</span><br><span class="line">Status:       Succeeded</span><br><span class="line">IP:           172.1.3.42</span><br><span class="line">IPs:</span><br><span class="line">  IP:           172.1.3.42</span><br><span class="line">Controlled By:  Job/hello-1596438960</span><br></pre></td></tr></table></figure><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><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">$ kubectl describe job hello-1596438960</span><br><span class="line">Name:           hello-1596438960</span><br><span class="line">Namespace:      default</span><br><span class="line">Selector:       controller-uid=e421bffd-df9f-4342-8c3f-a852076deb6e</span><br><span class="line">Labels:         controller-uid=e421bffd-df9f-4342-8c3f-a852076deb6e</span><br><span class="line">                job-name=hello-1596438960</span><br><span class="line">Annotations:    &lt;none&gt;</span><br><span class="line">Controlled By:  CronJob/hello</span><br></pre></td></tr></table></figure><h3 id="分析-2"><a class="markdownIt-Anchor" href="#分析-2"></a> 分析</h3><p>从yaml文件中可以看到，jobTemplate的描述同Job，所以，CronJob实际上是一个job的调度器。</p><p>CronJob创建了以<code>hello-</code>+随机串的方式，创建了随后的多个Job，再由Job控制Pod运行</p><p>而从pod一层一层往上追溯：</p><ul><li>Pod测controller为Job</li><li>Job的controller为CronJob</li></ul><h2 id="小结"><a class="markdownIt-Anchor" href="#小结"></a> 小结</h2><p>本章节主要了解了一下Job和CronJob。需要理解的是：</p><ul><li>Job控制pod，且Job仅运行一次</li><li>CronJob通过定时创建Job来运行</li></ul>]]></content>
    
    <summary type="html">
    
      &lt;blockquote&gt;
&lt;p&gt;学习极客时间上的&lt;a href=&quot;https://time.geekbang.org/column/intro/116&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;《深入剖析Kubernetes》&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;秉持眼过千遍不如手过一遍的原则。动手实践并记录结果&lt;/p&gt;
&lt;p&gt;对应章节：&lt;a href=&quot;https://time.geekbang.org/column/article/41607&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;22 | 撬动离线业务：Job与CronJob&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
    
    </summary>
    
    
      <category term="k8s" scheme="http://www.isimble.com/categories/k8s/"/>
    
    
      <category term="docker" scheme="http://www.isimble.com/tags/docker/"/>
    
      <category term="Kubernetes" scheme="http://www.isimble.com/tags/Kubernetes/"/>
    
  </entry>
  
  <entry>
    <title>K8s学习笔记——DaemonSet</title>
    <link href="http://www.isimble.com/2020/08/25/kubernetesLearning21/"/>
    <id>http://www.isimble.com/2020/08/25/kubernetesLearning21/</id>
    <published>2020-08-25T05:51:28.000Z</published>
    <updated>2020-08-25T05:54:54.059Z</updated>
    
    <content type="html"><![CDATA[<blockquote><p>学习极客时间上的<a href="https://time.geekbang.org/column/intro/116" target="_blank" rel="noopener">《深入剖析Kubernetes》</a></p><p>秉持眼过千遍不如手过一遍的原则。动手实践并记录结果</p><p>对应章节：<a href="https://time.geekbang.org/column/article/41366" target="_blank" rel="noopener">21 | 容器化守护进程的意义：DaemonSet</a></p></blockquote><a id="more"></a><h2 id="nodeaffinity"><a class="markdownIt-Anchor" href="#nodeaffinity"></a> nodeAffinity</h2><blockquote><p>原文中的nodeSelector和nodeAffinity的设置的yaml，apply之后一直处于pending状态。机智的我查看了一下flannel的pod设置，发现原文中使用了<code>matchExpressions</code>，而flannel的则使用了<code>matchFields</code></p></blockquote><figure class="highlight yaml"><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></pre></td><td class="code"><pre><span class="line"><span class="attr">apiVersion:</span> <span class="string">v1</span></span><br><span class="line"><span class="attr">kind:</span> <span class="string">Pod</span></span><br><span class="line"><span class="attr">metadata:</span></span><br><span class="line">  <span class="attr">name:</span> <span class="string">node-affinity-pod</span></span><br><span class="line"><span class="attr">spec:</span></span><br><span class="line">  <span class="attr">affinity:</span></span><br><span class="line">    <span class="attr">nodeAffinity:</span></span><br><span class="line">      <span class="attr">requiredDuringSchedulingIgnoredDuringExecution:</span></span><br><span class="line">        <span class="attr">nodeSelectorTerms:</span></span><br><span class="line">        <span class="bullet">-</span> <span class="attr">matchFields:</span></span><br><span class="line">          <span class="bullet">-</span> <span class="attr">key:</span> <span class="string">metadata.name</span></span><br><span class="line">            <span class="attr">operator:</span> <span class="string">In</span></span><br><span class="line">            <span class="attr">values:</span></span><br><span class="line">            <span class="bullet">-</span> <span class="string">node2</span></span><br><span class="line">  <span class="attr">containers:</span></span><br><span class="line">  <span class="bullet">-</span> <span class="attr">name:</span> <span class="string">busybox</span></span><br><span class="line">    <span class="attr">image:</span> <span class="string">busybox</span></span><br><span class="line">    <span class="attr">imagePullPolicy:</span> <span class="string">IfNotPresent</span></span><br><span class="line">    <span class="attr">stdin:</span> <span class="literal">true</span></span><br><span class="line">    <span class="attr">tty:</span> <span class="literal">true</span></span><br></pre></td></tr></table></figure><p>这样，我指定了调度到<code>node2</code>上</p><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></pre></td><td class="code"><pre><span class="line">$ kubectl get pod node-affinity-pod -o wide</span><br><span class="line">NAME                READY   STATUS    RESTARTS   AGE   IP            NODE    NOMINATED NODE   READINESS GATES</span><br><span class="line">node-affinity-pod   1/1     Running   0          23s   172.1.1.100   node2   &lt;none&gt;           &lt;none&gt;</span><br></pre></td></tr></table></figure><p>当然，这样只是指定了node来调度，但并不惟一。比如修改上面yaml文件中的name后，再创建一个pod，同样可以创建成功</p><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></pre></td><td class="code"><pre><span class="line">$ kubectl get pod node-affinity-pod -o wide</span><br><span class="line">NAME                READY   STATUS    RESTARTS   AGE   IP            NODE    NOMINATED NODE   READINESS GATES</span><br><span class="line">node-affinity-pod   1/1     Running   0          23s   172.1.1.100   node2   &lt;none&gt;           &lt;none&gt;</span><br><span class="line">node-affinity-pod2  1/1     Running   0          14s   172.1.1.101   node2   &lt;none&gt;           &lt;none&gt;</span><br></pre></td></tr></table></figure><p>但如果我将node设置为<code>node1</code>（node1是我的环境的master节点）</p><figure class="highlight yaml"><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></pre></td><td class="code"><pre><span class="line"><span class="attr">apiVersion:</span> <span class="string">v1</span></span><br><span class="line"><span class="attr">kind:</span> <span class="string">Pod</span></span><br><span class="line"><span class="attr">metadata:</span></span><br><span class="line">  <span class="attr">name:</span> <span class="string">node-affinity-pod</span></span><br><span class="line"><span class="attr">spec:</span></span><br><span class="line">  <span class="attr">affinity:</span></span><br><span class="line">    <span class="attr">nodeAffinity:</span></span><br><span class="line">      <span class="attr">requiredDuringSchedulingIgnoredDuringExecution:</span></span><br><span class="line">        <span class="attr">nodeSelectorTerms:</span></span><br><span class="line">        <span class="bullet">-</span> <span class="attr">matchFields:</span></span><br><span class="line">          <span class="bullet">-</span> <span class="attr">key:</span> <span class="string">metadata.name</span></span><br><span class="line">            <span class="attr">operator:</span> <span class="string">In</span></span><br><span class="line">            <span class="attr">values:</span></span><br><span class="line">            <span class="bullet">-</span> <span class="string">node1</span></span><br><span class="line">  <span class="attr">containers:</span></span><br><span class="line">  <span class="bullet">-</span> <span class="attr">name:</span> <span class="string">busybox</span></span><br><span class="line">    <span class="attr">image:</span> <span class="string">busybox</span></span><br><span class="line">    <span class="attr">imagePullPolicy:</span> <span class="string">IfNotPresent</span></span><br><span class="line">    <span class="attr">stdin:</span> <span class="literal">true</span></span><br><span class="line">    <span class="attr">tty:</span> <span class="literal">true</span></span><br></pre></td></tr></table></figure><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></pre></td><td class="code"><pre><span class="line">$ kubectl get pod node-affinity-pod -o wide</span><br><span class="line">NAME                READY   STATUS    RESTARTS   AGE   IP       NODE     NOMINATED NODE   READINESS GATES</span><br><span class="line">node-affinity-pod   0/1     Pending   0          96s   &lt;none&gt;   &lt;none&gt;   &lt;none&gt;           &lt;none&gt;</span><br></pre></td></tr></table></figure><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><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></pre></td><td class="code"><pre><span class="line">$ kubectl describe pod node-affinity-pod</span><br><span class="line">Name:         node-affinity-pod</span><br><span class="line">Namespace:    default</span><br><span class="line">Priority:     0</span><br><span class="line">Node:         &lt;none&gt;</span><br><span class="line">Labels:       &lt;none&gt;</span><br><span class="line">Annotations:  Status:  Pending</span><br><span class="line">...</span><br><span class="line">QoS Class:       BestEffort</span><br><span class="line">Node-Selectors:  &lt;none&gt;</span><br><span class="line">Tolerations:     node.kubernetes.io/not-ready:NoExecute <span class="keyword">for</span> 300s</span><br><span class="line">                 node.kubernetes.io/unreachable:NoExecute <span class="keyword">for</span> 300s</span><br><span class="line">Events:</span><br><span class="line">  Type     Reason            Age               From               Message</span><br><span class="line">  ----     ------            ----              ----               -------</span><br><span class="line">  Warning  FailedScheduling  36s (x3 over 2m)  default-scheduler  0/4 nodes are available: 1 node(s) had taint &#123;node-role.kubernetes.io/master: &#125;, that the pod didn<span class="string">'t tolerate, 3 node(s) didn'</span>t match node selector.</span><br></pre></td></tr></table></figure><p><code>1 node(s) had taint {node-role.kubernetes.io/master: }</code>，由于master节点不允许普通pod调度上去，所以，pod处于pending状态。</p><h2 id="污点"><a class="markdownIt-Anchor" href="#污点"></a> 污点</h2><figure class="highlight yaml"><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></pre></td><td class="code"><pre><span class="line"><span class="attr">apiVersion:</span> <span class="string">v1</span></span><br><span class="line"><span class="attr">kind:</span> <span class="string">Pod</span></span><br><span class="line"><span class="attr">metadata:</span></span><br><span class="line">  <span class="attr">name:</span> <span class="string">toleration-pod</span></span><br><span class="line"><span class="attr">spec:</span></span><br><span class="line">  <span class="attr">affinity:</span></span><br><span class="line">    <span class="attr">nodeAffinity:</span></span><br><span class="line">      <span class="attr">requiredDuringSchedulingIgnoredDuringExecution:</span></span><br><span class="line">        <span class="attr">nodeSelectorTerms:</span></span><br><span class="line">        <span class="bullet">-</span> <span class="attr">matchFields:</span></span><br><span class="line">          <span class="bullet">-</span> <span class="attr">key:</span> <span class="string">metadata.name</span></span><br><span class="line">            <span class="attr">operator:</span> <span class="string">In</span></span><br><span class="line">            <span class="attr">values:</span></span><br><span class="line">            <span class="bullet">-</span> <span class="string">node1</span></span><br><span class="line">  <span class="attr">tolerations:</span></span><br><span class="line">  <span class="bullet">-</span> <span class="attr">key:</span> <span class="string">node-role.kubernetes.io/master</span></span><br><span class="line">    <span class="attr">effect:</span> <span class="string">NoSchedule</span></span><br><span class="line">  <span class="attr">containers:</span></span><br><span class="line">  <span class="bullet">-</span> <span class="attr">name:</span> <span class="string">busybox</span></span><br><span class="line">    <span class="attr">image:</span> <span class="string">busybox</span></span><br><span class="line">    <span class="attr">imagePullPolicy:</span> <span class="string">IfNotPresent</span></span><br><span class="line">    <span class="attr">stdin:</span> <span class="literal">true</span></span><br><span class="line">    <span class="attr">tty:</span> <span class="literal">true</span></span><br></pre></td></tr></table></figure><p>改造了上面的pod，增加了对<code>node-role.kubernetes.io/master</code>的容忍</p><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></pre></td><td class="code"><pre><span class="line">$ kubectl get pod toleration-pod -o wide</span><br><span class="line">NAME             READY   STATUS    RESTARTS   AGE   IP           NODE    NOMINATED NODE   READINESS GATES</span><br><span class="line">toleration-pod   1/1     Running   0          1s    172.1.0.89   node1   &lt;none&gt;           &lt;none&gt;</span><br></pre></td></tr></table></figure><p>现在，pod已经被调度到了node1上</p><p>这样，就解决了master node上不能被调度的问题。同样，课程中提到了<code>unschedulable</code>的污点容忍。</p><blockquote><p>DaemonSet 自动地给被管理的 Pod 加上了这个特殊的 Toleration，就使得这些 Pod 可以忽略这个限制，继而保证每个节点上都会被调度一个 Pod</p></blockquote><h2 id="daemonset"><a class="markdownIt-Anchor" href="#daemonset"></a> DaemonSet</h2><h3 id="创建ds"><a class="markdownIt-Anchor" href="#创建ds"></a> 创建ds</h3><figure class="highlight yaml"><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></pre></td><td class="code"><pre><span class="line"><span class="attr">apiVersion:</span> <span class="string">apps/v1</span></span><br><span class="line"><span class="attr">kind:</span> <span class="string">DaemonSet</span></span><br><span class="line"><span class="attr">metadata:</span></span><br><span class="line">  <span class="attr">name:</span> <span class="string">test-ds</span></span><br><span class="line"><span class="attr">spec:</span></span><br><span class="line">  <span class="attr">selector:</span></span><br><span class="line">    <span class="attr">matchLabels:</span></span><br><span class="line">      <span class="attr">name:</span> <span class="string">my-test</span></span><br><span class="line">  <span class="attr">template:</span></span><br><span class="line">    <span class="attr">metadata:</span></span><br><span class="line">      <span class="attr">labels:</span></span><br><span class="line">        <span class="attr">name:</span> <span class="string">my-test</span></span><br><span class="line">    <span class="attr">spec:</span></span><br><span class="line">      <span class="attr">tolerations:</span></span><br><span class="line">      <span class="bullet">-</span> <span class="attr">key:</span> <span class="string">node-role.kubernetes.io/master</span></span><br><span class="line">        <span class="attr">effect:</span> <span class="string">NoSchedule</span></span><br><span class="line">      <span class="attr">containers:</span></span><br><span class="line">      <span class="bullet">-</span> <span class="attr">name:</span> <span class="string">my-test-busybox</span></span><br><span class="line">        <span class="attr">image:</span> <span class="string">busybox</span></span><br><span class="line">        <span class="attr">imagePullPolicy:</span> <span class="string">IfNotPresent</span></span><br><span class="line">        <span class="attr">stdin:</span> <span class="literal">true</span></span><br><span class="line">        <span class="attr">tty:</span> <span class="literal">true</span></span><br></pre></td></tr></table></figure><p>创建了一个<code>test-ds</code>的DaemonSet，在污点部分，容忍了master的污点。使其可以被调度在master节点上</p><h3 id="查看结果"><a class="markdownIt-Anchor" href="#查看结果"></a> 查看结果</h3><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></pre></td><td class="code"><pre><span class="line">kubectl get ds</span><br><span class="line">NAME        DESIRED   CURRENT   READY   UP-TO-DATE   AVAILABLE   NODE SELECTOR   AGE</span><br><span class="line"><span class="built_in">test</span>-ds     4         4         4       4            4           &lt;none&gt;          3m7s</span><br></pre></td></tr></table></figure><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><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line">$ kubectl get pods -l name=my-test -o wide</span><br><span class="line">NAME            READY   STATUS    RESTARTS   AGE     IP            NODE            NOMINATED NODE   READINESS GATES</span><br><span class="line"><span class="built_in">test</span>-ds-5nxj9   1/1     Running   0          4m33s   172.1.1.103   node2           &lt;none&gt;           &lt;none&gt;</span><br><span class="line"><span class="built_in">test</span>-ds-bc9jx   1/1     Running   0          4m33s   172.1.2.54    bqi-k8s-node3   &lt;none&gt;           &lt;none&gt;</span><br><span class="line"><span class="built_in">test</span>-ds-kgxm5   1/1     Running   0          4m33s   172.1.3.9     k8s-node4       &lt;none&gt;           &lt;none&gt;</span><br><span class="line"><span class="built_in">test</span>-ds-wvhm2   1/1     Running   0          4m33s   172.1.0.90    node1           &lt;none&gt;           &lt;none&gt;</span><br></pre></td></tr></table></figure><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><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></pre></td><td class="code"><pre><span class="line">$ kubectl describe pod <span class="built_in">test</span>-ds-kgxm5</span><br><span class="line">Name:         <span class="built_in">test</span>-ds-kgxm5</span><br><span class="line">Namespace:    default</span><br><span class="line">Priority:     0</span><br><span class="line">Node:         k8s-node4/10.160.18.184</span><br><span class="line">Start Time:   Fri, 31 Jul 2020 11:50:29 +0800</span><br><span class="line">Labels:       controller-revision-hash=7cdb9f7c5c</span><br><span class="line">              name=my-test</span><br><span class="line">              pod-template-generation=1</span><br><span class="line">Annotations:  &lt;none&gt;</span><br><span class="line">Status:       Running</span><br><span class="line">IP:           172.1.3.9</span><br><span class="line">IPs:</span><br><span class="line">  IP:           172.1.3.9</span><br><span class="line">Controlled By:  DaemonSet/<span class="built_in">test</span>-ds</span><br><span class="line">...</span><br><span class="line">QoS Class:       BestEffort</span><br><span class="line">Node-Selectors:  &lt;none&gt;</span><br><span class="line">Tolerations:     node-role.kubernetes.io/master:NoSchedule</span><br><span class="line">                 node.kubernetes.io/disk-pressure:NoSchedule</span><br><span class="line">                 node.kubernetes.io/memory-pressure:NoSchedule</span><br><span class="line">                 node.kubernetes.io/not-ready:NoExecute</span><br><span class="line">                 node.kubernetes.io/pid-pressure:NoSchedule</span><br><span class="line">                 node.kubernetes.io/unreachable:NoExecute</span><br><span class="line">                 node.kubernetes.io/unschedulable:NoSchedule</span><br><span class="line">Events:</span><br><span class="line">  Type    Reason     Age    From                Message</span><br><span class="line">  ----    ------     ----   ----                -------</span><br><span class="line">  Normal  Scheduled  4m55s  default-scheduler   Successfully assigned default/<span class="built_in">test</span>-ds-kgxm5 to k8s-node4</span><br><span class="line">  Normal  Pulling    4m54s  kubelet, k8s-node4  Pulling image <span class="string">"busybox"</span></span><br><span class="line">  Normal  Pulled     4m53s  kubelet, k8s-node4  Successfully pulled image <span class="string">"busybox"</span></span><br><span class="line">  Normal  Created    4m53s  kubelet, k8s-node4  Created container my-test-busybox</span><br><span class="line">  Normal  Started    4m52s  kubelet, k8s-node4  Started container my-test-busybox</span><br></pre></td></tr></table></figure><p>可以看到，每个node上都创建了一个pod，并且Tolerations字段中，除了<code>node-role.kubernetes.io/master:NoSchedule</code>，还自动增加了很多污点</p><h3 id="kill一个pod"><a class="markdownIt-Anchor" href="#kill一个pod"></a> kill一个pod</h3><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><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">$ kubectl delete pod <span class="built_in">test</span>-ds-kgxm5</span><br><span class="line">pod <span class="string">"test-ds-kgxm5"</span> deleted</span><br><span class="line">$ kubectl get pods -l name=my-test -o wide</span><br><span class="line">NAME            READY   STATUS    RESTARTS   AGE    IP            NODE            NOMINATED NODE   READINESS GATES</span><br><span class="line"><span class="built_in">test</span>-ds-5nxj9   1/1     Running   0          9m9s   172.1.1.103   node2           &lt;none&gt;           &lt;none&gt;</span><br><span class="line"><span class="built_in">test</span>-ds-bc9jx   1/1     Running   0          9m9s   172.1.2.54    bqi-k8s-node3   &lt;none&gt;           &lt;none&gt;</span><br><span class="line"><span class="built_in">test</span>-ds-dckg2   1/1     Running   0          5s     172.1.3.10    k8s-node4       &lt;none&gt;           &lt;none&gt;</span><br><span class="line"><span class="built_in">test</span>-ds-wvhm2   1/1     Running   0          9m9s   172.1.0.90    node1           &lt;none&gt;           &lt;none&gt;</span><br></pre></td></tr></table></figure><h3 id="更新"><a class="markdownIt-Anchor" href="#更新"></a> 更新</h3><ul><li>尝试更新镜像版本为一个错误的镜像</li></ul><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><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></pre></td><td class="code"><pre><span class="line">$ kubectl get pods -l name=my-test -o wide</span><br><span class="line">NAME            READY   STATUS              RESTARTS   AGE     IP            NODE            NOMINATED NODE   READINESS GATES</span><br><span class="line"><span class="built_in">test</span>-ds-5nxj9   1/1     Running             0          5h27m   172.1.1.103   node2           &lt;none&gt;           &lt;none&gt;</span><br><span class="line"><span class="built_in">test</span>-ds-dckg2   1/1     Running             0          5h18m   172.1.3.10    k8s-node4       &lt;none&gt;           &lt;none&gt;</span><br><span class="line"><span class="built_in">test</span>-ds-sbsbq   0/1     ContainerCreating   0          23s     &lt;none&gt;        bqi-k8s-node3   &lt;none&gt;           &lt;none&gt;</span><br><span class="line"><span class="built_in">test</span>-ds-wvhm2   1/1     Running             0          5h27m   172.1.0.90    node1           &lt;none&gt;           &lt;none&gt;</span><br><span class="line">$ kubectl get pods -l name=my-test -o wide</span><br><span class="line">NAME            READY   STATUS             RESTARTS   AGE     IP            NODE            NOMINATED NODE   READINESS GATES</span><br><span class="line"><span class="built_in">test</span>-ds-5nxj9   1/1     Running            0          5h28m   172.1.1.103   node2           &lt;none&gt;           &lt;none&gt;</span><br><span class="line"><span class="built_in">test</span>-ds-dckg2   1/1     Running            0          5h19m   172.1.3.10    k8s-node4       &lt;none&gt;           &lt;none&gt;</span><br><span class="line"><span class="built_in">test</span>-ds-sbsbq   0/1     ImagePullBackOff   0          42s     172.1.2.55    bqi-k8s-node3   &lt;none&gt;           &lt;none&gt;</span><br><span class="line"><span class="built_in">test</span>-ds-wvhm2   1/1     Running            0          5h28m   172.1.0.90    node1           &lt;none&gt;           &lt;none&gt;</span><br></pre></td></tr></table></figure><p>可以看到，DaemonSet的控制器会选择一个pod进行更新，当遇到更新失败时，将停止更新</p><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><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></pre></td><td class="code"><pre><span class="line">$ kubectl describe pod <span class="built_in">test</span>-ds-5nxj9</span><br><span class="line">Name:         <span class="built_in">test</span>-ds-5nxj9</span><br><span class="line">Namespace:    default</span><br><span class="line">Priority:     0</span><br><span class="line">Node:         node2/10.160.18.181</span><br><span class="line">Start Time:   Fri, 31 Jul 2020 11:50:29 +0800</span><br><span class="line">Labels:       controller-revision-hash=7cdb9f7c5c</span><br><span class="line">              name=my-test</span><br><span class="line">              pod-template-generation=1</span><br><span class="line">...</span><br><span class="line">$ kubectl describe pod <span class="built_in">test</span>-ds-dckg2</span><br><span class="line">Name:         <span class="built_in">test</span>-ds-dckg2</span><br><span class="line">Namespace:    default</span><br><span class="line">Priority:     0</span><br><span class="line">Node:         k8s-node4/10.160.18.184</span><br><span class="line">Start Time:   Fri, 31 Jul 2020 11:59:33 +0800</span><br><span class="line">Labels:       controller-revision-hash=7cdb9f7c5c</span><br><span class="line">              name=my-test</span><br><span class="line">              pod-template-generation=1</span><br><span class="line">...</span><br><span class="line">$ kubectl describe pod <span class="built_in">test</span>-ds-sbsbq</span><br><span class="line">Name:         <span class="built_in">test</span>-ds-sbsbq</span><br><span class="line">Namespace:    default</span><br><span class="line">Priority:     0</span><br><span class="line">Node:         bqi-k8s-node3/10.160.18.183</span><br><span class="line">Start Time:   Fri, 31 Jul 2020 17:18:02 +0800</span><br><span class="line">Labels:       controller-revision-hash=6755d9c956</span><br><span class="line">              name=my-test</span><br><span class="line">              pod-template-generation=2</span><br></pre></td></tr></table></figure><p>也可以看到，labels中：</p><ul><li>controller-revision-hash更新为一个新的</li><li>pod-template-generation更新为2</li></ul><p>现在，修改镜像为一个可用的镜像</p><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><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></pre></td><td class="code"><pre><span class="line">$ kubectl get pods -l name=my-test -o wide</span><br><span class="line">NAME            READY   STATUS        RESTARTS   AGE     IP            NODE            NOMINATED NODE   READINESS GATES</span><br><span class="line"><span class="built_in">test</span>-ds-dckg2   1/1     Terminating   0          5h25m   172.1.3.10    k8s-node4       &lt;none&gt;           &lt;none&gt;</span><br><span class="line"><span class="built_in">test</span>-ds-jd99w   1/1     Running       0          47s     172.1.2.56    bqi-k8s-node3   &lt;none&gt;           &lt;none&gt;</span><br><span class="line"><span class="built_in">test</span>-ds-nw5lk   1/1     Running       0          9s      172.1.1.104   node2           &lt;none&gt;           &lt;none&gt;</span><br><span class="line"><span class="built_in">test</span>-ds-wvhm2   1/1     Running       0          5h34m   172.1.0.90    node1           &lt;none&gt;           &lt;none&gt;</span><br><span class="line">$ kubectl get pods -l name=my-test -o wide</span><br><span class="line">NAME            READY   STATUS        RESTARTS   AGE     IP            NODE            NOMINATED NODE   READINESS GATES</span><br><span class="line"><span class="built_in">test</span>-ds-72z5v   1/1     Running       0          40s     172.1.3.11    k8s-node4       &lt;none&gt;           &lt;none&gt;</span><br><span class="line"><span class="built_in">test</span>-ds-jd99w   1/1     Running       0          118s    172.1.2.56    bqi-k8s-node3   &lt;none&gt;           &lt;none&gt;</span><br><span class="line"><span class="built_in">test</span>-ds-nw5lk   1/1     Running       0          80s     172.1.1.104   node2           &lt;none&gt;           &lt;none&gt;</span><br><span class="line"><span class="built_in">test</span>-ds-wvhm2   1/1     Terminating   0          5h35m   172.1.0.90    node1           &lt;none&gt;           &lt;none&gt;</span><br></pre></td></tr></table></figure><p>可以看到，当更新成功后，对应的pod被逐个替换</p><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><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">$ kubectl describe pod <span class="built_in">test</span>-ds-72z5v</span><br><span class="line">Name:         <span class="built_in">test</span>-ds-72z5v</span><br><span class="line">Namespace:    default</span><br><span class="line">Priority:     0</span><br><span class="line">Node:         k8s-node4/10.160.18.184</span><br><span class="line">Start Time:   Fri, 31 Jul 2020 17:25:23 +0800</span><br><span class="line">Labels:       controller-revision-hash=86b8bf4df4</span><br><span class="line">              name=my-test</span><br><span class="line">              pod-template-generation=3</span><br></pre></td></tr></table></figure><p>更新后的pod：</p><ul><li>controller-revision-hash被更新为一个新的</li><li>pod-template-generation也增加到了3</li></ul><h2 id="小结"><a class="markdownIt-Anchor" href="#小结"></a> 小结</h2><p>DaemonSet分别采用了遍历node来创建pod以及toleration等措施，保证了DaemonSet对应的pod在每一个node上被创建。</p><blockquote><p>通过 nodeAffinity 和 Toleration 这两个调度器的小功能，保证了每个节点上有且只有一个 Pod</p></blockquote><p>同时，通过controller-revision进行版本管理</p>]]></content>
    
    <summary type="html">
    
      &lt;blockquote&gt;
&lt;p&gt;学习极客时间上的&lt;a href=&quot;https://time.geekbang.org/column/intro/116&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;《深入剖析Kubernetes》&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;秉持眼过千遍不如手过一遍的原则。动手实践并记录结果&lt;/p&gt;
&lt;p&gt;对应章节：&lt;a href=&quot;https://time.geekbang.org/column/article/41366&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;21 | 容器化守护进程的意义：DaemonSet&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
    
    </summary>
    
    
      <category term="k8s" scheme="http://www.isimble.com/categories/k8s/"/>
    
    
      <category term="docker" scheme="http://www.isimble.com/tags/docker/"/>
    
      <category term="Kubernetes" scheme="http://www.isimble.com/tags/Kubernetes/"/>
    
  </entry>
  
  <entry>
    <title>K8s学习笔记——StatefulSet实践</title>
    <link href="http://www.isimble.com/2020/08/04/kubernetesLearning20/"/>
    <id>http://www.isimble.com/2020/08/04/kubernetesLearning20/</id>
    <published>2020-08-04T02:06:04.000Z</published>
    <updated>2020-08-04T02:07:58.789Z</updated>
    
    <content type="html"><![CDATA[<blockquote><p>学习极客时间上的<a href="https://time.geekbang.org/column/intro/116" target="_blank" rel="noopener">《深入剖析Kubernetes》</a></p><p>秉持眼过千遍不如手过一遍的原则。动手实践并记录结果</p><p>对应章节：<a href="https://time.geekbang.org/column/article/41217" target="_blank" rel="noopener">20 | 深入理解StatefulSet（三）：有状态应用实践</a></p></blockquote><a id="more"></a><h2 id="mysql集群"><a class="markdownIt-Anchor" href="#mysql集群"></a> MySQL集群</h2><h3 id="描述"><a class="markdownIt-Anchor" href="#描述"></a> 描述</h3><ol><li>是一个“主从复制“的MySQL集群</li><li>有一个主节点和多个从节点</li><li>从节点可水平扩展</li><li>所有写操作都只能在主节点上完成</li><li>读操作可以在所有节点上完成</li></ol><h3 id="创建myconf的configmap"><a class="markdownIt-Anchor" href="#创建myconf的configmap"></a> 创建my.conf的configMap</h3><figure class="highlight yaml"><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="attr">apiVersion:</span> <span class="string">v1</span></span><br><span class="line"><span class="attr">kind:</span> <span class="string">ConfigMap</span></span><br><span class="line"><span class="attr">metadata:</span></span><br><span class="line">  <span class="attr">name:</span> <span class="string">mysql</span></span><br><span class="line">  <span class="attr">labels:</span></span><br><span class="line">    <span class="attr">app:</span> <span class="string">mysql</span></span><br><span class="line"><span class="attr">data:</span></span><br><span class="line">  <span class="attr">master.cnf:</span> <span class="string">|</span></span><br><span class="line">    <span class="string">[mysqld]</span></span><br><span class="line">    <span class="string">log-bin</span></span><br><span class="line">  <span class="attr">slave.cnf:</span> <span class="string">|</span></span><br><span class="line">    <span class="string">[mysqld]</span></span><br><span class="line">    <span class="string">super-read-only</span></span><br></pre></td></tr></table></figure><figure class="highlight bash"><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">$ kubectl get configmap</span><br><span class="line">mysql                                     2      19s</span><br></pre></td></tr></table></figure><h3 id="创建两个service"><a class="markdownIt-Anchor" href="#创建两个service"></a> 创建两个Service</h3><figure class="highlight yaml"><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></pre></td><td class="code"><pre><span class="line"><span class="attr">apiVersion:</span> <span class="string">v1</span></span><br><span class="line"><span class="attr">kind:</span> <span class="string">Service</span></span><br><span class="line"><span class="attr">metadata:</span></span><br><span class="line">  <span class="attr">name:</span> <span class="string">mysql</span></span><br><span class="line">  <span class="attr">labels:</span></span><br><span class="line">    <span class="attr">app:</span> <span class="string">mysql</span></span><br><span class="line"><span class="attr">spec:</span></span><br><span class="line">  <span class="attr">ports:</span></span><br><span class="line">  <span class="bullet">-</span> <span class="attr">name:</span> <span class="string">mysql</span></span><br><span class="line">    <span class="attr">port:</span> <span class="number">3306</span></span><br><span class="line">  <span class="attr">clusterIP:</span> <span class="string">None</span></span><br><span class="line">  <span class="attr">selector:</span></span><br><span class="line">    <span class="attr">app:</span> <span class="string">mysql</span></span><br><span class="line"><span class="meta">---</span></span><br><span class="line"><span class="attr">apiVersion:</span> <span class="string">v1</span></span><br><span class="line"><span class="attr">kind:</span> <span class="string">Service</span></span><br><span class="line"><span class="attr">metadata:</span></span><br><span class="line">  <span class="attr">name:</span> <span class="string">mysql-read</span></span><br><span class="line">  <span class="attr">labels:</span></span><br><span class="line">    <span class="attr">app:</span> <span class="string">mysql</span></span><br><span class="line"><span class="attr">spec:</span></span><br><span class="line">  <span class="attr">ports:</span></span><br><span class="line">  <span class="bullet">-</span> <span class="attr">name:</span> <span class="string">mysql</span></span><br><span class="line">    <span class="attr">port:</span> <span class="number">3306</span></span><br><span class="line">  <span class="attr">selector:</span></span><br><span class="line">    <span class="attr">app:</span> <span class="string">mysql</span></span><br></pre></td></tr></table></figure><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></pre></td><td class="code"><pre><span class="line">$ kubectl get service</span><br><span class="line">NAME                          TYPE           CLUSTER-IP       EXTERNAL-IP   PORT(S)                         AGE</span><br><span class="line">mysql                         ClusterIP      None             &lt;none&gt;        3306/TCP                        4s</span><br><span class="line">mysql-read                    ClusterIP      10.105.117.44    &lt;none&gt;        3306/TCP                        4s</span><br></pre></td></tr></table></figure><h3 id="创建statefulset"><a class="markdownIt-Anchor" href="#创建statefulset"></a> 创建StatefulSet</h3><blockquote><p>这个yaml文件是如此的长，在不太懂的情况下手抄作业</p></blockquote><figure class="highlight yaml"><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><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br><span class="line">77</span><br><span class="line">78</span><br><span class="line">79</span><br><span class="line">80</span><br><span class="line">81</span><br><span class="line">82</span><br><span class="line">83</span><br><span class="line">84</span><br><span class="line">85</span><br><span class="line">86</span><br><span class="line">87</span><br><span class="line">88</span><br><span class="line">89</span><br><span class="line">90</span><br><span class="line">91</span><br><span class="line">92</span><br><span class="line">93</span><br><span class="line">94</span><br><span class="line">95</span><br><span class="line">96</span><br><span class="line">97</span><br><span class="line">98</span><br><span class="line">99</span><br><span class="line">100</span><br><span class="line">101</span><br><span class="line">102</span><br><span class="line">103</span><br><span class="line">104</span><br><span class="line">105</span><br><span class="line">106</span><br><span class="line">107</span><br><span class="line">108</span><br><span class="line">109</span><br><span class="line">110</span><br><span class="line">111</span><br><span class="line">112</span><br><span class="line">113</span><br><span class="line">114</span><br><span class="line">115</span><br><span class="line">116</span><br><span class="line">117</span><br><span class="line">118</span><br><span class="line">119</span><br><span class="line">120</span><br><span class="line">121</span><br><span class="line">122</span><br><span class="line">123</span><br><span class="line">124</span><br><span class="line">125</span><br><span class="line">126</span><br><span class="line">127</span><br><span class="line">128</span><br><span class="line">129</span><br><span class="line">130</span><br><span class="line">131</span><br><span class="line">132</span><br><span class="line">133</span><br><span class="line">134</span><br><span class="line">135</span><br><span class="line">136</span><br><span class="line">137</span><br><span class="line">138</span><br><span class="line">139</span><br><span class="line">140</span><br><span class="line">141</span><br><span class="line">142</span><br><span class="line">143</span><br><span class="line">144</span><br><span class="line">145</span><br><span class="line">146</span><br><span class="line">147</span><br><span class="line">148</span><br><span class="line">149</span><br><span class="line">150</span><br><span class="line">151</span><br><span class="line">152</span><br><span class="line">153</span><br><span class="line">154</span><br><span class="line">155</span><br><span class="line">156</span><br><span class="line">157</span><br><span class="line">158</span><br><span class="line">159</span><br><span class="line">160</span><br><span class="line">161</span><br><span class="line">162</span><br><span class="line">163</span><br><span class="line">164</span><br></pre></td><td class="code"><pre><span class="line"><span class="attr">apiVersion:</span> <span class="string">apps/v1</span></span><br><span class="line"><span class="attr">kind:</span> <span class="string">StatefulSet</span></span><br><span class="line"><span class="attr">metadata:</span></span><br><span class="line">  <span class="attr">name:</span> <span class="string">mysql</span></span><br><span class="line"><span class="attr">spec:</span></span><br><span class="line">  <span class="attr">selector:</span></span><br><span class="line">    <span class="attr">matchLabels:</span></span><br><span class="line">      <span class="attr">app:</span> <span class="string">mysql</span></span><br><span class="line">  <span class="attr">serviceName:</span> <span class="string">mysql</span></span><br><span class="line">  <span class="attr">replicas:</span> <span class="number">3</span></span><br><span class="line">  <span class="attr">template:</span></span><br><span class="line">    <span class="attr">metadata:</span></span><br><span class="line">      <span class="attr">labels:</span></span><br><span class="line">        <span class="attr">app:</span> <span class="string">mysql</span></span><br><span class="line">    <span class="attr">spec:</span></span><br><span class="line">      <span class="attr">initContainers:</span></span><br><span class="line">      <span class="bullet">-</span> <span class="attr">name:</span> <span class="string">init-mysql</span></span><br><span class="line">        <span class="attr">image:</span> <span class="string">mysql:5.7</span></span><br><span class="line">        <span class="attr">command:</span></span><br><span class="line">        <span class="bullet">-</span> <span class="string">bash</span></span><br><span class="line">        <span class="bullet">-</span> <span class="string">"-c"</span></span><br><span class="line">        <span class="bullet">-</span> <span class="string">|</span></span><br><span class="line">          <span class="string">set</span> <span class="string">-ex</span></span><br><span class="line">          <span class="comment"># Generate mysql server-id from pod ordinal index.</span></span><br><span class="line">          <span class="string">[[</span> <span class="string">`hostname`</span> <span class="string">=~</span> <span class="string">-([0-9]+)$</span> <span class="string">]]</span> <span class="string">||</span> <span class="string">exit</span> <span class="number">1</span></span><br><span class="line">          <span class="string">ordinal=$&#123;BASH_REMATCH[1]&#125;</span></span><br><span class="line">          <span class="string">echo</span> <span class="string">[mysqld]</span> <span class="string">&gt;</span> <span class="string">/mnt/conf.d/server-id.cnf</span></span><br><span class="line">          <span class="comment"># Add an offset to avoid reserved server-id=0 value.</span></span><br><span class="line">          <span class="string">echo</span> <span class="string">server-id=$((100</span> <span class="string">+</span> <span class="string">$ordinal))</span> <span class="string">&gt;&gt;</span> <span class="string">/mnt/conf.d/server-id.cnf</span></span><br><span class="line">          <span class="comment"># Copy appropriate conf.d files from config-map to emptyDir.</span></span><br><span class="line">          <span class="string">if</span> <span class="string">[[</span> <span class="string">$ordinal</span> <span class="string">-eq</span> <span class="number">0</span> <span class="string">]];</span> <span class="string">then</span></span><br><span class="line">            <span class="string">cp</span> <span class="string">/mnt/config-map/master.cnf</span> <span class="string">/mnt/conf.d/</span></span><br><span class="line">          <span class="string">else</span></span><br><span class="line">            <span class="string">cp</span> <span class="string">/mnt/config-map/slave.cnf</span> <span class="string">/mnt/conf.d/</span></span><br><span class="line">          <span class="string">fi</span></span><br><span class="line">        <span class="attr">volumeMounts:</span></span><br><span class="line">        <span class="bullet">-</span> <span class="attr">name:</span> <span class="string">conf</span></span><br><span class="line">          <span class="attr">mountPath:</span> <span class="string">/mnt/conf.d</span></span><br><span class="line">        <span class="bullet">-</span> <span class="attr">name:</span> <span class="string">config-map</span></span><br><span class="line">          <span class="attr">mountPath:</span> <span class="string">/mnt/config-map</span></span><br><span class="line">      <span class="bullet">-</span> <span class="attr">name:</span> <span class="string">clone-mysql</span></span><br><span class="line">        <span class="attr">image:</span> <span class="number">10.160</span><span class="number">.15</span><span class="number">.5</span><span class="string">/google_containers/xtrabackup:1.0</span></span><br><span class="line">        <span class="attr">command:</span></span><br><span class="line">        <span class="bullet">-</span> <span class="string">bash</span></span><br><span class="line">        <span class="bullet">-</span> <span class="string">"-c"</span></span><br><span class="line">        <span class="bullet">-</span> <span class="string">|</span></span><br><span class="line">          <span class="string">set</span> <span class="string">-ex</span></span><br><span class="line">          <span class="comment"># Skip the clone if data already exists.</span></span><br><span class="line">          <span class="string">[[</span> <span class="string">-d</span> <span class="string">/var/lib/mysql/mysql</span> <span class="string">]]</span> <span class="string">&amp;&amp;</span> <span class="string">exit</span> <span class="number">0</span></span><br><span class="line">          <span class="comment"># Skip the clone on master (ordinal index 0).</span></span><br><span class="line">          <span class="string">[[</span> <span class="string">`hostname`</span> <span class="string">=~</span> <span class="string">-([0-9]+)$</span> <span class="string">]]</span> <span class="string">||</span> <span class="string">exit</span> <span class="number">1</span></span><br><span class="line">          <span class="string">ordinal=$&#123;BASH_REMATCH[1]&#125;</span></span><br><span class="line">          <span class="string">[[</span> <span class="string">$ordinal</span> <span class="string">-eq</span> <span class="number">0</span> <span class="string">]]</span> <span class="string">&amp;&amp;</span> <span class="string">exit</span> <span class="number">0</span></span><br><span class="line">          <span class="comment"># Clone data from previous peer.</span></span><br><span class="line">          <span class="string">ncat</span> <span class="string">--recv-only</span> <span class="string">mysql-$(($ordinal-1)).mysql</span> <span class="number">3307</span> <span class="string">|</span> <span class="string">xbstream</span> <span class="string">-x</span> <span class="string">-C</span> <span class="string">/var/lib/mysql</span></span><br><span class="line">          <span class="comment"># Prepare the backup.</span></span><br><span class="line">          <span class="string">xtrabackup</span> <span class="string">--prepare</span> <span class="string">--target-dir=/var/lib/mysql</span></span><br><span class="line">        <span class="attr">volumeMounts:</span></span><br><span class="line">        <span class="bullet">-</span> <span class="attr">name:</span> <span class="string">data</span></span><br><span class="line">          <span class="attr">mountPath:</span> <span class="string">/var/lib/mysql</span></span><br><span class="line">          <span class="attr">subPath:</span> <span class="string">mysql</span></span><br><span class="line">        <span class="bullet">-</span> <span class="attr">name:</span> <span class="string">conf</span></span><br><span class="line">          <span class="attr">mountPath:</span> <span class="string">/etc/mysql/conf.d</span></span><br><span class="line">      <span class="attr">containers:</span></span><br><span class="line">      <span class="bullet">-</span> <span class="attr">name:</span> <span class="string">mysql</span></span><br><span class="line">        <span class="attr">image:</span> <span class="string">mysql:5.7</span></span><br><span class="line">        <span class="attr">env:</span></span><br><span class="line">        <span class="bullet">-</span> <span class="attr">name:</span> <span class="string">MYSQL_ALLOW_EMPTY_PASSWORD</span></span><br><span class="line">          <span class="attr">value:</span> <span class="string">"1"</span></span><br><span class="line">        <span class="attr">ports:</span></span><br><span class="line">        <span class="bullet">-</span> <span class="attr">name:</span> <span class="string">mysql</span></span><br><span class="line">          <span class="attr">containerPort:</span> <span class="number">3306</span></span><br><span class="line">        <span class="attr">volumeMounts:</span></span><br><span class="line">        <span class="bullet">-</span> <span class="attr">name:</span> <span class="string">data</span></span><br><span class="line">          <span class="attr">mountPath:</span> <span class="string">/var/lib/mysql</span></span><br><span class="line">          <span class="attr">subPath:</span> <span class="string">mysql</span></span><br><span class="line">        <span class="bullet">-</span> <span class="attr">name:</span> <span class="string">conf</span></span><br><span class="line">          <span class="attr">mountPath:</span> <span class="string">/etc/mysql/conf.d</span></span><br><span class="line">        <span class="attr">resources:</span></span><br><span class="line">          <span class="attr">requests:</span></span><br><span class="line">            <span class="attr">cpu:</span> <span class="string">500m</span></span><br><span class="line">            <span class="attr">memory:</span> <span class="string">1Gi</span></span><br><span class="line">        <span class="attr">livenessProbe:</span></span><br><span class="line">          <span class="attr">exec:</span></span><br><span class="line">            <span class="attr">command:</span> <span class="string">["mysqladmin",</span> <span class="string">"ping"</span><span class="string">]</span></span><br><span class="line">          <span class="attr">initialDelaySeconds:</span> <span class="number">30</span></span><br><span class="line">          <span class="attr">periodSeconds:</span> <span class="number">10</span></span><br><span class="line">          <span class="attr">timeoutSeconds:</span> <span class="number">5</span></span><br><span class="line">        <span class="attr">readinessProbe:</span></span><br><span class="line">          <span class="attr">exec:</span></span><br><span class="line">            <span class="comment"># Check we can execute queries over TCP (skip-networking is off).</span></span><br><span class="line">            <span class="attr">command:</span> <span class="string">["mysql",</span> <span class="string">"-h"</span><span class="string">,</span> <span class="string">"127.0.0.1"</span><span class="string">,</span> <span class="string">"-e"</span><span class="string">,</span> <span class="string">"SELECT 1"</span><span class="string">]</span></span><br><span class="line">          <span class="attr">initialDelaySeconds:</span> <span class="number">5</span></span><br><span class="line">          <span class="attr">periodSeconds:</span> <span class="number">2</span></span><br><span class="line">          <span class="attr">timeoutSeconds:</span> <span class="number">1</span></span><br><span class="line">      <span class="bullet">-</span> <span class="attr">name:</span> <span class="string">xtrabackup</span></span><br><span class="line">        <span class="attr">image:</span> <span class="number">10.160</span><span class="number">.15</span><span class="number">.5</span><span class="string">/google_containers/xtrabackup:1.0</span></span><br><span class="line">        <span class="attr">ports:</span></span><br><span class="line">        <span class="bullet">-</span> <span class="attr">name:</span> <span class="string">xtrabackup</span></span><br><span class="line">          <span class="attr">containerPort:</span> <span class="number">3307</span></span><br><span class="line">        <span class="attr">command:</span></span><br><span class="line">        <span class="bullet">-</span> <span class="string">bash</span></span><br><span class="line">        <span class="bullet">-</span> <span class="string">"-c"</span></span><br><span class="line">        <span class="bullet">-</span> <span class="string">|</span></span><br><span class="line">          <span class="string">set</span> <span class="string">-ex</span></span><br><span class="line">          <span class="string">cd</span> <span class="string">/var/lib/mysql</span></span><br><span class="line">          <span class="comment"># Determine binlog position of cloned data, if any.</span></span><br><span class="line">          <span class="string">if</span> <span class="string">[[</span> <span class="string">-f</span> <span class="string">xtrabackup_slave_info</span> <span class="string">]];</span> <span class="string">then</span></span><br><span class="line">            <span class="comment"># XtraBackup already generated a partial "CHANGE MASTER TO" query</span></span><br><span class="line">            <span class="comment"># because we're cloning from an existing slave.</span></span><br><span class="line">            <span class="string">mv</span> <span class="string">xtrabackup_slave_info</span> <span class="string">change_master_to.sql.in</span></span><br><span class="line">            <span class="comment"># Ignore xtrabackup_binlog_info in this case (it's useless).</span></span><br><span class="line">            <span class="string">rm</span> <span class="string">-f</span> <span class="string">xtrabackup_binlog_info</span></span><br><span class="line">          <span class="string">elif</span> <span class="string">[[</span> <span class="string">-f</span> <span class="string">xtrabackup_binlog_info</span> <span class="string">]];</span> <span class="string">then</span></span><br><span class="line">            <span class="comment"># We're cloning directly from master. Parse binlog position.</span></span><br><span class="line">            <span class="string">[[</span> <span class="string">`cat</span> <span class="string">xtrabackup_binlog_info`</span> <span class="string">=~</span> <span class="string">^(.*?)[[:space:]]+(.*?)$</span> <span class="string">]]</span> <span class="string">||</span> <span class="string">exit</span> <span class="number">1</span></span><br><span class="line">            <span class="string">rm</span> <span class="string">xtrabackup_binlog_info</span></span><br><span class="line">            <span class="string">echo</span> <span class="string">"CHANGE MASTER TO MASTER_LOG_FILE='$&#123;BASH_REMATCH[1]&#125;',\</span></span><br><span class="line"><span class="string">                  MASTER_LOG_POS=$&#123;BASH_REMATCH[2]&#125;"</span> <span class="string">&gt;</span> <span class="string">change_master_to.sql.in</span></span><br><span class="line">          <span class="string">fi</span></span><br><span class="line">          <span class="comment"># Check if we need to complete a clone by starting replication.</span></span><br><span class="line">          <span class="string">if</span> <span class="string">[[</span> <span class="string">-f</span> <span class="string">change_master_to.sql.in</span> <span class="string">]];</span> <span class="string">then</span></span><br><span class="line">            <span class="string">echo</span> <span class="string">"Waiting for mysqld to be ready (accepting connections)"</span></span><br><span class="line">            <span class="string">until</span> <span class="string">mysql</span> <span class="string">-h</span> <span class="number">127.0</span><span class="number">.0</span><span class="number">.1</span> <span class="string">-e</span> <span class="string">"SELECT 1"</span><span class="string">;</span> <span class="string">do</span> <span class="string">sleep</span> <span class="number">1</span><span class="string">;</span> <span class="string">done</span></span><br><span class="line">            <span class="string">echo</span> <span class="string">"Initializing replication from clone position"</span></span><br><span class="line">            <span class="comment"># In case of container restart, attempt this at-most-once.</span></span><br><span class="line">            <span class="string">mv</span> <span class="string">change_master_to.sql.in</span> <span class="string">change_master_to.sql.orig</span></span><br><span class="line">            <span class="string">mysql</span> <span class="string">-h</span> <span class="number">127.0</span><span class="number">.0</span><span class="number">.1</span> <span class="string">&lt;&lt;EOF</span></span><br><span class="line">          <span class="string">$(&lt;change_master_to.sql.orig),</span></span><br><span class="line">            <span class="string">MASTER_HOST='mysql-0.mysql',</span></span><br><span class="line">            <span class="string">MASTER_USER='root',</span></span><br><span class="line">            <span class="string">MASTER_PASSWORD='',</span></span><br><span class="line">            <span class="string">MASTER_CONNECT_RETRY=10;</span></span><br><span class="line">          <span class="string">START</span> <span class="string">SLAVE;</span></span><br><span class="line">          <span class="string">EOF</span></span><br><span class="line">          <span class="string">fi</span></span><br><span class="line">          <span class="comment"># Start a server to send backups when requested by peers.</span></span><br><span class="line">          <span class="string">exec</span> <span class="string">ncat</span> <span class="string">--listen</span> <span class="string">--keep-open</span> <span class="string">--send-only</span> <span class="string">--max-conns=1</span> <span class="number">3307</span> <span class="string">-c</span> <span class="string">\</span></span><br><span class="line">            <span class="string">"xtrabackup --backup --slave-info --stream=xbstream --host=127.0.0.1 --user=root"</span></span><br><span class="line">        <span class="attr">volumeMounts:</span></span><br><span class="line">        <span class="bullet">-</span> <span class="attr">name:</span> <span class="string">data</span></span><br><span class="line">          <span class="attr">mountPath:</span> <span class="string">/var/lib/mysql</span></span><br><span class="line">          <span class="attr">subPath:</span> <span class="string">mysql</span></span><br><span class="line">        <span class="bullet">-</span> <span class="attr">name:</span> <span class="string">conf</span></span><br><span class="line">          <span class="attr">mountPath:</span> <span class="string">/etc/mysql/conf.d</span></span><br><span class="line">        <span class="attr">resources:</span></span><br><span class="line">          <span class="attr">requests:</span></span><br><span class="line">            <span class="attr">cpu:</span> <span class="string">100m</span></span><br><span class="line">            <span class="attr">memory:</span> <span class="string">100Mi</span></span><br><span class="line">      <span class="attr">volumes:</span></span><br><span class="line">      <span class="bullet">-</span> <span class="attr">name:</span> <span class="string">conf</span></span><br><span class="line">        <span class="attr">emptyDir:</span> <span class="string">&#123;&#125;</span></span><br><span class="line">      <span class="bullet">-</span> <span class="attr">name:</span> <span class="string">config-map</span></span><br><span class="line">        <span class="attr">configMap:</span></span><br><span class="line">          <span class="attr">name:</span> <span class="string">mysql</span></span><br><span class="line">  <span class="attr">volumeClaimTemplates:</span></span><br><span class="line">  <span class="bullet">-</span> <span class="attr">metadata:</span></span><br><span class="line">      <span class="attr">name:</span> <span class="string">data</span></span><br><span class="line">    <span class="attr">spec:</span></span><br><span class="line">      <span class="attr">accessModes:</span> <span class="string">["ReadWriteOnce"]</span></span><br><span class="line">      <span class="attr">storageClassName:</span> <span class="string">"nfs-client"</span></span><br><span class="line">      <span class="attr">resources:</span></span><br><span class="line">        <span class="attr">requests:</span></span><br><span class="line">          <span class="attr">storage:</span> <span class="string">10Gi</span></span><br></pre></td></tr></table></figure><h3 id="检查"><a class="markdownIt-Anchor" href="#检查"></a> 检查</h3><ul><li>PV及PVC</li></ul><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">$ kubectl get pv</span><br><span class="line">NAME                                       CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS   CLAIM                                                 STORAGECLASS   REASON   AGE</span><br><span class="line">pvc-ba5e0a68-59f6-4812-b3cc-919898c72f21   10Gi       RWO            Delete           Bound    default/data-mysql-2                                  nfs-client              116s</span><br><span class="line">pvc-cd69aa2b-6e92-48da-998b-363fb3c796e9   10Gi       RWO            Delete           Bound    default/data-mysql-0                                  nfs-client              106m</span><br><span class="line">pvc-f89ba84c-f87c-498a-ac19-99eca1645f4f   10Gi       RWO            Delete           Bound    default/data-mysql-1                                  nfs-client              105m</span><br></pre></td></tr></table></figure><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">$ kubectl get pvc</span><br><span class="line">NAME                                          STATUS   VOLUME                                     CAPACITY   ACCESS MODES   STORAGECLASS   AGE</span><br><span class="line">data-mysql-0                                  Bound    pvc-cd69aa2b-6e92-48da-998b-363fb3c796e9   10Gi       RWO            nfs-client     106m</span><br><span class="line">data-mysql-1                                  Bound    pvc-f89ba84c-f87c-498a-ac19-99eca1645f4f   10Gi       RWO            nfs-client     105m</span><br><span class="line">data-mysql-2                                  Bound    pvc-ba5e0a68-59f6-4812-b3cc-919898c72f21   10Gi       RWO            nfs-client     110s</span><br></pre></td></tr></table></figure><ul><li>pod</li></ul><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">$ kubectl get pods -l app=mysql</span><br><span class="line">NAME      READY   STATUS    RESTARTS   AGE</span><br><span class="line">mysql-0   2/2     Running   0          104m</span><br><span class="line">mysql-1   2/2     Running   1          3m27s</span><br><span class="line">mysql-2   2/2     Running   1          3m7s</span><br></pre></td></tr></table></figure><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><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></pre></td><td class="code"><pre><span class="line">$ kubectl describe pod mysql-2</span><br><span class="line">...</span><br><span class="line">Events:</span><br><span class="line">  Type     Reason            Age                    From               Message</span><br><span class="line">  ----     ------            ----                   ----               -------</span><br><span class="line">  Warning  FailedScheduling  3m35s                  default-scheduler  running <span class="string">"VolumeBinding"</span> filter plugin <span class="keyword">for</span> pod <span class="string">"mysql-2"</span>: pod has unbound immediate PersistentVolumeClaims</span><br><span class="line">  Warning  FailedScheduling  3m35s                  default-scheduler  persistentvolumeclaim <span class="string">"data-mysql-2"</span> not found</span><br><span class="line">  Normal   Scheduled         3m32s                  default-scheduler  Successfully assigned default/mysql-2 to node1</span><br><span class="line">  Normal   Pulled            3m32s                  kubelet, node1     Container image <span class="string">"mysql:5.7"</span> already present on machine</span><br><span class="line">  Normal   Created           3m32s                  kubelet, node1     Created container init-mysql</span><br><span class="line">  Normal   Started           3m31s                  kubelet, node1     Started container init-mysql</span><br><span class="line">  Normal   Started           3m30s                  kubelet, node1     Started container <span class="built_in">clone</span>-mysql</span><br><span class="line">  Normal   Pulled            3m30s                  kubelet, node1     Container image <span class="string">"10.160.15.5/google_containers/xtrabackup:1.0"</span> already present on machine</span><br><span class="line">  Normal   Created           3m30s                  kubelet, node1     Created container <span class="built_in">clone</span>-mysql</span><br><span class="line">  Normal   Pulled            2m55s                  kubelet, node1     Container image <span class="string">"10.160.15.5/google_containers/xtrabackup:1.0"</span> already present on machine</span><br><span class="line">  Normal   Created           2m55s                  kubelet, node1     Created container xtrabackup</span><br><span class="line">  Normal   Started           2m55s                  kubelet, node1     Started container xtrabackup</span><br><span class="line">  Normal   Pulled            2m54s (x2 over 2m55s)  kubelet, node1     Container image <span class="string">"mysql:5.7"</span> already present on machine</span><br><span class="line">  Normal   Created           2m54s (x2 over 2m55s)  kubelet, node1     Created container mysql</span><br><span class="line">  Normal   Started           2m54s (x2 over 2m55s)  kubelet, node1     Started container mysql</span><br></pre></td></tr></table></figure><ul><li>service</li></ul><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></pre></td><td class="code"><pre><span class="line">$ kubectl get service</span><br><span class="line">NAME                                    TYPE           CLUSTER-IP       EXTERNAL-IP   PORT(S)                         AGE</span><br><span class="line">mysql                                   ClusterIP      None             &lt;none&gt;        3306/TCP                        21h</span><br><span class="line">mysql-read                              ClusterIP      10.105.117.44    &lt;none&gt;        3306/TCP                        21h</span><br></pre></td></tr></table></figure><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></pre></td><td class="code"><pre><span class="line">$ kubectl get statefulset</span><br><span class="line">NAME                   READY   AGE</span><br><span class="line">mysql                  3/3     107m</span><br></pre></td></tr></table></figure><h3 id="验证集群"><a class="markdownIt-Anchor" href="#验证集群"></a> 验证集群</h3><ul><li>创建测试数据</li></ul><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><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">$ kubectl run mysql-client --image=mysql:5.7 -i --rm --restart=Never --\</span><br><span class="line">  mysql -h mysql-0.mysql &lt;&lt;EOF</span><br><span class="line">CREATE DATABASE <span class="built_in">test</span>;</span><br><span class="line">CREATE TABLE test.messages (message VARCHAR(250));</span><br><span class="line">INSERT INTO test.messages VALUES (<span class="string">'hello'</span>);</span><br><span class="line">EOF</span><br><span class="line"></span><br><span class="line">If you don<span class="string">'t see a command prompt, try pressing enter.</span></span><br><span class="line"><span class="string">pod "mysql-client" deleted</span></span><br></pre></td></tr></table></figure><ul><li>读取测试数据</li></ul><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><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">$ kubectl run mysql-client --image=mysql:5.7 -i -t --rm --restart=Never -- mysql -h mysql-read -e <span class="string">"SELECT * FROM test.messages"</span></span><br><span class="line">If you don<span class="string">'t see a command prompt, try pressing enter.</span></span><br><span class="line"><span class="string">+---------+</span></span><br><span class="line"><span class="string">| message |</span></span><br><span class="line"><span class="string">+---------+</span></span><br><span class="line"><span class="string">| hello   |</span></span><br><span class="line"><span class="string">+---------+</span></span><br><span class="line"><span class="string">pod "mysql-client" deleted</span></span><br></pre></td></tr></table></figure><h3 id="扩容mysql集群"><a class="markdownIt-Anchor" href="#扩容mysql集群"></a> 扩容mysql集群</h3><ul><li>修改replicas为5</li></ul><figure class="highlight yaml"><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="attr">apiVersion:</span> <span class="string">apps/v1</span></span><br><span class="line"><span class="attr">kind:</span> <span class="string">StatefulSet</span></span><br><span class="line"><span class="attr">metadata:</span></span><br><span class="line">  <span class="attr">name:</span> <span class="string">mysql</span></span><br><span class="line"><span class="attr">spec:</span></span><br><span class="line">  <span class="attr">selector:</span></span><br><span class="line">    <span class="attr">matchLabels:</span></span><br><span class="line">      <span class="attr">app:</span> <span class="string">mysql</span></span><br><span class="line">  <span class="attr">serviceName:</span> <span class="string">mysql</span></span><br><span class="line">  <span class="attr">replicas:</span> <span class="number">5</span></span><br></pre></td></tr></table></figure><ul><li>pods</li></ul><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><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line">$ kubectl get pods -l app=mysql</span><br><span class="line">NAME      READY   STATUS    RESTARTS   AGE</span><br><span class="line">mysql-0   2/2     Running   0          4h51m</span><br><span class="line">mysql-1   2/2     Running   1          3h10m</span><br><span class="line">mysql-2   2/2     Running   1          3h10m</span><br><span class="line">mysql-3   2/2     Running   1          119s</span><br><span class="line">mysql-4   2/2     Running   0          71s</span><br></pre></td></tr></table></figure><ul><li>获取数据</li></ul><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><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line">$ kubectl run mysql-client --image=mysql:5.7 -it --rm --restart=Never -- mysql -h mysql-4.mysql -e <span class="string">"SELECT * FROM test.messages"</span></span><br><span class="line">+---------+</span><br><span class="line">| message |</span><br><span class="line">+---------+</span><br><span class="line">| hello   |</span><br><span class="line">+---------+</span><br><span class="line">pod <span class="string">"mysql-client"</span> deleted</span><br></pre></td></tr></table></figure><ul><li>尝试写入</li></ul><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></pre></td><td class="code"><pre><span class="line">$ kubectl run mysql-client --image=mysql:5.7 -it --rm --restart=Never -- mysql -h mysql-4.mysql -e <span class="string">"INSERT INTO test.messages VALUES ('test')"</span></span><br><span class="line">ERROR 1290 (HY000) at line 1: The MySQL server is running with the --super-read-only option so it cannot execute this statement</span><br><span class="line">pod <span class="string">"mysql-client"</span> deleted</span><br><span class="line">pod default/mysql-client terminated (Error)</span><br></pre></td></tr></table></figure><h2 id="分析"><a class="markdownIt-Anchor" href="#分析"></a> 分析</h2><p>实验伴随着解决各种问题完成了，现在再回头来总结一下我理解的YAML文件的内容</p><ol><li>init_containers中定义了两个container，分别是mysql和xtrabackup<ol><li>mysql的container根据hostname进行判断，是初始化为master还是slave</li><li>xtrabackup的container，如果不为master，则根据数据是否存在决定是否要拷贝数据</li></ol></li><li>containers中也同样定义了两个container，也同样是mysql和xtrabackup<ol><li>mysql的container直接使用init_container中创建的数据，启动mysql服务</li><li>xtrabackup的container则开启3307用来为其他的slave提供拷贝</li></ol></li></ol><h3 id="更新"><a class="markdownIt-Anchor" href="#更新"></a> 更新</h3><p>修改镜像版本为<code>10.160.15.5/pub/mysql:5.7</code></p><blockquote><p>由于新镜像实际上和原来的镜像是同一个md5，不会出现其他问题。</p></blockquote><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><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></pre></td><td class="code"><pre><span class="line">$ kubectl get pods -l app=mysql</span><br><span class="line">NAME      READY   STATUS        RESTARTS   AGE</span><br><span class="line">mysql-0   2/2     Running       0          26h</span><br><span class="line">mysql-1   2/2     Running       1          24h</span><br><span class="line">mysql-2   2/2     Running       1          24h</span><br><span class="line">mysql-3   2/2     Running       1          21h</span><br><span class="line">mysql-4   2/2     Terminating   0          46s</span><br><span class="line">$ kubectl get pods -l app=mysql</span><br><span class="line">NAME      READY   STATUS        RESTARTS   AGE</span><br><span class="line">mysql-0   2/2     Running       0          26h</span><br><span class="line">mysql-1   2/2     Running       1          24h</span><br><span class="line">mysql-2   2/2     Running       1          24h</span><br><span class="line">mysql-3   2/2     Terminating   1          21h</span><br><span class="line">mysql-4   2/2     Running       0          46s</span><br><span class="line">$ kubectl get pods -l app=mysql</span><br><span class="line">NAME      READY   STATUS        RESTARTS   AGE</span><br><span class="line">mysql-0   2/2     Running       0          26h</span><br><span class="line">mysql-1   2/2     Terminating   1          25h</span><br><span class="line">mysql-2   2/2     Running       0          17s</span><br><span class="line">mysql-3   2/2     Running       0          68s</span><br><span class="line">mysql-4   2/2     Running       0          2m19s</span><br><span class="line">$ kubectl get pods -l app=mysql</span><br><span class="line">NAME      READY   STATUS     RESTARTS   AGE</span><br><span class="line">mysql-0   0/2     Init:0/2   0          1s</span><br><span class="line">mysql-1   2/2     Running    0          47s</span><br><span class="line">mysql-2   2/2     Running    0          90s</span><br><span class="line">mysql-3   2/2     Running    0          2m21s</span><br><span class="line">mysql-4   2/2     Running    0          3m32s</span><br></pre></td></tr></table></figure><p>可以看到，StatefulSet更新后，会先将最后一个pod进行更新，成功后，会更新mysql-3，依次类推，直到更新到mysql-0</p><h2 id="小结"><a class="markdownIt-Anchor" href="#小结"></a> 小结</h2><blockquote><p>StatefulSet 其实是一种特殊的 Deployment，只不过这个“Deployment”的每个 Pod 实例的名字里，都携带了一个唯一并且固定的编号。这个编号的顺序，固定了 Pod 的拓扑关系；这个编号对应的 DNS 记录，固定了 Pod 的访问方式；这个编号对应的 PV，绑定了 Pod 与持久化存储的关系。所以，当 Pod 被删除重建时，这些“状态”都会保持不变。</p></blockquote><p>可以看到，由于pod名称固定，PV以及PVC固定，即使删掉一个pod，重建后，仍然会创建一个与其名字相同的pod并使用原有的PV及PVC。从而对应的pod启动后，内容一致</p><p>然而，由于将master和slave写在一个StatefulSet，感觉实现的非常复杂。</p>]]></content>
    
    <summary type="html">
    
      &lt;blockquote&gt;
&lt;p&gt;学习极客时间上的&lt;a href=&quot;https://time.geekbang.org/column/intro/116&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;《深入剖析Kubernetes》&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;秉持眼过千遍不如手过一遍的原则。动手实践并记录结果&lt;/p&gt;
&lt;p&gt;对应章节：&lt;a href=&quot;https://time.geekbang.org/column/article/41217&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;20 | 深入理解StatefulSet（三）：有状态应用实践&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
    
    </summary>
    
    
      <category term="k8s" scheme="http://www.isimble.com/categories/k8s/"/>
    
    
      <category term="docker" scheme="http://www.isimble.com/tags/docker/"/>
    
      <category term="Kubernetes" scheme="http://www.isimble.com/tags/Kubernetes/"/>
    
  </entry>
  
  <entry>
    <title>K8s学习笔记——StatefulSet之存储状态</title>
    <link href="http://www.isimble.com/2020/08/04/kubernetesLearning19/"/>
    <id>http://www.isimble.com/2020/08/04/kubernetesLearning19/</id>
    <published>2020-08-04T01:51:32.000Z</published>
    <updated>2020-08-04T01:54:33.643Z</updated>
    
    <content type="html"><![CDATA[<blockquote><p>学习极客时间上的<a href="https://time.geekbang.org/column/intro/116" target="_blank" rel="noopener">《深入剖析Kubernetes》</a></p><p>秉持眼过千遍不如手过一遍的原则。动手实践并记录结果</p><p>对应章节：<a href="https://time.geekbang.org/column/article/41154" target="_blank" rel="noopener">19 | 深入理解StatefulSet（二）：存储状态</a></p></blockquote><a id="more"></a><blockquote><p>注：本节实验中用到的StorageClassName依赖于另一篇博文中的使用NFS</p></blockquote><h2 id="创建statefulset"><a class="markdownIt-Anchor" href="#创建statefulset"></a> 创建StatefulSet</h2><h3 id="创建带volumeclaim的statefulset"><a class="markdownIt-Anchor" href="#创建带volumeclaim的statefulset"></a> 创建带volumeClaim的StatefulSet</h3><figure class="highlight yaml"><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="attr">apiVersion:</span> <span class="string">apps/v1</span></span><br><span class="line"><span class="attr">kind:</span> <span class="string">StatefulSet</span></span><br><span class="line"><span class="attr">metadata:</span></span><br><span class="line">  <span class="attr">name:</span> <span class="string">ss-ss</span></span><br><span class="line"><span class="attr">spec:</span></span><br><span class="line">  <span class="attr">serviceName:</span> <span class="string">"ss-ss-nginx"</span></span><br><span class="line">  <span class="attr">replicas:</span> <span class="number">2</span></span><br><span class="line">  <span class="attr">selector:</span></span><br><span class="line">    <span class="attr">matchLabels:</span></span><br><span class="line">      <span class="attr">app:</span> <span class="string">nginx</span></span><br><span class="line">  <span class="attr">template:</span></span><br><span class="line">    <span class="attr">metadata:</span></span><br><span class="line">      <span class="attr">labels:</span></span><br><span class="line">        <span class="attr">app:</span> <span class="string">nginx</span></span><br><span class="line">    <span class="attr">spec:</span></span><br><span class="line">      <span class="attr">containers:</span></span><br><span class="line">      <span class="bullet">-</span> <span class="attr">name:</span> <span class="string">nginx</span></span><br><span class="line">        <span class="attr">image:</span> <span class="string">nginx</span></span><br><span class="line">        <span class="attr">imagePullPolicy:</span> <span class="string">IfNotPresent</span></span><br><span class="line">        <span class="attr">ports:</span></span><br><span class="line">        <span class="bullet">-</span> <span class="attr">containerPort:</span> <span class="number">80</span></span><br><span class="line">          <span class="attr">name:</span> <span class="string">web</span></span><br><span class="line">        <span class="attr">volumeMounts:</span></span><br><span class="line">        <span class="bullet">-</span> <span class="attr">name:</span> <span class="string">www</span></span><br><span class="line">          <span class="attr">mountPath:</span> <span class="string">/usr/share/nginx/html</span></span><br><span class="line">  <span class="attr">volumeClaimTemplates:</span></span><br><span class="line">  <span class="bullet">-</span> <span class="attr">metadata:</span></span><br><span class="line">      <span class="attr">name:</span> <span class="string">www</span></span><br><span class="line">    <span class="attr">spec:</span></span><br><span class="line">      <span class="attr">storageClassName:</span> <span class="string">nfs-client</span></span><br><span class="line">      <span class="attr">accessModes:</span></span><br><span class="line">      <span class="bullet">-</span> <span class="string">ReadWriteOnce</span></span><br><span class="line">      <span class="attr">resources:</span></span><br><span class="line">        <span class="attr">requests:</span></span><br><span class="line">          <span class="attr">storage:</span> <span class="string">1Gi</span></span><br></pre></td></tr></table></figure><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><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">$ kubectl get pods</span><br><span class="line">NAME                                                     READY   STATUS    RESTARTS   AGE</span><br><span class="line">ss-ss-0                                                  1/1     Running   0          4s</span><br><span class="line">ss-ss-1                                                  0/1     Pending   0          0s</span><br><span class="line">$ kubectl get pods</span><br><span class="line">NAME                                                     READY   STATUS    RESTARTS   AGE</span><br><span class="line">ss-ss-0                                                  1/1     Running   0          23s</span><br><span class="line">ss-ss-1                                                  1/1     Running   0          19s</span><br></pre></td></tr></table></figure><h3 id="查看pv及pvc"><a class="markdownIt-Anchor" href="#查看pv及pvc"></a> 查看PV及PVC</h3><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><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">$ kubectl get pv</span><br><span class="line">NAME                                       CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS   CLAIM                 STORAGECLASS   REASON   AGE</span><br><span class="line">pvc-1a215f93-37df-4278-9723-51d365c4cf96   1Gi        RWO            Delete           Bound    default/www-ss-ss-0   nfs-client              56s</span><br><span class="line">pvc-f07c6d74-6eee-4930-9ad6-20fdb4faa5d5   1Gi        RWO            Delete           Bound    default/www-ss-ss-1   nfs-client              52s</span><br><span class="line">$ kubectl get pvc</span><br><span class="line">NAME          STATUS   VOLUME                                     CAPACITY   ACCESS MODES   STORAGECLASS   AGE</span><br><span class="line">www-ss-ss-0   Bound    pvc-1a215f93-37df-4278-9723-51d365c4cf96   1Gi        RWO            nfs-client     59s</span><br><span class="line">www-ss-ss-1   Bound    pvc-f07c6d74-6eee-4930-9ad6-20fdb4faa5d5   1Gi        RWO            nfs-client     55s</span><br></pre></td></tr></table></figure><p>查看nfs server：</p><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></pre></td><td class="code"><pre><span class="line">$ ls</span><br><span class="line">default-www-ss-ss-0-pvc-1a215f93-37df-4278-9723-51d365c4cf96</span><br><span class="line">default-www-ss-ss-1-pvc-f07c6d74-6eee-4930-9ad6-20fdb4faa5d5</span><br></pre></td></tr></table></figure><h3 id="在各个pod上创建文件"><a class="markdownIt-Anchor" href="#在各个pod上创建文件"></a> 在各个pod上创建文件</h3><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></pre></td><td class="code"><pre><span class="line">$ <span class="keyword">for</span> i <span class="keyword">in</span> 0 1; <span class="keyword">do</span> kubectl <span class="built_in">exec</span> ss-ss-<span class="variable">$i</span> -- sh -c <span class="string">'echo hello $(hostname) &gt; /usr/share/nginx/html/index.html'</span>; <span class="keyword">done</span></span><br><span class="line">$ <span class="keyword">for</span> i <span class="keyword">in</span> 0 1; <span class="keyword">do</span> kubectl <span class="built_in">exec</span> -it ss-ss-<span class="variable">$i</span> -- curl localhost; <span class="keyword">done</span></span><br><span class="line">hello ss-ss-0</span><br><span class="line">hello ss-ss-1</span><br></pre></td></tr></table></figure><h3 id="删除对应的pod"><a class="markdownIt-Anchor" href="#删除对应的pod"></a> 删除对应的pod</h3><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><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line">$ kubectl get pods -l app=nginx</span><br><span class="line">NAME      READY   STATUS    RESTARTS   AGE</span><br><span class="line">ss-ss-0   1/1     Running   0          10m</span><br><span class="line">ss-ss-1   1/1     Running   0          10m</span><br><span class="line">$ kubectl delete pod -l app=nginx</span><br><span class="line">pod <span class="string">"ss-ss-0"</span> deleted</span><br><span class="line">pod <span class="string">"ss-ss-1"</span> deleted</span><br></pre></td></tr></table></figure><p>查看pvc</p><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></pre></td><td class="code"><pre><span class="line">$ kubectl get pvc</span><br><span class="line">NAME          STATUS   VOLUME                                     CAPACITY   ACCESS MODES   STORAGECLASS   AGE</span><br><span class="line">www-ss-ss-0   Bound    pvc-1a215f93-37df-4278-9723-51d365c4cf96   1Gi        RWO            nfs-client     13m</span><br><span class="line">www-ss-ss-1   Bound    pvc-f07c6d74-6eee-4930-9ad6-20fdb4faa5d5   1Gi        RWO            nfs-client     13m</span><br></pre></td></tr></table></figure><p>可以看到，pod删除，但pvc还存在</p><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></pre></td><td class="code"><pre><span class="line">$ kubectl get pod -l app=nginx</span><br><span class="line">NAME      READY   STATUS    RESTARTS   AGE</span><br><span class="line">ss-ss-0   1/1     Running   0          4m21s</span><br><span class="line">ss-ss-1   1/1     Running   0          4m19s</span><br></pre></td></tr></table></figure><p>随后pod被重建，再来curl看看</p><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></pre></td><td class="code"><pre><span class="line">$ <span class="keyword">for</span> i <span class="keyword">in</span> 0 1; <span class="keyword">do</span> kubectl <span class="built_in">exec</span> -it ss-ss-<span class="variable">$i</span> -- curl localhost; <span class="keyword">done</span></span><br><span class="line">hello ss-ss-0</span><br><span class="line">hello ss-ss-1</span><br></pre></td></tr></table></figure><p>由此：</p><ol><li>当删除一个pod时，这个 Pod 对应的 PVC 和 PV，并不会被删除，而这个 Volume 里已经写入的数据，也会保存在远程存储服务里</li><li>控制器就会重新创建一个新的、名字还是叫作 ss-ss-0 的 Pod 来，“纠正”这个不一致的情况</li><li>在新的 ss-ss-0 Pod 被创建出来之后，Kubernetes 为它查找名叫 web-ss-ss-0 的 PVC 时，就会直接找到旧 Pod 遗留下来的同名的 PVC，进而找到跟这个 PVC 绑定在一起的 PV</li></ol><p><strong>那么，如果删除了PVC呢？</strong></p><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><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">$ kubectl delete pvc www-ss-ss-0</span><br><span class="line">persistentvolumeclaim <span class="string">"www-ss-ss-0"</span> deleted</span><br><span class="line">$ kubectl delete pvc www-ss-ss-1</span><br><span class="line">persistentvolumeclaim <span class="string">"www-ss-ss-1"</span> deleted</span><br><span class="line">$ kubectl get pvc</span><br><span class="line">No resources found <span class="keyword">in</span> default namespace.</span><br><span class="line">$ kubectl get pv</span><br><span class="line">No resources found <span class="keyword">in</span> default namespace.</span><br></pre></td></tr></table></figure><p>可以看到，删除PVC后，对应的PV也同样被删除了</p><p>而nfs服务器端：</p><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><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line">$ ls</span><br><span class="line">archived-default-www-ss-ss-0-pvc-1a215f93-37df-4278-9723-51d365c4cf96   archived-default-www-ss-ss-1-pvc-f07c6d74-6eee-4930-9ad6-20fdb4faa5d5</span><br><span class="line">$ ls archived-default-www-ss-ss-0-pvc-1a215f93-37df-4278-9723-51d365c4cf96/</span><br><span class="line">index.html</span><br><span class="line">$ cat archived-default-www-ss-ss-0-pvc-1a215f93-37df-4278-9723-51d365c4cf96/index.html</span><br><span class="line">hello ss-ss-0</span><br></pre></td></tr></table></figure><p>服务器端的目录变成了<code>archived</code>开头的目录，但内容依然存在，以备后续查看。</p><h2 id="小结"><a class="markdownIt-Anchor" href="#小结"></a> 小结</h2><ol><li>首先，StatefulSet 的控制器直接管理的是 Pod</li><li>其次，Kubernetes 通过 Headless Service，为这些有编号的 Pod，在 DNS 服务器中生成带有同样编号的 DNS 记录</li><li>最后，StatefulSet 还为每一个 Pod 分配并创建一个同样编号的 PVC</li></ol><p><strong>StatefulSet 其实就是一种特殊的 Deployment，而其独特之处在于，它的每个 Pod 都被编号了</strong></p>]]></content>
    
    <summary type="html">
    
      &lt;blockquote&gt;
&lt;p&gt;学习极客时间上的&lt;a href=&quot;https://time.geekbang.org/column/intro/116&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;《深入剖析Kubernetes》&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;秉持眼过千遍不如手过一遍的原则。动手实践并记录结果&lt;/p&gt;
&lt;p&gt;对应章节：&lt;a href=&quot;https://time.geekbang.org/column/article/41154&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;19 | 深入理解StatefulSet（二）：存储状态&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
    
    </summary>
    
    
      <category term="k8s" scheme="http://www.isimble.com/categories/k8s/"/>
    
    
      <category term="docker" scheme="http://www.isimble.com/tags/docker/"/>
    
      <category term="Kubernetes" scheme="http://www.isimble.com/tags/Kubernetes/"/>
    
  </entry>
  
  <entry>
    <title>K8s学习笔记——StatefulSet之拓扑状态</title>
    <link href="http://www.isimble.com/2020/07/29/kubernetesLearning18/"/>
    <id>http://www.isimble.com/2020/07/29/kubernetesLearning18/</id>
    <published>2020-07-29T09:02:29.000Z</published>
    <updated>2020-07-29T09:07:42.144Z</updated>
    
    <content type="html"><![CDATA[<blockquote><p>学习极客时间上的<a href="https://time.geekbang.org/column/intro/116" target="_blank" rel="noopener">《深入剖析Kubernetes》</a></p><p>秉持眼过千遍不如手过一遍的原则。动手实践并记录结果</p><p>对应章节：<a href="https://time.geekbang.org/column/article/41017" target="_blank" rel="noopener">18 | 深入理解StatefulSet（一）：拓扑状态</a></p></blockquote><a id="more"></a><h2 id="headless-service"><a class="markdownIt-Anchor" href="#headless-service"></a> Headless Service</h2><h3 id="创建service"><a class="markdownIt-Anchor" href="#创建service"></a> 创建service</h3><figure class="highlight yaml"><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="attr">apiVersion:</span> <span class="string">v1</span></span><br><span class="line"><span class="attr">kind:</span> <span class="string">Service</span></span><br><span class="line"><span class="attr">metadata:</span></span><br><span class="line">  <span class="attr">name:</span> <span class="string">nginx</span></span><br><span class="line">  <span class="attr">labels:</span></span><br><span class="line">    <span class="attr">app:</span> <span class="string">nginx</span></span><br><span class="line"><span class="attr">spec:</span></span><br><span class="line">  <span class="attr">ports:</span></span><br><span class="line">  <span class="bullet">-</span> <span class="attr">port:</span> <span class="number">80</span></span><br><span class="line">    <span class="attr">name:</span> <span class="string">web</span></span><br><span class="line">  <span class="attr">clusterIP:</span> <span class="string">None</span></span><br><span class="line">  <span class="attr">selector:</span></span><br><span class="line">    <span class="attr">app:</span> <span class="string">nginx</span></span><br></pre></td></tr></table></figure><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></pre></td><td class="code"><pre><span class="line">$ kubectl get service</span><br><span class="line">NAME         TYPE        CLUSTER-IP   EXTERNAL-IP   PORT(S)   AGE</span><br><span class="line">nginx        ClusterIP   None         &lt;none&gt;        80/TCP    129m</span><br></pre></td></tr></table></figure><h3 id="创建statefulset"><a class="markdownIt-Anchor" href="#创建statefulset"></a> 创建StatefulSet</h3><figure class="highlight yaml"><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></pre></td><td class="code"><pre><span class="line"><span class="attr">apiVersion:</span> <span class="string">apps/v1</span></span><br><span class="line"><span class="attr">kind:</span> <span class="string">StatefulSet</span></span><br><span class="line"><span class="attr">metadata:</span></span><br><span class="line">  <span class="attr">name:</span> <span class="string">web</span></span><br><span class="line"><span class="attr">spec:</span></span><br><span class="line">  <span class="attr">serviceName:</span> <span class="string">"nginx"</span></span><br><span class="line">  <span class="attr">replicas:</span> <span class="number">2</span></span><br><span class="line">  <span class="attr">selector:</span></span><br><span class="line">    <span class="attr">matchLabels:</span></span><br><span class="line">      <span class="attr">app:</span> <span class="string">nginx</span></span><br><span class="line">  <span class="attr">template:</span></span><br><span class="line">    <span class="attr">metadata:</span></span><br><span class="line">      <span class="attr">labels:</span></span><br><span class="line">        <span class="attr">app:</span> <span class="string">nginx</span></span><br><span class="line">    <span class="attr">spec:</span></span><br><span class="line">      <span class="attr">containers:</span></span><br><span class="line">      <span class="bullet">-</span> <span class="attr">name:</span> <span class="string">nginx</span></span><br><span class="line">        <span class="attr">image:</span> <span class="string">nginx</span></span><br><span class="line">        <span class="attr">imagePullPolicy:</span> <span class="string">IfNotPresent</span></span><br><span class="line">        <span class="attr">ports:</span></span><br><span class="line">        <span class="bullet">-</span> <span class="attr">containerPort:</span> <span class="number">80</span></span><br><span class="line">          <span class="attr">name:</span> <span class="string">web</span></span><br></pre></td></tr></table></figure><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><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">$ kubectl apply -f statefulset.yaml</span><br><span class="line">statefulset.apps/web created</span><br><span class="line">$ kubectl get pods -w -l app=nginx</span><br><span class="line">NAME    READY   STATUS              RESTARTS   AGE</span><br><span class="line">web-0   1/1     Running             0          2s</span><br><span class="line">web-1   0/1     ContainerCreating   0          1s</span><br><span class="line">web-1   1/1     Running             0          2s</span><br><span class="line">$ kubectl get statefulset -o wide</span><br><span class="line">NAME   READY   AGE   CONTAINERS   IMAGES</span><br><span class="line">web    2/2     52s   nginx        nginx</span><br><span class="line">$ kubectl get pods -o wide</span><br><span class="line">NAME    READY   STATUS    RESTARTS   AGE   IP            NODE            NOMINATED NODE   READINESS GATES</span><br><span class="line">web-0   1/1     Running   0          85s   172.1.1.199   node2           &lt;none&gt;           &lt;none&gt;</span><br><span class="line">web-1   1/1     Running   0          81s   172.1.2.180   bqi-k8s-node3   &lt;none&gt;           &lt;none&gt;</span><br></pre></td></tr></table></figure><p>可以看出，statefulset创建出来的pod，名字是固定的，而不再像deployment中的，pod名字会变化</p><h3 id="验证"><a class="markdownIt-Anchor" href="#验证"></a> 验证</h3><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></pre></td><td class="code"><pre><span class="line">$ kubectl <span class="built_in">exec</span> web-0 -- sh -c <span class="string">'hostname'</span></span><br><span class="line">web-0</span><br><span class="line">$ kubectl <span class="built_in">exec</span> web-1 -- sh -c <span class="string">'hostname'</span></span><br><span class="line">web-1</span><br></pre></td></tr></table></figure><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><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></pre></td><td class="code"><pre><span class="line">$ kubectl run -i --tty --image busybox:1.28.4 web-test --restart=Never --rm -- /bin/sh</span><br><span class="line">If you don<span class="string">'t see a command prompt, try pressing enter.</span></span><br><span class="line"><span class="string">/ # nslookup web-0.nginx</span></span><br><span class="line"><span class="string">Server:    10.96.0.10</span></span><br><span class="line"><span class="string">Address 1: 10.96.0.10 kube-dns.kube-system.svc.cluster.local</span></span><br><span class="line"><span class="string"></span></span><br><span class="line"><span class="string">Name:      web-0.nginx</span></span><br><span class="line"><span class="string">Address 1: 172.1.1.199 web-0.nginx.default.svc.cluster.local</span></span><br><span class="line"><span class="string">/ # nslookup web-1.nginx</span></span><br><span class="line"><span class="string">Server:    10.96.0.10</span></span><br><span class="line"><span class="string">Address 1: 10.96.0.10 kube-dns.kube-system.svc.cluster.local</span></span><br><span class="line"><span class="string"></span></span><br><span class="line"><span class="string">Name:      web-1.nginx</span></span><br><span class="line"><span class="string">Address 1: 172.1.2.180 web-1.nginx.default.svc.cluster.local</span></span><br><span class="line"><span class="string">/ #</span></span><br></pre></td></tr></table></figure><h3 id="重建pod"><a class="markdownIt-Anchor" href="#重建pod"></a> 重建pod</h3><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><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></pre></td><td class="code"><pre><span class="line">$ kubectl delete pod -l app=nginx</span><br><span class="line">pod <span class="string">"web-0"</span> deleted</span><br><span class="line">pod <span class="string">"web-1"</span> deleted</span><br><span class="line"><span class="comment"># 快速执行</span></span><br><span class="line">$ kubectl get pod -w -l app=nginx</span><br><span class="line">NAME    READY   STATUS              RESTARTS   AGE</span><br><span class="line">web-0   0/1     ContainerCreating   0          0s</span><br><span class="line">web-0   1/1     Running             0          1s</span><br><span class="line">web-1   0/1     Pending             0          0s</span><br><span class="line">web-1   0/1     Pending             0          0s</span><br><span class="line">web-1   0/1     ContainerCreating   0          0s</span><br><span class="line">web-1   1/1     Running             0          3s</span><br><span class="line">$  kubectl get pods -o wide</span><br><span class="line">NAME    READY   STATUS    RESTARTS   AGE   IP            NODE            NOMINATED NODE   READINESS GATES</span><br><span class="line">web-0   1/1     Running   0          85s   172.1.1.201   node2           &lt;none&gt;           &lt;none&gt;</span><br><span class="line">web-1   1/1     Running   0          81s   172.1.2.181   bqi-k8s-node3   &lt;none&gt;           &lt;none&gt;</span><br></pre></td></tr></table></figure><p>可以看到，当删除了相关的pod后，kubernetes会以同样的名字重建pod</p><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><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></pre></td><td class="code"><pre><span class="line">$ kubectl run -i --tty --image busybox:1.28.4 connect-test --restart=Never --rm -- /bin/sh</span><br><span class="line">If you don<span class="string">'t see a command prompt, try pressing enter.</span></span><br><span class="line"><span class="string">/ # nslookup web-0.nginx</span></span><br><span class="line"><span class="string">Server:    10.96.0.10</span></span><br><span class="line"><span class="string">Address 1: 10.96.0.10 kube-dns.kube-system.svc.cluster.local</span></span><br><span class="line"><span class="string"></span></span><br><span class="line"><span class="string">Name:      web-0.nginx</span></span><br><span class="line"><span class="string">Address 1: 172.1.1.201 web-0.nginx.default.svc.cluster.local</span></span><br><span class="line"><span class="string">/ # nslookup web-1.nginx</span></span><br><span class="line"><span class="string">Server:    10.96.0.10</span></span><br><span class="line"><span class="string">Address 1: 10.96.0.10 kube-dns.kube-system.svc.cluster.local</span></span><br><span class="line"><span class="string"></span></span><br><span class="line"><span class="string">Name:      web-1.nginx</span></span><br><span class="line"><span class="string">Address 1: 172.1.2.181 web-1.nginx.default.svc.cluster.local</span></span><br><span class="line"><span class="string">/ #</span></span><br></pre></td></tr></table></figure><p>重建后，依然可以访问<code>web-0.nginx</code>，但IP地址发生了变化</p><h2 id="小结"><a class="markdownIt-Anchor" href="#小结"></a> 小结</h2><p>本节课程主要学习了StatefulSet这个控制器，K8s在按照pod模版进行创建时：</p><ol><li>对pod进行编号并逐一完成创建工作</li><li>当重建发生时，也会按照编号对pod逐一进行操作</li><li>通过headless service，StatefulSet 为每个 Pod 创建了一个固定并且稳定的 DNS 记录</li></ol>]]></content>
    
    <summary type="html">
    
      &lt;blockquote&gt;
&lt;p&gt;学习极客时间上的&lt;a href=&quot;https://time.geekbang.org/column/intro/116&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;《深入剖析Kubernetes》&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;秉持眼过千遍不如手过一遍的原则。动手实践并记录结果&lt;/p&gt;
&lt;p&gt;对应章节：&lt;a href=&quot;https://time.geekbang.org/column/article/41017&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;18 | 深入理解StatefulSet（一）：拓扑状态&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
    
    </summary>
    
    
      <category term="k8s" scheme="http://www.isimble.com/categories/k8s/"/>
    
    
      <category term="docker" scheme="http://www.isimble.com/tags/docker/"/>
    
      <category term="Kubernetes" scheme="http://www.isimble.com/tags/Kubernetes/"/>
    
  </entry>
  
  <entry>
    <title>K8s学习笔记——作业副本与水平扩展</title>
    <link href="http://www.isimble.com/2020/07/29/kubernetesLearning17/"/>
    <id>http://www.isimble.com/2020/07/29/kubernetesLearning17/</id>
    <published>2020-07-29T08:51:05.000Z</published>
    <updated>2020-07-29T09:00:36.673Z</updated>
    
    <content type="html"><![CDATA[<blockquote><p>学习极客时间上的<a href="https://time.geekbang.org/column/intro/116" target="_blank" rel="noopener">《深入剖析Kubernetes》</a></p><p>秉持眼过千遍不如手过一遍的原则。动手实践并记录结果</p><p>对应章节：<a href="https://time.geekbang.org/column/article/40906" target="_blank" rel="noopener">17 | 经典PaaS的记忆：作业副本与水平扩展</a></p></blockquote><a id="more"></a><h2 id="replicaset"><a class="markdownIt-Anchor" href="#replicaset"></a> ReplicaSet</h2><p>书接上文中，创建了一个<code>nginx-dp</code>的deployment</p><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></pre></td><td class="code"><pre><span class="line">$ kubectl get pods</span><br><span class="line">NAME                        READY   STATUS    RESTARTS   AGE</span><br><span class="line">nginx-dp-67f857c57f-4wptz   1/1     Running   0          7m34s</span><br><span class="line">nginx-dp-67f857c57f-qx7l7   1/1     Running   0          25m</span><br></pre></td></tr></table></figure><p>先来查看下ReplicaSet</p><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></pre></td><td class="code"><pre><span class="line">$ kubectl get replicasets</span><br><span class="line">NAME                  DESIRED   CURRENT   READY   AGE</span><br><span class="line">nginx-dp-67f857c57f   2         2         2       39m</span><br></pre></td></tr></table></figure><p>由此可见，实际上当我们创建一个deployment的时候，k8s为我们创建了一个名为<code>nginx-dp-67f857c57f</code>的ReplicaSet。是不是觉得这个名字中的ID这么熟悉。正是Pod的labels字段中的那个ID</p><h3 id="创建一个replicaset"><a class="markdownIt-Anchor" href="#创建一个replicaset"></a> 创建一个ReplicaSet</h3><figure class="highlight yaml"><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></pre></td><td class="code"><pre><span class="line"><span class="attr">apiVersion:</span> <span class="string">apps/v1</span></span><br><span class="line"><span class="attr">kind:</span> <span class="string">ReplicaSet</span></span><br><span class="line"><span class="attr">metadata:</span></span><br><span class="line">  <span class="attr">name:</span> <span class="string">test-rs</span></span><br><span class="line">  <span class="attr">labels:</span></span><br><span class="line">    <span class="attr">app:</span> <span class="string">nginx</span></span><br><span class="line"><span class="attr">spec:</span></span><br><span class="line">  <span class="attr">replicas:</span> <span class="number">3</span></span><br><span class="line">  <span class="attr">selector:</span></span><br><span class="line">    <span class="attr">matchLabels:</span></span><br><span class="line">      <span class="attr">app:</span> <span class="string">nginx</span></span><br><span class="line">  <span class="attr">template:</span></span><br><span class="line">    <span class="attr">metadata:</span></span><br><span class="line">      <span class="attr">labels:</span></span><br><span class="line">        <span class="attr">app:</span> <span class="string">nginx</span></span><br><span class="line">    <span class="attr">spec:</span></span><br><span class="line">      <span class="attr">containers:</span></span><br><span class="line">      <span class="bullet">-</span> <span class="attr">name:</span> <span class="string">nginx</span></span><br><span class="line">        <span class="attr">image:</span> <span class="string">nginx</span></span><br><span class="line">        <span class="attr">imagePullPolicy:</span> <span class="string">Never</span></span><br></pre></td></tr></table></figure><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><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">$ kubectl apply -f rs-test.yaml</span><br><span class="line">replicaset.apps/rs-test created</span><br><span class="line">$ kubectl get pods</span><br><span class="line">NAME                        READY   STATUS        RESTARTS   AGE</span><br><span class="line">nginx-dp-67f857c57f-4wptz   1/1     Running       0          33m</span><br><span class="line">nginx-dp-67f857c57f-qx7l7   1/1     Running       0          51m</span><br><span class="line">rs-test-8zd6q               0/1     Terminating   0          4s</span><br><span class="line">rs-test-f5vvr               0/1     Terminating   0          4s</span><br><span class="line">rs-test-rkh7r               0/1     Terminating   0          4s</span><br><span class="line">$ kubectl get rs</span><br><span class="line">NAME                  DESIRED   CURRENT   READY   AGE</span><br><span class="line">nginx-dp-67f857c57f   2         2         2       51m</span><br><span class="line">rs-test               0         0         0       14s</span><br></pre></td></tr></table></figure><p><strong>WHAT?!</strong></p><p>居然创建失败，所谓在作死的道路上不停试探。谁让我用了和上节课中的Deployment一样的labels呢</p><p>再来一遍：</p><figure class="highlight yaml"><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></pre></td><td class="code"><pre><span class="line"><span class="attr">apiVersion:</span> <span class="string">apps/v1</span></span><br><span class="line"><span class="attr">kind:</span> <span class="string">ReplicaSet</span></span><br><span class="line"><span class="attr">metadata:</span></span><br><span class="line">  <span class="attr">name:</span> <span class="string">test-rs</span></span><br><span class="line">  <span class="attr">labels:</span></span><br><span class="line">    <span class="attr">app:</span> <span class="string">nginx-new</span></span><br><span class="line"><span class="attr">spec:</span></span><br><span class="line">  <span class="attr">replicas:</span> <span class="number">3</span></span><br><span class="line">  <span class="attr">selector:</span></span><br><span class="line">    <span class="attr">matchLabels:</span></span><br><span class="line">      <span class="attr">app:</span> <span class="string">nginx-new</span></span><br><span class="line">  <span class="attr">template:</span></span><br><span class="line">    <span class="attr">metadata:</span></span><br><span class="line">      <span class="attr">labels:</span></span><br><span class="line">        <span class="attr">app:</span> <span class="string">nginx-new</span></span><br><span class="line">    <span class="attr">spec:</span></span><br><span class="line">      <span class="attr">containers:</span></span><br><span class="line">      <span class="bullet">-</span> <span class="attr">name:</span> <span class="string">nginx</span></span><br><span class="line">        <span class="attr">image:</span> <span class="string">nginx</span></span><br><span class="line">        <span class="attr">imagePullPolicy:</span> <span class="string">Never</span></span><br></pre></td></tr></table></figure><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><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">$ kubectl get rs</span><br><span class="line">NAME                  DESIRED   CURRENT   READY   AGE</span><br><span class="line">nginx-dp-67f857c57f   2         2         2       54m</span><br><span class="line"><span class="built_in">test</span>-rs               3         3         3       7m30s</span><br><span class="line">$ kubectl get pods</span><br><span class="line">NAME                        READY   STATUS    RESTARTS   AGE</span><br><span class="line">nginx-dp-67f857c57f-4wptz   1/1     Running   0          37m</span><br><span class="line">nginx-dp-67f857c57f-qx7l7   1/1     Running   0          54m</span><br><span class="line"><span class="built_in">test</span>-rs-9wfx8               1/1     Running   0          7m33s</span><br><span class="line"><span class="built_in">test</span>-rs-qbckm               1/1     Running   0          7m33s</span><br><span class="line"><span class="built_in">test</span>-rs-rxjbv               1/1     Running   0          7m33s</span><br></pre></td></tr></table></figure><p>现在看起来，创建出了一个名为<code>test-rs</code>的ReplicaSet，而<code>test-rs</code>的rs又创建出了三个pod</p><img src="/2020/07/29/kubernetesLearning17/replicaSet.png" class="" title="ReplicaSet"><h3 id="水平收缩"><a class="markdownIt-Anchor" href="#水平收缩"></a> 水平收缩</h3><p>修改<code>test-rs</code>的RS：<code>replicas: 3</code>为<code>replicas: 4</code></p><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><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">$ kubectl apply -f rs-test.yaml</span><br><span class="line">replicaset.apps/<span class="built_in">test</span>-rs configured</span><br><span class="line">$ kubectl get pods</span><br><span class="line">NAME                        READY   STATUS    RESTARTS   AGE</span><br><span class="line"><span class="built_in">test</span>-rs-9wfx8               1/1     Running   0          37m</span><br><span class="line"><span class="built_in">test</span>-rs-dwm9j               1/1     Running   0          4s</span><br><span class="line"><span class="built_in">test</span>-rs-qbckm               1/1     Running   0          37m</span><br><span class="line"><span class="built_in">test</span>-rs-rxjbv               1/1     Running   0          37m</span><br></pre></td></tr></table></figure><p>修改为4个后，自动创建了一个新的<code>test-rs-dwm9j</code>的pod</p><p>再次修改为<code>replicas: 2</code></p><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><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></pre></td><td class="code"><pre><span class="line">$ kubectl get pods</span><br><span class="line">NAME                        READY   STATUS    RESTARTS   AGE</span><br><span class="line"><span class="built_in">test</span>-rs-9wfx8               1/1     Running   0          41m</span><br><span class="line"><span class="built_in">test</span>-rs-rxjbv               1/1     Running   0          41m</span><br><span class="line">$ kubectl describe rs <span class="built_in">test</span>-rs</span><br><span class="line">Name:         <span class="built_in">test</span>-rs</span><br><span class="line">Namespace:    default</span><br><span class="line">Selector:     app=nginx-new</span><br><span class="line">Labels:       app=nginx-new</span><br><span class="line">Annotations:  Replicas:  2 current / 2 desired</span><br><span class="line">Pods Status:  2 Running / 0 Waiting / 0 Succeeded / 0 Failed</span><br><span class="line">...</span><br><span class="line">Events:</span><br><span class="line">  Type    Reason            Age    From                   Message</span><br><span class="line">  ----    ------            ----   ----                   -------</span><br><span class="line">  Normal  SuccessfulCreate  41m    replicaset-controller  Created pod: <span class="built_in">test</span>-rs-qbckm</span><br><span class="line">  Normal  SuccessfulCreate  41m    replicaset-controller  Created pod: <span class="built_in">test</span>-rs-9wfx8</span><br><span class="line">  Normal  SuccessfulCreate  41m    replicaset-controller  Created pod: <span class="built_in">test</span>-rs-rxjbv</span><br><span class="line">  Normal  SuccessfulCreate  4m41s  replicaset-controller  Created pod: <span class="built_in">test</span>-rs-dwm9j</span><br><span class="line">  Normal  SuccessfulDelete  16s    replicaset-controller  Deleted pod: <span class="built_in">test</span>-rs-dwm9j</span><br><span class="line">  Normal  SuccessfulDelete  16s    replicaset-controller  Deleted pod: <span class="built_in">test</span>-rs-qbckm</span><br></pre></td></tr></table></figure><p>查看ReplicaSet的Events可以看出来：</p><ol><li>修改为4的时候，创建了一个新的pod</li><li>修改为2的时候，两个pod被删除</li></ol><h2 id="滚动更新"><a class="markdownIt-Anchor" href="#滚动更新"></a> 滚动更新</h2><h4 id="创建deployment"><a class="markdownIt-Anchor" href="#创建deployment"></a> 创建Deployment</h4><figure class="highlight yaml"><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></pre></td><td class="code"><pre><span class="line"><span class="attr">apiVersion:</span> <span class="string">apps/v1</span></span><br><span class="line"><span class="attr">kind:</span> <span class="string">Deployment</span></span><br><span class="line"><span class="attr">metadata:</span></span><br><span class="line">  <span class="attr">name:</span> <span class="string">nginx-dp</span></span><br><span class="line">  <span class="attr">labels:</span></span><br><span class="line">    <span class="attr">app:</span> <span class="string">nginx</span></span><br><span class="line"><span class="attr">spec:</span></span><br><span class="line">  <span class="attr">replicas:</span> <span class="number">3</span></span><br><span class="line">  <span class="attr">selector:</span></span><br><span class="line">    <span class="attr">matchLabels:</span></span><br><span class="line">      <span class="attr">app:</span> <span class="string">nginx</span></span><br><span class="line">  <span class="attr">template:</span></span><br><span class="line">    <span class="attr">metadata:</span></span><br><span class="line">      <span class="attr">labels:</span></span><br><span class="line">        <span class="attr">app:</span> <span class="string">nginx</span></span><br><span class="line">    <span class="attr">spec:</span></span><br><span class="line">      <span class="attr">containers:</span></span><br><span class="line">      <span class="bullet">-</span> <span class="attr">name:</span> <span class="string">nginx</span></span><br><span class="line">        <span class="attr">image:</span> <span class="string">nginx</span></span><br><span class="line">        <span class="attr">ports:</span></span><br><span class="line">        <span class="bullet">-</span> <span class="attr">containerPort:</span> <span class="number">80</span></span><br></pre></td></tr></table></figure><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><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">$ kubectl apply -f nginx-dp.yaml --record</span><br><span class="line">deployment.apps/nginx-dp created</span><br><span class="line"><span class="comment"># 注：执行完立即执行rollout才能看到</span></span><br><span class="line">$ kubectl rollout status deployment/nginx-dp</span><br><span class="line">Waiting <span class="keyword">for</span> deployment <span class="string">"nginx-dp"</span> rollout to finish: 0 of 3 updated replicas are available...</span><br><span class="line">Waiting <span class="keyword">for</span> deployment <span class="string">"nginx-dp"</span> rollout to finish: 1 of 3 updated replicas are available...</span><br><span class="line">Waiting <span class="keyword">for</span> deployment <span class="string">"nginx-dp"</span> rollout to finish: 2 of 3 updated replicas are available...</span><br><span class="line">deployment <span class="string">"nginx-dp"</span> successfully rolled out</span><br><span class="line">$ kubectl get rs</span><br><span class="line">NAME                 DESIRED   CURRENT   READY   AGE</span><br><span class="line">nginx-dp-d46f5678b   3         3         3       3m41s</span><br><span class="line">$ kubectl get deploy</span><br><span class="line">NAME       READY   UP-TO-DATE   AVAILABLE   AGE</span><br><span class="line">nginx-dp   3/3     3            3           3m45s</span><br></pre></td></tr></table></figure><p>可以看到:</p><ol><li>ReplicaSet的状态有：Desired, Current, Ready</li><li>Deployment的有： Ready, Available, UP-to-date</li></ol><blockquote><p>注：与课程中的不一样</p></blockquote><h3 id="修改image版本"><a class="markdownIt-Anchor" href="#修改image版本"></a> 修改image版本</h3><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><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">$ kubectl edit deployment/nginx-dp</span><br><span class="line">....</span><br><span class="line">    spec:</span><br><span class="line">      containers:</span><br><span class="line">      - image: nginx:stable</span><br><span class="line">        imagePullPolicy: Always</span><br><span class="line">        name: nginx</span><br><span class="line">        ports:</span><br><span class="line">        - containerPort: 80</span><br><span class="line">          protocol: TCP</span><br></pre></td></tr></table></figure><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><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></pre></td><td class="code"><pre><span class="line">$ kubectl get rs</span><br><span class="line">NAME                  DESIRED   CURRENT   READY   AGE</span><br><span class="line">nginx-dp-7fb9ff5685   1         1         0       41s</span><br><span class="line">nginx-dp-d46f5678b    3         3         3       8m2s</span><br><span class="line">$ kubectl rollout status deployment/nginx-dp</span><br><span class="line">Waiting <span class="keyword">for</span> deployment <span class="string">"nginx-dp"</span> rollout to finish: 1 out of 3 new replicas have been updated...</span><br><span class="line">Waiting <span class="keyword">for</span> deployment <span class="string">"nginx-dp"</span> rollout to finish: 1 out of 3 new replicas have been updated...</span><br><span class="line">Waiting <span class="keyword">for</span> deployment <span class="string">"nginx-dp"</span> rollout to finish: 1 out of 3 new replicas have been updated...</span><br><span class="line">Waiting <span class="keyword">for</span> deployment <span class="string">"nginx-dp"</span> rollout to finish: 2 out of 3 new replicas have been updated...</span><br><span class="line">Waiting <span class="keyword">for</span> deployment <span class="string">"nginx-dp"</span> rollout to finish: 2 out of 3 new replicas have been updated...</span><br><span class="line">Waiting <span class="keyword">for</span> deployment <span class="string">"nginx-dp"</span> rollout to finish: 2 out of 3 new replicas have been updated...</span><br><span class="line">Waiting <span class="keyword">for</span> deployment <span class="string">"nginx-dp"</span> rollout to finish: 1 old replicas are pending termination...</span><br><span class="line">Waiting <span class="keyword">for</span> deployment <span class="string">"nginx-dp"</span> rollout to finish: 1 old replicas are pending termination...</span><br><span class="line">deployment <span class="string">"nginx-dp"</span> successfully rolled out</span><br><span class="line">$ kubectl get rs</span><br><span class="line">NAME                  DESIRED   CURRENT   READY   AGE</span><br><span class="line">nginx-dp-7fb9ff5685   3         3         3       10m</span><br><span class="line">nginx-dp-d46f5678b    0         0         0       17m</span><br><span class="line">$ kubectl describe deploy nginx-dp</span><br><span class="line">...</span><br><span class="line">StrategyType:           RollingUpdate</span><br><span class="line">MinReadySeconds:        0</span><br><span class="line">RollingUpdateStrategy:  25% max unavailable, 25% max surge</span><br><span class="line">...</span><br><span class="line">OldReplicaSets:  &lt;none&gt;</span><br><span class="line">NewReplicaSet:   nginx-dp-7fb9ff5685 (3/3 replicas created)</span><br><span class="line">Events:</span><br><span class="line">  Type    Reason             Age    From                   Message</span><br><span class="line">  ----    ------             ----   ----                   -------</span><br><span class="line">  Normal  ScalingReplicaSet  18m    deployment-controller  Scaled up replica <span class="built_in">set</span> nginx-dp-d46f5678b to 3</span><br><span class="line">  Normal  ScalingReplicaSet  11m    deployment-controller  Scaled up replica <span class="built_in">set</span> nginx-dp-7fb9ff5685 to 1</span><br><span class="line">  Normal  ScalingReplicaSet  7m22s  deployment-controller  Scaled down replica <span class="built_in">set</span> nginx-dp-d46f5678b to 2</span><br><span class="line">  Normal  ScalingReplicaSet  7m22s  deployment-controller  Scaled up replica <span class="built_in">set</span> nginx-dp-7fb9ff5685 to 2</span><br><span class="line">  Normal  ScalingReplicaSet  3m34s  deployment-controller  Scaled down replica <span class="built_in">set</span> nginx-dp-d46f5678b to 1</span><br><span class="line">  Normal  ScalingReplicaSet  3m34s  deployment-controller  Scaled up replica <span class="built_in">set</span> nginx-dp-7fb9ff5685 to 3</span><br><span class="line">  Normal  ScalingReplicaSet  3m17s  deployment-controller  Scaled down replica <span class="built_in">set</span> nginx-dp-d46f5678b to 0</span><br></pre></td></tr></table></figure><p>从上面的各种结果可以看出，当修改了deployment中的image后：</p><ol><li>k8s创建了一个新的ReplicaSet: <code>nginx-dp-7fb9ff5685</code></li><li>逐个增加新的ReplicaSet，然后逐个减少旧的ReplicaSet</li><li>当滚动更新完毕后，旧的RS <code>nginx-dp-d46f5678b</code>数量变为0，但仍旧保留，没有自动删除</li><li>Deployment的NewReplicaSet字段变成了<code>nginx-dp-7fb9ff5685</code></li></ol><h3 id="修改为一个错误的image"><a class="markdownIt-Anchor" href="#修改为一个错误的image"></a> 修改为一个错误的image</h3><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><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></pre></td><td class="code"><pre><span class="line">$ kubectl <span class="built_in">set</span> image deployment/nginx-dp nginx=nginx:1.91</span><br><span class="line">deployment.apps/nginx-dp image updated</span><br><span class="line">$ kubectl get rs</span><br><span class="line">NAME                  DESIRED   CURRENT   READY   AGE</span><br><span class="line">nginx-dp-6d6678fb55   1         1         0       6s</span><br><span class="line">nginx-dp-7fb9ff5685   3         3         3       24m</span><br><span class="line">nginx-dp-d46f5678b    0         0         0       31m</span><br><span class="line">$ kubectl get pods</span><br><span class="line">NAME                        READY   STATUS         RESTARTS   AGE</span><br><span class="line">nginx-dp-6d6678fb55-4xxpv   0/1     ErrImagePull   0          72s</span><br><span class="line">nginx-dp-7fb9ff5685-25xlv   1/1     Running        0          25m</span><br><span class="line">nginx-dp-7fb9ff5685-jxvt8   1/1     Running        0          17m</span><br><span class="line">nginx-dp-7fb9ff5685-ld64t   1/1     Running        0          21m</span><br><span class="line">$ kubectl describe deployment nginx-dp</span><br><span class="line">...</span><br><span class="line">OldReplicaSets:  nginx-dp-7fb9ff5685 (3/3 replicas created)</span><br><span class="line">NewReplicaSet:   nginx-dp-6d6678fb55 (1/1 replicas created)</span><br><span class="line">Events:</span><br><span class="line">  Type    Reason             Age   From                   Message</span><br><span class="line">  ----    ------             ----  ----                   -------</span><br><span class="line">  Normal  ScalingReplicaSet  33m   deployment-controller  Scaled up replica <span class="built_in">set</span> nginx-dp-d46f5678b to 3</span><br><span class="line">  Normal  ScalingReplicaSet  25m   deployment-controller  Scaled up replica <span class="built_in">set</span> nginx-dp-7fb9ff5685 to 1</span><br><span class="line">  Normal  ScalingReplicaSet  21m   deployment-controller  Scaled down replica <span class="built_in">set</span> nginx-dp-d46f5678b to 2</span><br><span class="line">  Normal  ScalingReplicaSet  21m   deployment-controller  Scaled up replica <span class="built_in">set</span> nginx-dp-7fb9ff5685 to 2</span><br><span class="line">  Normal  ScalingReplicaSet  18m   deployment-controller  Scaled down replica <span class="built_in">set</span> nginx-dp-d46f5678b to 1</span><br><span class="line">  Normal  ScalingReplicaSet  18m   deployment-controller  Scaled up replica <span class="built_in">set</span> nginx-dp-7fb9ff5685 to 3</span><br><span class="line">  Normal  ScalingReplicaSet  17m   deployment-controller  Scaled down replica <span class="built_in">set</span> nginx-dp-d46f5678b to 0</span><br><span class="line">  Normal  ScalingReplicaSet  98s   deployment-controller  Scaled up replica <span class="built_in">set</span> nginx-dp-6d6678fb55 to 1</span><br></pre></td></tr></table></figure><p>可以看出：</p><ol><li>再次创建了一个新的RS: <code>nginx-dp-6d6678fb55</code></li><li>创建了一个名为<code>nginx-dp-6d6678fb55-4xxpv</code>的pod，但状态为<code>ErrImagePull</code></li><li>Deployment的OldReplicaSets为原来的<code>nginx-dp-7fb9ff5685</code>，NewReplicaSet为新的<code>nginx-dp-6d6678fb55</code></li></ol><h3 id="rollout"><a class="markdownIt-Anchor" href="#rollout"></a> Rollout</h3><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><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></pre></td><td class="code"><pre><span class="line">$ kubectl rollout undo deployment/nginx-dp</span><br><span class="line">deployment.apps/nginx-dp rolled back</span><br><span class="line">$ kubectl get rs</span><br><span class="line">NAME                  DESIRED   CURRENT   READY   AGE</span><br><span class="line">nginx-dp-6d6678fb55   0         0         0       6m49s</span><br><span class="line">nginx-dp-7fb9ff5685   3         3         3       30m</span><br><span class="line">nginx-dp-d46f5678b    0         0         0       38m</span><br><span class="line">$ kubectl describe deployment/nginx-dp</span><br><span class="line">...</span><br><span class="line">OldReplicaSets:  &lt;none&gt;</span><br><span class="line">NewReplicaSet:   nginx-dp-7fb9ff5685 (3/3 replicas created)</span><br><span class="line">Events:</span><br><span class="line">  Type    Reason             Age   From                   Message</span><br><span class="line">  ----    ------             ----  ----                   -------</span><br><span class="line">  Normal  ScalingReplicaSet  38m   deployment-controller  Scaled up replica <span class="built_in">set</span> nginx-dp-d46f5678b to 3</span><br><span class="line">  Normal  ScalingReplicaSet  31m   deployment-controller  Scaled up replica <span class="built_in">set</span> nginx-dp-7fb9ff5685 to 1</span><br><span class="line">  Normal  ScalingReplicaSet  27m   deployment-controller  Scaled down replica <span class="built_in">set</span> nginx-dp-d46f5678b to 2</span><br><span class="line">  Normal  ScalingReplicaSet  27m   deployment-controller  Scaled up replica <span class="built_in">set</span> nginx-dp-7fb9ff5685 to 2</span><br><span class="line">  Normal  ScalingReplicaSet  23m   deployment-controller  Scaled down replica <span class="built_in">set</span> nginx-dp-d46f5678b to 1</span><br><span class="line">  Normal  ScalingReplicaSet  23m   deployment-controller  Scaled up replica <span class="built_in">set</span> nginx-dp-7fb9ff5685 to 3</span><br><span class="line">  Normal  ScalingReplicaSet  23m   deployment-controller  Scaled down replica <span class="built_in">set</span> nginx-dp-d46f5678b to 0</span><br><span class="line">  Normal  ScalingReplicaSet  7m2s  deployment-controller  Scaled up replica <span class="built_in">set</span> nginx-dp-6d6678fb55 to 1</span><br><span class="line">  Normal  ScalingReplicaSet  19s   deployment-controller  Scaled down replica <span class="built_in">set</span> nginx-dp-6d6678fb55 to 0</span><br><span class="line">$ kubectl get pods</span><br><span class="line">NAME                        READY   STATUS    RESTARTS   AGE</span><br><span class="line">nginx-dp-7fb9ff5685-25xlv   1/1     Running   0          40m</span><br><span class="line">nginx-dp-7fb9ff5685-jxvt8   1/1     Running   0          33m</span><br><span class="line">nginx-dp-7fb9ff5685-ld64t   1/1     Running   0          36m</span><br></pre></td></tr></table></figure><p>可以看出：</p><ol><li><code>nginx-dp-6d6678fb55</code>的RS的期望值变为了0</li><li>对应的pod被自动删除</li></ol><h4 id="history"><a class="markdownIt-Anchor" href="#history"></a> history</h4><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><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></pre></td><td class="code"><pre><span class="line">$ kubectl rollout <span class="built_in">history</span> deployment/nginx-dp</span><br><span class="line">deployment.apps/nginx-dp</span><br><span class="line">REVISION  CHANGE-CAUSE</span><br><span class="line">1         kubectl apply --filename=nginx-dp.yaml --record=<span class="literal">true</span></span><br><span class="line">3         kubectl apply --filename=nginx-dp.yaml --record=<span class="literal">true</span></span><br><span class="line">4         kubectl apply --filename=nginx-dp.yaml --record=<span class="literal">true</span></span><br><span class="line"></span><br><span class="line">$ kubectl rollout <span class="built_in">history</span> deployment/nginx-dp --revision=4</span><br><span class="line">deployment.apps/nginx-dp with revision <span class="comment">#4</span></span><br><span class="line">Pod Template:</span><br><span class="line">  Labels:   app=nginx</span><br><span class="line">    pod-template-hash=7fb9ff5685</span><br><span class="line">  Annotations:  kubernetes.io/change-cause: kubectl apply --filename=nginx-dp.yaml --record=<span class="literal">true</span></span><br><span class="line">  Containers:</span><br><span class="line">   nginx:</span><br><span class="line">    Image:  nginx:stable</span><br><span class="line">    Port:   80/TCP</span><br><span class="line">    Host Port:  0/TCP</span><br><span class="line">    Environment:    &lt;none&gt;</span><br><span class="line">    Mounts: &lt;none&gt;</span><br><span class="line">  Volumes:  &lt;none&gt;</span><br></pre></td></tr></table></figure><blockquote><p>注：新版本的命令输出已经和课程中的不一样了</p></blockquote><p>现在可以使用<code>revision</code>字段回滚到镜像为nginx:latest</p><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><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">$ kubectl rollout <span class="built_in">history</span> deployment/nginx-dp --revision=1</span><br><span class="line">deployment.apps/nginx-dp with revision <span class="comment">#1</span></span><br><span class="line">Pod Template:</span><br><span class="line">  Labels:   app=nginx</span><br><span class="line">    pod-template-hash=d46f5678b</span><br><span class="line">  Annotations:  kubernetes.io/change-cause: kubectl apply --filename=nginx-dp.yaml --record=<span class="literal">true</span></span><br><span class="line">  Containers:</span><br><span class="line">   nginx:</span><br><span class="line">    Image:  nginx</span><br><span class="line">    Port:   80/TCP</span><br><span class="line">    Host Port:  0/TCP</span><br><span class="line">    Environment:    &lt;none&gt;</span><br><span class="line">    Mounts: &lt;none&gt;</span><br><span class="line">  Volumes:  &lt;none&gt;</span><br><span class="line">$ kubectl rollout undo deployment/nginx-dp --to-revision=1</span><br><span class="line">deployment.apps/nginx-dp rolled back</span><br><span class="line">$ kubectl get rs</span><br><span class="line">NAME                  DESIRED   CURRENT   READY   AGE</span><br><span class="line">nginx-dp-6d6678fb55   0         0         0       29m</span><br><span class="line">nginx-dp-7fb9ff5685   3         3         3       53m</span><br><span class="line">nginx-dp-d46f5678b    1         1         0       60m</span><br><span class="line">$ kubectl get rs</span><br><span class="line">NAME                  DESIRED   CURRENT   READY   AGE</span><br><span class="line">nginx-dp-6d6678fb55   0         0         0       29m</span><br><span class="line">nginx-dp-7fb9ff5685   1         1         1       53m</span><br><span class="line">nginx-dp-d46f5678b    3         3         2       60m</span><br><span class="line">$ kubectl get rs</span><br><span class="line">NAME                  DESIRED   CURRENT   READY   AGE</span><br><span class="line">nginx-dp-6d6678fb55   0         0         0       29m</span><br><span class="line">nginx-dp-7fb9ff5685   0         0         0       53m</span><br><span class="line">nginx-dp-d46f5678b    3         3         3       60m</span><br></pre></td></tr></table></figure><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><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></pre></td><td class="code"><pre><span class="line">$ kubectl rollout <span class="built_in">history</span> deployment/nginx-dp</span><br><span class="line">deployment.apps/nginx-dp</span><br><span class="line">REVISION  CHANGE-CAUSE</span><br><span class="line">3         kubectl apply --filename=nginx-dp.yaml --record=<span class="literal">true</span></span><br><span class="line">4         kubectl apply --filename=nginx-dp.yaml --record=<span class="literal">true</span></span><br><span class="line">5         kubectl apply --filename=nginx-dp.yaml --record=<span class="literal">true</span></span><br><span class="line"></span><br><span class="line">$ kubectl rollout <span class="built_in">history</span> deployment/nginx-dp --revision=5</span><br><span class="line">deployment.apps/nginx-dp with revision <span class="comment">#5</span></span><br><span class="line">Pod Template:</span><br><span class="line">  Labels:   app=nginx</span><br><span class="line">    pod-template-hash=d46f5678b</span><br><span class="line">  Annotations:  kubernetes.io/change-cause: kubectl apply --filename=nginx-dp.yaml --record=<span class="literal">true</span></span><br><span class="line">  Containers:</span><br><span class="line">   nginx:</span><br><span class="line">    Image:  nginx</span><br><span class="line">    Port:   80/TCP</span><br><span class="line">    Host Port:  0/TCP</span><br><span class="line">    Environment:    &lt;none&gt;</span><br><span class="line">    Mounts: &lt;none&gt;</span><br><span class="line">  Volumes:  &lt;none&gt;</span><br></pre></td></tr></table></figure><p>可以看到，回滚之后：</p><ol><li>原来的revision 1已经不存在了</li><li>出现了一个revision = 5</li><li>revision 5和原来的revision 1的内容一致</li></ol><p>所以，虽然是回滚到某个版本，但revision的号依然是增加了的。是通过滚动升级的方式实现了回滚的操作</p><h3 id="暂停与恢复"><a class="markdownIt-Anchor" href="#暂停与恢复"></a> 暂停与恢复</h3><ul><li>现在，先暂停</li></ul><figure class="highlight bash"><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">$ kubectl rollout pause deployment/nginx-dp</span><br><span class="line">deployment.apps/nginx-dp paused</span><br></pre></td></tr></table></figure><ul><li>修改image版本</li></ul><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><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></pre></td><td class="code"><pre><span class="line">$ kubectl <span class="built_in">set</span> image deployment/nginx-dp nginx=nginx:1.18</span><br><span class="line">deployment.apps/nginx-dp image updated</span><br><span class="line">$ kubectl get rs</span><br><span class="line">NAME                  DESIRED   CURRENT   READY   AGE</span><br><span class="line">nginx-dp-6d6678fb55   0         0         0       37m</span><br><span class="line">nginx-dp-7fb9ff5685   0         0         0       61m</span><br><span class="line">nginx-dp-d46f5678b    3         3         3       68m</span><br><span class="line">$ kubectl describe deployment/nginx-dp</span><br><span class="line">...</span><br><span class="line">OldReplicaSets:  nginx-dp-d46f5678b (3/3 replicas created)</span><br><span class="line">NewReplicaSet:   &lt;none&gt;</span><br><span class="line">Events:</span><br><span class="line">  Type    Reason             Age                  From                   Message</span><br><span class="line">  ----    ------             ----                 ----                   -------</span><br><span class="line">  Normal  ScalingReplicaSet  57m                  deployment-controller  Scaled down replica <span class="built_in">set</span> nginx-dp-d46f5678b to 2</span><br><span class="line">  Normal  ScalingReplicaSet  57m                  deployment-controller  Scaled up replica <span class="built_in">set</span> nginx-dp-7fb9ff5685 to 2</span><br><span class="line">  Normal  ScalingReplicaSet  54m                  deployment-controller  Scaled down replica <span class="built_in">set</span> nginx-dp-d46f5678b to 1</span><br><span class="line">  Normal  ScalingReplicaSet  54m                  deployment-controller  Scaled up replica <span class="built_in">set</span> nginx-dp-7fb9ff5685 to 3</span><br><span class="line">  Normal  ScalingReplicaSet  53m                  deployment-controller  Scaled down replica <span class="built_in">set</span> nginx-dp-d46f5678b to 0</span><br><span class="line">  Normal  ScalingReplicaSet  37m                  deployment-controller  Scaled up replica <span class="built_in">set</span> nginx-dp-6d6678fb55 to 1</span><br><span class="line">  Normal  ScalingReplicaSet  30m                  deployment-controller  Scaled down replica <span class="built_in">set</span> nginx-dp-6d6678fb55 to 0</span><br><span class="line">  Normal  ScalingReplicaSet  8m32s                deployment-controller  Scaled up replica <span class="built_in">set</span> nginx-dp-d46f5678b to 1</span><br><span class="line">  Normal  ScalingReplicaSet  8m26s                deployment-controller  Scaled up replica <span class="built_in">set</span> nginx-dp-d46f5678b to 2</span><br><span class="line">  Normal  ScalingReplicaSet  8m26s                deployment-controller  Scaled down replica <span class="built_in">set</span> nginx-dp-7fb9ff5685 to 2</span><br><span class="line">  Normal  ScalingReplicaSet  8m22s (x2 over 69m)  deployment-controller  Scaled up replica <span class="built_in">set</span> nginx-dp-d46f5678b to 3</span><br><span class="line">  Normal  ScalingReplicaSet  8m22s                deployment-controller  Scaled down replica <span class="built_in">set</span> nginx-dp-7fb9ff5685 to 1</span><br><span class="line">  Normal  ScalingReplicaSet  8m17s                deployment-controller  Scaled down replica <span class="built_in">set</span> nginx-dp-7fb9ff5685 to 0</span><br></pre></td></tr></table></figure><p>可以看到：</p><ol><li>修改了image为nginx:1.18后，没有创建出新的RS</li><li>但：Deployment的OldReplicaSet变成了<code>nginx-dp-d46f5678b</code>，而NewReplicaSet变成了<code>&lt;none&gt;</code>，这与最早之前看到的不一样</li></ol><ul><li>如果在暂停状态下将image再设置回nginx:latest会怎样呢</li></ul><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><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></pre></td><td class="code"><pre><span class="line">$ kubectl <span class="built_in">set</span> image deployment/nginx-dp nginx=nginx</span><br><span class="line">deployment.apps/nginx-dp image updated</span><br><span class="line">$ kubectl get rs</span><br><span class="line">NAME                  DESIRED   CURRENT   READY   AGE</span><br><span class="line">nginx-dp-6d6678fb55   0         0         0       44m</span><br><span class="line">nginx-dp-7fb9ff5685   0         0         0       68m</span><br><span class="line">nginx-dp-d46f5678b    3         3         3       76m</span><br><span class="line"><span class="comment"># 取消暂停</span></span><br><span class="line">$ kubectl rollout resume deployment/nginx-dp</span><br><span class="line">deployment.apps/nginx-dp resumed</span><br><span class="line">$ kubectl get rs</span><br><span class="line">NAME                  DESIRED   CURRENT   READY   AGE</span><br><span class="line">nginx-dp-6d6678fb55   0         0         0       46m</span><br><span class="line">nginx-dp-7fb9ff5685   0         0         0       70m</span><br><span class="line">nginx-dp-d46f5678b    3         3         3       77m</span><br><span class="line">$ kubectl rollout <span class="built_in">history</span> deployment/nginx-dp</span><br><span class="line">deployment.apps/nginx-dp</span><br><span class="line">REVISION  CHANGE-CAUSE</span><br><span class="line">3         kubectl apply --filename=nginx-dp.yaml --record=<span class="literal">true</span></span><br><span class="line">4         kubectl apply --filename=nginx-dp.yaml --record=<span class="literal">true</span></span><br><span class="line">5         kubectl apply --filename=nginx-dp.yaml --record=<span class="literal">true</span></span><br><span class="line">$ kubectl describe deployment/nginx-dp</span><br><span class="line">...</span><br><span class="line">OldReplicaSets:  &lt;none&gt;</span><br><span class="line">NewReplicaSet:   nginx-dp-d46f5678b (3/3 replicas created)</span><br><span class="line">...</span><br></pre></td></tr></table></figure><p>可以看到，修改回暂停前的镜像后，没有生成新的revision</p><ul><li>继续暂停的实验</li></ul><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><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></pre></td><td class="code"><pre><span class="line"><span class="comment"># 暂停</span></span><br><span class="line">$ kubectl rollout pause deployment/nginx-dp</span><br><span class="line">deployment.apps/nginx-dp paused</span><br><span class="line"><span class="comment"># 修改</span></span><br><span class="line">$ kubectl <span class="built_in">set</span> image deployment/nginx-dp nginx=nginx:1.18</span><br><span class="line">deployment.apps/nginx-dp image updated</span><br><span class="line"><span class="comment"># 恢复</span></span><br><span class="line">$ kubectl rollout resume deployment nginx-dp</span><br><span class="line">deployment.apps/nginx-dp resumed</span><br><span class="line">$ kubectl get rs</span><br><span class="line">NAME                  DESIRED   CURRENT   READY   AGE</span><br><span class="line">nginx-dp-6d6678fb55   0         0         0       53m</span><br><span class="line">nginx-dp-7f6cd547bd   1         1         0       3s</span><br><span class="line">nginx-dp-7fb9ff5685   0         0         0       77m</span><br><span class="line">nginx-dp-d46f5678b    3         3         3       85m</span><br><span class="line">$ kubectl rollout <span class="built_in">history</span> deployment/nginx-dp</span><br><span class="line">deployment.apps/nginx-dp</span><br><span class="line">REVISION  CHANGE-CAUSE</span><br><span class="line">3         kubectl apply --filename=nginx-dp.yaml --record=<span class="literal">true</span></span><br><span class="line">4         kubectl apply --filename=nginx-dp.yaml --record=<span class="literal">true</span></span><br><span class="line">5         kubectl apply --filename=nginx-dp.yaml --record=<span class="literal">true</span></span><br><span class="line">6         kubectl apply --filename=nginx-dp.yaml --record=<span class="literal">true</span></span><br><span class="line">$ kubectl get rs</span><br><span class="line">NAME                  DESIRED   CURRENT   READY   AGE</span><br><span class="line">nginx-dp-6d6678fb55   0         0         0       55m</span><br><span class="line">nginx-dp-7f6cd547bd   3         3         3       90s</span><br><span class="line">nginx-dp-7fb9ff5685   0         0         0       79m</span><br><span class="line">nginx-dp-d46f5678b    0         0         0       86m</span><br><span class="line">$ kubectl rollout <span class="built_in">history</span> deployment/nginx-dp --revision=6</span><br><span class="line">deployment.apps/nginx-dp with revision <span class="comment">#6</span></span><br><span class="line">Pod Template:</span><br><span class="line">  Labels:   app=nginx</span><br><span class="line">    pod-template-hash=7f6cd547bd</span><br><span class="line">  Annotations:  kubernetes.io/change-cause: kubectl apply --filename=nginx-dp.yaml --record=<span class="literal">true</span></span><br><span class="line">  Containers:</span><br><span class="line">   nginx:</span><br><span class="line">    Image:  nginx:1.18</span><br><span class="line">    Port:   80/TCP</span><br><span class="line">    Host Port:  0/TCP</span><br><span class="line">    Environment:    &lt;none&gt;</span><br><span class="line">    Mounts: &lt;none&gt;</span><br><span class="line">  Volumes:  &lt;none&gt;</span><br></pre></td></tr></table></figure><p>可以看出，当取消暂停后，对应的动作按照滚动更新的方式开始执行。</p><h2 id="小结"><a class="markdownIt-Anchor" href="#小结"></a> 小结</h2><p>本节课程主要学习了：</p><ol><li>水平扩展时，实际上是修改了ReplicaSet的期望值，并按照期望值去逐步拉起pod</li><li>而滚动更新时，会创建新的ReplicaSet，并通过逐个增加新的，而逐个减少旧的的方式来逐步替换pod</li></ol><p>最后，一个对原文的引用：</p><blockquote><p>Deployment 实际上是一个两层控制器。首先，它通过 ReplicaSet 的个数来描述应用的版本；然后，它再通过 ReplicaSet 的属性（比如 replicas 的值），来保证 Pod 的副本数量。</p></blockquote>]]></content>
    
    <summary type="html">
    
      &lt;blockquote&gt;
&lt;p&gt;学习极客时间上的&lt;a href=&quot;https://time.geekbang.org/column/intro/116&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;《深入剖析Kubernetes》&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;秉持眼过千遍不如手过一遍的原则。动手实践并记录结果&lt;/p&gt;
&lt;p&gt;对应章节：&lt;a href=&quot;https://time.geekbang.org/column/article/40906&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;17 | 经典PaaS的记忆：作业副本与水平扩展&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
    
    </summary>
    
    
      <category term="k8s" scheme="http://www.isimble.com/categories/k8s/"/>
    
    
      <category term="docker" scheme="http://www.isimble.com/tags/docker/"/>
    
      <category term="Kubernetes" scheme="http://www.isimble.com/tags/Kubernetes/"/>
    
  </entry>
  
  <entry>
    <title>K8s使用NFS跨节点数据持久化</title>
    <link href="http://www.isimble.com/2020/07/21/kubernetes-with-nfs/"/>
    <id>http://www.isimble.com/2020/07/21/kubernetes-with-nfs/</id>
    <published>2020-07-21T07:35:34.000Z</published>
    <updated>2020-07-23T03:10:23.534Z</updated>
    
    <content type="html"><![CDATA[<p>《深入剖析Kubernetes》中使用了Rook来搭建存储，而K8s本身也支持直接使用NFS。本次实验主要为后续学习做铺垫，使用现有NFS存储做为跨节点数据持久化，并简单的学习其实现原理。</p><a id="more"></a><h2 id="安装nfs客户端"><a class="markdownIt-Anchor" href="#安装nfs客户端"></a> 安装NFS客户端</h2><p>分别在各个node上安装</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">$ apt install nfs-common</span><br></pre></td></tr></table></figure><p><strong>测试</strong></p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">$ mount -t nfs 10.160.12.7:/data/share /mnt</span><br></pre></td></tr></table></figure><h2 id="nfs的pv及pvc测试"><a class="markdownIt-Anchor" href="#nfs的pv及pvc测试"></a> NFS的PV及PVC测试</h2><h3 id="新建pv"><a class="markdownIt-Anchor" href="#新建pv"></a> 新建PV</h3><figure class="highlight yaml"><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></pre></td><td class="code"><pre><span class="line"><span class="attr">apiVersion:</span> <span class="string">v1</span></span><br><span class="line"><span class="attr">kind:</span> <span class="string">PersistentVolume</span></span><br><span class="line"><span class="attr">metadata:</span></span><br><span class="line">  <span class="attr">name:</span> <span class="string">nfs-pv</span></span><br><span class="line"><span class="attr">spec:</span></span><br><span class="line">  <span class="attr">capacity:</span></span><br><span class="line">    <span class="attr">storage:</span> <span class="string">100Gi</span></span><br><span class="line">  <span class="attr">volumeMode:</span> <span class="string">Filesystem</span></span><br><span class="line">  <span class="attr">accessModes:</span></span><br><span class="line">  <span class="bullet">-</span> <span class="string">ReadWriteOnce</span></span><br><span class="line">  <span class="attr">persistentVolumeReclaimPolicy:</span> <span class="string">Recycle</span></span><br><span class="line">  <span class="attr">storageClassName:</span> <span class="string">nfs-client</span></span><br><span class="line">  <span class="attr">mountOptions:</span></span><br><span class="line">  <span class="bullet">-</span> <span class="string">hard</span></span><br><span class="line">  <span class="bullet">-</span> <span class="string">nfsvers=4.1</span></span><br><span class="line">  <span class="attr">nfs:</span></span><br><span class="line">    <span class="attr">path:</span> <span class="string">/data/share/bqi</span></span><br><span class="line">    <span class="attr">server:</span> <span class="number">10.160</span><span class="number">.12</span><span class="number">.7</span></span><br></pre></td></tr></table></figure><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></pre></td><td class="code"><pre><span class="line">$ kubectl get pv</span><br><span class="line">NAME     CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS   CLAIM                  STORAGECLASS   REASON   AGE</span><br><span class="line">nfs-pv   100Gi      RWO            Recycle          Bound    default/pvc-nfs-test   nfs-client              28m</span><br></pre></td></tr></table></figure><h3 id="新建pvc"><a class="markdownIt-Anchor" href="#新建pvc"></a> 新建PVC</h3><figure class="highlight yaml"><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="attr">apiVersion:</span> <span class="string">v1</span></span><br><span class="line"><span class="attr">kind:</span> <span class="string">PersistentVolumeClaim</span></span><br><span class="line"><span class="attr">metadata:</span></span><br><span class="line">  <span class="attr">name:</span> <span class="string">pvc-nfs-test</span></span><br><span class="line"><span class="attr">spec:</span></span><br><span class="line">  <span class="attr">accessModes:</span></span><br><span class="line">  <span class="bullet">-</span> <span class="string">ReadWriteOnce</span></span><br><span class="line">  <span class="attr">storageClassName:</span> <span class="string">nfs-client</span></span><br><span class="line">  <span class="attr">resources:</span></span><br><span class="line">    <span class="attr">requests:</span></span><br><span class="line">      <span class="attr">storage:</span> <span class="string">1Gi</span></span><br></pre></td></tr></table></figure><blockquote><p>注：storageClassName同PV的storageClassName</p></blockquote><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></pre></td><td class="code"><pre><span class="line">$ kubectl get pvc</span><br><span class="line">NAME           STATUS   VOLUME   CAPACITY   ACCESS MODES   STORAGECLASS   AGE</span><br><span class="line">pvc-nfs-test   Bound    nfs-pv   100Gi      RWO            nfs-client     7m41s</span><br></pre></td></tr></table></figure><h3 id="测试pvc"><a class="markdownIt-Anchor" href="#测试pvc"></a> 测试PVC</h3><p>测试思路：</p><ol><li>创建一个pod，使用pvc</li><li>在挂载目录下创建文件</li><li>再次创建一个pod，挂载pvc，检查其中文件</li><li>删除两个pod，重新创建一个使用pvc的pod，然后检查数据</li><li>同步检查跨节点时的状况</li></ol><h3 id="1-创建一个pod使用pvc"><a class="markdownIt-Anchor" href="#1-创建一个pod使用pvc"></a> 1. 创建一个pod，使用pvc</h3><figure class="highlight yaml"><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></pre></td><td class="code"><pre><span class="line"><span class="attr">apiVersion:</span> <span class="string">v1</span></span><br><span class="line"><span class="attr">kind:</span> <span class="string">Pod</span></span><br><span class="line"><span class="attr">metadata:</span></span><br><span class="line">  <span class="attr">name:</span> <span class="string">pvc-test-pod1</span></span><br><span class="line"><span class="attr">spec:</span></span><br><span class="line">  <span class="attr">containers:</span></span><br><span class="line">  <span class="bullet">-</span> <span class="attr">name:</span> <span class="string">pvc-busybox</span></span><br><span class="line">    <span class="attr">image:</span> <span class="string">busybox</span></span><br><span class="line">    <span class="attr">imagePullPolicy:</span> <span class="string">IfNotPresent</span></span><br><span class="line">    <span class="attr">stdin:</span> <span class="literal">true</span></span><br><span class="line">    <span class="attr">tty:</span> <span class="literal">true</span></span><br><span class="line">    <span class="attr">volumeMounts:</span></span><br><span class="line">    <span class="bullet">-</span> <span class="attr">name:</span> <span class="string">pvc</span></span><br><span class="line">      <span class="attr">mountPath:</span> <span class="string">/mnt</span></span><br><span class="line">  <span class="attr">volumes:</span></span><br><span class="line">  <span class="bullet">-</span> <span class="attr">name:</span> <span class="string">pvc</span></span><br><span class="line">    <span class="attr">persistentVolumeClaim:</span></span><br><span class="line">      <span class="attr">claimName:</span> <span class="string">pvc-nfs-test</span></span><br></pre></td></tr></table></figure><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></pre></td><td class="code"><pre><span class="line">$ kubectl get pods -o wide</span><br><span class="line">NAME            READY   STATUS    RESTARTS   AGE   IP            NODE            NOMINATED NODE   READINESS GATES</span><br><span class="line">pvc-test-pod1   1/1     Running   0          83s   172.1.1.229   node2           &lt;none&gt;           &lt;none&gt;</span><br></pre></td></tr></table></figure><h3 id="2-在挂载目录下创建文件"><a class="markdownIt-Anchor" href="#2-在挂载目录下创建文件"></a> 2. 在挂载目录下创建文件</h3><figure class="highlight bash"><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">$ kubectl <span class="built_in">exec</span> -it pvc-test-pod1 -- /bin/sh</span><br><span class="line">/ <span class="comment"># echo "hello nfs pvc" &gt; /mnt/test.txt</span></span><br></pre></td></tr></table></figure><h3 id="3-创建第二个pod"><a class="markdownIt-Anchor" href="#3-创建第二个pod"></a> 3. 创建第二个pod</h3><figure class="highlight yaml"><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></pre></td><td class="code"><pre><span class="line"><span class="attr">apiVersion:</span> <span class="string">v1</span></span><br><span class="line"><span class="attr">kind:</span> <span class="string">Pod</span></span><br><span class="line"><span class="attr">metadata:</span></span><br><span class="line">  <span class="attr">name:</span> <span class="string">pvc-test-pod2</span></span><br><span class="line"><span class="attr">spec:</span></span><br><span class="line">  <span class="attr">containers:</span></span><br><span class="line">  <span class="bullet">-</span> <span class="attr">name:</span> <span class="string">pvc-busybox</span></span><br><span class="line">    <span class="attr">image:</span> <span class="string">busybox</span></span><br><span class="line">    <span class="attr">imagePullPolicy:</span> <span class="string">IfNotPresent</span></span><br><span class="line">    <span class="attr">stdin:</span> <span class="literal">true</span></span><br><span class="line">    <span class="attr">tty:</span> <span class="literal">true</span></span><br><span class="line">    <span class="attr">volumeMounts:</span></span><br><span class="line">    <span class="bullet">-</span> <span class="attr">name:</span> <span class="string">pvc</span></span><br><span class="line">      <span class="attr">mountPath:</span> <span class="string">/mnt</span></span><br><span class="line">  <span class="attr">volumes:</span></span><br><span class="line">  <span class="bullet">-</span> <span class="attr">name:</span> <span class="string">pvc</span></span><br><span class="line">    <span class="attr">persistentVolumeClaim:</span></span><br><span class="line">      <span class="attr">claimName:</span> <span class="string">pvc-nfs-test</span></span><br></pre></td></tr></table></figure><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></pre></td><td class="code"><pre><span class="line">$ kubectl get pods -o wide</span><br><span class="line">NAME            READY   STATUS    RESTARTS   AGE     IP            NODE            NOMINATED NODE   READINESS GATES</span><br><span class="line">pvc-test-pod1   1/1     Running   0          5m26s   172.1.1.229   node2           &lt;none&gt;           &lt;none&gt;</span><br><span class="line">pvc-test-pod2   1/1     Running   0          2s      172.1.1.231   node2           &lt;none&gt;           &lt;none&gt;</span><br></pre></td></tr></table></figure><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></pre></td><td class="code"><pre><span class="line">$ kubectl <span class="built_in">exec</span> -it pvc-test-pod2 -- ls /mnt/</span><br><span class="line">test.txt</span><br><span class="line">$ kubectl <span class="built_in">exec</span> -it pvc-test-pod2 -- cat /mnt/test.txt</span><br><span class="line">hello nfs pvc</span><br></pre></td></tr></table></figure><h3 id="4-删除原来的pod并重建新的pod"><a class="markdownIt-Anchor" href="#4-删除原来的pod并重建新的pod"></a> 4. 删除原来的pod并重建新的pod</h3><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></pre></td><td class="code"><pre><span class="line">$ kubectl delete pod pvc-test-pod1</span><br><span class="line">pod <span class="string">"pvc-test-pod1"</span> deleted</span><br><span class="line">$ kubectl delete pod pvc-test-pod2</span><br><span class="line">pod <span class="string">"pvc-test-pod2"</span> deleted</span><br></pre></td></tr></table></figure><figure class="highlight yaml"><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></pre></td><td class="code"><pre><span class="line"><span class="attr">apiVersion:</span> <span class="string">v1</span></span><br><span class="line"><span class="attr">kind:</span> <span class="string">Pod</span></span><br><span class="line"><span class="attr">metadata:</span></span><br><span class="line">  <span class="attr">name:</span> <span class="string">pvc-test-pod3</span></span><br><span class="line"><span class="attr">spec:</span></span><br><span class="line">  <span class="attr">containers:</span></span><br><span class="line">  <span class="bullet">-</span> <span class="attr">name:</span> <span class="string">pvc-busybox</span></span><br><span class="line">    <span class="attr">image:</span> <span class="string">busybox</span></span><br><span class="line">    <span class="attr">imagePullPolicy:</span> <span class="string">IfNotPresent</span></span><br><span class="line">    <span class="attr">stdin:</span> <span class="literal">true</span></span><br><span class="line">    <span class="attr">tty:</span> <span class="literal">true</span></span><br><span class="line">    <span class="attr">volumeMounts:</span></span><br><span class="line">    <span class="bullet">-</span> <span class="attr">name:</span> <span class="string">pvc</span></span><br><span class="line">      <span class="attr">mountPath:</span> <span class="string">/mnt</span></span><br><span class="line">  <span class="attr">volumes:</span></span><br><span class="line">  <span class="bullet">-</span> <span class="attr">name:</span> <span class="string">pvc</span></span><br><span class="line">    <span class="attr">persistentVolumeClaim:</span></span><br><span class="line">      <span class="attr">claimName:</span> <span class="string">pvc-nfs-test</span></span><br></pre></td></tr></table></figure><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></pre></td><td class="code"><pre><span class="line">$ kubectl get pods -o wide</span><br><span class="line">NAME            READY   STATUS    RESTARTS   AGE   IP            NODE            NOMINATED NODE   READINESS GATES</span><br><span class="line">pvc-test-pod3   1/1     Running   0          7s    172.1.1.232   node2           &lt;none&gt;           &lt;none&gt;</span><br></pre></td></tr></table></figure><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></pre></td><td class="code"><pre><span class="line">$ kubectl <span class="built_in">exec</span> -it pvc-test-pod3 -- ls /mnt</span><br><span class="line">test.txt</span><br><span class="line">$ kubectl <span class="built_in">exec</span> -it pvc-test-pod3 -- cat /mnt/test.txt</span><br><span class="line">hello nfs pvc</span><br></pre></td></tr></table></figure><h3 id="5-测试跨节点"><a class="markdownIt-Anchor" href="#5-测试跨节点"></a> 5. 测试跨节点</h3><p>由于总是调度在node2上，不得已，使用deployment</p><figure class="highlight yaml"><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></pre></td><td class="code"><pre><span class="line"><span class="attr">apiVersion:</span> <span class="string">apps/v1</span></span><br><span class="line"><span class="attr">kind:</span> <span class="string">Deployment</span></span><br><span class="line"><span class="attr">metadata:</span></span><br><span class="line">  <span class="attr">name:</span> <span class="string">nfs-pvc-dp</span></span><br><span class="line">  <span class="attr">labels:</span></span><br><span class="line">    <span class="attr">app:</span> <span class="string">busybox</span></span><br><span class="line"><span class="attr">spec:</span></span><br><span class="line">  <span class="attr">replicas:</span> <span class="number">5</span></span><br><span class="line">  <span class="attr">selector:</span></span><br><span class="line">    <span class="attr">matchLabels:</span></span><br><span class="line">      <span class="attr">app:</span> <span class="string">busybox</span></span><br><span class="line">  <span class="attr">template:</span></span><br><span class="line">    <span class="attr">metadata:</span></span><br><span class="line">      <span class="attr">labels:</span></span><br><span class="line">        <span class="attr">app:</span> <span class="string">busybox</span></span><br><span class="line">    <span class="attr">spec:</span></span><br><span class="line">      <span class="attr">containers:</span></span><br><span class="line">      <span class="bullet">-</span> <span class="attr">name:</span> <span class="string">busybox</span></span><br><span class="line">        <span class="attr">image:</span> <span class="string">busybox</span></span><br><span class="line">        <span class="attr">imagePullPolicy:</span> <span class="string">IfNotPresent</span></span><br><span class="line">        <span class="attr">stdin:</span> <span class="literal">true</span></span><br><span class="line">        <span class="attr">tty:</span> <span class="literal">true</span></span><br><span class="line">        <span class="attr">volumeMounts:</span></span><br><span class="line">        <span class="bullet">-</span> <span class="attr">name:</span> <span class="string">pvc</span></span><br><span class="line">          <span class="attr">mountPath:</span> <span class="string">/mnt</span></span><br><span class="line">      <span class="attr">volumes:</span></span><br><span class="line">      <span class="bullet">-</span> <span class="attr">name:</span> <span class="string">pvc</span></span><br><span class="line">        <span class="attr">persistentVolumeClaim:</span></span><br><span class="line">          <span class="attr">claimName:</span> <span class="string">pvc-nfs-test</span></span><br></pre></td></tr></table></figure><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><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line">$ kubectl get pods -o wide</span><br><span class="line">NAME                          READY   STATUS    RESTARTS   AGE    IP            NODE            NOMINATED NODE   READINESS GATES</span><br><span class="line">nfs-pvc-dp-559d75db66-dg6th   1/1     Running   0          119s   172.1.1.233   node2           &lt;none&gt;           &lt;none&gt;</span><br><span class="line">nfs-pvc-dp-559d75db66-kwrnk   1/1     Running   0          119s   172.1.2.210   bqi-k8s-node3   &lt;none&gt;           &lt;none&gt;</span><br><span class="line">nfs-pvc-dp-559d75db66-qk4pr   1/1     Running   0          119s   172.1.2.209   bqi-k8s-node3   &lt;none&gt;           &lt;none&gt;</span><br><span class="line">nfs-pvc-dp-559d75db66-z224z   1/1     Running   0          119s   172.1.1.234   node2           &lt;none&gt;           &lt;none&gt;</span><br><span class="line">nfs-pvc-dp-559d75db66-z4xs5   1/1     Running   0          119s   172.1.2.211   bqi-k8s-node3   &lt;none&gt;           &lt;none&gt;</span><br></pre></td></tr></table></figure><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></pre></td><td class="code"><pre><span class="line">$ kubectl <span class="built_in">exec</span> -it nfs-pvc-dp-559d75db66-dg6th -- cat /mnt/test.txt</span><br><span class="line">hello nfs pvc</span><br><span class="line">$ kubectl <span class="built_in">exec</span> -it nfs-pvc-dp-559d75db66-kwrnk -- cat /mnt/test.txt</span><br><span class="line">hello nfs pvc</span><br></pre></td></tr></table></figure><h3 id="看看底层"><a class="markdownIt-Anchor" href="#看看底层"></a> 看看底层</h3><p>可以使用Linux的mount命令查看两个worker节点上的mount状况</p><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></pre></td><td class="code"><pre><span class="line"><span class="comment"># node2</span></span><br><span class="line">$ mount | grep 10.160.12.7</span><br><span class="line">10.160.12.7:/data/share/bqi on /var/lib/kubelet/pods/d2375620-7164-468e-a212-0f73042983d7/volumes/kubernetes.io~nfs/nfs-pv <span class="built_in">type</span> nfs4 (rw,relatime,vers=4.1,rsize=1048576,wsize=1048576,namlen=255,hard,proto=tcp,timeo=600,retrans=2,sec=sys,clientaddr=10.160.18.181,local_lock=none,addr=10.160.12.7)</span><br><span class="line">10.160.12.7:/data/share/bqi on /var/lib/kubelet/pods/015ee988-c22e-4a8e-aa9d-7a85d0dd6045/volumes/kubernetes.io~nfs/nfs-pv <span class="built_in">type</span> nfs4 (rw,relatime,vers=4.1,rsize=1048576,wsize=1048576,namlen=255,hard,proto=tcp,timeo=600,retrans=2,sec=sys,clientaddr=10.160.18.181,local_lock=none,addr=10.160.12.7)</span><br></pre></td></tr></table></figure><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></pre></td><td class="code"><pre><span class="line">$ mount | grep 10.160.12.7</span><br><span class="line">10.160.12.7:/data/share/bqi on /var/lib/kubelet/pods/2ff007b3-6568-4b90-9c76-2c994c18f71c/volumes/kubernetes.io~nfs/nfs-pv <span class="built_in">type</span> nfs4 (rw,relatime,vers=4.1,rsize=1048576,wsize=1048576,namlen=255,hard,proto=tcp,timeo=600,retrans=2,sec=sys,clientaddr=10.160.18.183,local_lock=none,addr=10.160.12.7)</span><br><span class="line">10.160.12.7:/data/share/bqi on /var/lib/kubelet/pods/aa545d93-0178-4adc-87b5-df27ac070a2e/volumes/kubernetes.io~nfs/nfs-pv <span class="built_in">type</span> nfs4 (rw,relatime,vers=4.1,rsize=1048576,wsize=1048576,namlen=255,hard,proto=tcp,timeo=600,retrans=2,sec=sys,clientaddr=10.160.18.183,local_lock=none,addr=10.160.12.7)</span><br><span class="line">10.160.12.7:/data/share/bqi on /var/lib/kubelet/pods/2098028e-8be5-44fd-b5d8-b358baf40791/volumes/kubernetes.io~nfs/nfs-pv <span class="built_in">type</span> nfs4 (rw,relatime,vers=4.1,rsize=1048576,wsize=1048576,namlen=255,hard,proto=tcp,timeo=600,retrans=2,sec=sys,clientaddr=10.160.18.183,local_lock=none,addr=10.160.12.7)</span><br></pre></td></tr></table></figure><p>可以看出：<code>10.160.12.7:/data/share/bqi</code>被分别挂载到了对应的pod的目录下</p><h2 id="自动创建pv及pvc"><a class="markdownIt-Anchor" href="#自动创建pv及pvc"></a> 自动创建PV及PVC</h2><p>当我以为这样就完了的时候，用着用着，我发现，一个PV只能被一个PVC绑定。所以，实际上之前的操作，都局限在将一个nfs的目录变成了一个PV，然后绑定到了PVC，最后挂载到了某个pod上。</p><p>而后续实验中发现，存储状态的实验需要不同的pod用不同的PVC。那我不可能总是手工去创建一个PV。于是，需要用到<code>nfs-client-provisioner</code></p><h3 id="nfs-client-provisioner"><a class="markdownIt-Anchor" href="#nfs-client-provisioner"></a> nfs-client-provisioner</h3><p><code>nfs-client-provisioner</code>可以利用NFS Server给Kubernetes作为持久存储的后端，并且动态提供PV。可以参考https://github.com/kubernetes-incubator/external-storage/tree/master/nfs-client</p><p>安装方式也有多种，这里采用<strong>helm</strong>方式安装，非常简单</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">$ helm install --<span class="built_in">set</span> nfs.server=10.160.12.7 --<span class="built_in">set</span> nfs.path=/data/share/bqi stable/nfs-client-provisioner</span><br></pre></td></tr></table></figure><p>参数说明：</p><ol><li>nfs.server - nfs服务器的地址</li><li>nfs.path - nfs共享出来的目录</li></ol><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></pre></td><td class="code"><pre><span class="line">$ helm list</span><br><span class="line">NAME              REVISION    UPDATED                     STATUS      CHART                           APP VERSION    NAMESPACE</span><br><span class="line">crusty-penguin    1           Wed Jul 22 19:07:19 2020    DEPLOYED    nfs-client-provisioner-1.2.8    3.1.0          default</span><br></pre></td></tr></table></figure><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><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></pre></td><td class="code"><pre><span class="line">$ helm status crusty-penguin</span><br><span class="line">LAST DEPLOYED: Wed Jul 22 19:07:19 2020</span><br><span class="line">NAMESPACE: default</span><br><span class="line">STATUS: DEPLOYED</span><br><span class="line"></span><br><span class="line">RESOURCES:</span><br><span class="line">==&gt; v1/ClusterRole</span><br><span class="line">NAME                                          CREATED AT</span><br><span class="line">crusty-penguin-nfs-client-provisioner-runner  2020-07-22T11:07:19Z</span><br><span class="line"></span><br><span class="line">==&gt; v1/ClusterRoleBinding</span><br><span class="line">NAME                                       ROLE                                                      AGE</span><br><span class="line">run-crusty-penguin-nfs-client-provisioner  ClusterRole/crusty-penguin-nfs-client-provisioner-runner  15h</span><br><span class="line"></span><br><span class="line">==&gt; v1/Deployment</span><br><span class="line">NAME                                   READY  UP-TO-DATE  AVAILABLE  AGE</span><br><span class="line">crusty-penguin-nfs-client-provisioner  1/1    1           1          15h</span><br><span class="line"></span><br><span class="line">==&gt; v1/Pod(related)</span><br><span class="line">NAME                                                    READY  STATUS   RESTARTS  AGE</span><br><span class="line">crusty-penguin-nfs-client-provisioner-579d48f95f-vncxw  1/1    Running  1         15h</span><br><span class="line"></span><br><span class="line">==&gt; v1/Role</span><br><span class="line">NAME                                                  CREATED AT</span><br><span class="line">leader-locking-crusty-penguin-nfs-client-provisioner  2020-07-22T11:07:19Z</span><br><span class="line"></span><br><span class="line">==&gt; v1/RoleBinding</span><br><span class="line">NAME                                                  ROLE                                                       AGE</span><br><span class="line">leader-locking-crusty-penguin-nfs-client-provisioner  Role/leader-locking-crusty-penguin-nfs-client-provisioner  15h</span><br><span class="line"></span><br><span class="line">==&gt; v1/ServiceAccount</span><br><span class="line">NAME                                   SECRETS  AGE</span><br><span class="line">crusty-penguin-nfs-client-provisioner  1        15h</span><br><span class="line"></span><br><span class="line">==&gt; v1/StorageClass</span><br><span class="line">NAME        PROVISIONER                                          RECLAIMPOLICY  VOLUMEBINDINGMODE  ALLOWVOLUMEEXPANSION  AGE</span><br><span class="line">nfs-client  cluster.local/crusty-penguin-nfs-client-provisioner  Delete         Immediate          <span class="literal">true</span>                  15h</span><br></pre></td></tr></table></figure><p>可以看到，主要部署了：</p><ol><li>Role, roleBinding, serviceAccount</li><li>Deployment</li><li>StorageClass</li></ol><p>其中，比较重要的是<code>StorageClass</code>，当前为<code>nfs-client</code>。当创建PVC时，指定了<code>storageClassName</code>为<code>nfs-client</code>后，将会自动创建PV及PVC</p><h3 id="测试"><a class="markdownIt-Anchor" href="#测试"></a> 测试</h3><ol><li>创建pvc</li></ol><figure class="highlight yaml"><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="attr">apiVersion:</span> <span class="string">v1</span></span><br><span class="line"><span class="attr">kind:</span> <span class="string">PersistentVolumeClaim</span></span><br><span class="line"><span class="attr">metadata:</span></span><br><span class="line">  <span class="attr">name:</span> <span class="string">pvc-nfs-test</span></span><br><span class="line"><span class="attr">spec:</span></span><br><span class="line">  <span class="attr">accessModes:</span></span><br><span class="line">  <span class="bullet">-</span> <span class="string">ReadWriteOnce</span></span><br><span class="line">  <span class="attr">storageClassName:</span> <span class="string">nfs-client</span></span><br><span class="line">  <span class="attr">resources:</span></span><br><span class="line">    <span class="attr">requests:</span></span><br><span class="line">      <span class="attr">storage:</span> <span class="string">1Gi</span></span><br></pre></td></tr></table></figure><ol start="2"><li>查看pv及pvc</li></ol><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></pre></td><td class="code"><pre><span class="line">$ kubectl get pvc</span><br><span class="line">NAME           STATUS   VOLUME                                     CAPACITY   ACCESS MODES   STORAGECLASS   AGE</span><br><span class="line">pvc-nfs-test   Bound    pvc-cd18aa33-8734-461c-81a5-f5cf2aa0ad8f   1Gi        RWO            nfs-client     3s</span><br></pre></td></tr></table></figure><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></pre></td><td class="code"><pre><span class="line">$ kubectl get pv</span><br><span class="line">NAME                                       CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS   CLAIM                  STORAGECLASS   REASON   AGE</span><br><span class="line">pvc-cd18aa33-8734-461c-81a5-f5cf2aa0ad8f   1Gi        RWO            Delete           Bound    default/pvc-nfs-test   nfs-client              10s</span><br></pre></td></tr></table></figure><ol start="3"><li>查看nfs服务器上的目录</li></ol><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></pre></td><td class="code"><pre><span class="line">$ ls -l</span><br><span class="line">total 0</span><br><span class="line">drwxrwxrwx 2 root root 10 Jul 23 11:01 default-pvc-nfs-test-pvc-cd18aa33-8734-461c-81a5-f5cf2aa0ad8f</span><br></pre></td></tr></table></figure><p>可以看到，对应的nfs服务器上的目录中创建了一个目录</p><h2 id="小结"><a class="markdownIt-Anchor" href="#小结"></a> 小结</h2><p>本次实验主要是想通过NFS创建PV及PVC，以提供跨节点数据持久化</p><blockquote><p>注：没有演示搭建nfs服务器的方法，网上教程很多</p></blockquote><ol><li>在创建PV时，指定了nfs方式</li><li>基于nfs的PV创建PVC，分布于多个节点上的pod可以共享数据</li><li>使用nfs-client-provisioner自动创建PV及PVC</li></ol>]]></content>
    
    <summary type="html">
    
      &lt;p&gt;《深入剖析Kubernetes》中使用了Rook来搭建存储，而K8s本身也支持直接使用NFS。本次实验主要为后续学习做铺垫，使用现有NFS存储做为跨节点数据持久化，并简单的学习其实现原理。&lt;/p&gt;
    
    </summary>
    
    
      <category term="k8s" scheme="http://www.isimble.com/categories/k8s/"/>
    
    
      <category term="Kubernetes" scheme="http://www.isimble.com/tags/Kubernetes/"/>
    
  </entry>
  
  <entry>
    <title>K8s学习笔记——控制器模型</title>
    <link href="http://www.isimble.com/2020/07/20/kubernetesLearning16/"/>
    <id>http://www.isimble.com/2020/07/20/kubernetesLearning16/</id>
    <published>2020-07-20T08:36:02.000Z</published>
    <updated>2020-07-20T08:38:07.568Z</updated>
    
    <content type="html"><![CDATA[<blockquote><p>学习极客时间上的<a href="https://time.geekbang.org/column/intro/116" target="_blank" rel="noopener">《深入剖析Kubernetes》</a></p><p>秉持眼过千遍不如手过一遍的原则。动手实践并记录结果</p><p>对应章节：<a href="https://time.geekbang.org/column/article/40583" target="_blank" rel="noopener">16 | 编排其实很简单：谈谈“控制器”模型</a></p></blockquote><a id="more"></a><h2 id="deployment"><a class="markdownIt-Anchor" href="#deployment"></a> Deployment</h2><figure class="highlight yaml"><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></pre></td><td class="code"><pre><span class="line"><span class="attr">apiVersion:</span> <span class="string">apps/v1</span></span><br><span class="line"><span class="attr">kind:</span> <span class="string">Deployment</span></span><br><span class="line"><span class="attr">metadata:</span></span><br><span class="line">  <span class="attr">name:</span> <span class="string">nginx-dp</span></span><br><span class="line"><span class="attr">spec:</span></span><br><span class="line">  <span class="attr">selector:</span></span><br><span class="line">    <span class="attr">matchLabels:</span></span><br><span class="line">      <span class="attr">app:</span> <span class="string">nginx</span></span><br><span class="line">  <span class="attr">replicas:</span> <span class="number">2</span></span><br><span class="line">  <span class="attr">template:</span></span><br><span class="line">    <span class="attr">metadata:</span></span><br><span class="line">      <span class="attr">labels:</span></span><br><span class="line">        <span class="attr">app:</span> <span class="string">nginx</span></span><br><span class="line">    <span class="attr">spec:</span></span><br><span class="line">      <span class="attr">containers:</span></span><br><span class="line">      <span class="bullet">-</span> <span class="attr">name:</span> <span class="string">nginx</span></span><br><span class="line">        <span class="attr">image:</span> <span class="string">nginx</span></span><br><span class="line">        <span class="attr">imagePullPolicy:</span> <span class="string">Never</span></span><br><span class="line">        <span class="attr">ports:</span></span><br><span class="line">        <span class="bullet">-</span> <span class="attr">containerPort:</span> <span class="number">80</span></span><br></pre></td></tr></table></figure><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><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></pre></td><td class="code"><pre><span class="line">$ kubectl get deploy</span><br><span class="line">NAME       READY   UP-TO-DATE   AVAILABLE   AGE</span><br><span class="line">nginx-dp   2/2     2            2           75s</span><br><span class="line">$ kubectl describe deploy nginx-dp</span><br><span class="line">Name:                   nginx-dp</span><br><span class="line">Namespace:              default</span><br><span class="line">CreationTimestamp:      Mon, 06 Jul 2020 15:56:10 +0800</span><br><span class="line">Labels:                 &lt;none&gt;</span><br><span class="line">Annotations:            deployment.kubernetes.io/revision: 1</span><br><span class="line">Selector:               app=nginx</span><br><span class="line">Replicas:               2 desired | 2 updated | 2 total | 2 available | 0 unavailable</span><br><span class="line">...</span><br><span class="line">$ kubectl get pods</span><br><span class="line">NAME                        READY   STATUS    RESTARTS   AGE</span><br><span class="line">nginx-dp-67f857c57f-kgmsq   1/1     Running   0          100s</span><br><span class="line">nginx-dp-67f857c57f-qx7l7   1/1     Running   0          100s</span><br></pre></td></tr></table></figure><blockquote><p>这个 Deployment 定义的编排动作：确保携带了 app=nginx 标签的 Pod 的个数，永远等于 spec.replicas 指定的个数，即 2 个。</p></blockquote><p>现在，可以手动删除一个pod看看</p><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><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line">$ kubectl delete pod nginx-dp-67f857c57f-kgmsq</span><br><span class="line">pod <span class="string">"nginx-dp-67f857c57f-kgmsq"</span> deleted</span><br><span class="line">$ kubectl get pods</span><br><span class="line">NAME                        READY   STATUS    RESTARTS   AGE</span><br><span class="line">nginx-dp-67f857c57f-nmrhh   1/1     Running   0          7s</span><br><span class="line">nginx-dp-67f857c57f-qx7l7   1/1     Running   0          3m8s</span><br></pre></td></tr></table></figure><p>可以看到，删除了<code>nginx-dp-67f857c57f-kgmsq</code>的pod，控制器自动拉起一个新的<code>nginx-dp-67f857c57f-nmrhh</code>的pod</p><h3 id="扩展一下"><a class="markdownIt-Anchor" href="#扩展一下"></a> 扩展一下</h3><p>如果我手工拉起一个匹配了label的pod会怎样呢</p><figure class="highlight yaml"><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="attr">apiVersion:</span> <span class="string">v1</span></span><br><span class="line"><span class="attr">kind:</span> <span class="string">Pod</span></span><br><span class="line"><span class="attr">metadata:</span></span><br><span class="line">  <span class="attr">name:</span> <span class="string">new-nginx-pod</span></span><br><span class="line">  <span class="attr">labels:</span></span><br><span class="line">    <span class="attr">app:</span> <span class="string">nginx</span></span><br><span class="line"><span class="attr">spec:</span></span><br><span class="line">  <span class="attr">containers:</span></span><br><span class="line">  <span class="bullet">-</span> <span class="attr">name:</span> <span class="string">new-nginx-contrainer</span></span><br><span class="line">    <span class="attr">image:</span> <span class="string">nginx</span></span><br><span class="line">    <span class="attr">imagePullPolicy:</span> <span class="string">Never</span></span><br><span class="line">    <span class="attr">ports:</span></span><br><span class="line">      <span class="bullet">-</span> <span class="attr">containerPort:</span> <span class="number">80</span></span><br></pre></td></tr></table></figure><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">$ kubectl get pods</span><br><span class="line">NAME                        READY   STATUS    RESTARTS   AGE</span><br><span class="line">new-nginx-pod               1/1     Running   0          7m20s</span><br><span class="line">nginx-dp-67f857c57f-nmrhh   1/1     Running   0          14m</span><br><span class="line">nginx-dp-67f857c57f-qx7l7   1/1     Running   0          17m</span><br></pre></td></tr></table></figure><p>发现并没有因此而减少一个pod。那么手工删除一个</p><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><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line">$ kubectl delete pod nginx-dp-67f857c57f-nmrhh</span><br><span class="line">pod <span class="string">"nginx-dp-67f857c57f-nmrhh"</span> deleted</span><br><span class="line">$ kubectl get pods</span><br><span class="line">NAME                        READY   STATUS    RESTARTS   AGE</span><br><span class="line">new-nginx-pod               1/1     Running   0          7m50s</span><br><span class="line">nginx-dp-67f857c57f-4wptz   1/1     Running   0          5s</span><br><span class="line">nginx-dp-67f857c57f-qx7l7   1/1     Running   0          17m</span><br></pre></td></tr></table></figure><p>依然还是创建了一个新的，为什么呢？</p><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><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">$ kubectl describe pod nginx-dp-67f857c57f-qx7l7</span><br><span class="line">Name:         nginx-dp-67f857c57f-qx7l7</span><br><span class="line">Namespace:    default</span><br><span class="line">Priority:     0</span><br><span class="line">Node:         node2/10.160.18.181</span><br><span class="line">Start Time:   Mon, 06 Jul 2020 15:56:10 +0800</span><br><span class="line">Labels:       app=nginx</span><br><span class="line">              pod-template-hash=67f857c57f</span><br></pre></td></tr></table></figure><blockquote><p>可以看到，Labels中，k8s自动创建了一个<code>pod-template-hash=67f857c57f</code>，来区别于手工创建出来的pod</p></blockquote><p>那如果在自定义的pod中也指定了呢？不妨试试</p><figure class="highlight yaml"><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"><span class="attr">apiVersion:</span> <span class="string">v1</span></span><br><span class="line"><span class="attr">kind:</span> <span class="string">Pod</span></span><br><span class="line"><span class="attr">metadata:</span></span><br><span class="line">  <span class="attr">name:</span> <span class="string">new-nginx-pod</span></span><br><span class="line">  <span class="attr">labels:</span></span><br><span class="line">    <span class="attr">app:</span> <span class="string">nginx</span></span><br><span class="line">    <span class="attr">pod-template-hash:</span> <span class="string">67f857c57f</span></span><br><span class="line"><span class="attr">spec:</span></span><br><span class="line">  <span class="attr">containers:</span></span><br><span class="line">  <span class="bullet">-</span> <span class="attr">name:</span> <span class="string">new-nginx-contrainer</span></span><br><span class="line">    <span class="attr">image:</span> <span class="string">nginx</span></span><br><span class="line">    <span class="attr">imagePullPolicy:</span> <span class="string">Never</span></span><br><span class="line">    <span class="attr">ports:</span></span><br><span class="line">      <span class="bullet">-</span> <span class="attr">containerPort:</span> <span class="number">80</span></span><br></pre></td></tr></table></figure><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><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">$ kubectl apply -f new-pod.yaml</span><br><span class="line">pod/new-nginx-pod created</span><br><span class="line"><span class="comment"># 以极快的速度查看pod</span></span><br><span class="line">$ kubectl get pods</span><br><span class="line">NAME                        READY   STATUS        RESTARTS   AGE</span><br><span class="line">new-nginx-pod               0/1     Terminating   0          1s</span><br><span class="line">nginx-dp-67f857c57f-4wptz   1/1     Running       0          6m25s</span><br><span class="line">nginx-dp-67f857c57f-qx7l7   1/1     Running       0          24m</span><br><span class="line"><span class="comment"># 稍等一下再试</span></span><br><span class="line">$ kubectl get pods</span><br><span class="line">NAME                        READY   STATUS    RESTARTS   AGE</span><br><span class="line">nginx-dp-67f857c57f-4wptz   1/1     Running   0          7m34s</span><br><span class="line">nginx-dp-67f857c57f-qx7l7   1/1     Running   0          25m</span><br></pre></td></tr></table></figure><p>可以看到，这个new-nginx-pod一创建出来，就进入了Terminating的状态，再次查看时，已经不存在了。</p><h2 id="小结"><a class="markdownIt-Anchor" href="#小结"></a> 小结</h2><p>本章节主要学习了Deployment的基础用法。可以看到，Deployment这种控制器，对携带指定标签的Pod，会维持一个指定的份数。</p><p>而且也注意到，为了有别于非deployment创建出来的pod，会为pod添加一个<code>pod-template-hash</code>的标签。</p>]]></content>
    
    <summary type="html">
    
      &lt;blockquote&gt;
&lt;p&gt;学习极客时间上的&lt;a href=&quot;https://time.geekbang.org/column/intro/116&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;《深入剖析Kubernetes》&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;秉持眼过千遍不如手过一遍的原则。动手实践并记录结果&lt;/p&gt;
&lt;p&gt;对应章节：&lt;a href=&quot;https://time.geekbang.org/column/article/40583&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;16 | 编排其实很简单：谈谈“控制器”模型&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
    
    </summary>
    
    
      <category term="k8s" scheme="http://www.isimble.com/categories/k8s/"/>
    
    
      <category term="docker" scheme="http://www.isimble.com/tags/docker/"/>
    
      <category term="Kubernetes" scheme="http://www.isimble.com/tags/Kubernetes/"/>
    
  </entry>
  
  <entry>
    <title>K8s网络相关问题及解决</title>
    <link href="http://www.isimble.com/2020/07/20/kubernetes-network-problem-resolve/"/>
    <id>http://www.isimble.com/2020/07/20/kubernetes-network-problem-resolve/</id>
    <published>2020-07-20T07:55:15.000Z</published>
    <updated>2020-07-20T08:08:39.431Z</updated>
    
    <content type="html"><![CDATA[<p>随着学习日渐深入，遇到了不少问题。有问题，度娘+谷哥。学习阶段，我只是各种文章的搬运工。先解决用的问题</p><p>本文主要解决以下几个问题：</p><ol><li>pod无法访问ClusterIP</li><li>busybox做dns查询</li><li>pod间互访及访问外网</li></ol><a id="more"></a><h2 id="问题1-pod无法访问clusterip"><a class="markdownIt-Anchor" href="#问题1-pod无法访问clusterip"></a> 问题1: pod无法访问ClusterIP</h2><blockquote><p>这个问题困扰了我好些天，最后，配置了IPVS就OK了</p></blockquote><h3 id="step0-kube-proxy日志"><a class="markdownIt-Anchor" href="#step0-kube-proxy日志"></a> step0 - kube-proxy日志</h3><p>从kube-proxy的日志中看到<code>Unknown proxy mode &quot;&quot;, assuming iptables proxy</code></p><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><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">$ kubectl logs -n kube-system kube-proxy-5n29r | more</span><br><span class="line">W0720 03:22:47.942827       1 server_others.go:559] Unknown proxy mode <span class="string">""</span>, assuming iptables proxy</span><br><span class="line">I0720 03:22:48.245820       1 node.go:136] Successfully retrieved node IP: 10.160.18.183</span><br><span class="line">I0720 03:22:48.245876       1 server_others.go:186] Using iptables Proxier.</span><br><span class="line">I0720 03:22:48.246253       1 server.go:583] Version: v1.18.3</span><br><span class="line">I0720 03:22:48.395170       1 conntrack.go:100] Set sysctl <span class="string">'net/netfilter/nf_conntrack_max'</span> to 131072</span><br><span class="line">I0720 03:22:48.395210       1 conntrack.go:52] Setting nf_conntrack_max to 131072</span><br><span class="line">I0720 03:22:48.395578       1 conntrack.go:83] Setting conntrack hashsize to 32768</span><br><span class="line">I0720 03:22:48.414004       1 conntrack.go:100] Set sysctl <span class="string">'net/netfilter/nf_conntrack_tcp_timeout_established'</span> to 86400</span><br><span class="line">I0720 03:22:48.414067       1 conntrack.go:100] Set sysctl <span class="string">'net/netfilter/nf_conntrack_tcp_timeout_close_wait'</span> to 3600</span><br><span class="line">I0720 03:22:48.533638       1 config.go:315] Starting service config controller</span><br><span class="line">I0720 03:22:48.533673       1 shared_informer.go:223] Waiting <span class="keyword">for</span> caches to sync <span class="keyword">for</span> service config</span><br><span class="line">I0720 03:22:48.533997       1 config.go:133] Starting endpoints config controller</span><br><span class="line">I0720 03:22:48.534016       1 shared_informer.go:223] Waiting <span class="keyword">for</span> caches to sync <span class="keyword">for</span> endpoints config</span><br></pre></td></tr></table></figure><h3 id="step1-安装相关包"><a class="markdownIt-Anchor" href="#step1-安装相关包"></a> step1 - 安装相关包</h3><figure class="highlight bash"><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="comment"># 在所有节点上</span></span><br><span class="line">$ apt install ipset ipvsadm</span><br></pre></td></tr></table></figure><h3 id="step2-加载module"><a class="markdownIt-Anchor" href="#step2-加载module"></a> step2 - 加载module</h3><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><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></pre></td><td class="code"><pre><span class="line">$ modprobe -- ip_vs</span><br><span class="line">$ modprobe -- ip_vs_rr</span><br><span class="line">$ modprobe -- ip_vs_wrr</span><br><span class="line">$ modprobe -- ip_vs_sh</span><br><span class="line">$ modprobe -- nf_conntrack</span><br><span class="line"><span class="comment"># 注：很多帖子上都写的是nf_conntrack_ipv4，但在Ubuntu20.04上，这个已经变成了nf_conntrack</span></span><br><span class="line"><span class="comment"># 检查配置</span></span><br><span class="line">$ lsmod | grep -e ipvs -e nf_conntrack</span><br><span class="line">nf_conntrack_netlink    45056  0</span><br><span class="line">nfnetlink              16384  3 nf_conntrack_netlink,ip_set</span><br><span class="line">nf_conntrack          139264  5 xt_conntrack,nf_nat,nf_conntrack_netlink,xt_MASQUERADE,ip_vs</span><br><span class="line">nf_defrag_ipv6         24576  2 nf_conntrack,ip_vs</span><br><span class="line">nf_defrag_ipv4         16384  1 nf_conntrack</span><br><span class="line">libcrc32c              16384  3 nf_conntrack,nf_nat,ip_vs</span><br><span class="line"><span class="comment"># 再注：Ubuntu 20.04上这些module可能默认已经加载了</span></span><br></pre></td></tr></table></figure><blockquote><p>注：如果ipvs默认没有加载的话，需要写一个脚本，系统重启时也需要加载</p></blockquote><h3 id="step3-修改kube-proxy配置文件"><a class="markdownIt-Anchor" href="#step3-修改kube-proxy配置文件"></a> step3 - 修改kube-proxy配置文件</h3><p>修改kube-proxy的configmap中的mode字段为<code>ipvs</code></p><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><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line">$ kubectl edit configmap kube-proxy -n kube-system</span><br><span class="line">...</span><br><span class="line">     kind: KubeProxyConfiguration</span><br><span class="line">     metricsBindAddress: <span class="string">""</span></span><br><span class="line">     mode: <span class="string">"ipvs"</span></span><br><span class="line">     nodePortAddresses: null</span><br><span class="line">     ...</span><br></pre></td></tr></table></figure><h3 id="step4-重启kube-proxy"><a class="markdownIt-Anchor" href="#step4-重启kube-proxy"></a> step4 - 重启kube-proxy</h3><p>可以逐个删除kube-proxy的pod，由k8s自动重启，也可以批量删除</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">$ kubectl get pod -n kube-system | grep kube-proxy |awk <span class="string">'&#123;system("kubectl delete pod "$1" -n kube-system")&#125;'</span></span><br></pre></td></tr></table></figure><p>查看kube-proxy的日志</p><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><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></pre></td><td class="code"><pre><span class="line">$ kubectl logs -n kube-system kube-proxy-44zw5</span><br><span class="line">I0720 05:37:30.026304       1 node.go:136] Successfully retrieved node IP: 10.160.18.181</span><br><span class="line">I0720 05:37:30.026349       1 server_others.go:259] Using ipvs Proxier.</span><br><span class="line">W0720 05:37:30.026600       1 proxier.go:429] IPVS scheduler not specified, use rr by default</span><br><span class="line">I0720 05:37:30.026814       1 server.go:583] Version: v1.18.3</span><br><span class="line">I0720 05:37:30.027200       1 conntrack.go:52] Setting nf_conntrack_max to 131072</span><br><span class="line">I0720 05:37:30.027452       1 config.go:133] Starting endpoints config controller</span><br><span class="line">I0720 05:37:30.027474       1 shared_informer.go:223] Waiting <span class="keyword">for</span> caches to sync <span class="keyword">for</span> endpoints config</span><br><span class="line">I0720 05:37:30.027507       1 config.go:315] Starting service config controller</span><br><span class="line">I0720 05:37:30.027529       1 shared_informer.go:223] Waiting <span class="keyword">for</span> caches to sync <span class="keyword">for</span> service config</span><br><span class="line">I0720 05:37:30.127736       1 shared_informer.go:230] Caches are synced <span class="keyword">for</span> endpoints config</span><br><span class="line">I0720 05:37:30.127790       1 shared_informer.go:230] Caches are synced <span class="keyword">for</span> service config</span><br></pre></td></tr></table></figure><p>可以看到<code>Using ipvs Proxier.</code>，说明IPVS已经启用了</p><p><strong>现在，可以启动一个busybox的container来ping一下coredns的clusterIP了</strong></p><h2 id="问题2-busybox做dns查询失败"><a class="markdownIt-Anchor" href="#问题2-busybox做dns查询失败"></a> 问题2: busybox做dns查询失败</h2><h3 id="step0-问题现象"><a class="markdownIt-Anchor" href="#step0-问题现象"></a> step0 - 问题现象</h3><p>在解决了pod无法访问dns clusterIP的问题之后，发现busybox还是无法解析到某个service的IP</p><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></pre></td><td class="code"><pre><span class="line">kubectl run -i --tty --image busybox dns-test --restart=Never --rm /bin/sh</span><br><span class="line">If you don<span class="string">'t see a command prompt, try pressing enter.</span></span><br><span class="line"><span class="string">/ # nslookup web-0.nginx</span></span><br><span class="line"><span class="string">;; connection timed out; no servers could be reached</span></span><br></pre></td></tr></table></figure><p>上网查完后发现：busybox的版本高于1.28.4都存在这个问题</p><h3 id="step1-解决方法"><a class="markdownIt-Anchor" href="#step1-解决方法"></a> step1 - 解决方法</h3><p>使用1.28.4的busybox镜像执行dns查询</p><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><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></pre></td><td class="code"><pre><span class="line">$ kubectl run -i --tty --image busybox:1.28.4 dns-test --restart=Never --rm /bin/sh</span><br><span class="line">If you don<span class="string">'t see a command prompt, try pressing enter.</span></span><br><span class="line"><span class="string">/ # nslookup web-0.nginx</span></span><br><span class="line"><span class="string">Server:    10.96.0.10</span></span><br><span class="line"><span class="string">Address 1: 10.96.0.10 kube-dns.kube-system.svc.cluster.local</span></span><br><span class="line"><span class="string"></span></span><br><span class="line"><span class="string">Name:      web-0.nginx</span></span><br><span class="line"><span class="string">Address 1: 172.1.2.175 web-0.nginx.default.svc.cluster.local</span></span><br><span class="line"><span class="string">/ # ping web-0.nginx</span></span><br><span class="line"><span class="string">PING web-0.nginx (172.1.2.175): 56 data bytes</span></span><br><span class="line"><span class="string">64 bytes from 172.1.2.175: seq=0 ttl=62 time=1.050 ms</span></span><br><span class="line"><span class="string">64 bytes from 172.1.2.175: seq=1 ttl=62 time=0.432 ms</span></span><br></pre></td></tr></table></figure><h2 id="问题3-pod互访及访问外网不通"><a class="markdownIt-Anchor" href="#问题3-pod互访及访问外网不通"></a> 问题3: pod互访及访问外网不通</h2><p><strong>问题原因</strong>：iptables</p><p><strong>解决方法</strong>：</p><p>分别在每个节点上执行</p><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><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line">$ iptables -P INPUT ACCEPT</span><br><span class="line">$ iptables -P FORWARD ACCEPT</span><br><span class="line">$ iptables -F</span><br><span class="line">$ iptables -L -n</span><br><span class="line">$ iptables -t nat -I POSTROUTING -s 172.1.2.0/24 -j MASQUERADE</span><br><span class="line"><span class="comment"># 注：172.1.2.0/24是每个节点的pod-network-cidr</span></span><br></pre></td></tr></table></figure><p><strong>测试</strong></p><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><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></pre></td><td class="code"><pre><span class="line">$ kubectl run -i --tty --image busybox:1.28.4 connect-test --restart=Never --rm -- /bin/sh</span><br><span class="line">If you don<span class="string">'t see a command prompt, try pressing enter.</span></span><br><span class="line"><span class="string">/ # ping 10.96.0.10 -c 1</span></span><br><span class="line"><span class="string">PING 10.96.0.10 (10.96.0.10): 56 data bytes</span></span><br><span class="line"><span class="string">64 bytes from 10.96.0.10: seq=0 ttl=64 time=0.082 ms</span></span><br><span class="line"><span class="string"></span></span><br><span class="line"><span class="string">--- 10.96.0.10 ping statistics ---</span></span><br><span class="line"><span class="string">1 packets transmitted, 1 packets received, 0% packet loss</span></span><br><span class="line"><span class="string">round-trip min/avg/max = 0.082/0.082/0.082 ms</span></span><br><span class="line"><span class="string">/ # ping 10.96.0.1 -c 1</span></span><br><span class="line"><span class="string">PING 10.96.0.1 (10.96.0.1): 56 data bytes</span></span><br><span class="line"><span class="string">64 bytes from 10.96.0.1: seq=0 ttl=64 time=0.072 ms</span></span><br><span class="line"><span class="string"></span></span><br><span class="line"><span class="string">--- 10.96.0.1 ping statistics ---</span></span><br><span class="line"><span class="string">1 packets transmitted, 1 packets received, 0% packet loss</span></span><br><span class="line"><span class="string">round-trip min/avg/max = 0.072/0.072/0.072 ms</span></span><br><span class="line"><span class="string">/ # ping 172.1.1.193 -c 1</span></span><br><span class="line"><span class="string">PING 172.1.1.193 (172.1.1.193): 56 data bytes</span></span><br><span class="line"><span class="string">64 bytes from 172.1.1.193: seq=0 ttl=64 time=0.108 ms</span></span><br><span class="line"><span class="string"></span></span><br><span class="line"><span class="string">--- 172.1.1.193 ping statistics ---</span></span><br><span class="line"><span class="string">1 packets transmitted, 1 packets received, 0% packet loss</span></span><br><span class="line"><span class="string">round-trip min/avg/max = 0.108/0.108/0.108 ms</span></span><br><span class="line"><span class="string">/ # ping 223.5.5.5 -c 1</span></span><br><span class="line"><span class="string">PING 223.5.5.5 (223.5.5.5): 56 data bytes</span></span><br><span class="line"><span class="string">64 bytes from 223.5.5.5: seq=0 ttl=114 time=5.659 ms</span></span><br><span class="line"><span class="string"></span></span><br><span class="line"><span class="string">--- 223.5.5.5 ping statistics ---</span></span><br><span class="line"><span class="string">1 packets transmitted, 1 packets received, 0% packet loss</span></span><br><span class="line"><span class="string">round-trip min/avg/max = 5.659/5.659/5.659 ms</span></span><br><span class="line"><span class="string">/ #</span></span><br><span class="line"><span class="string"># 注: 10.96.0.1为kube-apiserver的ClusterIP</span></span><br><span class="line"><span class="string">#     10.96.0.10为coredns的ClusterIP</span></span><br><span class="line"><span class="string">#     172.1.1.193为一个pod的IP</span></span><br></pre></td></tr></table></figure><p><strong>使iptables规则重启生效</strong></p><p>分别在每个节点上执行：</p><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></pre></td><td class="code"><pre><span class="line">$ iptables-save &gt; /etc/iptables.up.rules</span><br><span class="line">$ <span class="built_in">echo</span> -e <span class="string">'#!/bin/bash\n/sbin/iptables-restore &lt; /etc/iptables.up.rules'</span> &gt; /etc/network/<span class="keyword">if</span>-pre-up.d/iptables</span><br><span class="line">$ chmod +x /etc/network/<span class="keyword">if</span>-pre-up.d/iptables</span><br></pre></td></tr></table></figure>]]></content>
    
    <summary type="html">
    
      &lt;p&gt;随着学习日渐深入，遇到了不少问题。有问题，度娘+谷哥。学习阶段，我只是各种文章的搬运工。先解决用的问题&lt;/p&gt;
&lt;p&gt;本文主要解决以下几个问题：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;pod无法访问ClusterIP&lt;/li&gt;
&lt;li&gt;busybox做dns查询&lt;/li&gt;
&lt;li&gt;pod间互访及访问外网&lt;/li&gt;
&lt;/ol&gt;
    
    </summary>
    
    
      <category term="k8s" scheme="http://www.isimble.com/categories/k8s/"/>
    
    
      <category term="docker" scheme="http://www.isimble.com/tags/docker/"/>
    
      <category term="Kubernetes" scheme="http://www.isimble.com/tags/Kubernetes/"/>
    
  </entry>
  
  <entry>
    <title>K8s学习笔记——Pod使用进阶</title>
    <link href="http://www.isimble.com/2020/07/09/kubernetesLearning15/"/>
    <id>http://www.isimble.com/2020/07/09/kubernetesLearning15/</id>
    <published>2020-07-09T03:01:36.000Z</published>
    <updated>2020-07-09T03:14:55.847Z</updated>
    
    <content type="html"><![CDATA[<blockquote><p>学习极客时间上的<a href="https://time.geekbang.org/column/intro/116" target="_blank" rel="noopener">《深入剖析Kubernetes》</a></p><p>秉持眼过千遍不如手过一遍的原则。动手实践并记录结果</p><p>对应章节：<a href="https://time.geekbang.org/column/article/40466" target="_blank" rel="noopener">15 | 深入解析Pod对象（二）：使用进阶</a></p></blockquote><a id="more"></a><h2 id="project-volume"><a class="markdownIt-Anchor" href="#project-volume"></a> Project Volume</h2><p>Project Volume（投射数据卷）是为Pod提供事先定义好的一些数据，包括4种：</p><ol><li>Secret</li><li>ConfigMap</li><li>Downward API</li><li>ServiceAccountToken</li></ol><h3 id="secret"><a class="markdownIt-Anchor" href="#secret"></a> Secret</h3><ol><li>以文件形式创建secret</li></ol><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><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></pre></td><td class="code"><pre><span class="line"><span class="comment"># 先创建两个文件，username.txt和password.txt</span></span><br><span class="line">$ cat username.txt</span><br><span class="line">secuser</span><br><span class="line">$ cat password.txt</span><br><span class="line">secPassword</span><br><span class="line">$ kubectl create secret generic user --from-file=./username.txt</span><br><span class="line">secret/user created</span><br><span class="line">$ kubectl create secret generic pass --from-file=./password.txt</span><br><span class="line">secret/pass created</span><br><span class="line">$ kubectl get secret</span><br><span class="line">NAME                  TYPE                                  DATA   AGE</span><br><span class="line">default-token-nlz8h   kubernetes.io/service-account-token   3      36d</span><br><span class="line">pass                  Opaque                                1      6s</span><br><span class="line">user                  Opaque                                1      38s</span><br><span class="line"><span class="comment"># 可以看到default-token-nlz8h，实际上是k8s的默认token</span></span><br></pre></td></tr></table></figure><ol start="2"><li>Pod</li></ol><figure class="highlight yaml"><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></pre></td><td class="code"><pre><span class="line"><span class="attr">apiVersion:</span> <span class="string">v1</span></span><br><span class="line"><span class="attr">kind:</span> <span class="string">Pod</span></span><br><span class="line"><span class="attr">metadata:</span></span><br><span class="line">  <span class="attr">name:</span> <span class="string">test-pv-secret</span></span><br><span class="line"><span class="attr">spec:</span></span><br><span class="line">  <span class="attr">containers:</span></span><br><span class="line">  <span class="bullet">-</span> <span class="attr">name:</span> <span class="string">test-secret</span></span><br><span class="line">    <span class="attr">image:</span> <span class="string">busybox</span></span><br><span class="line">    <span class="attr">imagePullPolicy:</span> <span class="string">Never</span></span><br><span class="line">    <span class="attr">stdin:</span> <span class="literal">true</span></span><br><span class="line">    <span class="attr">tty:</span> <span class="literal">true</span></span><br><span class="line">    <span class="attr">volumeMounts:</span></span><br><span class="line">    <span class="bullet">-</span> <span class="attr">name:</span> <span class="string">sec-test</span></span><br><span class="line">      <span class="attr">mountPath:</span> <span class="string">"/pv"</span></span><br><span class="line">      <span class="attr">readOnly:</span> <span class="literal">true</span></span><br><span class="line">  <span class="attr">volumes:</span></span><br><span class="line">  <span class="bullet">-</span> <span class="attr">name:</span> <span class="string">sec-test</span></span><br><span class="line">    <span class="attr">projected:</span></span><br><span class="line">      <span class="attr">sources:</span></span><br><span class="line">      <span class="bullet">-</span> <span class="attr">secret:</span></span><br><span class="line">          <span class="attr">name:</span> <span class="string">user</span></span><br><span class="line">      <span class="bullet">-</span> <span class="attr">secret:</span></span><br><span class="line">          <span class="attr">name:</span> <span class="string">pass</span></span><br></pre></td></tr></table></figure><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><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></pre></td><td class="code"><pre><span class="line">$ kubectl describe pod <span class="built_in">test</span>-pv-secret</span><br><span class="line">Name:         <span class="built_in">test</span>-pv-secret</span><br><span class="line">...</span><br><span class="line">Volumes:</span><br><span class="line">  sec-test:</span><br><span class="line">    Type:                Projected (a volume that contains injected data from multiple sources)</span><br><span class="line">    SecretName:          user</span><br><span class="line">    SecretOptionalName:  &lt;nil&gt;</span><br><span class="line">    SecretName:          pass</span><br><span class="line">    SecretOptionalName:  &lt;nil&gt;</span><br><span class="line">  default-token-nlz8h:</span><br><span class="line">    Type:        Secret (a volume populated by a Secret)</span><br><span class="line">    SecretName:  default-token-nlz8h</span><br><span class="line">    Optional:    <span class="literal">false</span></span><br><span class="line">...</span><br></pre></td></tr></table></figure><p>可以看到，pod的Volumes中有两个：</p><ul><li>sec-test，即为yaml文件中的volume</li><li>default-token-nlz8h，k8s默认的token</li></ul><ol start="3"><li>容器层面</li></ol><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><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></pre></td><td class="code"><pre><span class="line">$ docker inspect a77ad18a7a2a</span><br><span class="line">[</span><br><span class="line">    &#123;</span><br><span class="line">        <span class="string">"Id"</span>: <span class="string">"a77ad18a7a2aad64fba15bf1dcef8b3f2fa803aa3da3cab5def23b40a0aa5b21"</span>,</span><br><span class="line">        ...</span><br><span class="line">        HostConfig<span class="string">": &#123;</span></span><br><span class="line"><span class="string">            "</span>Binds<span class="string">": [</span></span><br><span class="line"><span class="string">                "</span>/var/lib/kubelet/pods/cba17e39-f12d-416b-a9d1-6390b590d754/volumes/kubernetes.io~projected/sec-test:/pv:ro<span class="string">",</span></span><br><span class="line"><span class="string">                "</span>/var/lib/kubelet/pods/cba17e39-f12d-416b-a9d1-6390b590d754/volumes/kubernetes.io~secret/default-token-nlz8h:/var/run/secrets/kubernetes.io/serviceaccount:ro<span class="string">",</span></span><br><span class="line"><span class="string">                ...</span></span><br><span class="line"><span class="string">        "</span>Mounts<span class="string">": [</span></span><br><span class="line"><span class="string">            &#123;</span></span><br><span class="line"><span class="string">                "</span>Type<span class="string">": "</span><span class="built_in">bind</span><span class="string">",</span></span><br><span class="line"><span class="string">                "</span>Source<span class="string">": "</span>/var/lib/kubelet/pods/cba17e39-f12d-416b-a9d1-6390b590d754/volumes/kubernetes.io~projected/sec-test<span class="string">",</span></span><br><span class="line"><span class="string">                "</span>Destination<span class="string">": "</span>/pv<span class="string">",</span></span><br><span class="line"><span class="string">                "</span>Mode<span class="string">": "</span>ro<span class="string">",</span></span><br><span class="line"><span class="string">                "</span>RW<span class="string">": false,</span></span><br><span class="line"><span class="string">                "</span>Propagation<span class="string">": "</span>rprivate<span class="string">"</span></span><br><span class="line"><span class="string">            &#125;,</span></span><br><span class="line"><span class="string">            ...</span></span><br></pre></td></tr></table></figure><p>从上面的信息可以看出，<code>/var/lib/kubelet/pods/cba17e39-f12d-416b-a9d1-6390b590d754/volumes/kubernetes.io~projected/sec-test</code>目录以只读方式挂载到了容器上</p><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><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line">$ ls /var/lib/kubelet/pods/cba17e39-f12d-416b-a9d1-6390b590d754/volumes/kubernetes.io~projected/sec-test/</span><br><span class="line">password.txt  username.txt</span><br><span class="line">$ cat /var/lib/kubelet/pods/cba17e39-f12d-416b-a9d1-6390b590d754/volumes/kubernetes.io~projected/sec-test/username.txt</span><br><span class="line">secuser</span><br><span class="line">$ cat /var/lib/kubelet/pods/cba17e39-f12d-416b-a9d1-6390b590d754/volumes/kubernetes.io~projected/sec-test/password.txt</span><br><span class="line">secPassword</span><br></pre></td></tr></table></figure><ol start="4"><li>查看结果</li></ol><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><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line">$ kubectl <span class="built_in">exec</span> <span class="built_in">test</span>-pv-secret -- ls /pv</span><br><span class="line">password.txt</span><br><span class="line">username.txt</span><br><span class="line">$ kubectl <span class="built_in">exec</span> <span class="built_in">test</span>-pv-secret -- cat /pv/username.txt</span><br><span class="line">secuser</span><br><span class="line">$ kubectl <span class="built_in">exec</span> <span class="built_in">test</span>-pv-secret -- cat /pv/password.txt</span><br><span class="line">secPassword</span><br></pre></td></tr></table></figure><h3 id="secret对象"><a class="markdownIt-Anchor" href="#secret对象"></a> secret对象</h3><ol><li>创建secret对象</li></ol><blockquote><p>Secret 对象要求这些数据必须是经过 Base64 转码的，以免出现明文密码的安全隐患</p></blockquote><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></pre></td><td class="code"><pre><span class="line">$ <span class="built_in">echo</span> -n <span class="string">'secuser'</span> | base64</span><br><span class="line">c2VjdXNlcg==</span><br><span class="line">$ <span class="built_in">echo</span> -n <span class="string">'secPassword'</span> | base64</span><br><span class="line">c2VjUGFzc3dvcmQ=</span><br></pre></td></tr></table></figure><figure class="highlight yaml"><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"><span class="attr">apiVersion:</span> <span class="string">v1</span></span><br><span class="line"><span class="attr">kind:</span> <span class="string">Secret</span></span><br><span class="line"><span class="attr">metadata:</span></span><br><span class="line">  <span class="attr">name:</span> <span class="string">sec-obj-test</span></span><br><span class="line"><span class="attr">type:</span> <span class="string">Opaque</span></span><br><span class="line"><span class="attr">data:</span></span><br><span class="line">  <span class="attr">username:</span> <span class="string">c2VjdXNlcg==</span></span><br><span class="line">  <span class="attr">password:</span> <span class="string">c2VjUGFzc3dvcmQ=</span></span><br></pre></td></tr></table></figure><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><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line">$ kubectl apply -f secret-obj.yaml</span><br><span class="line">secret/sec-obj-test created</span><br><span class="line">$ kubectl get secret</span><br><span class="line">NAME                  TYPE                                  DATA   AGE</span><br><span class="line">default-token-nlz8h   kubernetes.io/service-account-token   3      36d</span><br><span class="line">sec-obj-test          Opaque                                2      45s</span><br></pre></td></tr></table></figure><ol start="2"><li>创建pod</li></ol><figure class="highlight yaml"><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></pre></td><td class="code"><pre><span class="line"><span class="attr">apiVersion:</span> <span class="string">v1</span></span><br><span class="line"><span class="attr">kind:</span> <span class="string">Pod</span></span><br><span class="line"><span class="attr">metadata:</span></span><br><span class="line">  <span class="attr">name:</span> <span class="string">sec-obj-test</span></span><br><span class="line"><span class="attr">spec:</span></span><br><span class="line">  <span class="attr">containers:</span></span><br><span class="line">  <span class="bullet">-</span> <span class="attr">name:</span> <span class="string">test-secobj</span></span><br><span class="line">    <span class="attr">image:</span> <span class="string">busybox</span></span><br><span class="line">    <span class="attr">imagePullPolicy:</span> <span class="string">Never</span></span><br><span class="line">    <span class="attr">stdin:</span> <span class="literal">true</span></span><br><span class="line">    <span class="attr">tty:</span> <span class="literal">true</span></span><br><span class="line">    <span class="attr">volumeMounts:</span></span><br><span class="line">    <span class="bullet">-</span> <span class="attr">name:</span> <span class="string">secobj-test</span></span><br><span class="line">      <span class="attr">mountPath:</span> <span class="string">"/pv"</span></span><br><span class="line">      <span class="attr">readOnly:</span> <span class="literal">true</span></span><br><span class="line">  <span class="attr">volumes:</span></span><br><span class="line">  <span class="bullet">-</span> <span class="attr">name:</span> <span class="string">sec-test</span></span><br><span class="line">    <span class="attr">projected:</span></span><br><span class="line">      <span class="attr">sources:</span></span><br><span class="line">      <span class="bullet">-</span> <span class="attr">secret:</span></span><br><span class="line">          <span class="attr">name:</span> <span class="string">sec-obj-test</span></span><br></pre></td></tr></table></figure><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><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">$ kubectl describe pod sec-obj-test</span><br><span class="line">Name:         sec-obj-test</span><br><span class="line">...</span><br><span class="line">    Mounts:</span><br><span class="line">      /pv from secobj-test (ro)</span><br><span class="line">      /var/run/secrets/kubernetes.io/serviceaccount from default-token-nlz8h (ro)</span><br><span class="line">...</span><br><span class="line">Volumes:</span><br><span class="line">  secobj-test:</span><br><span class="line">    Type:                Projected (a volume that contains injected data from multiple sources)</span><br><span class="line">    SecretName:          sec-obj-test</span><br><span class="line">    SecretOptionalName:  &lt;nil&gt;</span><br><span class="line">...</span><br></pre></td></tr></table></figure><ol start="3"><li>检查容器上的内容</li></ol><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><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">$ kubectl <span class="built_in">exec</span> sec-obj-test -- ls /pv</span><br><span class="line">password</span><br><span class="line">username</span><br><span class="line">$ kubectl <span class="built_in">exec</span> sec-obj-test -- cat /pv/username</span><br><span class="line">secuser</span><br><span class="line"><span class="comment"># 注：这里没有换行</span></span><br><span class="line">$ kubectl <span class="built_in">exec</span> sec-obj-test -- cat /pv/password</span><br><span class="line">secPassword</span><br><span class="line"><span class="comment"># 注：这里没有换行</span></span><br></pre></td></tr></table></figure><h3 id="configmap"><a class="markdownIt-Anchor" href="#configmap"></a> ConfigMap</h3><h4 id="创建configmap"><a class="markdownIt-Anchor" href="#创建configmap"></a> 创建configMap</h4><p>以如下配置文件为例</p><figure class="highlight python"><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">APP_NAME = <span class="string">"demo"</span></span><br><span class="line">APP_PORT = <span class="number">80</span></span><br></pre></td></tr></table></figure><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><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></pre></td><td class="code"><pre><span class="line">$ kubectl create configmap flask-config --from-file=config.py</span><br><span class="line">$ kubectl describe configmaps</span><br><span class="line">Name:         flask-config</span><br><span class="line">Namespace:    default</span><br><span class="line">Labels:       &lt;none&gt;</span><br><span class="line">Annotations:  &lt;none&gt;</span><br><span class="line"></span><br><span class="line">Data</span><br><span class="line">====</span><br><span class="line">config.py:</span><br><span class="line">----</span><br><span class="line">APP_NAME = <span class="string">"demo"</span></span><br><span class="line">APP_PORT = 80</span><br><span class="line"></span><br><span class="line">Events:  &lt;none&gt;</span><br></pre></td></tr></table></figure><h4 id="创建pod"><a class="markdownIt-Anchor" href="#创建pod"></a> 创建pod</h4><figure class="highlight yaml"><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></pre></td><td class="code"><pre><span class="line"><span class="attr">apiVersion:</span> <span class="string">v1</span></span><br><span class="line"><span class="attr">kind:</span> <span class="string">Pod</span></span><br><span class="line"><span class="attr">metadata:</span></span><br><span class="line">  <span class="attr">name:</span> <span class="string">configmap-test</span></span><br><span class="line"><span class="attr">spec:</span></span><br><span class="line">  <span class="attr">containers:</span></span><br><span class="line">  <span class="bullet">-</span> <span class="attr">name:</span> <span class="string">configmap-test-container</span></span><br><span class="line">    <span class="attr">image:</span> <span class="string">busybox</span></span><br><span class="line">    <span class="attr">imagePullPolicy:</span> <span class="string">Never</span></span><br><span class="line">    <span class="attr">stdin:</span> <span class="literal">true</span></span><br><span class="line">    <span class="attr">tty:</span> <span class="literal">true</span></span><br><span class="line">    <span class="attr">volumeMounts:</span></span><br><span class="line">    <span class="bullet">-</span> <span class="attr">name:</span> <span class="string">flask-config</span></span><br><span class="line">      <span class="attr">mountPath:</span> <span class="string">"/flask_config"</span></span><br><span class="line">      <span class="attr">readOnly:</span> <span class="literal">true</span></span><br><span class="line">  <span class="attr">volumes:</span></span><br><span class="line">  <span class="bullet">-</span> <span class="attr">name:</span> <span class="string">flask-config</span></span><br><span class="line">    <span class="attr">projected:</span></span><br><span class="line">      <span class="attr">sources:</span></span><br><span class="line">      <span class="bullet">-</span> <span class="attr">configMap:</span></span><br><span class="line">          <span class="attr">name:</span> <span class="string">flask-config</span></span><br></pre></td></tr></table></figure><h4 id="查看容器内的结果"><a class="markdownIt-Anchor" href="#查看容器内的结果"></a> 查看容器内的结果</h4><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">$ kubectl <span class="built_in">exec</span> configmap-test -- ls /flask_config</span><br><span class="line">config.py</span><br><span class="line">$ kubectl <span class="built_in">exec</span> configmap-test -- cat /flask_config/config.py</span><br><span class="line">APP_NAME = <span class="string">"demo"</span></span><br><span class="line">APP_PORT = 80</span><br></pre></td></tr></table></figure><h3 id="downwardapi"><a class="markdownIt-Anchor" href="#downwardapi"></a> DownwardAPI</h3><h4 id="创建pod-2"><a class="markdownIt-Anchor" href="#创建pod-2"></a> 创建pod</h4><figure class="highlight yaml"><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"><span class="attr">apiVersion:</span> <span class="string">v1</span></span><br><span class="line"><span class="attr">kind:</span> <span class="string">Pod</span></span><br><span class="line"><span class="attr">metadata:</span></span><br><span class="line">  <span class="attr">name:</span> <span class="string">downward-api-test</span></span><br><span class="line">  <span class="attr">labels:</span></span><br><span class="line">    <span class="attr">arch:</span> <span class="string">amd64</span></span><br><span class="line"><span class="attr">spec:</span></span><br><span class="line">  <span class="attr">containers:</span></span><br><span class="line">  <span class="bullet">-</span> <span class="attr">name:</span> <span class="string">downward-api-container</span></span><br><span class="line">    <span class="attr">image:</span> <span class="string">busybox</span></span><br><span class="line">    <span class="attr">imagePullPolicy:</span> <span class="string">Never</span></span><br><span class="line">    <span class="attr">stdin:</span> <span class="literal">true</span></span><br><span class="line">    <span class="attr">tty:</span> <span class="literal">true</span></span><br><span class="line">    <span class="attr">volumeMounts:</span></span><br><span class="line">    <span class="bullet">-</span> <span class="attr">name:</span> <span class="string">pod-label</span></span><br><span class="line">      <span class="attr">mountPath:</span> <span class="string">/pod_label</span></span><br><span class="line">      <span class="attr">readOnly:</span> <span class="literal">true</span></span><br><span class="line">  <span class="attr">volumes:</span></span><br><span class="line">  <span class="bullet">-</span> <span class="attr">name:</span> <span class="string">pod-label</span></span><br><span class="line">    <span class="attr">downwardAPI:</span></span><br><span class="line">      <span class="attr">items:</span></span><br><span class="line">        <span class="bullet">-</span> <span class="attr">path:</span> <span class="string">"labels"</span></span><br><span class="line">          <span class="attr">fieldRef:</span></span><br><span class="line">            <span class="attr">fieldPath:</span> <span class="string">metadata.labels</span></span><br></pre></td></tr></table></figure><p>说明：在volumes中声明了downwardAPI，将metadata.labels挂载到容器中的<code>/pod_label</code>里</p><blockquote><p>注：我当前的k8s环境中，downwardAPI可以不用定义在projected之下，当然也可以定义在之下</p></blockquote><h4 id="查看结果"><a class="markdownIt-Anchor" href="#查看结果"></a> 查看结果</h4><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></pre></td><td class="code"><pre><span class="line">$ kubectl <span class="built_in">exec</span> downward-api-test -- ls /pod_label</span><br><span class="line">labels</span><br><span class="line">$ kubectl <span class="built_in">exec</span> downward-api-test -- cat /pod_label/labels</span><br><span class="line">arch=<span class="string">"amd64"</span></span><br></pre></td></tr></table></figure><h4 id="尝试一个其他filed"><a class="markdownIt-Anchor" href="#尝试一个其他filed"></a> 尝试一个其他filed</h4><p>如将<code>metadata.labels</code>换成<code>metadata.namespace</code></p><figure class="highlight bash"><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">$ kubectl <span class="built_in">exec</span> downward-api-test -- cat /pod_label/labels</span><br><span class="line">default</span><br></pre></td></tr></table></figure><h3 id="serviceaccounttoken"><a class="markdownIt-Anchor" href="#serviceaccounttoken"></a> ServiceAccountToken</h3><p>其实之前查看pod信息的时候已经看到了相关内容</p><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><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></pre></td><td class="code"><pre><span class="line">$ kubectl describe pod xxxxxx</span><br><span class="line">...</span><br><span class="line">    Mounts:</span><br><span class="line">      /pod_label from pod-label (ro)</span><br><span class="line">      /var/run/secrets/kubernetes.io/serviceaccount from default-token-nlz8h (ro)</span><br><span class="line">...</span><br><span class="line">Volumes:</span><br><span class="line">  default-token-nlz8h:</span><br><span class="line">    Type:        Secret (a volume populated by a Secret)</span><br><span class="line">    SecretName:  default-token-nlz8h</span><br><span class="line">    Optional:    <span class="literal">false</span></span><br><span class="line">    ...</span><br></pre></td></tr></table></figure><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><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line">$ kubectl <span class="built_in">exec</span> downward-api-test -- ls /var/run/secrets/kubernetes.io/serviceaccount</span><br><span class="line">ca.crt</span><br><span class="line">namespace</span><br><span class="line">token</span><br><span class="line">$ kubectl <span class="built_in">exec</span> downward-api-test -- cat /var/run/secrets/kubernetes.io/serviceaccount/token</span><br><span class="line">eyJhbGciOiJSUzI1NiIsImtpZCI6IlhTSnlXMUhXTlNnUmd4MlVMTzdtbm14YVdiSzNUdjk4UnVoZ3RRbUFXZGsifQ.eyJpc3MiOiJrdWJlcm5ldGVzL3NlcnZpY2VhY2NvdW50Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9uYW1lc3BhY2UiOiJkZWZhdWx0Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9zZWNyZXQubmFtZSI6ImRlZmF1bHQtdG9rZW4tbmx6OGgiLCJrdWJlcm5ldGVzLmlvL3NlcnZpY2VhY2NvdW50L3NlcnZpY2UtYWNjb3VudC5uYW1lIjoiZGVmYXVsdCIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VydmljZS1hY2NvdW50LnVpZCI6IjU1MDAxNDE1LWU5N2MtNDVmNS04ZTNlLThkMzZhNGE5ZmYxMSIsInN1YiI6InN5c3RlbTpzZXJ2aWNlYWNjb3VudDpkZWZhdWx0OmRlZmF1bHQifQ.wPr9cO6ySUGV65jjA4WxheIk5mpDkim9jYNSN9hmDOOitOkKrC1qj5fg5eF_GnETUZbS7xaf7sitJgIWmNZfA9YJDMn_nY7a6TLGMMRlhRx3ZXhYg6XFheFCQkCwHLJt2FGNlBtf6WpRGBFVZK_bNbjrcxkBAE-tzz7wYFuA4L1zK3UQfZoie11F8NeEWVOliuMXlVT31GZeMG5MCsuSYk_c-S2c2eTT4ru1k74uH7W1nUi9P5O2CzQPjKHTIRcP3HSBuA1CQYxuBk8Av0eE6vQB41tYMIlpIavzljpd-_jWngPkZAUnQbislaXWZhzzKkGkGqsxsFGb0P57sX4Dyg</span><br></pre></td></tr></table></figure><h3 id="查看帮助"><a class="markdownIt-Anchor" href="#查看帮助"></a> 查看帮助</h3><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><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></pre></td><td class="code"><pre><span class="line">$ kubectl explain pod.spec.volumes.projected.sources</span><br><span class="line">KIND:     Pod</span><br><span class="line">VERSION:  v1</span><br><span class="line"></span><br><span class="line">RESOURCE: sources &lt;[]Object&gt;</span><br><span class="line"></span><br><span class="line">DESCRIPTION:</span><br><span class="line">     list of volume projections</span><br><span class="line"></span><br><span class="line">     Projection that may be projected along with other supported volume types</span><br><span class="line"></span><br><span class="line">FIELDS:</span><br><span class="line">   configMap    &lt;Object&gt;</span><br><span class="line">     information about the configMap data to project</span><br><span class="line"></span><br><span class="line">   downwardAPI  &lt;Object&gt;</span><br><span class="line">     information about the downwardAPI data to project</span><br><span class="line"></span><br><span class="line">   secret   &lt;Object&gt;</span><br><span class="line">     information about the secret data to project</span><br><span class="line"></span><br><span class="line">   serviceAccountToken  &lt;Object&gt;</span><br><span class="line">     information about the serviceAccountToken data to project</span><br></pre></td></tr></table></figure><h2 id="容器健康检查及恢复"><a class="markdownIt-Anchor" href="#容器健康检查及恢复"></a> 容器健康检查及恢复</h2><h3 id="创建pod-3"><a class="markdownIt-Anchor" href="#创建pod-3"></a> 创建pod</h3><figure class="highlight yaml"><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></pre></td><td class="code"><pre><span class="line"><span class="attr">apiVersion:</span> <span class="string">v1</span></span><br><span class="line"><span class="attr">kind:</span> <span class="string">Pod</span></span><br><span class="line"><span class="attr">metadata:</span></span><br><span class="line">  <span class="attr">name:</span> <span class="string">liveness-test</span></span><br><span class="line">  <span class="attr">labels:</span></span><br><span class="line">    <span class="attr">test:</span> <span class="string">liveness</span></span><br><span class="line"><span class="attr">spec:</span></span><br><span class="line">  <span class="attr">containers:</span></span><br><span class="line">  <span class="bullet">-</span> <span class="attr">name:</span> <span class="string">liveness</span></span><br><span class="line">    <span class="attr">image:</span> <span class="string">busybox</span></span><br><span class="line">    <span class="attr">imagePullPolicy:</span> <span class="string">Never</span></span><br><span class="line">    <span class="attr">args:</span></span><br><span class="line">    <span class="bullet">-</span> <span class="string">/bin/sh</span></span><br><span class="line">    <span class="bullet">-</span> <span class="string">-c</span></span><br><span class="line">    <span class="bullet">-</span> <span class="string">touch</span> <span class="string">/tmp/healthy;</span> <span class="string">sleep</span> <span class="number">30</span><span class="string">;</span> <span class="string">rm</span> <span class="string">/tmp/healthy;</span> <span class="string">sleep</span> <span class="number">600</span></span><br><span class="line">    <span class="attr">livenessProbe:</span></span><br><span class="line">      <span class="attr">exec:</span></span><br><span class="line">        <span class="attr">command:</span></span><br><span class="line">        <span class="bullet">-</span> <span class="string">cat</span></span><br><span class="line">        <span class="bullet">-</span> <span class="string">/tmp/healthy</span></span><br><span class="line">      <span class="attr">initialDelaySeconds:</span> <span class="number">5</span></span><br><span class="line">      <span class="attr">periodSeconds:</span> <span class="number">5</span></span><br></pre></td></tr></table></figure><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></pre></td><td class="code"><pre><span class="line">$ kubectl get pod</span><br><span class="line">NAME            READY   STATUS    RESTARTS   AGE</span><br><span class="line">liveness-test   1/1     Running   0          21s</span><br></pre></td></tr></table></figure><p>可以看到，在21s的时候，pod的运行状态正常，RESTARTS字段为0</p><blockquote><p>给他一会儿时间</p></blockquote><h3 id="查看pod详情"><a class="markdownIt-Anchor" href="#查看pod详情"></a> 查看pod详情</h3> <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><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></pre></td><td class="code"><pre><span class="line">$ ubectl describe pod liveness-test</span><br><span class="line">Name:         liveness-test</span><br><span class="line">Namespace:    default</span><br><span class="line">Priority:     0</span><br><span class="line">Node:         node2/10.160.18.181</span><br><span class="line">...</span><br><span class="line">Events:</span><br><span class="line">  Type     Reason     Age                From               Message</span><br><span class="line">  ----     ------     ----               ----               -------</span><br><span class="line">  Normal   Scheduled  75s                default-scheduler  Successfully assigned default/liveness-test to node2</span><br><span class="line">  Normal   Pulled     74s                kubelet, node2     Container image <span class="string">"busybox"</span> already present on machine</span><br><span class="line">  Normal   Created    74s                kubelet, node2     Created container liveness</span><br><span class="line">  Normal   Started    74s                kubelet, node2     Started container liveness</span><br><span class="line">  Warning  Unhealthy  32s (x3 over 42s)  kubelet, node2     Liveness probe failed: cat: can<span class="string">'t open '</span>/tmp/healthy<span class="string">': No such file or directory</span></span><br><span class="line"><span class="string">  Normal   Killing    32s                kubelet, node2     Container liveness failed liveness probe, will be restarted</span></span><br><span class="line"><span class="string">  Warning  Unhealthy  30s (x3 over 40s)  kubelet, node2     Liveness probe failed: cat: can'</span>t open <span class="string">'/tmp/healthy'</span>: No such file or directory</span><br><span class="line">  Normal   Killing    30s                kubelet, node2     Container liveness failed liveness probe, will be restarted</span><br><span class="line">  Normal   Started    2s (x2 over 74s)   kubelet, node2     Started container liveness</span><br><span class="line">  Normal   Pulled     2s (x2 over 74s)   kubelet, node2     Container image <span class="string">"busybox"</span> already present on machine</span><br><span class="line">  Normal   Created    2s (x2 over 74s)   kubelet, node2     Created container liveness</span><br></pre></td></tr></table></figure><p>当pod运行了一会儿后，<code>/tmp/healthy</code>被删除，随后，<code>Container liveness failed liveness probe, will be restarted</code></p><h3 id="查看pod重启状况"><a class="markdownIt-Anchor" href="#查看pod重启状况"></a> 查看pod重启状况</h3><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></pre></td><td class="code"><pre><span class="line">$ kubectl get pod</span><br><span class="line">NAME            READY   STATUS    RESTARTS   AGE</span><br><span class="line">liveness-test   1/1     Running   5          6m19s</span><br></pre></td></tr></table></figure><blockquote><p>podPresets是一个需要开启的选项，在我当前环境中没有开启，暂不学习</p></blockquote><h2 id="小结"><a class="markdownIt-Anchor" href="#小结"></a> 小结</h2><p>Pod使用进阶主要涉及了：</p><ol><li>Project Volume的4种类型</li><li>健康状况检查和恢复</li></ol>]]></content>
    
    <summary type="html">
    
      &lt;blockquote&gt;
&lt;p&gt;学习极客时间上的&lt;a href=&quot;https://time.geekbang.org/column/intro/116&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;《深入剖析Kubernetes》&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;秉持眼过千遍不如手过一遍的原则。动手实践并记录结果&lt;/p&gt;
&lt;p&gt;对应章节：&lt;a href=&quot;https://time.geekbang.org/column/article/40466&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;15 | 深入解析Pod对象（二）：使用进阶&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
    
    </summary>
    
    
      <category term="k8s" scheme="http://www.isimble.com/categories/k8s/"/>
    
    
      <category term="docker" scheme="http://www.isimble.com/tags/docker/"/>
    
      <category term="Kubernetes" scheme="http://www.isimble.com/tags/Kubernetes/"/>
    
  </entry>
  
  <entry>
    <title>K8s学习笔记——Pod的基本概念</title>
    <link href="http://www.isimble.com/2020/07/08/kubernetesLearning14/"/>
    <id>http://www.isimble.com/2020/07/08/kubernetesLearning14/</id>
    <published>2020-07-08T05:25:35.000Z</published>
    <updated>2020-07-08T05:36:41.106Z</updated>
    
    <content type="html"><![CDATA[<blockquote><p>学习极客时间上的<a href="https://time.geekbang.org/column/intro/116" target="_blank" rel="noopener">《深入剖析Kubernetes》</a></p><p>秉持眼过千遍不如手过一遍的原则。动手实践并记录结果</p><p>对应章节：<a href="https://time.geekbang.org/column/article/40366" target="_blank" rel="noopener">14 | 深入解析Pod对象（一）：基本概念</a></p></blockquote><a id="more"></a><h2 id="hostaliases测试"><a class="markdownIt-Anchor" href="#hostaliases测试"></a> <code>hostAliases</code>测试</h2><ul><li>Pod配置</li></ul><figure class="highlight yaml"><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></pre></td><td class="code"><pre><span class="line"><span class="attr">apiVersion:</span> <span class="string">v1</span></span><br><span class="line"><span class="attr">kind:</span> <span class="string">Pod</span></span><br><span class="line"><span class="attr">metadata:</span></span><br><span class="line">  <span class="attr">name:</span> <span class="string">my-first-test</span></span><br><span class="line"><span class="attr">spec:</span></span><br><span class="line">  <span class="attr">hostAliases:</span></span><br><span class="line">  <span class="bullet">-</span> <span class="attr">ip:</span> <span class="number">10.9</span><span class="number">.8</span><span class="number">.7</span></span><br><span class="line">    <span class="attr">hostnames:</span></span><br><span class="line">    <span class="bullet">-</span> <span class="string">"host.test.site"</span></span><br><span class="line">    <span class="bullet">-</span> <span class="string">"host.aliases.test.site"</span></span><br><span class="line">  <span class="attr">containers:</span></span><br><span class="line">  <span class="bullet">-</span> <span class="attr">name:</span> <span class="string">my-test-container1</span></span><br><span class="line">    <span class="attr">image:</span> <span class="string">busybox</span></span><br><span class="line">    <span class="attr">imagePullPolicy:</span> <span class="string">Never</span></span><br><span class="line">    <span class="attr">stdin:</span> <span class="literal">true</span></span><br><span class="line">    <span class="attr">tty:</span> <span class="literal">true</span></span><br><span class="line">  <span class="bullet">-</span> <span class="attr">name:</span> <span class="string">my-test-container2</span></span><br><span class="line">    <span class="attr">image:</span> <span class="string">busybox</span></span><br><span class="line">    <span class="attr">imagePullPolicy:</span> <span class="string">Never</span></span><br><span class="line">    <span class="attr">stdin:</span> <span class="literal">true</span></span><br><span class="line">    <span class="attr">tty:</span> <span class="literal">true</span></span><br></pre></td></tr></table></figure><ul><li>查看容器内的hosts信息</li></ul><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><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">$ kubectl <span class="built_in">exec</span> my-first-test -c my-test-container1 -- cat /etc/hosts</span><br><span class="line"><span class="comment"># Kubernetes-managed hosts file.</span></span><br><span class="line">127.0.0.1   localhost</span><br><span class="line">::1 localhost ip6-localhost ip6-loopback</span><br><span class="line">fe00::0 ip6-localnet</span><br><span class="line">fe00::0 ip6-mcastprefix</span><br><span class="line">fe00::1 ip6-allnodes</span><br><span class="line">fe00::2 ip6-allrouters</span><br><span class="line">172.172.1.41    my-first-test</span><br><span class="line"></span><br><span class="line"><span class="comment"># Entries added by HostAliases.</span></span><br><span class="line">10.9.8.7    host.test.site  host.aliases.test.site</span><br><span class="line">$ kubectl <span class="built_in">exec</span> my-first-test -c my-test-container2 -- cat /etc/hosts</span><br><span class="line"><span class="comment"># Kubernetes-managed hosts file.</span></span><br><span class="line">127.0.0.1   localhost</span><br><span class="line">::1 localhost ip6-localhost ip6-loopback</span><br><span class="line">fe00::0 ip6-localnet</span><br><span class="line">fe00::0 ip6-mcastprefix</span><br><span class="line">fe00::1 ip6-allnodes</span><br><span class="line">fe00::2 ip6-allrouters</span><br><span class="line">172.172.1.41    my-first-test</span><br><span class="line"></span><br><span class="line"><span class="comment"># Entries added by HostAliases.</span></span><br><span class="line">10.9.8.7    host.test.site  host.aliases.test.site</span><br></pre></td></tr></table></figure><h2 id="shareprocessnamespace"><a class="markdownIt-Anchor" href="#shareprocessnamespace"></a> <code>shareProcessNamespace</code></h2><h3 id="不配置shareprocessnamespace"><a class="markdownIt-Anchor" href="#不配置shareprocessnamespace"></a> 不配置<code>shareProcessNamespace</code></h3><figure class="highlight yaml"><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"><span class="attr">apiVersion:</span> <span class="string">v1</span></span><br><span class="line"><span class="attr">kind:</span> <span class="string">Pod</span></span><br><span class="line"><span class="attr">metadata:</span></span><br><span class="line">  <span class="attr">name:</span> <span class="literal">no</span><span class="string">-share-process-ns-test</span></span><br><span class="line"><span class="attr">spec:</span></span><br><span class="line">  <span class="attr">containers:</span></span><br><span class="line">  <span class="bullet">-</span> <span class="attr">name:</span> <span class="string">shell</span></span><br><span class="line">    <span class="attr">image:</span> <span class="string">busybox</span></span><br><span class="line">    <span class="attr">imagePullPolicy:</span> <span class="string">Never</span></span><br><span class="line">    <span class="attr">stdin:</span> <span class="literal">true</span></span><br><span class="line">    <span class="attr">tty:</span> <span class="literal">true</span></span><br><span class="line">  <span class="bullet">-</span> <span class="attr">name:</span> <span class="string">web</span></span><br><span class="line">    <span class="attr">image:</span> <span class="string">nginx:latest</span></span><br><span class="line">    <span class="attr">imagePullPolicy:</span> <span class="string">Never</span></span><br></pre></td></tr></table></figure><ul><li>通过shell的container查看进程</li></ul><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">$ kubectl <span class="built_in">exec</span> no-share-process-ns-test -c shell -- ps</span><br><span class="line">PID   USER     TIME  COMMAND</span><br><span class="line">    1 root      0:00 sh</span><br><span class="line">    6 root      0:00 ps</span><br><span class="line"><span class="comment"># shell的容器仅能看到自己容器内的进程</span></span><br></pre></td></tr></table></figure><ul><li>container层面信息</li></ul><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><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></pre></td><td class="code"><pre><span class="line">$ docker ps</span><br><span class="line">CONTAINER ID        IMAGE                                               COMMAND                  CREATED              STATUS              PORTS               NAMES</span><br><span class="line">117497ca101c        2622e6cca7eb                                        <span class="string">"/docker-entrypoint.…"</span>   About a minute ago   Up About a minute                       k8s_web_no-share-process-ns-test_default_94884606-ea15-4038-9fa0-0e3b11ca4f31_0</span><br><span class="line">ca8b6e6a1796        1c35c4412082                                        <span class="string">"sh"</span>                     About a minute ago   Up About a minute                       k8s_shell_no-share-process-ns-test_default_94884606-ea15-4038-9fa0-0e3b11ca4f31_0</span><br><span class="line">eb0fd0f91677        registry.aliyuncs.com/google_containers/pause:3.2   <span class="string">"/pause"</span>                 About a minute ago   Up About a minute                       k8s_POD_no-share-process-ns-test_default_94884606-ea15-4038-9fa0-0e3b11ca4f31_0</span><br><span class="line">$ docker inspect ca8b6e6a1796 | grep \"Pid\"</span><br><span class="line">            <span class="string">"Pid"</span>: 1561218,</span><br><span class="line">$ docker inspect 117497ca101c | grep \"Pid\"</span><br><span class="line">            <span class="string">"Pid"</span>: 1561252,</span><br><span class="line">$ ls -l /proc/1561218/ns/</span><br><span class="line">total 0</span><br><span class="line">lrwxrwxrwx 1 root root 0 Jun 17 14:43 cgroup -&gt; <span class="string">'cgroup:[4026531835]'</span></span><br><span class="line">lrwxrwxrwx 1 root root 0 Jun 17 14:41 ipc -&gt; <span class="string">'ipc:[4026532625]'</span></span><br><span class="line">lrwxrwxrwx 1 root root 0 Jun 17 14:41 mnt -&gt; <span class="string">'mnt:[4026532718]'</span></span><br><span class="line">lrwxrwxrwx 1 root root 0 Jun 17 14:41 net -&gt; <span class="string">'net:[4026532628]'</span></span><br><span class="line">lrwxrwxrwx 1 root root 0 Jun 17 14:41 pid -&gt; <span class="string">'pid:[4026532723]'</span></span><br><span class="line">lrwxrwxrwx 1 root root 0 Jun 17 14:43 pid_for_children -&gt; <span class="string">'pid:[4026532723]'</span></span><br><span class="line">lrwxrwxrwx 1 root root 0 Jun 17 14:43 user -&gt; <span class="string">'user:[4026531837]'</span></span><br><span class="line">lrwxrwxrwx 1 root root 0 Jun 17 14:41 uts -&gt; <span class="string">'uts:[4026532721]'</span></span><br><span class="line">$ ls -l /proc/1561252/ns/</span><br><span class="line">total 0</span><br><span class="line">lrwxrwxrwx 1 root root 0 Jun 17 14:43 cgroup -&gt; <span class="string">'cgroup:[4026531835]'</span></span><br><span class="line">lrwxrwxrwx 1 root root 0 Jun 17 14:43 ipc -&gt; <span class="string">'ipc:[4026532625]'</span></span><br><span class="line">lrwxrwxrwx 1 root root 0 Jun 17 14:43 mnt -&gt; <span class="string">'mnt:[4026532724]'</span></span><br><span class="line">lrwxrwxrwx 1 root root 0 Jun 17 14:43 net -&gt; <span class="string">'net:[4026532628]'</span></span><br><span class="line">lrwxrwxrwx 1 root root 0 Jun 17 14:43 pid -&gt; <span class="string">'pid:[4026532726]'</span></span><br><span class="line">lrwxrwxrwx 1 root root 0 Jun 17 14:43 pid_for_children -&gt; <span class="string">'pid:[4026532726]'</span></span><br><span class="line">lrwxrwxrwx 1 root root 0 Jun 17 14:43 user -&gt; <span class="string">'user:[4026531837]'</span></span><br><span class="line">lrwxrwxrwx 1 root root 0 Jun 17 14:43 uts -&gt; <span class="string">'uts:[4026532725]'</span></span><br></pre></td></tr></table></figure><blockquote><p>两个container的<code>pid</code>和<code>pid_for_children</code>不同</p></blockquote><h3 id="开启shareprocessnamespace"><a class="markdownIt-Anchor" href="#开启shareprocessnamespace"></a> 开启shareProcessNamespace</h3><figure class="highlight yaml"><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></pre></td><td class="code"><pre><span class="line"><span class="attr">apiVersion:</span> <span class="string">v1</span></span><br><span class="line"><span class="attr">kind:</span> <span class="string">Pod</span></span><br><span class="line"><span class="attr">metadata:</span></span><br><span class="line">  <span class="attr">name:</span> <span class="string">share-process-ns-test</span></span><br><span class="line"><span class="attr">spec:</span></span><br><span class="line">  <span class="attr">shareProcessNamespace:</span> <span class="literal">true</span></span><br><span class="line">  <span class="attr">containers:</span></span><br><span class="line">  <span class="bullet">-</span> <span class="attr">name:</span> <span class="string">shell</span></span><br><span class="line">    <span class="attr">image:</span> <span class="string">busybox</span></span><br><span class="line">    <span class="attr">imagePullPolicy:</span> <span class="string">Never</span></span><br><span class="line">    <span class="attr">stdin:</span> <span class="literal">true</span></span><br><span class="line">    <span class="attr">tty:</span> <span class="literal">true</span></span><br><span class="line">  <span class="bullet">-</span> <span class="attr">name:</span> <span class="string">web</span></span><br><span class="line">    <span class="attr">image:</span> <span class="string">nginx:latest</span></span><br><span class="line">    <span class="attr">imagePullPolicy:</span> <span class="string">Never</span></span><br></pre></td></tr></table></figure><ul><li>通过shell的container查看进程</li></ul><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><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line">$ kubectl <span class="built_in">exec</span> share-process-ns-test -c shell -- ps</span><br><span class="line">PID   USER     TIME  COMMAND</span><br><span class="line">    1 root      0:00 /pause</span><br><span class="line">    6 root      0:00 sh</span><br><span class="line">   12 root      0:00 nginx: master process nginx -g daemon off;</span><br><span class="line">   39 101       0:00 nginx: worker process</span><br><span class="line">   40 root      0:00 ps</span><br></pre></td></tr></table></figure><blockquote><p>可以看到，名为shell的container中也能看到nginx的进程</p></blockquote><ul><li>container层面</li></ul><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><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></pre></td><td class="code"><pre><span class="line">$ docker ps</span><br><span class="line">CONTAINER ID        IMAGE                                               COMMAND                  CREATED             STATUS              PORTS               NAMES</span><br><span class="line">955d3e3b9cba        2622e6cca7eb                                        <span class="string">"/docker-entrypoint.…"</span>   2 minutes ago       Up 2 minutes                            k8s_web_share-process-ns-test_default_d1b8348e-5399-4d30-9d53-de91ffdb9746_0</span><br><span class="line">d065b6907db0        1c35c4412082                                        <span class="string">"sh"</span>                     2 minutes ago       Up 2 minutes                            k8s_shell_share-process-ns-test_default_d1b8348e-5399-4d30-9d53-de91ffdb9746_0</span><br><span class="line">79a59e6e245c        registry.aliyuncs.com/google_containers/pause:3.2   <span class="string">"/pause"</span>                 2 minutes ago       Up 2 minutes                            k8s_POD_share-process-ns-test_default_d1b8348e-5399-4d30-9d53-de91ffdb9746_0</span><br><span class="line">$ docker inspect 955d3e3b9cba | grep \"Pid\"</span><br><span class="line">            <span class="string">"Pid"</span>: 1564637,</span><br><span class="line">$ docker inspect d065b6907db0 | grep \"Pid\"</span><br><span class="line">            <span class="string">"Pid"</span>: 1564603,</span><br><span class="line">$ ls -l /proc/1564637/ns/</span><br><span class="line">total 0</span><br><span class="line">lrwxrwxrwx 1 root root 0 Jun 17 14:51 cgroup -&gt; <span class="string">'cgroup:[4026531835]'</span></span><br><span class="line">lrwxrwxrwx 1 root root 0 Jun 17 14:51 ipc -&gt; <span class="string">'ipc:[4026532625]'</span></span><br><span class="line">lrwxrwxrwx 1 root root 0 Jun 17 14:51 mnt -&gt; <span class="string">'mnt:[4026532724]'</span></span><br><span class="line">lrwxrwxrwx 1 root root 0 Jun 17 14:51 net -&gt; <span class="string">'net:[4026532628]'</span></span><br><span class="line">lrwxrwxrwx 1 root root 0 Jun 17 14:51 pid -&gt; <span class="string">'pid:[4026532626]'</span></span><br><span class="line">lrwxrwxrwx 1 root root 0 Jun 17 14:51 pid_for_children -&gt; <span class="string">'pid:[4026532626]'</span></span><br><span class="line">lrwxrwxrwx 1 root root 0 Jun 17 14:51 user -&gt; <span class="string">'user:[4026531837]'</span></span><br><span class="line">lrwxrwxrwx 1 root root 0 Jun 17 14:51 uts -&gt; <span class="string">'uts:[4026532725]'</span></span><br><span class="line">$ ls -l /proc/1564603/ns/</span><br><span class="line">total 0</span><br><span class="line">lrwxrwxrwx 1 root root 0 Jun 17 14:51 cgroup -&gt; <span class="string">'cgroup:[4026531835]'</span></span><br><span class="line">lrwxrwxrwx 1 root root 0 Jun 17 14:48 ipc -&gt; <span class="string">'ipc:[4026532625]'</span></span><br><span class="line">lrwxrwxrwx 1 root root 0 Jun 17 14:48 mnt -&gt; <span class="string">'mnt:[4026532721]'</span></span><br><span class="line">lrwxrwxrwx 1 root root 0 Jun 17 14:48 net -&gt; <span class="string">'net:[4026532628]'</span></span><br><span class="line">lrwxrwxrwx 1 root root 0 Jun 17 14:48 pid -&gt; <span class="string">'pid:[4026532626]'</span></span><br><span class="line">lrwxrwxrwx 1 root root 0 Jun 17 14:51 pid_for_children -&gt; <span class="string">'pid:[4026532626]'</span></span><br><span class="line">lrwxrwxrwx 1 root root 0 Jun 17 14:51 user -&gt; <span class="string">'user:[4026531837]'</span></span><br><span class="line">lrwxrwxrwx 1 root root 0 Jun 17 14:48 uts -&gt; <span class="string">'uts:[4026532723]'</span></span><br></pre></td></tr></table></figure><blockquote><p>shell的container和web的container的<code>pid</code>和<code>pid_for_children</code>都是<code>pid:[4026532626]</code>的namespace</p></blockquote><h2 id="hostnetwork练习"><a class="markdownIt-Anchor" href="#hostnetwork练习"></a> <code>hostNetwork</code>练习</h2><figure class="highlight yaml"><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></pre></td><td class="code"><pre><span class="line"><span class="attr">apiVersion:</span> <span class="string">v1</span></span><br><span class="line"><span class="attr">kind:</span> <span class="string">Pod</span></span><br><span class="line"><span class="attr">metadata:</span></span><br><span class="line">  <span class="attr">name:</span> <span class="string">host-net-test</span></span><br><span class="line"><span class="attr">spec:</span></span><br><span class="line">  <span class="attr">hostNetwork:</span> <span class="literal">true</span></span><br><span class="line">  <span class="attr">containers:</span></span><br><span class="line">  <span class="bullet">-</span> <span class="attr">name:</span> <span class="string">shell</span></span><br><span class="line">    <span class="attr">image:</span> <span class="string">busybox</span></span><br><span class="line">    <span class="attr">imagePullPolicy:</span> <span class="string">Never</span></span><br><span class="line">    <span class="attr">stdin:</span> <span class="literal">true</span></span><br><span class="line">    <span class="attr">tty:</span> <span class="literal">true</span></span><br><span class="line">  <span class="bullet">-</span> <span class="attr">name:</span> <span class="string">web</span></span><br><span class="line">    <span class="attr">image:</span> <span class="string">nginx:latest</span></span><br><span class="line">    <span class="attr">imagePullPolicy:</span> <span class="string">Never</span></span><br></pre></td></tr></table></figure><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><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></pre></td><td class="code"><pre><span class="line">$ kubectl <span class="built_in">exec</span> host-net-test -c shell -- ifconfig</span><br><span class="line">cni0      Link encap:Ethernet  HWaddr 16:80:F0:F9:A0:B4</span><br><span class="line">          inet addr:172.172.1.1  Bcast:0.0.0.0  Mask:255.255.255.0</span><br><span class="line">          inet6 addr: fe80::1480:f0ff:fef9:a0b4/64 Scope:Link</span><br><span class="line">          UP BROADCAST MULTICAST  MTU:1500  Metric:1</span><br><span class="line">          RX packets:31 errors:0 dropped:0 overruns:0 frame:0</span><br><span class="line">          TX packets:600 errors:0 dropped:0 overruns:0 carrier:0</span><br><span class="line">          collisions:0 txqueuelen:1000</span><br><span class="line">          RX bytes:868 (868.0 B)  TX bytes:43824 (42.7 KiB)</span><br><span class="line"></span><br><span class="line">docker0   Link encap:Ethernet  HWaddr 02:42:BB:9B:62:76</span><br><span class="line">          inet addr:172.17.0.1  Bcast:172.17.255.255  Mask:255.255.0.0</span><br><span class="line">          inet6 addr: fe80::42:bbff:fe9b:6276/64 Scope:Link</span><br><span class="line">          UP BROADCAST MULTICAST  MTU:1500  Metric:1</span><br><span class="line">          RX packets:0 errors:0 dropped:0 overruns:0 frame:0</span><br><span class="line">          TX packets:19 errors:0 dropped:0 overruns:0 carrier:0</span><br><span class="line">          collisions:0 txqueuelen:0</span><br><span class="line">          RX bytes:0 (0.0 B)  TX bytes:1666 (1.6 KiB)</span><br><span class="line"></span><br><span class="line">...</span><br></pre></td></tr></table></figure><blockquote><p>container中看到的网卡信息与host相同</p></blockquote><h2 id="lifecycle练习"><a class="markdownIt-Anchor" href="#lifecycle练习"></a> <code>lifecycle</code>练习</h2><figure class="highlight yaml"><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></pre></td><td class="code"><pre><span class="line"><span class="attr">apiVersion:</span> <span class="string">v1</span></span><br><span class="line"><span class="attr">kind:</span> <span class="string">Pod</span></span><br><span class="line"><span class="attr">metadata:</span></span><br><span class="line">  <span class="attr">name:</span> <span class="string">lifecycle-demo</span></span><br><span class="line"><span class="attr">spec:</span></span><br><span class="line">  <span class="attr">containers:</span></span><br><span class="line">  <span class="bullet">-</span> <span class="attr">name:</span> <span class="string">lifecycle-demo-container</span></span><br><span class="line">    <span class="attr">image:</span> <span class="string">nginx</span></span><br><span class="line">    <span class="attr">imagePullPolicy:</span> <span class="string">Never</span></span><br><span class="line">    <span class="attr">lifecycle:</span></span><br><span class="line">      <span class="attr">postStart:</span></span><br><span class="line">        <span class="attr">exec:</span></span><br><span class="line">          <span class="attr">command:</span> <span class="string">["/bin/sh",</span> <span class="string">"-c"</span><span class="string">,</span> <span class="string">"echo Hello from the postStart handler &gt; /usr/share/message"</span><span class="string">]</span></span><br><span class="line">      <span class="attr">preStop:</span></span><br><span class="line">        <span class="attr">exec:</span></span><br><span class="line">          <span class="attr">command:</span> <span class="string">["/usr/sbin/nginx","-s","quit"]</span></span><br></pre></td></tr></table></figure><figure class="highlight bash"><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">$ kubectl <span class="built_in">exec</span> lifecycle-demo -- cat /usr/share/message</span><br><span class="line">Hello from the postStart handler</span><br></pre></td></tr></table></figure><blockquote><p>可以看到container启动后就打印了</p></blockquote><h2 id="小结"><a class="markdownIt-Anchor" href="#小结"></a> 小结</h2><p>这章节主要是理解哪些操作是属于pod层面，而哪些操作是属于容器层面。比如hostAliases和shareProcessNamespace，都是属于整个pod层面，而imagePullPolicy和lifecycle则属于container层面。</p><p>再次引用原文中的总结：</p><blockquote><p>**凡是 Pod 中的容器要共享宿主机的 Namespace，也一定是 Pod 级别的定义</p></blockquote>]]></content>
    
    <summary type="html">
    
      &lt;blockquote&gt;
&lt;p&gt;学习极客时间上的&lt;a href=&quot;https://time.geekbang.org/column/intro/116&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;《深入剖析Kubernetes》&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;秉持眼过千遍不如手过一遍的原则。动手实践并记录结果&lt;/p&gt;
&lt;p&gt;对应章节：&lt;a href=&quot;https://time.geekbang.org/column/article/40366&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;14 | 深入解析Pod对象（一）：基本概念&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
    
    </summary>
    
    
      <category term="k8s" scheme="http://www.isimble.com/categories/k8s/"/>
    
    
      <category term="docker" scheme="http://www.isimble.com/tags/docker/"/>
    
      <category term="Kubernetes" scheme="http://www.isimble.com/tags/Kubernetes/"/>
    
  </entry>
  
  <entry>
    <title>K8s学习笔记——为什么需要Pod</title>
    <link href="http://www.isimble.com/2020/07/06/kubernetesLearning05/"/>
    <id>http://www.isimble.com/2020/07/06/kubernetesLearning05/</id>
    <published>2020-07-06T05:34:23.000Z</published>
    <updated>2020-07-06T05:42:24.357Z</updated>
    
    <content type="html"><![CDATA[<blockquote><p>学习极客时间上的<a href="https://time.geekbang.org/column/intro/116" target="_blank" rel="noopener">《深入剖析Kubernetes》</a></p><p>秉持眼过千遍不如手过一遍的原则.</p><p>对应章节：<a href="https://time.geekbang.org/column/article/40092" target="_blank" rel="noopener">13 | 为什么我们需要Pod？</a></p></blockquote><a id="more"></a><h2 id="共享net的container"><a class="markdownIt-Anchor" href="#共享net的container"></a> 共享net的container</h2><h3 id="先来起两个共享net和volume的容器"><a class="markdownIt-Anchor" href="#先来起两个共享net和volume的容器"></a> 先来起两个共享net和volume的容器</h3><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></pre></td><td class="code"><pre><span class="line">$ docker run -it -d --name test1 busybox</span><br><span class="line">15dafb04a3fae857c0db7ce09c02d6ebc565de71a49df2511eded48457e0945e</span><br><span class="line">$ docker run -it -d --network container:test1 --volumes-from test1 --name test2 busybox</span><br><span class="line">6e15995e63a4f2cc0b293be848a448c2e34a1502477645c434e529245ffaa1f3</span><br></pre></td></tr></table></figure><h3 id="查看两个container的信息"><a class="markdownIt-Anchor" href="#查看两个container的信息"></a> 查看两个container的信息</h3><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><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></pre></td><td class="code"><pre><span class="line">$ docker inspect test1</span><br><span class="line">[</span><br><span class="line">    &#123;</span><br><span class="line">        <span class="string">"Id"</span>: <span class="string">"15dafb04a3fae857c0db7ce09c02d6ebc565de71a49df2511eded48457e0945e"</span>,</span><br><span class="line">            ...</span><br><span class="line">            <span class="string">"Pid"</span>: 2282,</span><br><span class="line">            ...</span><br><span class="line">        &#125;,</span><br><span class="line">        ...</span><br><span class="line">            <span class="string">"Networks"</span>: &#123;</span><br><span class="line">                <span class="string">"bridge"</span>: &#123;</span><br><span class="line">                    ...</span><br><span class="line">                    <span class="string">"NetworkID"</span>: <span class="string">"5bdb44786ae497e27f9626360b59ff35eead5c02f6f6da4392306132e8910ad0"</span>,</span><br><span class="line">                    <span class="string">"EndpointID"</span>: <span class="string">"8a9d1594a9949509e42eee8af6145d30e1162cc4c8384c0f7d7e8d7bece5cfdd"</span>,</span><br><span class="line">                    <span class="string">"Gateway"</span>: <span class="string">"172.17.0.1"</span>,</span><br><span class="line">                    <span class="string">"IPAddress"</span>: <span class="string">"172.17.0.2"</span>,</span><br><span class="line">                &#125;</span><br><span class="line">        ...</span><br><span class="line"></span><br><span class="line">$ docker inspect test2</span><br><span class="line">[</span><br><span class="line">    &#123;</span><br><span class="line">        <span class="string">"Id"</span>: <span class="string">"6e15995e63a4f2cc0b293be848a448c2e34a1502477645c434e529245ffaa1f3"</span>,</span><br><span class="line">        ...</span><br><span class="line">            <span class="string">"Pid"</span>: 3555,</span><br><span class="line">        ...</span><br><span class="line">            <span class="string">"NetworkMode"</span>: <span class="string">"container:15dafb04a3fae857c0db7ce09c02d6ebc565de71a49df2511eded48457e0945e"</span>,</span><br><span class="line">        ...</span><br></pre></td></tr></table></figure><h3 id="查看进程"><a class="markdownIt-Anchor" href="#查看进程"></a> 查看进程</h3><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><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></pre></td><td class="code"><pre><span class="line">$ ls -l /proc/2282/ns/</span><br><span class="line">total 0</span><br><span class="line">lrwxrwxrwx 1 root root 0 Jun 12 06:45 cgroup -&gt; <span class="string">'cgroup:[4026531835]'</span></span><br><span class="line">lrwxrwxrwx 1 root root 0 Jun 12 06:31 ipc -&gt; <span class="string">'ipc:[4026532571]'</span></span><br><span class="line">lrwxrwxrwx 1 root root 0 Jun 12 06:31 mnt -&gt; <span class="string">'mnt:[4026532569]'</span></span><br><span class="line">lrwxrwxrwx 1 root root 0 Jun 12 06:16 net -&gt; <span class="string">'net:[4026532574]'</span></span><br><span class="line">lrwxrwxrwx 1 root root 0 Jun 12 06:31 pid -&gt; <span class="string">'pid:[4026532572]'</span></span><br><span class="line">lrwxrwxrwx 1 root root 0 Jun 12 06:45 pid_for_children -&gt; <span class="string">'pid:[4026532572]'</span></span><br><span class="line">lrwxrwxrwx 1 root root 0 Jun 12 06:45 user -&gt; <span class="string">'user:[4026531837]'</span></span><br><span class="line">lrwxrwxrwx 1 root root 0 Jun 12 06:31 uts -&gt; <span class="string">'uts:[4026532570]'</span></span><br><span class="line">$ ls -l /proc/3555/ns/</span><br><span class="line">total 0</span><br><span class="line">lrwxrwxrwx 1 root root 0 Jun 12 06:45 cgroup -&gt; <span class="string">'cgroup:[4026531835]'</span></span><br><span class="line">lrwxrwxrwx 1 root root 0 Jun 12 06:42 ipc -&gt; <span class="string">'ipc:[4026532630]'</span></span><br><span class="line">lrwxrwxrwx 1 root root 0 Jun 12 06:42 mnt -&gt; <span class="string">'mnt:[4026532628]'</span></span><br><span class="line">lrwxrwxrwx 1 root root 0 Jun 12 06:42 net -&gt; <span class="string">'net:[4026532574]'</span></span><br><span class="line">lrwxrwxrwx 1 root root 0 Jun 12 06:42 pid -&gt; <span class="string">'pid:[4026532631]'</span></span><br><span class="line">lrwxrwxrwx 1 root root 0 Jun 12 06:45 pid_for_children -&gt; <span class="string">'pid:[4026532631]'</span></span><br><span class="line">lrwxrwxrwx 1 root root 0 Jun 12 06:45 user -&gt; <span class="string">'user:[4026531837]'</span></span><br><span class="line">lrwxrwxrwx 1 root root 0 Jun 12 06:42 uts -&gt; <span class="string">'uts:[4026532629]'</span></span><br></pre></td></tr></table></figure><p>可以看到，cgroup、net和user是相同的</p><blockquote><p>实际上，在不指定共享net的container的时候，cgroup和user也都是相同的</p><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><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></pre></td><td class="code"><pre><span class="line">$ docker run -it -d ubuntu</span><br><span class="line">25b637a2facf0ba713403c14f300644ee21cd107b45fb57d47f7cb4be0fcc3ad</span><br><span class="line">$ docker inspect 25b637a2f | grep Pid</span><br><span class="line">      <span class="string">"Pid"</span>: 10895,</span><br><span class="line">      <span class="string">"PidMode"</span>: <span class="string">""</span>,</span><br><span class="line">         <span class="string">"PidsLimit"</span>: null,</span><br><span class="line">$ ls /proc/10895/ns/ -l</span><br><span class="line">total 0</span><br><span class="line">lrwxrwxrwx 1 root root 0 Jun 15 03:10 cgroup -&gt; <span class="string">'cgroup:[4026531835]'</span></span><br><span class="line">lrwxrwxrwx 1 root root 0 Jun 15 03:10 ipc -&gt; <span class="string">'ipc:[4026532706]'</span></span><br><span class="line">lrwxrwxrwx 1 root root 0 Jun 15 03:10 mnt -&gt; <span class="string">'mnt:[4026532704]'</span></span><br><span class="line">lrwxrwxrwx 1 root root 0 Jun 15 03:10 net -&gt; <span class="string">'net:[4026532709]'</span></span><br><span class="line">lrwxrwxrwx 1 root root 0 Jun 15 03:10 pid -&gt; <span class="string">'pid:[4026532707]'</span></span><br><span class="line">lrwxrwxrwx 1 root root 0 Jun 15 03:10 pid_for_children -&gt; <span class="string">'pid:[4026532707]'</span></span><br><span class="line">lrwxrwxrwx 1 root root 0 Jun 15 03:10 user -&gt; <span class="string">'user:[4026531837]'</span></span><br><span class="line">lrwxrwxrwx 1 root root 0 Jun 15 03:10 uts -&gt; <span class="string">'uts:[4026532705]'</span></span><br></pre></td></tr></table></figure></blockquote><h3 id="查看网络"><a class="markdownIt-Anchor" href="#查看网络"></a> 查看网络</h3><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><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></pre></td><td class="code"><pre><span class="line">$ docker <span class="built_in">exec</span> -it test1 ifconfig</span><br><span class="line">eth0      Link encap:Ethernet  HWaddr 02:42:AC:11:00:02</span><br><span class="line">          inet addr:172.17.0.2  Bcast:172.17.255.255  Mask:255.255.0.0</span><br><span class="line">          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1</span><br><span class="line">          RX packets:19 errors:0 dropped:0 overruns:0 frame:0</span><br><span class="line">          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0</span><br><span class="line">          collisions:0 txqueuelen:0</span><br><span class="line">          RX bytes:1522 (1.4 KiB)  TX bytes:0 (0.0 B)</span><br><span class="line"></span><br><span class="line">lo        Link encap:Local Loopback</span><br><span class="line">          inet addr:127.0.0.1  Mask:255.0.0.0</span><br><span class="line">          UP LOOPBACK RUNNING  MTU:65536  Metric:1</span><br><span class="line">          RX packets:0 errors:0 dropped:0 overruns:0 frame:0</span><br><span class="line">          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0</span><br><span class="line">          collisions:0 txqueuelen:1000</span><br><span class="line">          RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)</span><br><span class="line"></span><br><span class="line">$ docker <span class="built_in">exec</span> -it test2 ifconfig</span><br><span class="line">eth0      Link encap:Ethernet  HWaddr 02:42:AC:11:00:02</span><br><span class="line">          inet addr:172.17.0.2  Bcast:172.17.255.255  Mask:255.255.0.0</span><br><span class="line">          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1</span><br><span class="line">          RX packets:19 errors:0 dropped:0 overruns:0 frame:0</span><br><span class="line">          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0</span><br><span class="line">          collisions:0 txqueuelen:0</span><br><span class="line">          RX bytes:1522 (1.4 KiB)  TX bytes:0 (0.0 B)</span><br><span class="line"></span><br><span class="line">lo        Link encap:Local Loopback</span><br><span class="line">          inet addr:127.0.0.1  Mask:255.0.0.0</span><br><span class="line">          UP LOOPBACK RUNNING  MTU:65536  Metric:1</span><br><span class="line">          RX packets:0 errors:0 dropped:0 overruns:0 frame:0</span><br><span class="line">          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0</span><br><span class="line">          collisions:0 txqueuelen:1000</span><br><span class="line">          RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)</span><br></pre></td></tr></table></figure><p>两个container的eth0的IP，MAC等都相同</p><h2 id="pod"><a class="markdownIt-Anchor" href="#pod"></a> Pod</h2><h3 id="先起一个pod看看"><a class="markdownIt-Anchor" href="#先起一个pod看看"></a> 先起一个pod看看</h3><figure class="highlight yaml"><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></pre></td><td class="code"><pre><span class="line"><span class="attr">apiVersion:</span> <span class="string">v1</span></span><br><span class="line"><span class="attr">kind:</span> <span class="string">Pod</span></span><br><span class="line"><span class="attr">metadata:</span></span><br><span class="line">  <span class="attr">name:</span> <span class="string">two-containers</span></span><br><span class="line"><span class="attr">spec:</span></span><br><span class="line">  <span class="attr">containers:</span></span><br><span class="line">  <span class="bullet">-</span> <span class="attr">name:</span> <span class="string">my-test-container1</span></span><br><span class="line">    <span class="attr">image:</span> <span class="string">busybox</span></span><br><span class="line">    <span class="attr">imagePullPolicy:</span> <span class="string">Never</span></span><br><span class="line">    <span class="attr">stdin:</span> <span class="literal">true</span></span><br><span class="line">    <span class="attr">tty:</span> <span class="literal">true</span></span><br><span class="line">  <span class="bullet">-</span> <span class="attr">name:</span> <span class="string">my-test-container2</span></span><br><span class="line">    <span class="attr">image:</span> <span class="string">busybox</span></span><br><span class="line">    <span class="attr">imagePullPolicy:</span> <span class="string">Never</span></span><br><span class="line">    <span class="attr">stdin:</span> <span class="literal">true</span></span><br><span class="line">    <span class="attr">tty:</span> <span class="literal">true</span></span><br></pre></td></tr></table></figure><blockquote><p>注：因为已经pull了image，所以这里设置了<code>imagePullPolicy: Never</code></p></blockquote><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></pre></td><td class="code"><pre><span class="line">$ kubectl get pods</span><br><span class="line">NAME             READY   STATUS    RESTARTS   AGE</span><br><span class="line">two-containers   2/2     Running   0          3s</span><br></pre></td></tr></table></figure><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">$ docker ps</span><br><span class="line">CONTAINER ID        IMAGE                                               COMMAND                  CREATED              STATUS              PORTS               NAMES</span><br><span class="line">14aea3a7ec58        1c35c4412082                                        <span class="string">"sh"</span>                     About a minute ago   Up About a minute                       k8s_my-test-container2_two-containers_default_dd628b40-a070-4d9d-9837-7d3031092e86_0</span><br><span class="line">fb9a5a4e5ee2        1c35c4412082                                        <span class="string">"sh"</span>                     About a minute ago   Up About a minute                       k8s_my-test-container1_two-containers_default_dd628b40-a070-4d9d-9837-7d3031092e86_0</span><br><span class="line">bac4514284b2        registry.aliyuncs.com/google_containers/pause:3.2   <span class="string">"/pause"</span>                 About a minute ago   Up About a minute                       k8s_POD_two-containers_default_dd628b40-a070-4d9d-9837-7d3031092e86_0</span><br></pre></td></tr></table></figure><p>可以看到，分别起了3个container：</p><ul><li>k8s_my-test-container1_two-containers_default</li><li>k8s_my-test-container2_two-containers_default</li><li>k8s_POD_two-containers_default</li></ul><p>其中，<code>k8s_POD_two-containers_default</code>的image是<code>pause</code></p><h3 id="先看看namespace"><a class="markdownIt-Anchor" href="#先看看namespace"></a> 先看看namespace</h3><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><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></pre></td><td class="code"><pre><span class="line">$ docker inspect 14aea3a7ec58 | grep \"Pid\"</span><br><span class="line">            <span class="string">"Pid"</span>: 359647,</span><br><span class="line">$ docker inspect fb9a5a4e5ee2 | grep \"Pid\"</span><br><span class="line">            <span class="string">"Pid"</span>: 359614,</span><br><span class="line">$ docker inspect bac4514284b2 | grep \"Pid\"</span><br><span class="line">            <span class="string">"Pid"</span>: 359530,</span><br><span class="line">$ ls -l /proc/359647/ns</span><br><span class="line">total 0</span><br><span class="line">lrwxrwxrwx 1 root root 0 Jun 15 14:41 cgroup -&gt; <span class="string">'cgroup:[4026531835]'</span></span><br><span class="line">lrwxrwxrwx 1 root root 0 Jun 15 14:41 ipc -&gt; <span class="string">'ipc:[4026532625]'</span></span><br><span class="line">lrwxrwxrwx 1 root root 0 Jun 15 14:41 mnt -&gt; <span class="string">'mnt:[4026532715]'</span></span><br><span class="line">lrwxrwxrwx 1 root root 0 Jun 15 14:41 net -&gt; <span class="string">'net:[4026532628]'</span></span><br><span class="line">lrwxrwxrwx 1 root root 0 Jun 15 14:41 pid -&gt; <span class="string">'pid:[4026532717]'</span></span><br><span class="line">lrwxrwxrwx 1 root root 0 Jun 15 14:41 pid_for_children -&gt; <span class="string">'pid:[4026532717]'</span></span><br><span class="line">lrwxrwxrwx 1 root root 0 Jun 15 14:41 user -&gt; <span class="string">'user:[4026531837]'</span></span><br><span class="line">lrwxrwxrwx 1 root root 0 Jun 15 14:41 uts -&gt; <span class="string">'uts:[4026532716]'</span></span><br><span class="line">$ ls -l /proc/359614/ns</span><br><span class="line">total 0</span><br><span class="line">lrwxrwxrwx 1 root root 0 Jun 15 14:41 cgroup -&gt; <span class="string">'cgroup:[4026531835]'</span></span><br><span class="line">lrwxrwxrwx 1 root root 0 Jun 15 14:41 ipc -&gt; <span class="string">'ipc:[4026532625]'</span></span><br><span class="line">lrwxrwxrwx 1 root root 0 Jun 15 14:41 mnt -&gt; <span class="string">'mnt:[4026532710]'</span></span><br><span class="line">lrwxrwxrwx 1 root root 0 Jun 15 14:41 net -&gt; <span class="string">'net:[4026532628]'</span></span><br><span class="line">lrwxrwxrwx 1 root root 0 Jun 15 14:41 pid -&gt; <span class="string">'pid:[4026532714]'</span></span><br><span class="line">lrwxrwxrwx 1 root root 0 Jun 15 14:41 pid_for_children -&gt; <span class="string">'pid:[4026532714]'</span></span><br><span class="line">lrwxrwxrwx 1 root root 0 Jun 15 14:41 user -&gt; <span class="string">'user:[4026531837]'</span></span><br><span class="line">lrwxrwxrwx 1 root root 0 Jun 15 14:41 uts -&gt; <span class="string">'uts:[4026532713]'</span></span><br><span class="line">$ ls -l /proc/359530/ns</span><br><span class="line">total 0</span><br><span class="line">lrwxrwxrwx 1 root root 0 Jun 15 14:41 cgroup -&gt; <span class="string">'cgroup:[4026531835]'</span></span><br><span class="line">lrwxrwxrwx 1 root root 0 Jun 15 14:38 ipc -&gt; <span class="string">'ipc:[4026532625]'</span></span><br><span class="line">lrwxrwxrwx 1 root root 0 Jun 15 14:41 mnt -&gt; <span class="string">'mnt:[4026532623]'</span></span><br><span class="line">lrwxrwxrwx 1 root root 0 Jun 15 14:38 net -&gt; <span class="string">'net:[4026532628]'</span></span><br><span class="line">lrwxrwxrwx 1 root root 0 Jun 15 14:41 pid -&gt; <span class="string">'pid:[4026532626]'</span></span><br><span class="line">lrwxrwxrwx 1 root root 0 Jun 15 14:41 pid_for_children -&gt; <span class="string">'pid:[4026532626]'</span></span><br><span class="line">lrwxrwxrwx 1 root root 0 Jun 15 14:41 user -&gt; <span class="string">'user:[4026531837]'</span></span><br><span class="line">lrwxrwxrwx 1 root root 0 Jun 15 14:41 uts -&gt; <span class="string">'uts:[4026532624]'</span></span><br></pre></td></tr></table></figure><h3 id="看看ip"><a class="markdownIt-Anchor" href="#看看ip"></a> 看看IP</h3><ul><li>Pod层面</li></ul><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><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></pre></td><td class="code"><pre><span class="line">$ kubectl describe pod two-containers</span><br><span class="line">Name:         two-containers</span><br><span class="line">Namespace:    default</span><br><span class="line">Priority:     0</span><br><span class="line">Node:         node2/10.160.18.181</span><br><span class="line">Start Time:   Mon, 15 Jun 2020 14:38:10 +0800</span><br><span class="line">Labels:       &lt;none&gt;</span><br><span class="line">Annotations:  Status:  Running</span><br><span class="line">IP:           172.172.1.35</span><br><span class="line">IPs:</span><br><span class="line">  IP:  172.172.1.35</span><br><span class="line">Containers:</span><br><span class="line">  my-test-container1:</span><br><span class="line">    Container ID:   docker://fb9a5a4e5ee2eef15dddc159bdb507b435ebbbc189d3ceefbaca7d7d4dac994d</span><br><span class="line">    Image:          busybox</span><br><span class="line">    ...</span><br><span class="line">    Mounts:</span><br><span class="line">      /var/run/secrets/kubernetes.io/serviceaccount from default-token-nlz8h (ro)</span><br><span class="line">  my-test-container2:</span><br><span class="line">    Container ID:   docker://14aea3a7ec58e4f4220d6eea1266799a55fbdd945956d4845d4e062fce6542d7</span><br><span class="line">    Image:          busybox</span><br><span class="line">    ...</span><br><span class="line">    Mounts:</span><br><span class="line">      /var/run/secrets/kubernetes.io/serviceaccount from default-token-nlz8h (ro)</span><br><span class="line">...</span><br><span class="line">Volumes:</span><br><span class="line">  default-token-nlz8h:</span><br><span class="line">    Type:        Secret (a volume populated by a Secret)</span><br><span class="line">    SecretName:  default-token-nlz8h</span><br><span class="line">    Optional:    <span class="literal">false</span></span><br></pre></td></tr></table></figure><ul><li>Container层面</li></ul><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><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></pre></td><td class="code"><pre><span class="line">$ docker <span class="built_in">exec</span> -it 14aea3a7ec58 ifconfig</span><br><span class="line">eth0      Link encap:Ethernet  HWaddr 26:64:FF:FA:7D:BE</span><br><span class="line">          inet addr:172.172.1.35  Bcast:0.0.0.0  Mask:255.255.255.0</span><br><span class="line">          UP BROADCAST RUNNING MULTICAST  MTU:1450  Metric:1</span><br><span class="line">          RX packets:15 errors:0 dropped:0 overruns:0 frame:0</span><br><span class="line">          TX packets:1 errors:0 dropped:0 overruns:0 carrier:0</span><br><span class="line">          collisions:0 txqueuelen:0</span><br><span class="line">          RX bytes:1198 (1.1 KiB)  TX bytes:42 (42.0 B)</span><br><span class="line"></span><br><span class="line">lo        Link encap:Local Loopback</span><br><span class="line">          inet addr:127.0.0.1  Mask:255.0.0.0</span><br><span class="line">          UP LOOPBACK RUNNING  MTU:65536  Metric:1</span><br><span class="line">          RX packets:0 errors:0 dropped:0 overruns:0 frame:0</span><br><span class="line">          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0</span><br><span class="line">          collisions:0 txqueuelen:1000</span><br><span class="line">          RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)</span><br><span class="line"></span><br><span class="line">$ docker <span class="built_in">exec</span> -it fb9a5a4e5ee2 ifconfig</span><br><span class="line">eth0      Link encap:Ethernet  HWaddr 26:64:FF:FA:7D:BE</span><br><span class="line">          inet addr:172.172.1.35  Bcast:0.0.0.0  Mask:255.255.255.0</span><br><span class="line">          UP BROADCAST RUNNING MULTICAST  MTU:1450  Metric:1</span><br><span class="line">          RX packets:15 errors:0 dropped:0 overruns:0 frame:0</span><br><span class="line">          TX packets:1 errors:0 dropped:0 overruns:0 carrier:0</span><br><span class="line">          collisions:0 txqueuelen:0</span><br><span class="line">          RX bytes:1198 (1.1 KiB)  TX bytes:42 (42.0 B)</span><br><span class="line"></span><br><span class="line">lo        Link encap:Local Loopback</span><br><span class="line">          inet addr:127.0.0.1  Mask:255.0.0.0</span><br><span class="line">          UP LOOPBACK RUNNING  MTU:65536  Metric:1</span><br><span class="line">          RX packets:0 errors:0 dropped:0 overruns:0 frame:0</span><br><span class="line">          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0</span><br><span class="line">          collisions:0 txqueuelen:1000</span><br><span class="line">          RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)</span><br></pre></td></tr></table></figure><h2 id="pod共享volume"><a class="markdownIt-Anchor" href="#pod共享volume"></a> Pod共享volume</h2><h3 id="pod配置"><a class="markdownIt-Anchor" href="#pod配置"></a> Pod配置</h3><figure class="highlight yaml"><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></pre></td><td class="code"><pre><span class="line"><span class="attr">apiVersion:</span> <span class="string">v1</span></span><br><span class="line"><span class="attr">kind:</span> <span class="string">Pod</span></span><br><span class="line"><span class="attr">metadata:</span></span><br><span class="line">  <span class="attr">name:</span> <span class="string">two-containers-volume</span></span><br><span class="line"><span class="attr">spec:</span></span><br><span class="line">  <span class="attr">volumes:</span></span><br><span class="line">  <span class="bullet">-</span> <span class="attr">name:</span> <span class="string">shared-data</span></span><br><span class="line">    <span class="attr">hostPath:</span></span><br><span class="line">      <span class="attr">path:</span> <span class="string">/data</span></span><br><span class="line">  <span class="attr">containers:</span></span><br><span class="line">  <span class="bullet">-</span> <span class="attr">name:</span> <span class="string">c1</span></span><br><span class="line">    <span class="attr">image:</span> <span class="string">busybox</span></span><br><span class="line">    <span class="attr">imagePullPolicy:</span> <span class="string">Never</span></span><br><span class="line">    <span class="attr">stdin:</span> <span class="literal">true</span></span><br><span class="line">    <span class="attr">tty:</span> <span class="literal">true</span></span><br><span class="line">    <span class="attr">volumeMounts:</span></span><br><span class="line">    <span class="bullet">-</span> <span class="attr">name:</span> <span class="string">shared-data</span></span><br><span class="line">      <span class="attr">mountPath:</span> <span class="string">/data</span></span><br><span class="line">  <span class="bullet">-</span> <span class="attr">name:</span> <span class="string">c2</span></span><br><span class="line">    <span class="attr">image:</span> <span class="string">busybox</span></span><br><span class="line">    <span class="attr">imagePullPolicy:</span> <span class="string">Never</span></span><br><span class="line">    <span class="attr">stdin:</span> <span class="literal">true</span></span><br><span class="line">    <span class="attr">tty:</span> <span class="literal">true</span></span><br><span class="line">    <span class="attr">volumeMounts:</span></span><br><span class="line">    <span class="bullet">-</span> <span class="attr">name:</span> <span class="string">shared-data</span></span><br><span class="line">      <span class="attr">mountPath:</span> <span class="string">/data</span></span><br></pre></td></tr></table></figure><h3 id="查看pod信息"><a class="markdownIt-Anchor" href="#查看pod信息"></a> 查看pod信息</h3><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></pre></td><td class="code"><pre><span class="line">$ kubectl get pods</span><br><span class="line">NAME                    READY   STATUS    RESTARTS   AGE</span><br><span class="line">two-containers-volume   2/2     Running   0          5s</span><br></pre></td></tr></table></figure><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><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></pre></td><td class="code"><pre><span class="line">$ kubectl describe pod two-containers-volume</span><br><span class="line">Name:         two-containers-volume</span><br><span class="line">Namespace:    default</span><br><span class="line">Priority:     0</span><br><span class="line">Node:         node2/10.160.18.181</span><br><span class="line">Start Time:   Mon, 15 Jun 2020 14:53:43 +0800</span><br><span class="line">Labels:       &lt;none&gt;</span><br><span class="line">Annotations:  Status:  Running</span><br><span class="line">IP:           172.172.1.36</span><br><span class="line">IPs:</span><br><span class="line">  IP:  172.172.1.36</span><br><span class="line">Containers:</span><br><span class="line">  c1:</span><br><span class="line">    Container ID:   docker://b5b285305aae0d9155fca8415a1002697b0a446d222ce8f8bb27456c51680bc0</span><br><span class="line">    Image:          busybox</span><br><span class="line">    ...</span><br><span class="line">    Mounts:</span><br><span class="line">      /data from shared-data (rw)</span><br><span class="line">      /var/run/secrets/kubernetes.io/serviceaccount from default-token-nlz8h (ro)</span><br><span class="line">  c2:</span><br><span class="line">    Container ID:   docker://52767f5bfa9e246e79547b11bfca0eb5948f3458850beaf173fbd921e43aa949</span><br><span class="line">    Image:          busybox</span><br><span class="line">    ...</span><br><span class="line">    Mounts:</span><br><span class="line">      /data from shared-data (rw)</span><br><span class="line">      /var/run/secrets/kubernetes.io/serviceaccount from default-token-nlz8h (ro)</span><br><span class="line">...</span><br><span class="line">Volumes:</span><br><span class="line">  shared-data:</span><br><span class="line">    Type:          HostPath (bare host directory volume)</span><br><span class="line">    Path:          /data</span><br><span class="line">    HostPathType:</span><br><span class="line">  default-token-nlz8h:</span><br><span class="line">    Type:        Secret (a volume populated by a Secret)</span><br><span class="line">    SecretName:  default-token-nlz8h</span><br><span class="line">    Optional:    <span class="literal">false</span></span><br><span class="line">...</span><br></pre></td></tr></table></figure><blockquote><p>对比之前的，可以看到，volumes中增加了一个<code>shared-data</code>的volume，每个container的<code>Mounts</code>中多了一个<code>/data from shared-data (rw)</code></p></blockquote><h3 id="查看container层面的信息"><a class="markdownIt-Anchor" href="#查看container层面的信息"></a> 查看container层面的信息</h3><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">$ docker ps</span><br><span class="line">CONTAINER ID        IMAGE                                               COMMAND                  CREATED             STATUS              PORTS               NAMES</span><br><span class="line">52767f5bfa9e        1c35c4412082                                        <span class="string">"sh"</span>                     6 minutes ago       Up 6 minutes                            k8s_c2_two-containers-volume_default_a66c7066-35c2-4be6-b58a-0df6ede9d95d_0</span><br><span class="line">b5b285305aae        1c35c4412082                                        <span class="string">"sh"</span>                     6 minutes ago       Up 6 minutes                            k8s_c1_two-containers-volume_default_a66c7066-35c2-4be6-b58a-0df6ede9d95d_0</span><br><span class="line">09b081c04b1b        registry.aliyuncs.com/google_containers/pause:3.2   <span class="string">"/pause"</span>                 6 minutes ago       Up 6 minutes                            k8s_POD_two-containers-volume_default_a66c7066-35c2-4be6-b58a-0df6ede9d95d_0</span><br></pre></td></tr></table></figure><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><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><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br><span class="line">77</span><br><span class="line">78</span><br><span class="line">79</span><br><span class="line">80</span><br><span class="line">81</span><br><span class="line">82</span><br></pre></td><td class="code"><pre><span class="line">$ docker inspect 52767f5bfa9e</span><br><span class="line">[</span><br><span class="line">    &#123;</span><br><span class="line">        ...</span><br><span class="line">        <span class="string">"Name"</span>: <span class="string">"/k8s_c2_two-containers-volume_default_a66c7066-35c2-4be6-b58a-0df6ede9d95d_0"</span>,</span><br><span class="line">        ...</span><br><span class="line">        <span class="string">"HostConfig"</span>: &#123;</span><br><span class="line">            ...</span><br><span class="line">            <span class="string">"NetworkMode"</span>: <span class="string">"container:09b081c04b1ba2b973d7fb31aadd7d796d8f6aef03113764f4a868022b6332ee"</span>,</span><br><span class="line">            ...</span><br><span class="line">        &#125;,</span><br><span class="line">        ...</span><br><span class="line">        <span class="string">"Mounts"</span>: [</span><br><span class="line">            ...</span><br><span class="line">            &#123;</span><br><span class="line">                <span class="string">"Type"</span>: <span class="string">"bind"</span>,</span><br><span class="line">                <span class="string">"Source"</span>: <span class="string">"/data"</span>,</span><br><span class="line">                <span class="string">"Destination"</span>: <span class="string">"/data"</span>,</span><br><span class="line">                <span class="string">"Mode"</span>: <span class="string">""</span>,</span><br><span class="line">                <span class="string">"RW"</span>: <span class="literal">true</span>,</span><br><span class="line">                <span class="string">"Propagation"</span>: <span class="string">"rprivate"</span></span><br><span class="line">            &#125;,</span><br><span class="line">            ...</span><br><span class="line">        ],</span><br><span class="line">        ...</span><br><span class="line">    &#125;</span><br><span class="line">]</span><br><span class="line">$ docker inspect b5b285305aae</span><br><span class="line">[</span><br><span class="line">    &#123;</span><br><span class="line">        ...</span><br><span class="line">        <span class="string">"Name"</span>: <span class="string">"/k8s_c1_two-containers-volume_default_a66c7066-35c2-4be6-b58a-0df6ede9d95d_0"</span>,</span><br><span class="line">        ...</span><br><span class="line">        <span class="string">"HostConfig"</span>: &#123;</span><br><span class="line">            ...</span><br><span class="line">            <span class="string">"NetworkMode"</span>: <span class="string">"container:09b081c04b1ba2b973d7fb31aadd7d796d8f6aef03113764f4a868022b6332ee"</span>,</span><br><span class="line">            ...</span><br><span class="line">        &#125;,</span><br><span class="line">        ...</span><br><span class="line">        <span class="string">"Mounts"</span>: [</span><br><span class="line">            &#123;</span><br><span class="line">                <span class="string">"Type"</span>: <span class="string">"bind"</span>,</span><br><span class="line">                <span class="string">"Source"</span>: <span class="string">"/data"</span>,</span><br><span class="line">                <span class="string">"Destination"</span>: <span class="string">"/data"</span>,</span><br><span class="line">                <span class="string">"Mode"</span>: <span class="string">""</span>,</span><br><span class="line">                <span class="string">"RW"</span>: <span class="literal">true</span>,</span><br><span class="line">                <span class="string">"Propagation"</span>: <span class="string">"rprivate"</span></span><br><span class="line">            &#125;,</span><br><span class="line">            ...</span><br><span class="line">        ],</span><br><span class="line">        ...</span><br><span class="line">    &#125;</span><br><span class="line">]</span><br><span class="line">$ docker inspect 09b081c04b1b</span><br><span class="line">[</span><br><span class="line">    &#123;</span><br><span class="line">        ...</span><br><span class="line">        <span class="string">"Name"</span>: <span class="string">"/k8s_POD_two-containers-volume_default_a66c7066-35c2-4be6-b58a-0df6ede9d95d_0"</span>,</span><br><span class="line">        ...</span><br><span class="line">        <span class="string">"HostConfig"</span>: &#123;</span><br><span class="line">            ...</span><br><span class="line">            <span class="string">"NetworkMode"</span>: <span class="string">"none"</span>,</span><br><span class="line">            ...</span><br><span class="line">        &#125;,</span><br><span class="line">        ...</span><br><span class="line">        <span class="string">"Mounts"</span>: [],</span><br><span class="line">        ...</span><br><span class="line">        <span class="string">"NetworkSettings"</span>: &#123;</span><br><span class="line">            ...</span><br><span class="line">            <span class="string">"SandboxKey"</span>: <span class="string">"/var/run/docker/netns/cb1ed85e8f94"</span>,</span><br><span class="line">            ...</span><br><span class="line">            <span class="string">"Networks"</span>: &#123;</span><br><span class="line">                <span class="string">"none"</span>: &#123;</span><br><span class="line">                    ...</span><br><span class="line">                    <span class="string">"NetworkID"</span>: <span class="string">"d5b75ce86af4c81134a382c1b77ed2de74e8ec9d484a68a5002f52ed3905b239"</span>,</span><br><span class="line">                    <span class="string">"EndpointID"</span>: <span class="string">"f6ea091a8d1445dae3a4b961c6cfbfa05c671f604dab8c9284eca959d02e7867"</span>,</span><br><span class="line">                    ...</span><br><span class="line">                &#125;</span><br><span class="line">            &#125;</span><br><span class="line">        &#125;</span><br><span class="line">    &#125;</span><br><span class="line">]</span><br></pre></td></tr></table></figure><blockquote><p>说明：</p><ul><li><code>k8s_POD_two-containers-volume_default</code>这个container的<code>NetworkSettings</code>字段声明有网络相关内容，但Mounts为空</li><li><code>k8s_c1</code>和<code>k8s_c2</code>的container的<code>NetworkSettings</code>为空，但Mounts中则挂载了<code>/data</code>目录</li></ul></blockquote><h2 id="init-container"><a class="markdownIt-Anchor" href="#init-container"></a> Init container</h2><figure class="highlight yaml"><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></pre></td><td class="code"><pre><span class="line"><span class="attr">apiVersion:</span> <span class="string">v1</span></span><br><span class="line"><span class="attr">kind:</span> <span class="string">Pod</span></span><br><span class="line"><span class="attr">metadata:</span></span><br><span class="line">  <span class="attr">name:</span> <span class="string">init-container-test</span></span><br><span class="line"><span class="attr">spec:</span></span><br><span class="line">  <span class="attr">volumes:</span></span><br><span class="line">  <span class="bullet">-</span> <span class="attr">name:</span> <span class="string">app-volume</span></span><br><span class="line">    <span class="attr">emptyDir:</span> <span class="string">&#123;&#125;</span></span><br><span class="line">  <span class="attr">initContainers:</span></span><br><span class="line">  <span class="bullet">-</span> <span class="attr">image:</span> <span class="string">busybox</span></span><br><span class="line">    <span class="attr">imagePullPolicy:</span> <span class="string">Never</span></span><br><span class="line">    <span class="attr">name:</span> <span class="string">data-container</span></span><br><span class="line">    <span class="attr">stdin:</span> <span class="literal">true</span></span><br><span class="line">    <span class="attr">tty:</span> <span class="literal">true</span></span><br><span class="line">    <span class="attr">command:</span> <span class="string">["touch",</span> <span class="string">"/data/test.txt"</span><span class="string">]</span></span><br><span class="line">    <span class="attr">volumeMounts:</span></span><br><span class="line">    <span class="bullet">-</span> <span class="attr">mountPath:</span> <span class="string">"/data"</span></span><br><span class="line">      <span class="attr">name:</span> <span class="string">app-volume</span></span><br><span class="line">  <span class="attr">containers:</span></span><br><span class="line">  <span class="bullet">-</span> <span class="attr">image:</span> <span class="string">busybox</span></span><br><span class="line">    <span class="attr">imagePullPolicy:</span> <span class="string">Never</span></span><br><span class="line">    <span class="attr">name:</span> <span class="string">app-container</span></span><br><span class="line">    <span class="attr">stdin:</span> <span class="literal">true</span></span><br><span class="line">    <span class="attr">tty:</span> <span class="literal">true</span></span><br><span class="line">    <span class="attr">volumeMounts:</span></span><br><span class="line">    <span class="bullet">-</span> <span class="attr">mountPath:</span> <span class="string">"/data"</span></span><br><span class="line">      <span class="attr">name:</span> <span class="string">app-volume</span></span><br></pre></td></tr></table></figure><h3 id="查看pod状况"><a class="markdownIt-Anchor" href="#查看pod状况"></a> 查看pod状况</h3><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></pre></td><td class="code"><pre><span class="line">$ kubectl get pod</span><br><span class="line">NAME                  READY   STATUS    RESTARTS   AGE</span><br><span class="line">init-container-test   1/1     Running   0          5s</span><br></pre></td></tr></table></figure><h3 id="查看container"><a class="markdownIt-Anchor" href="#查看container"></a> 查看container</h3><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></pre></td><td class="code"><pre><span class="line">$ docker ps</span><br><span class="line">CONTAINER ID        IMAGE                                               COMMAND                  CREATED             STATUS              PORTS               NAMES</span><br><span class="line">ce67fd98bc68        1c35c4412082                                        <span class="string">"sh"</span>                     30 seconds ago      Up 29 seconds                           k8s_app-container_init-container-test_default_5960cae6-00b3-48ae-9991-741d73077dc4_0</span><br><span class="line">e75657cb2079        registry.aliyuncs.com/google_containers/pause:3.2   <span class="string">"/pause"</span>                 31 seconds ago      Up 30 seconds                           k8s_POD_init-container-test_default_5960cae6-00b3-48ae-9991-741d73077dc4_0</span><br></pre></td></tr></table></figure><blockquote><p>会发现这里只有一个<code>k8s_app-container</code>和<code>k8s_POD</code>，而没有<code>init-container</code></p><p>是因为</p><blockquote><p>在 Pod 中，所有 Init Container 定义的容器，都会比 spec.containers 定义的用户容器先启动。并且，Init Container 容器会按顺序逐一启动，而直到它们都启动并且退出了，用户容器才会启动。</p></blockquote><p>但k8s并没有在这个container结束运行后重启它</p></blockquote><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">$ docker ps -a</span><br><span class="line">CONTAINER ID        IMAGE                                                COMMAND                  CREATED             STATUS                      PORTS               NAMES</span><br><span class="line">ce67fd98bc68        1c35c4412082                                         <span class="string">"sh"</span>                     36 seconds ago      Up 36 seconds                                   k8s_app-container_init-container-test_default_5960cae6-00b3-48ae-9991-741d73077dc4_0</span><br><span class="line">bbc45d10357c        1c35c4412082                                         <span class="string">"touch /data/test.txt"</span>   37 seconds ago      Exited (0) 37 seconds ago                       k8s_data-container_init-container-test_default_5960cae6-00b3-48ae-9991-741d73077dc4_0</span><br><span class="line">e75657cb2079        registry.aliyuncs.com/google_containers/pause:3.2    <span class="string">"/pause"</span>                 37 seconds ago      Up 37 seconds                                   k8s_POD_init-container-test_default_5960cae6-00b3-48ae-9991-741d73077dc4_0</span><br></pre></td></tr></table></figure><blockquote><p>从这里可以看到， <code>data-container</code>已经<code>Exited (0) 37 seconds ago</code></p></blockquote><figure class="highlight bash"><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">$ kubectl <span class="built_in">exec</span> init-container-test -- ls /data</span><br><span class="line">test.txt</span><br></pre></td></tr></table></figure><blockquote><p>通过容器可以看到test.txt已经存在在<code>init-container-test</code>的<code>/data</code>目录下了</p></blockquote><h2 id="总结引用"><a class="markdownIt-Anchor" href="#总结引用"></a> 总结引用</h2><ul><li>一个运行在虚拟机里的应用，哪怕再简单，也是被管理在 systemd 或者 supervisord 之下的一组进程，而不是一个进程。</li><li>对于容器来说，一个容器永远只能管理一个进程</li><li>Pod，实际上是在扮演传统基础设施里“虚拟机”的角色；而容器，则是这个虚拟机里运行的用户程序。</li></ul>]]></content>
    
    <summary type="html">
    
      &lt;blockquote&gt;
&lt;p&gt;学习极客时间上的&lt;a href=&quot;https://time.geekbang.org/column/intro/116&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;《深入剖析Kubernetes》&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;秉持眼过千遍不如手过一遍的原则.&lt;/p&gt;
&lt;p&gt;对应章节：&lt;a href=&quot;https://time.geekbang.org/column/article/40092&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;13 | 为什么我们需要Pod？&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
    
    </summary>
    
    
      <category term="k8s" scheme="http://www.isimble.com/categories/k8s/"/>
    
    
      <category term="docker" scheme="http://www.isimble.com/tags/docker/"/>
    
      <category term="Kubernetes" scheme="http://www.isimble.com/tags/Kubernetes/"/>
    
  </entry>
  
  <entry>
    <title>K8s学习笔记——重新认识Docker容器</title>
    <link href="http://www.isimble.com/2020/06/23/kubernetesLearning04/"/>
    <id>http://www.isimble.com/2020/06/23/kubernetesLearning04/</id>
    <published>2020-06-23T04:48:13.000Z</published>
    <updated>2020-06-23T04:57:09.217Z</updated>
    
    <content type="html"><![CDATA[<blockquote><p>学习极客时间上的<a href="https://time.geekbang.org/column/intro/116" target="_blank" rel="noopener">《深入剖析Kubernetes》</a></p><p>秉持眼过千遍不如手过一遍的原则.</p><p>对应章节：<a href="https://time.geekbang.org/column/article/18119" target="_blank" rel="noopener">08 | 白话容器基础（四）：重新认识Docker容器</a></p></blockquote><a id="more"></a><h2 id="build一个镜像"><a class="markdownIt-Anchor" href="#build一个镜像"></a> build一个镜像</h2><h3 id="创建flask相关文件"><a class="markdownIt-Anchor" href="#创建flask相关文件"></a> 创建Flask相关文件</h3><ul><li><a href="http://app.py" target="_blank" rel="noopener">app.py</a></li></ul><figure class="highlight python"><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"><span class="keyword">from</span> flask <span class="keyword">import</span> Flask</span><br><span class="line"><span class="keyword">import</span> socket</span><br><span class="line"><span class="keyword">import</span> os</span><br><span class="line"></span><br><span class="line">app = Flask(__name__)</span><br><span class="line"></span><br><span class="line"><span class="meta">@app.route('/')</span></span><br><span class="line"><span class="function"><span class="keyword">def</span> <span class="title">hello</span><span class="params">()</span>:</span></span><br><span class="line">    html = <span class="string">"&lt;h3&gt;Hello &#123;name&#125;!&lt;/h3&gt;"</span> \</span><br><span class="line">           <span class="string">"&lt;b&gt;Hostname:&lt;/b&gt; &#123;hostname&#125;&lt;br/&gt;"</span>           </span><br><span class="line">    <span class="keyword">return</span> html.format(name=os.getenv(<span class="string">"NAME"</span>, <span class="string">"world"</span>), hostname=socket.gethostname())</span><br><span class="line">    </span><br><span class="line"><span class="keyword">if</span> __name__ == <span class="string">"__main__"</span>:</span><br><span class="line">    app.run(host=<span class="string">'0.0.0.0'</span>, port=<span class="number">80</span>)</span><br></pre></td></tr></table></figure><ul><li>requirements.txt</li></ul><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">Flask</span><br></pre></td></tr></table></figure><h3 id="创建dockerfile"><a class="markdownIt-Anchor" href="#创建dockerfile"></a> 创建Dockerfile</h3><figure class="highlight dockerfile"><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></pre></td><td class="code"><pre><span class="line"><span class="keyword">FROM</span> python:<span class="number">2.7</span>-slim</span><br><span class="line"></span><br><span class="line"><span class="keyword">WORKDIR</span><span class="bash"> /app</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># app.py和requirements.txt都放在当前文件夹的app目录下</span></span><br><span class="line"><span class="keyword">ADD</span><span class="bash"> ./app /app</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># 使用pip命令安装这个应用所需要的依赖</span></span><br><span class="line"><span class="keyword">RUN</span><span class="bash"> pip install --trusted-host pypi.python.org -r requirements.txt</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># 允许外界访问容器的80端口</span></span><br><span class="line"><span class="keyword">EXPOSE</span> <span class="number">80</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># 设置环境变量</span></span><br><span class="line"><span class="keyword">ENV</span> NAME World</span><br><span class="line"></span><br><span class="line"><span class="comment"># 设置容器进程为：python app.py，即：这个Python应用的启动命令</span></span><br><span class="line"><span class="keyword">CMD</span><span class="bash"> [<span class="string">"python"</span>, <span class="string">"app.py"</span>]</span></span><br></pre></td></tr></table></figure><p>当前目录结构</p><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><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">$ tree .</span><br><span class="line">.</span><br><span class="line">├── app</span><br><span class="line">│   ├── app.py</span><br><span class="line">│   └── requirements.txt</span><br><span class="line">└── Dockerfile</span><br><span class="line"></span><br><span class="line">1 directory, 3 files</span><br></pre></td></tr></table></figure><h3 id="build-docker镜像"><a class="markdownIt-Anchor" href="#build-docker镜像"></a> build docker镜像</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">$ docker build -t flaskapp .</span><br></pre></td></tr></table></figure><p>当build镜像时：</p><ol><li>docker每执行一行，会以上一层为基础拉起一个容器</li><li>然后在这个容器里执行对应的命令</li><li>完成后，将这一层提交成一个image</li></ol><h3 id="查看镜像的build-history"><a class="markdownIt-Anchor" href="#查看镜像的build-history"></a> 查看镜像的build history</h3><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">$ docker <span class="built_in">history</span> 06e1a19665ce</span><br><span class="line">IMAGE               CREATED             CREATED BY                                      SIZE                COMMENT</span><br><span class="line">06e1a19665ce        5 weeks ago         /bin/sh -c apk update &amp;&amp; apk add nginx          2.98MB</span><br><span class="line">f70734b6a266        2 months ago        /bin/sh -c <span class="comment">#(nop)  CMD ["/bin/sh"]              0B</span></span><br><span class="line">&lt;missing&gt;           2 months ago        /bin/sh -c <span class="comment">#(nop) ADD file:b91adb67b670d3a6f…   5.61MB</span></span><br></pre></td></tr></table></figure><h2 id="docker-exec的本质"><a class="markdownIt-Anchor" href="#docker-exec的本质"></a> docker exec的本质</h2><h3 id="进入一个namespace"><a class="markdownIt-Anchor" href="#进入一个namespace"></a> 进入一个namespace</h3><ul><li><code>set_ns.c</code></li></ul><figure class="highlight c"><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></pre></td><td class="code"><pre><span class="line"><span class="meta">#<span class="meta-keyword">define</span> _GNU_SOURCE</span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">include</span> <span class="meta-string">&lt;fcntl.h&gt;</span></span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">include</span> <span class="meta-string">&lt;sched.h&gt;</span></span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">include</span> <span class="meta-string">&lt;unistd.h&gt;</span></span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">include</span> <span class="meta-string">&lt;stdlib.h&gt;</span></span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">include</span> <span class="meta-string">&lt;stdio.h&gt;</span></span></span><br><span class="line"></span><br><span class="line"><span class="meta">#<span class="meta-keyword">define</span> errExit(msg) do &#123; perror(msg); exit(EXIT_FAILURE);&#125; while (0)</span></span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">int</span> <span class="title">main</span><span class="params">(<span class="keyword">int</span> argc, <span class="keyword">char</span> *argv[])</span> </span>&#123;</span><br><span class="line">    <span class="keyword">int</span> fd;</span><br><span class="line">    </span><br><span class="line">    fd = <span class="built_in">open</span>(argv[<span class="number">1</span>], O_RDONLY);</span><br><span class="line">    <span class="keyword">if</span> (setns(fd, <span class="number">0</span>) == <span class="number">-1</span>) &#123;</span><br><span class="line">        errExit(<span class="string">"setns"</span>);</span><br><span class="line">    &#125;</span><br><span class="line">    execvp(argv[<span class="number">2</span>], &amp;argv[<span class="number">2</span>]); </span><br><span class="line">    errExit(<span class="string">"execvp"</span>);</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">$ gcc -o set_ns set_ns.c</span><br></pre></td></tr></table></figure><h3 id="启动一个container"><a class="markdownIt-Anchor" href="#启动一个container"></a> 启动一个container</h3><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></pre></td><td class="code"><pre><span class="line">$ docker run -it -d --rm ubuntu</span><br><span class="line">59ed1b0423ac42b5659e9c3d1759000e934c8383f605875d86db42b6ae7bf098</span><br><span class="line">$ docker inspect 59ed1b0423a | grep \"Pid\"</span><br><span class="line">            <span class="string">"Pid"</span>: 14123,</span><br></pre></td></tr></table></figure><h3 id="查看进程相关ns"><a class="markdownIt-Anchor" href="#查看进程相关ns"></a> 查看进程相关ns</h3><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><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">$ ls /proc/14123/ns/ -l</span><br><span class="line">total 0</span><br><span class="line">lrwxrwxrwx 1 root root 0 Jun 16 07:34 cgroup -&gt; <span class="string">'cgroup:[4026531835]'</span></span><br><span class="line">lrwxrwxrwx 1 root root 0 Jun 16 07:34 ipc -&gt; <span class="string">'ipc:[4026532571]'</span></span><br><span class="line">lrwxrwxrwx 1 root root 0 Jun 16 07:34 mnt -&gt; <span class="string">'mnt:[4026532569]'</span></span><br><span class="line">lrwxrwxrwx 1 root root 0 Jun 16 07:32 net -&gt; <span class="string">'net:[4026532574]'</span></span><br><span class="line">lrwxrwxrwx 1 root root 0 Jun 16 07:34 pid -&gt; <span class="string">'pid:[4026532572]'</span></span><br><span class="line">lrwxrwxrwx 1 root root 0 Jun 16 07:34 pid_for_children -&gt; <span class="string">'pid:[4026532572]'</span></span><br><span class="line">lrwxrwxrwx 1 root root 0 Jun 16 07:34 user -&gt; <span class="string">'user:[4026531837]'</span></span><br><span class="line">lrwxrwxrwx 1 root root 0 Jun 16 07:34 uts -&gt; <span class="string">'uts:[4026532570]'</span></span><br></pre></td></tr></table></figure><h3 id="以net的namespace运行ifconfig"><a class="markdownIt-Anchor" href="#以net的namespace运行ifconfig"></a> 以net的namespace运行ifconfig</h3><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><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></pre></td><td class="code"><pre><span class="line">$ ./set_ns /proc/14123/ns/net /bin/bash</span><br><span class="line">$ ifconfig</span><br><span class="line">eth0: flags=4163&lt;UP,BROADCAST,RUNNING,MULTICAST&gt;  mtu 1500</span><br><span class="line">        inet 172.17.0.2  netmask 255.255.0.0  broadcast 172.17.255.255</span><br><span class="line">        ether 02:42:ac:11:00:02  txqueuelen 0  (Ethernet)</span><br><span class="line">        RX packets 13  bytes 1046 (1.0 KB)</span><br><span class="line">        RX errors 0  dropped 0  overruns 0  frame 0</span><br><span class="line">        TX packets 0  bytes 0 (0.0 B)</span><br><span class="line">        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0</span><br><span class="line"></span><br><span class="line">lo: flags=73&lt;UP,LOOPBACK,RUNNING&gt;  mtu 65536</span><br><span class="line">        inet 127.0.0.1  netmask 255.0.0.0</span><br><span class="line">        loop  txqueuelen 1000  (Local Loopback)</span><br><span class="line">        RX packets 0  bytes 0 (0.0 B)</span><br><span class="line">        RX errors 0  dropped 0  overruns 0  frame 0</span><br><span class="line">        TX packets 0  bytes 0 (0.0 B)</span><br><span class="line">        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0</span><br></pre></td></tr></table></figure><h3 id="分别用set_ns和docker-exec查看"><a class="markdownIt-Anchor" href="#分别用set_ns和docker-exec查看"></a> 分别用set_ns和docker exec查看</h3><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">$ ps -aux | grep /bin/bash</span><br><span class="line">root     14123  0.0  0.3   4112  3288 pts/0    Ss+  07:32   0:00 /bin/bash</span><br><span class="line">root     14682  0.0  5.8 706028 58772 pts/3    Sl+  07:47   0:00 docker <span class="built_in">exec</span> -it 59ed1b0423ac /bin/bash</span><br><span class="line">root     14698  0.0  0.3   4112  3376 pts/1    Ss+  07:47   0:00 /bin/bash</span><br><span class="line">root     14722  0.0  0.3  20416  3792 pts/4    S+   07:52   0:00 /bin/bash</span><br></pre></td></tr></table></figure><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><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line">$ ls -l /proc/14123/ns/net</span><br><span class="line">lrwxrwxrwx 1 root root 0 Jun 16 07:32 /proc/14123/ns/net -&gt; <span class="string">'net:[4026532574]'</span></span><br><span class="line">$ ls -l /proc/14698/ns/net</span><br><span class="line">lrwxrwxrwx 1 root root 0 Jun 16 07:49 /proc/14698/ns/net -&gt; <span class="string">'net:[4026532574]'</span></span><br><span class="line">$ ls -l /proc/14722/ns/net</span><br><span class="line">lrwxrwxrwx 1 root root 0 Jun 16 07:52 /proc/14722/ns/net -&gt; <span class="string">'net:[4026532574]'</span></span><br></pre></td></tr></table></figure><blockquote><p>可以看出，最终都指向了同一个net namespace</p></blockquote><blockquote><p>Linux的ip命令也支持创建一个network namespace，如：</p><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></pre></td><td class="code"><pre><span class="line">$ ip netns add ns_test</span><br><span class="line">$ ip netns <span class="built_in">exec</span> ns_test /bin/bash</span><br><span class="line">$ ifconfig</span><br><span class="line"><span class="comment"># 由于并没有为这个namespace设定接口，所以，这里显示为空</span></span><br></pre></td></tr></table></figure><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></pre></td><td class="code"><pre><span class="line">$ ps -aux | grep /bin/bash</span><br><span class="line">root     14956  0.0  0.4  20416  4056 pts/0    S+   08:33   0:00 /bin/bash</span><br><span class="line">$ ls -l /proc/14956/ns/net</span><br><span class="line">lrwxrwxrwx 1 root root 0 Jun 16 08:33 /proc/14956/ns/net -&gt; <span class="string">'net:[4026532629]'</span></span><br></pre></td></tr></table></figure><p>当然，同样可以使用前面的set_ns的工具进行查看</p><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></pre></td><td class="code"><pre><span class="line">$ ./set_ns /proc/14956/ns/net /bin/bash</span><br><span class="line">$ ifconfig</span><br><span class="line"><span class="comment"># 这里同样没有内容输出</span></span><br></pre></td></tr></table></figure><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">$ ps -aux | grep /bin/bash</span><br><span class="line">root     14956  0.0  0.4  20416  4056 pts/0    S+   08:33   0:00 /bin/bash</span><br><span class="line">root     14992  0.0  0.4  20416  4084 pts/4    S+   08:42   0:00 /bin/bash</span><br><span class="line">$ ls -l /proc/14992/ns/net</span><br><span class="line">lrwxrwxrwx 1 root root 0 Jun 16 08:45 /proc/14992/ns/net -&gt; <span class="string">'net:[4026532629]'</span></span><br></pre></td></tr></table></figure><p>可以看到，使用ip命令进入namespace和set_ns进入namespace后的的<code>/bin/bash</code>的ns</p></blockquote><h2 id="volume的本质"><a class="markdownIt-Anchor" href="#volume的本质"></a> Volume的本质</h2><h3 id="启动一个挂载volume的容器"><a class="markdownIt-Anchor" href="#启动一个挂载volume的容器"></a> 启动一个挂载volume的容器</h3><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">$ docker run --rm -it -d -v /<span class="built_in">test</span> ubuntu</span><br><span class="line">65f6facb7c3c8e2f239bed07481e70ca7e0d09fc61617d0ef07e00a066ae7f96</span><br><span class="line">$ docker volume ls</span><br><span class="line">DRIVER              VOLUME NAME</span><br><span class="line"><span class="built_in">local</span>               ca1683d1e9cc06657c7857d8b8c7196176a59e409d74fc72ff30f0a76f98d614</span><br></pre></td></tr></table></figure><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><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></pre></td><td class="code"><pre><span class="line">$ docker inspect 65f6fa</span><br><span class="line">[</span><br><span class="line">    &#123;</span><br><span class="line">        <span class="string">"Id"</span>: <span class="string">"65f6facb7c3c8e2f239bed07481e70ca7e0d09fc61617d0ef07e00a066ae7f96"</span>,</span><br><span class="line">        ...</span><br><span class="line">        <span class="string">"Mounts"</span>: [</span><br><span class="line">            &#123;</span><br><span class="line">                <span class="string">"Type"</span>: <span class="string">"volume"</span>,</span><br><span class="line">                <span class="string">"Name"</span>: <span class="string">"ca1683d1e9cc06657c7857d8b8c7196176a59e409d74fc72ff30f0a76f98d614"</span>,</span><br><span class="line">                <span class="string">"Source"</span>: <span class="string">"/var/lib/docker/volumes/ca1683d1e9cc06657c7857d8b8c7196176a59e409d74fc72ff30f0a76f98d614/_data"</span>,</span><br><span class="line">                <span class="string">"Destination"</span>: <span class="string">"/test"</span>,</span><br><span class="line">                <span class="string">"Driver"</span>: <span class="string">"local"</span>,</span><br><span class="line">                <span class="string">"Mode"</span>: <span class="string">""</span>,</span><br><span class="line">                <span class="string">"RW"</span>: <span class="literal">true</span>,</span><br><span class="line">                <span class="string">"Propagation"</span>: <span class="string">""</span></span><br><span class="line">            &#125;</span><br><span class="line">        ],</span><br><span class="line">        ...</span><br><span class="line">]</span><br></pre></td></tr></table></figure><p>可以看到，在不指定本地目录的时候，docker会自动创建一个volume，且在<code>/var/lib/docker/volumes</code>下创建一个目录</p><h3 id="启动一个挂载本地目录的容器"><a class="markdownIt-Anchor" href="#启动一个挂载本地目录的容器"></a> 启动一个挂载本地目录的容器</h3><figure class="highlight bash"><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">$ docker run --rm -it -d -v /<span class="built_in">test</span>:/<span class="built_in">test</span> ubuntu</span><br><span class="line">ddbbb888a84a3b700a321db79e0743576d894a2c6c6b9be58f73142d921b60aa</span><br></pre></td></tr></table></figure><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><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></pre></td><td class="code"><pre><span class="line">$ docker inspect ddbbb8</span><br><span class="line">[</span><br><span class="line">    &#123;</span><br><span class="line">        <span class="string">"Id"</span>: <span class="string">"ddbbb888a84a3b700a321db79e0743576d894a2c6c6b9be58f73142d921b60aa"</span>,</span><br><span class="line">        ...</span><br><span class="line">        <span class="string">"Mounts"</span>: [</span><br><span class="line">            &#123;</span><br><span class="line">                <span class="string">"Type"</span>: <span class="string">"bind"</span>,</span><br><span class="line">                <span class="string">"Source"</span>: <span class="string">"/test"</span>,</span><br><span class="line">                <span class="string">"Destination"</span>: <span class="string">"/test"</span>,</span><br><span class="line">                <span class="string">"Mode"</span>: <span class="string">""</span>,</span><br><span class="line">                <span class="string">"RW"</span>: <span class="literal">true</span>,</span><br><span class="line">                <span class="string">"Propagation"</span>: <span class="string">"rprivate"</span></span><br><span class="line">            &#125;</span><br><span class="line">        ],</span><br><span class="line">        ...</span><br><span class="line">]</span><br></pre></td></tr></table></figure><h3 id="volume挂载的真相"><a class="markdownIt-Anchor" href="#volume挂载的真相"></a> Volume挂载的真相</h3><p><strong>这一段话有必要引述</strong></p><blockquote><p>Docker 又是如何做到把一个宿主机上的目录或者文件，挂载到容器里面去呢？难道又是 Mount Namespace 的黑科技吗？</p><p>实际上，并不需要这么麻烦。在《白话容器基础（三）：深入理解容器镜像》的分享中，我已经介绍过，当容器进程被创建之后，尽管开启了 Mount Namespace，但是在它执行 chroot（或者 pivot_root）之前，容器进程一直可以看到宿主机上的整个文件系统。而宿主机上的文件系统，也自然包括了我们要使用的容器镜像。这个镜像的各个层，保存在 /var/lib/docker/aufs/diff 目录下，在容器进程启动后，它们会被联合挂载在 /var/lib/docker/aufs/mnt/ 目录中，这样容器所需的 rootfs 就准备好了。</p><p>所以，我们只需要在 rootfs 准备好之后，在执行 chroot 之前，把 Volume 指定的宿主机目录（比如 /home 目录），挂载到指定的容器目录（比如 /test 目录）在宿主机上对应的目录（即 /var/lib/docker/aufs/mnt/[可读写层 ID]/test）上，这个 Volume 的挂载工作就完成了</p></blockquote><p>由此可见，如果要将一个目录挂载到一个容器里，其操作是：</p><ul><li>进入mount namespace</li><li>将需要挂载的目录挂载到容器的目录上</li><li><code>chroot</code>切换到对应的文件系统</li></ul><h4 id="示例"><a class="markdownIt-Anchor" href="#示例"></a> 示例</h4><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></pre></td><td class="code"><pre><span class="line">$ docker ps</span><br><span class="line">CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES</span><br><span class="line">65f6facb7c3c        ubuntu              <span class="string">"/bin/bash"</span>         14 minutes ago      Up 14 minutes                           recursing_clarke</span><br></pre></td></tr></table></figure><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><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></pre></td><td class="code"><pre><span class="line">$ docker inspect 65f6facb7c3c</span><br><span class="line">[</span><br><span class="line">    &#123;</span><br><span class="line">        <span class="string">"Id"</span>: <span class="string">"65f6facb7c3c8e2f239bed07481e70ca7e0d09fc61617d0ef07e00a066ae7f96"</span>,</span><br><span class="line">        ...</span><br><span class="line">        <span class="string">"GraphDriver"</span>: &#123;</span><br><span class="line">            <span class="string">"Data"</span>: &#123;</span><br><span class="line">                <span class="string">"LowerDir"</span>: <span class="string">"/var/lib/docker/overlay2/9f0bd8e84ddffd8663f01c959a0ced115a4d598b096896be15b3c680039d7754-init/diff:/var/lib/docker/overlay2/17bd5da0cda20e8ecd1d4955d25f49609ff0d7aa72fe45a0388a357fcc5b625f/diff:/var/lib/docker/overlay2/823e415d4256d05fb0101af4dcc42a4389d44cf6467972d654e93e0cc575cd9b/diff:/var/lib/docker/overlay2/37d3e588905fae55c8a0481e9cda7be36177af874631abb15724c893887e260b/diff:/var/lib/docker/overlay2/40d198d6f624e455800254766eb6a7190ce02442fc48f02f6f16f72105cefd0d/diff"</span>,</span><br><span class="line">                <span class="string">"MergedDir"</span>: <span class="string">"/var/lib/docker/overlay2/9f0bd8e84ddffd8663f01c959a0ced115a4d598b096896be15b3c680039d7754/merged"</span>,</span><br><span class="line">                <span class="string">"UpperDir"</span>: <span class="string">"/var/lib/docker/overlay2/9f0bd8e84ddffd8663f01c959a0ced115a4d598b096896be15b3c680039d7754/diff"</span>,</span><br><span class="line">                <span class="string">"WorkDir"</span>: <span class="string">"/var/lib/docker/overlay2/9f0bd8e84ddffd8663f01c959a0ced115a4d598b096896be15b3c680039d7754/work"</span></span><br><span class="line">            &#125;,</span><br><span class="line">            <span class="string">"Name"</span>: <span class="string">"overlay2"</span></span><br><span class="line">        &#125;,</span><br><span class="line">        <span class="string">"Mounts"</span>: [</span><br><span class="line">            &#123;</span><br><span class="line">                <span class="string">"Type"</span>: <span class="string">"volume"</span>,</span><br><span class="line">                <span class="string">"Name"</span>: <span class="string">"ca1683d1e9cc06657c7857d8b8c7196176a59e409d74fc72ff30f0a76f98d614"</span>,</span><br><span class="line">                <span class="string">"Source"</span>: <span class="string">"/var/lib/docker/volumes/ca1683d1e9cc06657c7857d8b8c7196176a59e409d74fc72ff30f0a76f98d614/_data"</span>,</span><br><span class="line">                <span class="string">"Destination"</span>: <span class="string">"/test"</span>,</span><br><span class="line">                <span class="string">"Driver"</span>: <span class="string">"local"</span>,</span><br><span class="line">                <span class="string">"Mode"</span>: <span class="string">""</span>,</span><br><span class="line">                <span class="string">"RW"</span>: <span class="literal">true</span>,</span><br><span class="line">                <span class="string">"Propagation"</span>: <span class="string">""</span></span><br><span class="line">            &#125;</span><br><span class="line">        ],</span><br><span class="line">        ...</span><br><span class="line">]</span><br></pre></td></tr></table></figure><p>可以看到<code>Mounts</code>中的<code>/var/lib/docker/volumes/ca1683d1e9cc06657c7857d8b8c7196176a59e409d74fc72ff30f0a76f98d614/_data</code></p><p><code>UpperDir</code>中已经可以看到test目录了</p><figure class="highlight bash"><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">$ ls /var/lib/docker/overlay2/9f0bd8e84ddffd8663f01c959a0ced115a4d598b096896be15b3c680039d7754/diff/</span><br><span class="line"><span class="built_in">test</span></span><br></pre></td></tr></table></figure><p>现在，在docker中创建一个文件</p><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></pre></td><td class="code"><pre><span class="line">$ docker <span class="built_in">exec</span> -it 65f6facb7c3c touch /<span class="built_in">test</span>/test.txt</span><br><span class="line">$ ls /var/lib/docker/volumes/ca1683d1e9cc06657c7857d8b8c7196176a59e409d74fc72ff30f0a76f98d614/_data/</span><br><span class="line">test.txt</span><br></pre></td></tr></table></figure><h3 id="绑定挂载机制"><a class="markdownIt-Anchor" href="#绑定挂载机制"></a> 绑定挂载机制</h3><p>可以将一个目录绑定挂载到另外一个目录</p><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><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></pre></td><td class="code"><pre><span class="line">$ ls /<span class="built_in">test</span></span><br><span class="line"><span class="comment"># 没有挂载前，目录为空</span></span><br><span class="line"><span class="comment"># 挂载tmp目录</span></span><br><span class="line">$ mount --<span class="built_in">bind</span> /tmp /<span class="built_in">test</span></span><br><span class="line">$ ls /<span class="built_in">test</span></span><br><span class="line">systemd-private-0ea54a48e403454ba91e8c8d816d2cbd-systemd-resolved.service-A5ml7i   vmware-root_550-2991137472</span><br><span class="line">systemd-private-0ea54a48e403454ba91e8c8d816d2cbd-systemd-timesyncd.service-qu9LFm</span><br><span class="line"><span class="comment"># /test目录与/tmp目录内容一致</span></span><br><span class="line">$ ls /tmp</span><br><span class="line">systemd-private-0ea54a48e403454ba91e8c8d816d2cbd-systemd-resolved.service-A5ml7i   vmware-root_550-2991137472</span><br><span class="line">systemd-private-0ea54a48e403454ba91e8c8d816d2cbd-systemd-timesyncd.service-qu9LFm</span><br><span class="line"><span class="comment"># umount</span></span><br><span class="line">$ umount /<span class="built_in">test</span></span><br><span class="line">$ ls /<span class="built_in">test</span></span><br><span class="line"><span class="comment"># 目录为空</span></span><br></pre></td></tr></table></figure><p>但是，启动容器前host上的目录没有挂载内容，容器启动后，host上挂载目录，查看容器中的内容</p><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><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></pre></td><td class="code"><pre><span class="line">$ ls /<span class="built_in">test</span></span><br><span class="line"><span class="comment"># 无内容</span></span><br><span class="line">$ docker run -it -d --rm -v /<span class="built_in">test</span>:/<span class="built_in">test</span> ubuntu</span><br><span class="line">5f2aaad59abb7546ecd4b7a47ede09fb6a1541c4bda27b79de893bd27350b93c</span><br><span class="line">$ docker <span class="built_in">exec</span> -it 5f2 ls /<span class="built_in">test</span></span><br><span class="line"><span class="comment"># 无内容</span></span><br><span class="line">$ mount --<span class="built_in">bind</span> /tmp /<span class="built_in">test</span></span><br><span class="line">$ ls /<span class="built_in">test</span></span><br><span class="line">systemd-private-0ea54a48e403454ba91e8c8d816d2cbd-systemd-resolved.service-A5ml7i   vmware-root_550-2991137472</span><br><span class="line">systemd-private-0ea54a48e403454ba91e8c8d816d2cbd-systemd-timesyncd.service-qu9LFm</span><br><span class="line">$ docker <span class="built_in">exec</span> -it 5f2 ls /<span class="built_in">test</span></span><br><span class="line"><span class="comment"># 依旧没有内容</span></span><br><span class="line">$ docker <span class="built_in">exec</span> -it 5f2 touch /<span class="built_in">test</span>/test.txt</span><br><span class="line">$ ls /<span class="built_in">test</span></span><br><span class="line">systemd-private-0ea54a48e403454ba91e8c8d816d2cbd-systemd-resolved.service-A5ml7i   vmware-root_550-2991137472</span><br><span class="line">systemd-private-0ea54a48e403454ba91e8c8d816d2cbd-systemd-timesyncd.service-qu9LFm</span><br><span class="line"><span class="comment"># 咦，test.txt去哪儿了呢</span></span><br><span class="line">$ umount /<span class="built_in">test</span></span><br><span class="line">$ ls /<span class="built_in">test</span></span><br><span class="line">test.txt</span><br><span class="line"><span class="comment"># 这样就有了</span></span><br></pre></td></tr></table></figure><p>如果/test目录已经mount了呢？</p><h3 id="会不会将本地挂载的目录提交到image里面呢"><a class="markdownIt-Anchor" href="#会不会将本地挂载的目录提交到image里面呢"></a> 会不会将本地挂载的目录提交到image里面呢？</h3><blockquote><p><strong>不会</strong></p><p>容器的镜像操作，比如 docker commit，都是发生在宿主机空间的。而由于 Mount Namespace 的隔离作用，宿主机并不知道这个绑定挂载的存在。所以，在宿主机看来，容器中可读写层的 /test 目录（/var/lib/docker/aufs/mnt/[可读写层 ID]/test），始终是空的。</p></blockquote><h2 id="小结"><a class="markdownIt-Anchor" href="#小结"></a> 小结</h2><p>本节主要学习了DockerFile编写、镜像的build方法。以及docker exec和volume的底层实现原理。</p><p>通过所有前面几节的实验，不难发现，docker就是通过linux namespace进行隔离，cgroup对资源进行限制，rootfs作为容器的文件系统。无论是docker镜像还是docker容器，以及网络和volume，都是在linux的这些基础功能的基础上实现起来的。</p>]]></content>
    
    <summary type="html">
    
      &lt;blockquote&gt;
&lt;p&gt;学习极客时间上的&lt;a href=&quot;https://time.geekbang.org/column/intro/116&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;《深入剖析Kubernetes》&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;秉持眼过千遍不如手过一遍的原则.&lt;/p&gt;
&lt;p&gt;对应章节：&lt;a href=&quot;https://time.geekbang.org/column/article/18119&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;08 | 白话容器基础（四）：重新认识Docker容器&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
    
    </summary>
    
    
      <category term="k8s" scheme="http://www.isimble.com/categories/k8s/"/>
    
    
      <category term="docker" scheme="http://www.isimble.com/tags/docker/"/>
    
      <category term="Kubernetes" scheme="http://www.isimble.com/tags/Kubernetes/"/>
    
  </entry>
  
  <entry>
    <title>K8s学习笔记——深入理解容器镜像</title>
    <link href="http://www.isimble.com/2020/06/23/kubernetesLearning03/"/>
    <id>http://www.isimble.com/2020/06/23/kubernetesLearning03/</id>
    <published>2020-06-23T04:25:55.000Z</published>
    <updated>2020-06-23T04:33:00.853Z</updated>
    
    <content type="html"><![CDATA[<blockquote><p>学习极客时间上的<a href="https://time.geekbang.org/column/intro/116" target="_blank" rel="noopener">《深入剖析Kubernetes》</a></p><p>秉持眼过千遍不如手过一遍的原则.</p><p>对应章节：<a href="https://time.geekbang.org/column/article/17921" target="_blank" rel="noopener">07 | 白话容器基础（三）：深入理解容器镜像</a></p></blockquote><a id="more"></a><h2 id="以系统调用方式创建namespace实验"><a class="markdownIt-Anchor" href="#以系统调用方式创建namespace实验"></a> 以系统调用方式创建namespace实验</h2><p><strong>ns.c</strong></p><figure class="highlight c"><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="meta">#<span class="meta-keyword">define</span> _GNU_SOURCE</span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">include</span> <span class="meta-string">&lt;sys/mount.h&gt;</span></span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">include</span> <span class="meta-string">&lt;sys/types.h&gt;</span></span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">include</span> <span class="meta-string">&lt;sys/wait.h&gt;</span></span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">include</span> <span class="meta-string">&lt;stdio.h&gt;</span></span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">include</span> <span class="meta-string">&lt;sched.h&gt;</span></span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">include</span> <span class="meta-string">&lt;signal.h&gt;</span></span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">include</span> <span class="meta-string">&lt;unistd.h&gt;</span></span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">define</span> STACK_SIZE (1024 * 1024)</span></span><br><span class="line"><span class="keyword">static</span> <span class="keyword">char</span> container_stack[STACK_SIZE];</span><br><span class="line"><span class="keyword">char</span>* <span class="keyword">const</span> container_args[] = &#123;</span><br><span class="line">  <span class="string">"/bin/bash"</span>,</span><br><span class="line">  <span class="literal">NULL</span></span><br><span class="line">&#125;;</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">int</span> <span class="title">container_main</span><span class="params">(<span class="keyword">void</span>* arg)</span></span></span><br><span class="line"><span class="function"></span>&#123;</span><br><span class="line">  <span class="built_in">printf</span>(<span class="string">"Container - inside the container!\n"</span>);</span><br><span class="line">  execv(container_args[<span class="number">0</span>], container_args);</span><br><span class="line">  <span class="built_in">printf</span>(<span class="string">"Something's wrong!\n"</span>);</span><br><span class="line">  <span class="keyword">return</span> <span class="number">1</span>;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">int</span> <span class="title">main</span><span class="params">()</span></span></span><br><span class="line"><span class="function"></span>&#123;</span><br><span class="line">  <span class="built_in">printf</span>(<span class="string">"Parent - start a container!\n"</span>);</span><br><span class="line">  <span class="keyword">int</span> container_pid = clone(container_main, container_stack+STACK_SIZE, CLONE_NEWNS | SIGCHLD , <span class="literal">NULL</span>);</span><br><span class="line">  waitpid(container_pid, <span class="literal">NULL</span>, <span class="number">0</span>);</span><br><span class="line">  <span class="built_in">printf</span>(<span class="string">"Parent - container stopped!\n"</span>);</span><br><span class="line">  <span class="keyword">return</span> <span class="number">0</span>;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h3 id="build-ns并进入ns"><a class="markdownIt-Anchor" href="#build-ns并进入ns"></a> build ns并进入ns</h3><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><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">$ gcc -o ns ns.c</span><br><span class="line">$ ./ns</span><br><span class="line">Parent - start a container!</span><br><span class="line">Container - inside the container!</span><br><span class="line">$ ls /tmp</span><br><span class="line">systemd-private-8bac4934482d484d879054051ff48730-systemd-resolved.service-54yGbQ   vmware-root_563-4281712267</span><br><span class="line">systemd-private-8bac4934482d484d879054051ff48730-systemd-timesyncd.service-ti2Lns</span><br><span class="line">$ <span class="built_in">exit</span></span><br><span class="line"><span class="built_in">exit</span></span><br><span class="line">Parent - container stopped!</span><br></pre></td></tr></table></figure><h3 id="查看进程在另外一个窗口中执行"><a class="markdownIt-Anchor" href="#查看进程在另外一个窗口中执行"></a> 查看进程(在另外一个窗口中执行)</h3><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><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></pre></td><td class="code"><pre><span class="line">$ ps -aux</span><br><span class="line">...</span><br><span class="line">root     12217  0.0  0.0   5532   720 pts/3    S    06:41   0:00 ./ns</span><br><span class="line">root     12218  0.0  0.3  20312  3980 pts/3    S+   06:41   0:00 /bin/bash</span><br><span class="line">...</span><br><span class="line">$ pstree -g</span><br><span class="line">systemd(1)─┬─VGAuthService(562)</span><br><span class="line">           ├─sshd(1144)─┬─sshd(2307)───bash(2394)</span><br><span class="line">           │            ├─sshd(2448)───bash(2529)</span><br><span class="line">           │            ├─sshd(11698)───bash(11784)───pstree(12265)</span><br><span class="line">           │            └─sshd(11845)───bash(11927)───ns(12217)───bash(12218)</span><br><span class="line">           ...</span><br></pre></td></tr></table></figure><blockquote><p>由上面的操作可见，即使开启了namespace，容器进程看到的文件系统与宿主机一样</p></blockquote><h2 id="重新挂载目录实验"><a class="markdownIt-Anchor" href="#重新挂载目录实验"></a> 重新挂载目录实验</h2><h3 id="修改代码"><a class="markdownIt-Anchor" href="#修改代码"></a> 修改代码</h3><ul><li>修改<code>ns.c</code>的<code>container_main</code>函数，新创建文件<code>ns_new.c</code></li></ul><blockquote><p>注：因为是在虚拟机上实验，根目录类型默认是shared，所以，需要先重新挂载根目录</p></blockquote><figure class="highlight c"><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="function"><span class="keyword">int</span> <span class="title">container_main</span><span class="params">(<span class="keyword">void</span>* arg)</span></span></span><br><span class="line"><span class="function"></span>&#123;</span><br><span class="line">  <span class="built_in">printf</span>(<span class="string">"Container - inside the container!\n"</span>);</span><br><span class="line">  <span class="comment">// 如果你的机器的根目录的挂载类型是shared，那必须先重新挂载根目录</span></span><br><span class="line">  mount(<span class="string">""</span>, <span class="string">"/"</span>, <span class="literal">NULL</span>, MS_PRIVATE, <span class="string">""</span>);</span><br><span class="line">  mount(<span class="string">"none"</span>, <span class="string">"/tmp"</span>, <span class="string">"tmpfs"</span>, <span class="number">0</span>, <span class="string">""</span>);</span><br><span class="line">  execv(container_args[<span class="number">0</span>], container_args);</span><br><span class="line">  <span class="built_in">printf</span>(<span class="string">"Something's wrong!\n"</span>);</span><br><span class="line">  <span class="keyword">return</span> <span class="number">1</span>;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h3 id="编译及测试效果"><a class="markdownIt-Anchor" href="#编译及测试效果"></a> 编译及测试效果</h3><ul><li>在容器内</li></ul><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><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></pre></td><td class="code"><pre><span class="line">$ gcc -o ns_new ns_new.c</span><br><span class="line">$ ./ns_new</span><br><span class="line">Parent - start a container!</span><br><span class="line">Container - inside the container!</span><br><span class="line">$ ls /tmp</span><br><span class="line">$ mount -l | grep tmpfs</span><br><span class="line">udev on /dev <span class="built_in">type</span> devtmpfs (rw,nosuid,relatime,size=473204k,nr_inodes=118301,mode=755)</span><br><span class="line">tmpfs on /run <span class="built_in">type</span> tmpfs (rw,nosuid,noexec,relatime,size=100928k,mode=755)</span><br><span class="line">tmpfs on /dev/shm <span class="built_in">type</span> tmpfs (rw,nosuid,nodev)</span><br><span class="line">tmpfs on /run/lock <span class="built_in">type</span> tmpfs (rw,nosuid,nodev,noexec,relatime,size=5120k)</span><br><span class="line">tmpfs on /sys/fs/cgroup <span class="built_in">type</span> tmpfs (ro,nosuid,nodev,noexec,mode=755)</span><br><span class="line">tmpfs on /run/user/0 <span class="built_in">type</span> tmpfs (rw,nosuid,nodev,relatime,size=100924k,mode=700)</span><br><span class="line">none on /tmp <span class="built_in">type</span> tmpfs (rw,relatime)</span><br><span class="line">$ <span class="built_in">exit</span></span><br><span class="line"><span class="built_in">exit</span></span><br><span class="line">Parent - container stopped!</span><br></pre></td></tr></table></figure><ul><li>在宿主机上</li></ul><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><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line">$ mount -l | grep tmpfs</span><br><span class="line">udev on /dev <span class="built_in">type</span> devtmpfs (rw,nosuid,relatime,size=473204k,nr_inodes=118301,mode=755)</span><br><span class="line">tmpfs on /run <span class="built_in">type</span> tmpfs (rw,nosuid,noexec,relatime,size=100928k,mode=755)</span><br><span class="line">tmpfs on /dev/shm <span class="built_in">type</span> tmpfs (rw,nosuid,nodev)</span><br><span class="line">tmpfs on /run/lock <span class="built_in">type</span> tmpfs (rw,nosuid,nodev,noexec,relatime,size=5120k)</span><br><span class="line">tmpfs on /sys/fs/cgroup <span class="built_in">type</span> tmpfs (ro,nosuid,nodev,noexec,mode=755)</span><br><span class="line">tmpfs on /run/user/0 <span class="built_in">type</span> tmpfs (rw,nosuid,nodev,relatime,size=100924k,mode=700)</span><br></pre></td></tr></table></figure><h2 id="chroot实验"><a class="markdownIt-Anchor" href="#chroot实验"></a> chroot实验</h2><h3 id="准备"><a class="markdownIt-Anchor" href="#准备"></a> 准备</h3><ul><li>创建一个test目录并准备未见</li></ul><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><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></pre></td><td class="code"><pre><span class="line">$ mkdir <span class="built_in">test</span></span><br><span class="line">$ mkdir -p <span class="built_in">test</span>/&#123;bin,lib64,lib&#125;</span><br><span class="line"><span class="comment"># 拷贝bash和ls命令</span></span><br><span class="line">$ cp -v /bin/&#123;bash,ls&#125; <span class="built_in">test</span>/bin/</span><br><span class="line"><span class="string">'/bin/bash'</span> -&gt; <span class="string">'test/bin/bash'</span></span><br><span class="line"><span class="string">'/bin/ls'</span> -&gt; <span class="string">'test/bin/ls'</span></span><br><span class="line"><span class="comment"># 拷贝lib</span></span><br><span class="line">$ list=<span class="string">"<span class="variable">$(ldd /bin/ls | egrep -o '/lib.*\.[0-9]')</span>"</span></span><br><span class="line">$ mkdir <span class="built_in">test</span>/lib/x86_64-linux-gnu</span><br><span class="line">$ <span class="keyword">for</span> i <span class="keyword">in</span> <span class="variable">$list</span>; <span class="keyword">do</span> cp -v <span class="string">"<span class="variable">$i</span>"</span> <span class="string">"test<span class="variable">$&#123;i&#125;</span>"</span>; <span class="keyword">done</span></span><br><span class="line"><span class="string">'/lib/x86_64-linux-gnu/libselinux.so.1'</span> -&gt; <span class="string">'test/lib/x86_64-linux-gnu/libselinux.so.1'</span></span><br><span class="line"><span class="string">'/lib/x86_64-linux-gnu/libc.so.6'</span> -&gt; <span class="string">'test/lib/x86_64-linux-gnu/libc.so.6'</span></span><br><span class="line"><span class="string">'/lib/x86_64-linux-gnu/libpcre.so.3'</span> -&gt; <span class="string">'test/lib/x86_64-linux-gnu/libpcre.so.3'</span></span><br><span class="line"><span class="string">'/lib/x86_64-linux-gnu/libdl.so.2'</span> -&gt; <span class="string">'test/lib/x86_64-linux-gnu/libdl.so.2'</span></span><br><span class="line"><span class="string">'/lib64/ld-linux-x86-64.so.2'</span> -&gt; <span class="string">'test/lib64/ld-linux-x86-64.so.2'</span></span><br><span class="line"><span class="string">'/lib/x86_64-linux-gnu/libpthread.so.0'</span> -&gt; <span class="string">'test/lib/x86_64-linux-gnu/libpthread.so.0'</span></span><br><span class="line">$ cp /lib/x86_64-linux-gnu/libtinfo.so.5 <span class="built_in">test</span>/lib/x86_64-linux-gnu/</span><br></pre></td></tr></table></figure><h3 id="chroot"><a class="markdownIt-Anchor" href="#chroot"></a> chroot</h3><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></pre></td><td class="code"><pre><span class="line">$ chroot <span class="built_in">test</span> /bin/bash</span><br><span class="line">bash-4.4<span class="comment"># ls</span></span><br><span class="line">bin  lib  lib64</span><br></pre></td></tr></table></figure><ul><li>以busybox的镜像为例，同样可以chroot</li></ul><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></pre></td><td class="code"><pre><span class="line">$ chroot busybox /bin/sh</span><br><span class="line">/ <span class="comment"># ls</span></span><br><span class="line">bin   dev   etc   home  root  tmp   usr   var</span><br></pre></td></tr></table></figure><h2 id="unionfs实验"><a class="markdownIt-Anchor" href="#unionfs实验"></a> UnionFS实验</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><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">$ mkdir A</span><br><span class="line">$ mkdir B</span><br><span class="line">$ mkdi^C</span><br><span class="line">$ touch A/t1.txt</span><br><span class="line">$ touch A/t2.txt</span><br><span class="line">$ touch B/t2.txt</span><br><span class="line">$ touch B/t3.txt</span><br><span class="line">$ mkdir C</span><br><span class="line">$ mount -t aufs -o <span class="built_in">dirs</span>=./A:./B none ./C</span><br><span class="line">$ ls C</span><br><span class="line">t1.txt  t2.txt  t3.txt</span><br><span class="line">$ mount -l | grep aufs</span><br><span class="line">none on /root/bqi/C <span class="built_in">type</span> aufs (rw,relatime,si=f9e234d74656f278)</span><br></pre></td></tr></table></figure><p>此时，可以尝试修改<code>A/t1.txt</code>, <code>A/t2.txt</code>, <code>B/t2.txt</code>, <code>B/t3.txt</code></p><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><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="built_in">echo</span> <span class="string">'This is a test'</span> &gt; A/t1.txt</span><br><span class="line">$ cat C/t1.txt</span><br><span class="line">This is a <span class="built_in">test</span></span><br><span class="line">$ <span class="built_in">echo</span> <span class="string">'This is a test2'</span> &gt; A/t2.txt</span><br><span class="line">$ cat C/t2.txt</span><br><span class="line">This is a test2</span><br><span class="line">$ cat B/t2.txt</span><br><span class="line">$ <span class="built_in">echo</span> <span class="string">'This is test2 for B'</span> &gt; B/t2.txt</span><br><span class="line">$ cat C/t2.txt</span><br><span class="line">This is a test2</span><br></pre></td></tr></table></figure><h2 id="docker-image解析"><a class="markdownIt-Anchor" href="#docker-image解析"></a> docker image解析</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><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></pre></td><td class="code"><pre><span class="line">$ docker inspect ubuntu</span><br><span class="line">...</span><br><span class="line">        <span class="string">"GraphDriver"</span>: &#123;</span><br><span class="line">            <span class="string">"Data"</span>: &#123;</span><br><span class="line">                <span class="string">"LowerDir"</span>: <span class="string">"/var/lib/docker/overlay2/823e415d4256d05fb0101af4dcc42a4389d44cf6467972d654e93e0cc575cd9b/diff:/var/lib/docker/overlay2/37d3e588905fae55c8a0481e9cda7be36177af874631abb15724c893887e260b/diff:/var/lib/docker/overlay2/40d198d6f624e455800254766eb6a7190ce02442fc48f02f6f16f72105cefd0d/diff"</span>,</span><br><span class="line">                <span class="string">"MergedDir"</span>: <span class="string">"/var/lib/docker/overlay2/17bd5da0cda20e8ecd1d4955d25f49609ff0d7aa72fe45a0388a357fcc5b625f/merged"</span>,</span><br><span class="line">                <span class="string">"UpperDir"</span>: <span class="string">"/var/lib/docker/overlay2/17bd5da0cda20e8ecd1d4955d25f49609ff0d7aa72fe45a0388a357fcc5b625f/diff"</span>,</span><br><span class="line">                <span class="string">"WorkDir"</span>: <span class="string">"/var/lib/docker/overlay2/17bd5da0cda20e8ecd1d4955d25f49609ff0d7aa72fe45a0388a357fcc5b625f/work"</span></span><br><span class="line">            &#125;,</span><br><span class="line">            <span class="string">"Name"</span>: <span class="string">"overlay2"</span></span><br><span class="line">        &#125;,</span><br><span class="line">        <span class="string">"RootFS"</span>: &#123;</span><br><span class="line">            <span class="string">"Type"</span>: <span class="string">"layers"</span>,</span><br><span class="line">            <span class="string">"Layers"</span>: [</span><br><span class="line">                <span class="string">"sha256:7789f1a3d4e9258fbe5469a8d657deb6aba168d86967063e9b80ac3e1154333f"</span>,</span><br><span class="line">                <span class="string">"sha256:9e53fd4895597d04f8871a68caea4c686011e1fbd0be32e57e89ada2ea5c24c4"</span>,</span><br><span class="line">                <span class="string">"sha256:2a19bd70fcd4ce7fd73b37b1b2c710f8065817a9db821ff839fe0b4b4560e643"</span>,</span><br><span class="line">                <span class="string">"sha256:8891751e0a1733c5c214d17ad2b0040deccbdea0acebb963679735964d516ac2"</span></span><br><span class="line">            ]</span><br><span class="line">        &#125;,</span><br><span class="line">...</span><br></pre></td></tr></table></figure><p>你会看到，Ubuntu镜像，在我的环境里面是4层</p><h3 id="overlay挂载方式"><a class="markdownIt-Anchor" href="#overlay挂载方式"></a> overlay挂载方式</h3><h4 id="先启动一个container"><a class="markdownIt-Anchor" href="#先启动一个container"></a> 先启动一个container</h4><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><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></pre></td><td class="code"><pre><span class="line">$ docker run -it -d ubuntu</span><br><span class="line">$ docker ps</span><br><span class="line">CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES</span><br><span class="line">a274e38c218a        ubuntu              <span class="string">"/bin/bash"</span>         17 minutes ago      Up 17 minutes                           musing_knuth</span><br><span class="line">$ docker inspect a274e38c218a</span><br><span class="line">...</span><br><span class="line">        <span class="string">"GraphDriver"</span>: &#123;</span><br><span class="line">            <span class="string">"Data"</span>: &#123;</span><br><span class="line">                <span class="string">"LowerDir"</span>: <span class="string">"/var/lib/docker/overlay2/0c3ff90aba26b4197b2293789f75d4e3db7a9213601b8d222b1f0c413c7115b2-init/diff:/var/lib/docker/overlay2/17bd5da0cda20e8ecd1d4955d25f49609ff0d7aa72fe45a0388a357fcc5b625f/diff:/var/lib/docker/overlay2/823e415d4256d05fb0101af4dcc42a4389d44cf6467972d654e93e0cc575cd9b/diff:/var/lib/docker/overlay2/37d3e588905fae55c8a0481e9cda7be36177af874631abb15724c893887e260b/diff:/var/lib/docker/overlay2/40d198d6f624e455800254766eb6a7190ce02442fc48f02f6f16f72105cefd0d/diff"</span>,</span><br><span class="line">                <span class="string">"MergedDir"</span>: <span class="string">"/var/lib/docker/overlay2/0c3ff90aba26b4197b2293789f75d4e3db7a9213601b8d222b1f0c413c7115b2/merged"</span>,</span><br><span class="line">                <span class="string">"UpperDir"</span>: <span class="string">"/var/lib/docker/overlay2/0c3ff90aba26b4197b2293789f75d4e3db7a9213601b8d222b1f0c413c7115b2/diff"</span>,</span><br><span class="line">                <span class="string">"WorkDir"</span>: <span class="string">"/var/lib/docker/overlay2/0c3ff90aba26b4197b2293789f75d4e3db7a9213601b8d222b1f0c413c7115b2/work"</span></span><br><span class="line">            &#125;,</span><br><span class="line">            <span class="string">"Name"</span>: <span class="string">"overlay2"</span></span><br><span class="line">        &#125;,</span><br><span class="line">...</span><br></pre></td></tr></table></figure><h4 id="查看系统挂载表"><a class="markdownIt-Anchor" href="#查看系统挂载表"></a> 查看系统挂载表</h4><figure class="highlight bash"><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">$ cat /proc/mounts | grep overlay</span><br><span class="line">overlay /var/lib/docker/overlay2/0c3ff90aba26b4197b2293789f75d4e3db7a9213601b8d222b1f0c413c7115b2/merged overlay rw,relatime,lowerdir=/var/lib/docker/overlay2/l/7ZDIR6KYXXF6RMDW3JCBEQUGMH:/var/lib/docker/overlay2/l/TH3OYMS4POUF3S22QNB7UJPORG:/var/lib/docker/overlay2/l/BJILDL5W6H6U7LGVSUUS2QUTGO:/var/lib/docker/overlay2/l/6F6BVIETKMGL5QLJIOCP6CONB3:/var/lib/docker/overlay2/l/P5BANYVEKZJYYPT4M6IFNLAR7Z,upperdir=/var/lib/docker/overlay2/0c3ff90aba26b4197b2293789f75d4e3db7a9213601b8d222b1f0c413c7115b2/diff,workdir=/var/lib/docker/overlay2/0c3ff90aba26b4197b2293789f75d4e3db7a9213601b8d222b1f0c413c7115b2/work 0 0</span><br></pre></td></tr></table></figure><p>可以看到，lowerdir由5个目录共同挂载而成，分别是</p><ol><li><code>7ZDIR6KYXXF6RMDW3JCBEQUGMH</code></li><li><code>TH3OYMS4POUF3S22QNB7UJPORG</code></li><li><code>BJILDL5W6H6U7LGVSUUS2QUTGO</code></li><li><code>6F6BVIETKMGL5QLJIOCP6CONB3</code></li><li><code>P5BANYVEKZJYYPT4M6IFNLAR7Z</code></li></ol><h4 id="查看overlay2目录下的文件"><a class="markdownIt-Anchor" href="#查看overlay2目录下的文件"></a> 查看overlay2目录下的文件</h4><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><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></pre></td><td class="code"><pre><span class="line">$ ls /var/lib/docker/overlay2/l/ -l</span><br><span class="line">total 56</span><br><span class="line">lrwxrwxrwx 1 root root 72 May 14 07:09 2L7W765NSNAZAJUW324PTRY6AF -&gt; ../6bd794b03d6772755f61a55ff28f0f20caf1541192c57030b1c0d92e4d3134fa/diff</span><br><span class="line">lrwxrwxrwx 1 root root 72 May 13 07:09 2VHUX6G37XVXLON33KHDZBOVBH -&gt; ../2787c91d4cd57511162a5b17a1ad9cca5204e57b541127223dd11b8c084710bb/diff</span><br><span class="line">lrwxrwxrwx 1 root root 72 Jun 11 05:51 6F6BVIETKMGL5QLJIOCP6CONB3 -&gt; ../37d3e588905fae55c8a0481e9cda7be36177af874631abb15724c893887e260b/diff</span><br><span class="line">lrwxrwxrwx 1 root root 72 May 13 07:24 6P3MYX3ANRVWUUGIBBTJYPGRLP -&gt; ../6d18d5f8aed3820e7500e1f70b3c5d896b90c109977a1097e957667a6b0f48f3/diff</span><br><span class="line">lrwxrwxrwx 1 root root 77 Jun 11 07:53 7ZDIR6KYXXF6RMDW3JCBEQUGMH -&gt; ../0c3ff90aba26b4197b2293789f75d4e3db7a9213601b8d222b1f0c413c7115b2-init/diff</span><br><span class="line">lrwxrwxrwx 1 root root 72 Jun 11 05:51 BJILDL5W6H6U7LGVSUUS2QUTGO -&gt; ../823e415d4256d05fb0101af4dcc42a4389d44cf6467972d654e93e0cc575cd9b/diff</span><br><span class="line">lrwxrwxrwx 1 root root 72 May 13 07:24 D26SOVMOFLZLRVVBCVXJVRYAE2 -&gt; ../a74c293f4eb20bef383865bbba97f84a51fd0d894ced280dc1cfe6021be3ae77/diff</span><br><span class="line">lrwxrwxrwx 1 root root 72 Jun 11 07:53 EY46SF3NEYTFL4QOXUZT5YHMA3 -&gt; ../0c3ff90aba26b4197b2293789f75d4e3db7a9213601b8d222b1f0c413c7115b2/diff</span><br><span class="line">lrwxrwxrwx 1 root root 72 May 13 07:30 IXP5XYXVUASXI2FOX5UKMYW2JN -&gt; ../c58e315ff14dda2b6ec7f75a3a0a8099dfe269604a0acecf6ecf026c6b56de63/diff</span><br><span class="line">lrwxrwxrwx 1 root root 72 May 14 07:18 N7NRQKX4E62F2JKRQ5JCI3BSSH -&gt; ../d6fed7e45abcf9e0055b9de876a81a5347cdcf364736b0f50053630f8f189e30/diff</span><br><span class="line">lrwxrwxrwx 1 root root 72 May 13 06:16 NJCD6YK72MQFTUSJUMGOEJL4WM -&gt; ../bf1fb537d794b4460c81ae39fc45c3230c22b47e4509a35c282ca15727fe81ac/diff</span><br><span class="line">lrwxrwxrwx 1 root root 72 Jun 11 05:51 P5BANYVEKZJYYPT4M6IFNLAR7Z -&gt; ../40d198d6f624e455800254766eb6a7190ce02442fc48f02f6f16f72105cefd0d/diff</span><br><span class="line">lrwxrwxrwx 1 root root 72 Jun 11 05:51 TH3OYMS4POUF3S22QNB7UJPORG -&gt; ../17bd5da0cda20e8ecd1d4955d25f49609ff0d7aa72fe45a0388a357fcc5b625f/diff</span><br><span class="line">lrwxrwxrwx 1 root root 72 May 13 07:24 YQB24YJNNQSDHU2IDBA2L4LCX4 -&gt; ../c3bee923bb1d5cd56503c976bc8353a6a579698186536f6023524b84373a6834/diff</span><br></pre></td></tr></table></figure><h4 id="做个对比"><a class="markdownIt-Anchor" href="#做个对比"></a> 做个对比</h4><ol><li><p>容器ID为a274e38，对应的DIR的ID是0c3ff90</p></li><li><p><code>lowerdir=/var/lib/docker/overlay2/l/7ZDIR6KYXXF6RMDW3JCBEQUGMH</code>， 实际上指向了<code>0c3ff90aba26b4197b2293789f75d4e3db7a9213601b8d222b1f0c413c7115b2-init/diff</code></p><figure class="highlight bash"><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">$ ls /var/lib/docker/overlay2/0c3ff90aba26b4197b2293789f75d4e3db7a9213601b8d222b1f0c413c7115b2-init/diff/</span><br><span class="line">dev  etc</span><br></pre></td></tr></table></figure></li><li><p><code>/var/lib/docker/overlay2/l/TH3OYMS4POUF3S22QNB7UJPORG</code> 实际上指向了<code>17bd5da0cda20e8ecd1d4955d25f49609ff0d7aa72fe45a0388a357fcc5b625f/diff</code></p><figure class="highlight bash"><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">$ ls /var/lib/docker/overlay2/17bd5da0cda20e8ecd1d4955d25f49609ff0d7aa72fe45a0388a357fcc5b625f/diff/</span><br><span class="line">run</span><br></pre></td></tr></table></figure></li><li><p>而<code>17bd5da0cda20e8ecd1d4955d25f49609ff0d7aa72fe45a0388a357fcc5b625f/diff</code>实际上是ubuntu镜像的<code>UpperDir</code></p><figure class="highlight bash"><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">$ ls /var/lib/docker/overlay2/17bd5da0cda20e8ecd1d4955d25f49609ff0d7aa72fe45a0388a357fcc5b625f/diff/</span><br><span class="line">run</span><br></pre></td></tr></table></figure></li><li><p><code>/var/lib/docker/overlay2/l/BJILDL5W6H6U7LGVSUUS2QUTGO</code>实际上是<code>823e415d4256d05fb0101af4dcc42a4389d44cf6467972d654e93e0cc575cd9b/diff</code></p></li><li><p>而<code>823e415d4256d05fb0101af4dcc42a4389d44cf6467972d654e93e0cc575cd9b/diff</code>实际上是ubuntu镜像的<code>LowerDir</code></p><figure class="highlight bash"><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">$ ls /var/lib/docker/overlay2/823e415d4256d05fb0101af4dcc42a4389d44cf6467972d654e93e0cc575cd9b/diff/</span><br><span class="line">etc  usr  var</span><br></pre></td></tr></table></figure></li><li><p><code>/var/lib/docker/overlay2/l/6F6BVIETKMGL5QLJIOCP6CONB3</code>实际上是<code>37d3e588905fae55c8a0481e9cda7be36177af874631abb15724c893887e260b/diff</code></p><figure class="highlight bash"><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">$ ls /var/lib/docker/overlay2/37d3e588905fae55c8a0481e9cda7be36177af874631abb15724c893887e260b/diff/</span><br><span class="line">var</span><br></pre></td></tr></table></figure></li><li><p><code>/var/lib/docker/overlay2/l/P5BANYVEKZJYYPT4M6IFNLAR7Z</code>实际上是<code>40d198d6f624e455800254766eb6a7190ce02442fc48f02f6f16f72105cefd0d/diff</code></p><figure class="highlight bash"><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">$ ls /var/lib/docker/overlay2/40d198d6f624e455800254766eb6a7190ce02442fc48f02f6f16f72105cefd0d/diff/</span><br><span class="line">bin  boot  dev  etc  home  lib  lib32  lib64  libx32  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var</span><br></pre></td></tr></table></figure></li></ol><h2 id="小结"><a class="markdownIt-Anchor" href="#小结"></a> 小结</h2><ol><li>容器的镜像即rootfs是按照一层一层的组合起来的。</li><li>启动容器进程时，将多个增量的rootfs联合挂载成一个完整的rootfs</li><li>启动容器时，会只读模式挂载一个init层，以及一个可写的层</li></ol>]]></content>
    
    <summary type="html">
    
      &lt;blockquote&gt;
&lt;p&gt;学习极客时间上的&lt;a href=&quot;https://time.geekbang.org/column/intro/116&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;《深入剖析Kubernetes》&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;秉持眼过千遍不如手过一遍的原则.&lt;/p&gt;
&lt;p&gt;对应章节：&lt;a href=&quot;https://time.geekbang.org/column/article/17921&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;07 | 白话容器基础（三）：深入理解容器镜像&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
    
    </summary>
    
    
      <category term="k8s" scheme="http://www.isimble.com/categories/k8s/"/>
    
    
      <category term="docker" scheme="http://www.isimble.com/tags/docker/"/>
    
      <category term="Kubernetes" scheme="http://www.isimble.com/tags/Kubernetes/"/>
    
  </entry>
  
  <entry>
    <title>K8s学习笔记——限制与隔离</title>
    <link href="http://www.isimble.com/2020/06/17/kubernetesLearning02/"/>
    <id>http://www.isimble.com/2020/06/17/kubernetesLearning02/</id>
    <published>2020-06-17T08:08:05.000Z</published>
    <updated>2020-06-17T08:18:47.113Z</updated>
    
    <content type="html"><![CDATA[<blockquote><p>学习极客时间上的<a href="https://time.geekbang.org/column/intro/116" target="_blank" rel="noopener">《深入剖析Kubernetes》</a></p><p>秉持眼过千遍不如手过一遍的原则.</p><p>对应章节：<a href="https://time.geekbang.org/column/article/14653" target="_blank" rel="noopener">06 | 白话容器基础（二）：隔离与限制</a></p></blockquote><a id="more"></a><h2 id="隔离与限制"><a class="markdownIt-Anchor" href="#隔离与限制"></a> 隔离与限制</h2><h2 id="cgroup的mount点"><a class="markdownIt-Anchor" href="#cgroup的mount点"></a> cgroup的mount点</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><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">$ mount -t cgroup</span><br><span class="line">cgroup on /sys/fs/cgroup/systemd <span class="built_in">type</span> cgroup (rw,nosuid,nodev,noexec,relatime,xattr,name=systemd)</span><br><span class="line">cgroup on /sys/fs/cgroup/hugetlb <span class="built_in">type</span> cgroup (rw,nosuid,nodev,noexec,relatime,hugetlb)</span><br><span class="line">cgroup on /sys/fs/cgroup/rdma <span class="built_in">type</span> cgroup (rw,nosuid,nodev,noexec,relatime,rdma)</span><br><span class="line">cgroup on /sys/fs/cgroup/devices <span class="built_in">type</span> cgroup (rw,nosuid,nodev,noexec,relatime,devices)</span><br><span class="line">cgroup on /sys/fs/cgroup/perf_event <span class="built_in">type</span> cgroup (rw,nosuid,nodev,noexec,relatime,perf_event)</span><br><span class="line">cgroup on /sys/fs/cgroup/net_cls,net_prio <span class="built_in">type</span> cgroup (rw,nosuid,nodev,noexec,relatime,net_cls,net_prio)</span><br><span class="line">cgroup on /sys/fs/cgroup/cpu,cpuacct <span class="built_in">type</span> cgroup (rw,nosuid,nodev,noexec,relatime,cpu,cpuacct)</span><br><span class="line">cgroup on /sys/fs/cgroup/blkio <span class="built_in">type</span> cgroup (rw,nosuid,nodev,noexec,relatime,blkio)</span><br><span class="line">cgroup on /sys/fs/cgroup/memory <span class="built_in">type</span> cgroup (rw,nosuid,nodev,noexec,relatime,memory)</span><br><span class="line">cgroup on /sys/fs/cgroup/pids <span class="built_in">type</span> cgroup (rw,nosuid,nodev,noexec,relatime,pids)</span><br><span class="line">cgroup on /sys/fs/cgroup/cpuset <span class="built_in">type</span> cgroup (rw,nosuid,nodev,noexec,relatime,cpuset,clone_children)</span><br><span class="line">cgroup on /sys/fs/cgroup/freezer <span class="built_in">type</span> cgroup (rw,nosuid,nodev,noexec,relatime,freezer)</span><br></pre></td></tr></table></figure><h2 id="查看cpu相关信息"><a class="markdownIt-Anchor" href="#查看cpu相关信息"></a> 查看CPU相关信息</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><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="built_in">cd</span> /sys/fs/cgroup</span><br><span class="line">$ ls cpu</span><br><span class="line">cgroup.clone_children  cpuacct.stat       cpuacct.usage_percpu       cpuacct.usage_sys   cpu.cfs_quota_us  docker             system.slice</span><br><span class="line">cgroup.procs           cpuacct.usage      cpuacct.usage_percpu_sys   cpuacct.usage_user  cpu.shares        notify_on_release  tasks</span><br><span class="line">cgroup.sane_behavior   cpuacct.usage_all  cpuacct.usage_percpu_user  cpu.cfs_period_us   cpu.stat          release_agent      user.slice</span><br><span class="line">$ cat cpu/cpu.cfs_period_us</span><br><span class="line">100000</span><br><span class="line">$ cat cpu/cpu.cfs_quota_us</span><br><span class="line">-1</span><br></pre></td></tr></table></figure><h2 id="在cpu目录下创建一个container目录"><a class="markdownIt-Anchor" href="#在cpu目录下创建一个container目录"></a> 在CPU目录下创建一个container目录</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><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line">$ mkdir container</span><br><span class="line">$ ls container/</span><br><span class="line">cgroup.clone_children  cpuacct.usage_all          cpuacct.usage_sys   cpu.shares</span><br><span class="line">cgroup.procs           cpuacct.usage_percpu       cpuacct.usage_user  cpu.stat</span><br><span class="line">cpuacct.stat           cpuacct.usage_percpu_sys   cpu.cfs_period_us   notify_on_release</span><br><span class="line">cpuacct.usage          cpuacct.usage_percpu_user  cpu.cfs_quota_us    tasks</span><br></pre></td></tr></table></figure><blockquote><p>会看到创建目录后，会自动创建一堆文件</p></blockquote><h2 id="用一个while循环检测cpu使用状况"><a class="markdownIt-Anchor" href="#用一个while循环检测cpu使用状况"></a> 用一个while循环检测CPU使用状况</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><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">while</span> : ; <span class="keyword">do</span> : ; <span class="keyword">done</span> &amp;</span><br><span class="line">[1] 16508</span><br><span class="line">$ top</span><br><span class="line">top - 09:03:06 up  3:32,  4 users,  load average: 0.28, 0.07, 0.02</span><br><span class="line">Tasks: 105 total,   2 running,  61 sleeping,   0 stopped,   0 zombie</span><br><span class="line">%Cpu(s): 99.7 us,  0.3 sy,  0.0 ni,  0.0 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st</span><br><span class="line">KiB Mem :  1009256 total,   208232 free,   220168 used,   580856 buff/cache</span><br><span class="line">KiB Swap:  2018300 total,  2008256 free,    10044 used.   647692 avail Mem</span><br><span class="line"></span><br><span class="line">  PID USER      PR  NI    VIRT    RES    SHR S %CPU %MEM     TIME+ COMMAND</span><br><span class="line">16508 root      20   0   21640   3180   1216 R 99.7  0.3   0:17.88 bash</span><br></pre></td></tr></table></figure><blockquote><p>在有的虚拟机上，你会看到CPU使用率不是99%，可能是50%，25%等，你可以思考一下这是为什么</p></blockquote><h2 id="使用container的cgroup对while循环进行资源限制"><a class="markdownIt-Anchor" href="#使用container的cgroup对while循环进行资源限制"></a> 使用container的cgroup对while循环进行资源限制</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><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="built_in">echo</span> 20000 &gt; container/cpu.cfs_quota_us</span><br><span class="line">$ <span class="built_in">echo</span> 16508 &gt; container/tasks</span><br><span class="line">$ top</span><br><span class="line">top - 09:06:24 up  3:35,  4 users,  load average: 0.97, 0.52, 0.21</span><br><span class="line">Tasks: 105 total,   2 running,  61 sleeping,   0 stopped,   0 zombie</span><br><span class="line">%Cpu(s): 20.0 us,  0.0 sy,  0.0 ni, 79.7 id,  0.0 wa,  0.0 hi,  0.3 si,  0.0 st</span><br><span class="line">KiB Mem :  1009256 total,   208636 free,   219736 used,   580884 buff/cache</span><br><span class="line">KiB Swap:  2018300 total,  2008256 free,    10044 used.   648120 avail Mem</span><br><span class="line"></span><br><span class="line">  PID USER      PR  NI    VIRT    RES    SHR S %CPU %MEM     TIME+ COMMAND</span><br><span class="line">16508 root      20   0   21640   3180   1216 R 20.6  0.3   3:31.08 bash</span><br></pre></td></tr></table></figure><h2 id="起一个容器看看"><a class="markdownIt-Anchor" href="#起一个容器看看"></a> 起一个容器看看</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><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">$ docker run -it --cpu-period=100000 --cpu-quota=20000 ubuntu /bin/bash</span><br><span class="line">root@26cbffdcb5bf:/<span class="comment"># cat /sys/fs/cgroup/cpu/cpu.cfs_period_us</span></span><br><span class="line">100000</span><br><span class="line">root@26cbffdcb5bf:/<span class="comment"># cat /sys/fs/cgroup/cpu/cpu.cfs_quota_us</span></span><br><span class="line">20000</span><br><span class="line"><span class="comment"># 在宿主机上</span></span><br><span class="line">$ cat /sys/fs/cgroup/cpu/docker/26cbffdcb5bf2f9d9ecdc9207f4211c8f5b3cfbc39d83c77ed4666db3ca0bac3/cpu.cfs_period_us</span><br><span class="line">100000</span><br><span class="line">$ cat /sys/fs/cgroup/cpu/docker/26cbffdcb5bf2f9d9ecdc9207f4211c8f5b3cfbc39d83c77ed4666db3ca0bac3/cpu.cfs_quota_us</span><br><span class="line">20000</span><br></pre></td></tr></table></figure><h2 id="top对比"><a class="markdownIt-Anchor" href="#top对比"></a> top对比</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><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></pre></td><td class="code"><pre><span class="line"><span class="comment"># 容器中</span></span><br><span class="line">root@26cbffdcb5bf:/<span class="comment"># while : ; do : ; done &amp;</span></span><br><span class="line">[1] 11</span><br><span class="line">root@26cbffdcb5bf:/<span class="comment"># top</span></span><br><span class="line">top - 09:10:34 up  3:39,  0 users,  load average: 0.01, 0.21, 0.15</span><br><span class="line">Tasks:   3 total,   2 running,   1 sleeping,   0 stopped,   0 zombie</span><br><span class="line">%Cpu(s): 20.3 us,  0.0 sy,  0.0 ni, 79.7 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st</span><br><span class="line">MiB Mem :    985.6 total,    163.9 free,    251.5 used,    570.2 buff/cache</span><br><span class="line">MiB Swap:   1971.0 total,   1961.2 free,      9.8 used.    595.9 avail Mem</span><br><span class="line"></span><br><span class="line">  PID USER      PR  NI    VIRT    RES    SHR S  %CPU  %MEM     TIME+ COMMAND</span><br><span class="line">   11 root      20   0    4224    560      0 R  20.3   0.1   0:01.21 bash</span><br><span class="line">    1 root      20   0    4224   3504   2944 S   0.0   0.3   0:00.19 bash</span><br><span class="line">   12 root      20   0    6080   3244   2740 R   0.0   0.3   0:00.00 top</span><br><span class="line">   </span><br><span class="line"><span class="comment"># 宿主机上</span></span><br><span class="line">$ top</span><br><span class="line">top - 09:11:36 up  3:40,  5 users,  load average: 0.10, 0.20, 0.15</span><br><span class="line">Tasks: 111 total,   2 running,  66 sleeping,   0 stopped,   0 zombie</span><br><span class="line">%Cpu(s): 20.0 us,  0.3 sy,  0.0 ni, 79.7 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st</span><br><span class="line">KiB Mem :  1009256 total,   167472 free,   257600 used,   584184 buff/cache</span><br><span class="line">KiB Swap:  2018300 total,  2008256 free,    10044 used.   610176 avail Mem</span><br><span class="line"></span><br><span class="line">  PID USER      PR  NI    VIRT    RES    SHR S %CPU %MEM     TIME+ COMMAND</span><br><span class="line">16755 root      20   0    4224    560      0 R 19.9  0.1   0:13.62 bash</span><br><span class="line">$ pstree -g</span><br><span class="line">systemd(1)─┬─VGAuthService(562)</span><br><span class="line">           ├─accounts-daemon(866)─┬─&#123;accounts-daemon&#125;(866)</span><br><span class="line">           │                      └─&#123;accounts-daemon&#125;(866)</span><br><span class="line">           ├─atd(928)</span><br><span class="line">           ├─containerd(1055)─├─containerd-shim(16557)─┬─bash(16585)───bash(16755)</span><br><span class="line">           │                  │                        ├─&#123;containerd-shim&#125;(16557)</span><br><span class="line">           │                  │                        ├─&#123;containerd-shim&#125;(16557)</span><br><span class="line">           │                  │                        ├─&#123;containerd-shim&#125;(16557)</span><br><span class="line">           │                  │                        ├─&#123;containerd-shim&#125;(16557)</span><br><span class="line">           │                  │                        ├─&#123;containerd-shim&#125;(16557)</span><br><span class="line">           │                  │                        ├─&#123;containerd-shim&#125;(16557)</span><br><span class="line">           │                  │                        ├─&#123;containerd-shim&#125;(16557)</span><br><span class="line">           │                  │                        ├─&#123;containerd-shim&#125;(16557)</span><br><span class="line">           │                  │                        └─&#123;containerd-shim&#125;(16557)</span><br></pre></td></tr></table></figure><p>可以看到容器内和容器外部看到的是一样的</p><h2 id="总结"><a class="markdownIt-Anchor" href="#总结"></a> 总结</h2><p>主要使用了cgroup对一个进程的CPU使用率进行了限制，通过了解进程的CPU使用率限制机制，了解docker通过cgroup对相关资源使用的限制</p>]]></content>
    
    <summary type="html">
    
      &lt;blockquote&gt;
&lt;p&gt;学习极客时间上的&lt;a href=&quot;https://time.geekbang.org/column/intro/116&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;《深入剖析Kubernetes》&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;秉持眼过千遍不如手过一遍的原则.&lt;/p&gt;
&lt;p&gt;对应章节：&lt;a href=&quot;https://time.geekbang.org/column/article/14653&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;06 | 白话容器基础（二）：隔离与限制&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
    
    </summary>
    
    
      <category term="k8s" scheme="http://www.isimble.com/categories/k8s/"/>
    
    
      <category term="docker" scheme="http://www.isimble.com/tags/docker/"/>
    
      <category term="Kubernetes" scheme="http://www.isimble.com/tags/Kubernetes/"/>
    
  </entry>
  
  <entry>
    <title>K8s学习笔记——container之于进程</title>
    <link href="http://www.isimble.com/2020/06/17/kubernetesLearning01/"/>
    <id>http://www.isimble.com/2020/06/17/kubernetesLearning01/</id>
    <published>2020-06-17T05:35:07.000Z</published>
    <updated>2020-06-17T05:41:20.476Z</updated>
    
    <content type="html"><![CDATA[<blockquote><p>学习极客时间上的<a href="https://time.geekbang.org/column/intro/116" target="_blank" rel="noopener">《深入剖析Kubernetes》</a></p><p>秉持眼过千遍不如手过一遍的原则.</p><p>对应章节：<a href="https://time.geekbang.org/column/article/14642" target="_blank" rel="noopener">05 | 白话容器基础（一）：从进程说开去</a></p></blockquote><a id="more"></a><h2 id="操作"><a class="markdownIt-Anchor" href="#操作"></a> 操作</h2><h3 id="start一个container"><a class="markdownIt-Anchor" href="#start一个container"></a> start一个container</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">$ docker run -it -d busybox</span><br></pre></td></tr></table></figure><h3 id="查看进程"><a class="markdownIt-Anchor" href="#查看进程"></a> 查看进程</h3><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">$ ps -aux</span><br><span class="line">...</span><br><span class="line">root      2817  0.0  0.2 107700  2296 ?        Sl   05:42   0:00 containerd-shim -namespace moby -workdir /var/lib/containerd/io.containerd.run</span><br><span class="line">root      2851  0.0  0.0   1308     4 pts/0    Ss+  05:42   0:00 sh</span><br><span class="line">...</span><br></pre></td></tr></table></figure><h3 id="查看进程树"><a class="markdownIt-Anchor" href="#查看进程树"></a> 查看进程树</h3><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><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></pre></td><td class="code"><pre><span class="line">$ pstree  -g</span><br><span class="line">systemd(1)─┬─VGAuthService(562)</span><br><span class="line">           ├─accounts-daemon(866)─┬─&#123;accounts-daemon&#125;(866)</span><br><span class="line">           │                      └─&#123;accounts-daemon&#125;(866)</span><br><span class="line">           ├─atd(928)</span><br><span class="line">           ├─containerd(1055)─┬─containerd-shim(2817)─┬─sh(2851)</span><br><span class="line">           │                  │                       ├─&#123;containerd-shim&#125;(2817)</span><br><span class="line">           │                  │                       ├─&#123;containerd-shim&#125;(2817)</span><br><span class="line">           │                  │                       ├─&#123;containerd-shim&#125;(2817)</span><br><span class="line">           │                  │                       ├─&#123;containerd-shim&#125;(2817)</span><br><span class="line">           │                  │                       ├─&#123;containerd-shim&#125;(2817)</span><br><span class="line">           │                  │                       ├─&#123;containerd-shim&#125;(2817)</span><br><span class="line">           │                  │                       ├─&#123;containerd-shim&#125;(2817)</span><br><span class="line">           │                  │                       ├─&#123;containerd-shim&#125;(2817)</span><br><span class="line">           │                  │                       ├─&#123;containerd-shim&#125;(2817)</span><br><span class="line">           │                  │                       └─&#123;containerd-shim&#125;(2817)</span><br><span class="line"> ....</span><br></pre></td></tr></table></figure><h3 id="查看容器内进程"><a class="markdownIt-Anchor" href="#查看容器内进程"></a> 查看容器内进程</h3><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></pre></td><td class="code"><pre><span class="line">$ ps</span><br><span class="line">PID   USER     TIME  COMMAND</span><br><span class="line">    1 root      0:00 sh</span><br><span class="line">    6 root      0:00 ps</span><br></pre></td></tr></table></figure><h3 id="分别查看两个进程的namespace"><a class="markdownIt-Anchor" href="#分别查看两个进程的namespace"></a> 分别查看两个进程的namespace</h3><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><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></pre></td><td class="code"><pre><span class="line">/proc/2817/ns<span class="comment"># ls -l</span></span><br><span class="line">total 0</span><br><span class="line">lrwxrwxrwx 1 root root 0 Jun 11 05:43 cgroup -&gt; <span class="string">'cgroup:[4026531835]'</span></span><br><span class="line">lrwxrwxrwx 1 root root 0 Jun 11 05:43 ipc -&gt; <span class="string">'ipc:[4026531839]'</span></span><br><span class="line">lrwxrwxrwx 1 root root 0 Jun 11 05:43 mnt -&gt; <span class="string">'mnt:[4026531840]'</span></span><br><span class="line">lrwxrwxrwx 1 root root 0 Jun 11 05:43 net -&gt; <span class="string">'net:[4026531993]'</span></span><br><span class="line">lrwxrwxrwx 1 root root 0 Jun 11 05:43 pid -&gt; <span class="string">'pid:[4026531836]'</span></span><br><span class="line">lrwxrwxrwx 1 root root 0 Jun 11 06:16 pid_for_children -&gt; <span class="string">'pid:[4026531836]'</span></span><br><span class="line">lrwxrwxrwx 1 root root 0 Jun 11 05:43 user -&gt; <span class="string">'user:[4026531837]'</span></span><br><span class="line">lrwxrwxrwx 1 root root 0 Jun 11 05:43 uts -&gt; <span class="string">'uts:[4026531838]</span></span><br><span class="line"><span class="string">/proc/2851/ns# ls -l</span></span><br><span class="line"><span class="string">total 0</span></span><br><span class="line"><span class="string">lrwxrwxrwx 1 root root 0 Jun 11 05:43 cgroup -&gt; '</span>cgroup:[4026531835]<span class="string">'</span></span><br><span class="line"><span class="string">lrwxrwxrwx 1 root root 0 Jun 11 05:43 ipc -&gt; '</span>ipc:[4026532571]<span class="string">'</span></span><br><span class="line"><span class="string">lrwxrwxrwx 1 root root 0 Jun 11 05:43 mnt -&gt; '</span>mnt:[4026532569]<span class="string">'</span></span><br><span class="line"><span class="string">lrwxrwxrwx 1 root root 0 Jun 11 05:42 net -&gt; '</span>net:[4026532574]<span class="string">'</span></span><br><span class="line"><span class="string">lrwxrwxrwx 1 root root 0 Jun 11 05:43 pid -&gt; '</span>pid:[4026532572]<span class="string">'</span></span><br><span class="line"><span class="string">lrwxrwxrwx 1 root root 0 Jun 11 06:16 pid_for_children -&gt; '</span>pid:[4026532572]<span class="string">'</span></span><br><span class="line"><span class="string">lrwxrwxrwx 1 root root 0 Jun 11 05:43 user -&gt; '</span>user:[4026531837]<span class="string">'</span></span><br><span class="line"><span class="string">lrwxrwxrwx 1 root root 0 Jun 11 05:43 uts -&gt; '</span>uts:[4026532570]<span class="string">'</span></span><br></pre></td></tr></table></figure><h2 id="总结"><a class="markdownIt-Anchor" href="#总结"></a> 总结</h2><ol><li>启动一个docker容器后，会看到启动了一个2817的进程，这个进程是1055的子进程</li><li>而因为busybox容器启动后，启动了<code>sh</code>，其实际上是2817的子进程2851</li><li>而在容器中，能看到1号进程是<code>sh</code></li><li>通过/proc下可以看到，进程2817和进程2851的ns下，cgroup是都是<code>4026531835</code></li><li>而很明显，每个container都会创建<code>ipc</code>, <code>mnt</code>, <code>net</code>, <code>pid</code>, <code>pid_for_children</code>, <code>user</code>, <code>uts</code>这些namespace</li></ol>]]></content>
    
    <summary type="html">
    
      &lt;blockquote&gt;
&lt;p&gt;学习极客时间上的&lt;a href=&quot;https://time.geekbang.org/column/intro/116&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;《深入剖析Kubernetes》&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;秉持眼过千遍不如手过一遍的原则.&lt;/p&gt;
&lt;p&gt;对应章节：&lt;a href=&quot;https://time.geekbang.org/column/article/14642&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;05 | 白话容器基础（一）：从进程说开去&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
    
    </summary>
    
    
      <category term="k8s" scheme="http://www.isimble.com/categories/k8s/"/>
    
    
      <category term="docker" scheme="http://www.isimble.com/tags/docker/"/>
    
      <category term="Kubernetes" scheme="http://www.isimble.com/tags/Kubernetes/"/>
    
  </entry>
  
  <entry>
    <title>国内源安装k8s——Ubuntu</title>
    <link href="http://www.isimble.com/2020/05/19/ubuntu-install-k8s-aliyun/"/>
    <id>http://www.isimble.com/2020/05/19/ubuntu-install-k8s-aliyun/</id>
    <published>2020-05-19T09:16:31.000Z</published>
    <updated>2020-05-19T09:26:18.171Z</updated>
    
    <content type="html"><![CDATA[<ul><li>阿里云源</li><li>Ubuntu20.04</li><li>master + slave</li></ul><a id="more"></a><h2 id="安装docker"><a class="markdownIt-Anchor" href="#安装docker"></a> 安装docker</h2><p>分别在两个node上安装docker-ce</p><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><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line">$ apt-get update </span><br><span class="line">$ apt-get -y install apt-transport-https ca-certificates curl software-properties-common</span><br><span class="line">$ curl -fsSL http://mirrors.aliyun.com/docker-ce/linux/ubuntu/gpg | sudo apt-key add -</span><br><span class="line">$ add-apt-repository <span class="string">"deb [arch=amd64] http://mirrors.aliyun.com/docker-ce/linux/ubuntu <span class="variable">$(lsb_release -cs)</span> stable"</span></span><br><span class="line">$ apt update</span><br><span class="line">$ apt-get -y install docker-ce</span><br></pre></td></tr></table></figure><h2 id="安装kubeadmkubectlkubelet"><a class="markdownIt-Anchor" href="#安装kubeadmkubectlkubelet"></a> 安装kubeadm，kubectl，kubelet</h2><p>分别在两个node上安装</p><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><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line">$ apt-get update &amp;&amp; apt-get install -y apt-transport-https</span><br><span class="line">$ curl https://mirrors.aliyun.com/kubernetes/apt/doc/apt-key.gpg | apt-key add - </span><br><span class="line">$ cat &lt;&lt;EOF &gt;/etc/apt/sources.list.d/kubernetes.list</span><br><span class="line">deb https://mirrors.aliyun.com/kubernetes/apt/ kubernetes-xenial main</span><br><span class="line">EOF</span><br><span class="line">$ apt-get update</span><br><span class="line">$ apt-get install -y kubelet kubeadm kubectl</span><br></pre></td></tr></table></figure><h2 id="初始化master节点"><a class="markdownIt-Anchor" href="#初始化master节点"></a> 初始化master节点</h2><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">$ kubeadm init --pod-network-cidr=172.172.0.0/16 --image-repository registry.aliyuncs.com/google_containers</span><br></pre></td></tr></table></figure><p>安装成功后，会有如下信息：</p><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><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></pre></td><td class="code"><pre><span class="line">Your Kubernetes control-plane has initialized successfully!</span><br><span class="line"></span><br><span class="line">To start using your cluster, you need to run the following as a regular user:</span><br><span class="line"></span><br><span class="line">  mkdir -p <span class="variable">$HOME</span>/.kube</span><br><span class="line">  sudo cp -i /etc/kubernetes/admin.conf <span class="variable">$HOME</span>/.kube/config</span><br><span class="line">  sudo chown $(id -u):$(id -g) <span class="variable">$HOME</span>/.kube/config</span><br><span class="line"></span><br><span class="line">You should now deploy a pod network to the cluster.</span><br><span class="line">Run <span class="string">"kubectl apply -f [podnetwork].yaml"</span> with one of the options listed at:</span><br><span class="line">  https://kubernetes.io/docs/concepts/cluster-administration/addons/</span><br><span class="line"></span><br><span class="line">Then you can join any number of worker nodes by running the following on each as root:</span><br><span class="line"></span><br><span class="line">kubeadm join 10.160.18.180:6443 --token 5xxosi.3du1z15pevcvnyyx \</span><br><span class="line">    --discovery-token-ca-cert-hash sha256:4cc4977482e04ac0ca845bf3520a6a5fa8a0cf6ac8233e734a47e0250c259f73</span><br></pre></td></tr></table></figure><p>根据提示，执行</p><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></pre></td><td class="code"><pre><span class="line">$ mkdir -p <span class="variable">$HOME</span>/.kube</span><br><span class="line">$ sudo cp -i /etc/kubernetes/admin.conf <span class="variable">$HOME</span>/.kube/config</span><br><span class="line">$ sudo chown $(id -u):$(id -g) <span class="variable">$HOME</span>/.kube/config</span><br></pre></td></tr></table></figure><h2 id="安装flannel"><a class="markdownIt-Anchor" href="#安装flannel"></a> 安装flannel</h2><p>参考： <a href="https://github.com/coreos/flannel" target="_blank" rel="noopener">https://github.com/coreos/flannel</a></p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">$ kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml</span><br></pre></td></tr></table></figure><h2 id="安装dashboard"><a class="markdownIt-Anchor" href="#安装dashboard"></a> 安装dashboard</h2><p>参考：<a href="https://github.com/kubernetes/dashboard" target="_blank" rel="noopener">https://github.com/kubernetes/dashboard</a></p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">$ kubectl apply -f https://raw.githubusercontent.com/kubernetes/dashboard/v2.0.0/aio/deploy/recommended.yaml</span><br></pre></td></tr></table></figure><h4 id="修改dashboard配置"><a class="markdownIt-Anchor" href="#修改dashboard配置"></a> 修改dashboard配置</h4><p>修改<code>spec</code>中的<code>type</code>为<code>NodePort</code></p><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><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">$ kubectl -n kubernetes-dashboard edit service kubernetes-dashboard</span><br><span class="line">.......</span><br><span class="line">spec:</span><br><span class="line">  clusterIP: 10.101.212.193</span><br><span class="line">  externalTrafficPolicy: Cluster</span><br><span class="line">  ports:</span><br><span class="line">  - nodePort: 32609</span><br><span class="line">    port: 443</span><br><span class="line">    protocol: TCP</span><br><span class="line">    targetPort: 8443</span><br><span class="line">  selector:</span><br><span class="line">    k8s-app: kubernetes-dashboard</span><br><span class="line">  sessionAffinity: None</span><br><span class="line">  <span class="built_in">type</span>: NodePort</span><br></pre></td></tr></table></figure><p>修改成功后，查看port信息</p><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></pre></td><td class="code"><pre><span class="line">$ kubectl -n kubernetes-dashboard get service kubernetes-dashboard</span><br><span class="line">NAME                   TYPE       CLUSTER-IP       EXTERNAL-IP   PORT(S)         AGE</span><br><span class="line">kubernetes-dashboard   NodePort   10.101.212.193   &lt;none&gt;        443:32609/TCP   27m</span><br></pre></td></tr></table></figure><p><strong>现在，可以通过<code>https://&lt;master-ip&gt;:&lt;NodePort&gt;</code>（这里的port是32609）来访问dashboard了</strong></p><p>虽然页面已经展示出来了，但需要使用token或Kubeconfig才能访问</p><h4 id="创建sample-user"><a class="markdownIt-Anchor" href="#创建sample-user"></a> 创建sample-user</h4><h5 id="创建服务账号"><a class="markdownIt-Anchor" href="#创建服务账号"></a> 创建服务账号</h5><p>新建<code>dashboard-adminuser.yaml</code>并写入：</p><figure class="highlight yaml"><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"><span class="attr">apiVersion:</span> <span class="string">v1</span></span><br><span class="line"><span class="attr">kind:</span> <span class="string">ServiceAccount</span></span><br><span class="line"><span class="attr">metadata:</span></span><br><span class="line">  <span class="attr">name:</span> <span class="string">admin-user</span></span><br><span class="line">  <span class="attr">namespace:</span> <span class="string">kubernetes-dashboard</span></span><br></pre></td></tr></table></figure><p>执行：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">$ kubectl apply -f dashboard-adminuser.yaml</span><br></pre></td></tr></table></figure><h5 id="创建clusterrolebinding"><a class="markdownIt-Anchor" href="#创建clusterrolebinding"></a> 创建ClusterRoleBinding</h5><p>新建<code>cluster-role-binding.yaml</code>并写入：</p><figure class="highlight yaml"><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></pre></td><td class="code"><pre><span class="line"><span class="attr">apiVersion:</span> <span class="string">rbac.authorization.k8s.io/v1</span></span><br><span class="line"><span class="attr">kind:</span> <span class="string">ClusterRoleBinding</span></span><br><span class="line"><span class="attr">metadata:</span></span><br><span class="line">  <span class="attr">name:</span> <span class="string">admin-user</span></span><br><span class="line"><span class="attr">roleRef:</span></span><br><span class="line">  <span class="attr">apiGroup:</span> <span class="string">rbac.authorization.k8s.io</span></span><br><span class="line">  <span class="attr">kind:</span> <span class="string">ClusterRole</span></span><br><span class="line">  <span class="attr">name:</span> <span class="string">cluster-admin</span></span><br><span class="line"><span class="attr">subjects:</span></span><br><span class="line"><span class="bullet">-</span> <span class="attr">kind:</span> <span class="string">ServiceAccount</span></span><br><span class="line">  <span class="attr">name:</span> <span class="string">admin-user</span></span><br><span class="line">  <span class="attr">namespace:</span> <span class="string">kubernetes-dashboard</span></span><br></pre></td></tr></table></figure><p>执行：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">$ kubetcl apply -f cluster-role-binding.yaml</span><br></pre></td></tr></table></figure><h5 id="获取token"><a class="markdownIt-Anchor" href="#获取token"></a> 获取token</h5><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><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">$ kubectl -n kubernetes-dashboard describe secret $(kubectl -n kubernetes-dashboard get secret | grep admin-user | awk <span class="string">'&#123;print $1&#125;'</span>)</span><br><span class="line">Name:         admin-user-token-jmggp</span><br><span class="line">Namespace:    kubernetes-dashboard</span><br><span class="line">Labels:       &lt;none&gt;</span><br><span class="line">Annotations:  kubernetes.io/service-account.name: admin-user</span><br><span class="line">              kubernetes.io/service-account.uid: 58210c16-0fac-438c-8867-d0a3e7b950b9</span><br><span class="line"></span><br><span class="line">Type:  kubernetes.io/service-account-token</span><br><span class="line"></span><br><span class="line">Data</span><br><span class="line">====</span><br><span class="line">ca.crt:     1025 bytes</span><br><span class="line">namespace:  20 bytes</span><br><span class="line">token:      eyJhbGciOiJSUzI1NiIsImtpZCI6IlhTSnlXMUhXTlNnUmd4MlVMTzdtbm14YVdiSzNUdjk4UnVoZ3RRbUFXZGsifQ.eyJpc3MiOiJrdWJlcm5ldGVzL3NlcnZpY2VhY2NvdW50Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9uYW1lc3BhY2UiOiJrdWJlcm5ldGVzLWRhc2hib2FyZCIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VjcmV0Lm5hbWUiOiJhZG1pbi11c2VyLXRva2VuLWptZ2dwIiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9zZXJ2aWNlLWFjY291bnQubmFtZSI6ImFkbWluLXVzZXIiLCJrdWJlcm5ldGVzLmlvL3NlcnZpY2VhY2NvdW50L3NlcnZpY2UtYWNjb3VudC51aWQiOiI1ODIxMGMxNi0wZmFjLTQzOGMtODg2Ny1kMGEzZTdiOTUwYjkiLCJzdWIiOiJzeXN0ZW06c2VydmljZWFjY291bnQ6a3ViZXJuZXRlcy1kYXNoYm9hcmQ6YWRtaW4tdXNlciJ9.F4TKNO_6Guu-vcLUtELUOhRI2dGMcZ3V1et2evono_a6f-TvCR9c4pbyYCnRdCG6_MumTmyE5W1g3zHioVnb5TgnGwfmAfIWLltwwLEOxOdLfO7oqM8zrYfzZnIH16SoOZQYMU7xIk5MhE5WN265n8Q2kpDMraf0L06_nqNy1pq8h9eaX0QIntosl4fmf9KVew0geLCKbknEwpnzGGfSCcKLLgE7a45ACWwStJiL29t69gcKJ6ze33MXpA5_irk2nKkavXbKEk7ejapgYK66nOxJnDKgbNVDcBP47xHrPjGeeupB6bw6uUMWxA6z4kJUTVRepk6yTMGVDPzB9Muicw</span><br></pre></td></tr></table></figure><p><strong>现在，可以使用token登录Dashboard了</strong></p><h2 id="slave节点加入集群"><a class="markdownIt-Anchor" href="#slave节点加入集群"></a> slave节点加入集群</h2><figure class="highlight bash"><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">$ kubeadm join 10.160.18.180:6443 --token 5xxosi.3du1z15pevcvnyyx \</span><br><span class="line">    --discovery-token-ca-cert-hash sha256:4cc4977482e04ac0ca845bf3520a6a5fa8a0cf6ac8233e734a47e0250c259f73</span><br></pre></td></tr></table></figure><h3 id="问题及解决方案"><a class="markdownIt-Anchor" href="#问题及解决方案"></a> 问题及解决方案</h3><h4 id="docker-cgroup-driver问题"><a class="markdownIt-Anchor" href="#docker-cgroup-driver问题"></a> docker cgroup driver问题</h4><p><strong>问题日志</strong></p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">[WARNING IsDockerSystemdCheck]: detected <span class="string">"cgroupfs"</span> as the Docker cgroup driver. The recommended driver is <span class="string">"systemd"</span>. Please follow the guide at https://kubernetes.io/docs/setup/cri/</span><br></pre></td></tr></table></figure><p><strong>解决方法</strong></p><ol><li>在<code>/etc/docker/</code>下创建<code>daemon.json</code></li></ol><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">cat &gt; /etc/docker/daemon.json &lt;&lt;EOF</span><br><span class="line">&#123;</span><br><span class="line">  <span class="string">"exec-opts"</span>: [<span class="string">"native.cgroupdriver=systemd"</span>]</span><br><span class="line">&#125;</span><br><span class="line">EOF</span><br></pre></td></tr></table></figure><ol start="2"><li>重启docker进程</li></ol><figure class="highlight bash"><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">$ systemctl restart docker</span><br><span class="line">$ systemctl status docker</span><br></pre></td></tr></table></figure><h4 id="swap问题"><a class="markdownIt-Anchor" href="#swap问题"></a> swap问题</h4><p><strong>问题日志</strong></p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">[ERROR Swap]: running with swap on is not supported. Please <span class="built_in">disable</span> swap</span><br></pre></td></tr></table></figure><p><strong>解决方法</strong></p><figure class="highlight bash"><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">$ swapoff -a</span><br><span class="line"><span class="comment"># 在所有node上执行</span></span><br></pre></td></tr></table></figure><p>但这只是暂时关闭了swap，重启node后，就会再次打开。需要修改<code>/etc/fstab</code>，在swap那行加上<code>#</code></p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">#UUID=4eeb5155-41f9-4478-a420-2beb4290a721 none            swap    sw              0       0</span></span><br></pre></td></tr></table></figure><h3 id="node处于notready状态"><a class="markdownIt-Anchor" href="#node处于notready状态"></a> Node处于NotReady状态</h3><p>node处于NotReady状态的原因有很多。可以一步一步处理</p><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></pre></td><td class="code"><pre><span class="line">$ kubectl get nodes</span><br><span class="line">NAME    STATUS   ROLES    AGE     VERSION</span><br><span class="line">node1   Ready    master   4h56m   v1.18.2</span><br><span class="line">node2   NotReady    &lt;none&gt;   4h6m    v1.18.2</span><br></pre></td></tr></table></figure><p>先查看错误原因：</p><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><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></pre></td><td class="code"><pre><span class="line">$ kubectl get pod -n kube-system</span><br><span class="line">NAME                            READY   STATUS                  RESTARTS   AGE</span><br><span class="line">coredns-7ff77c879f-2k7rw        1/1     Running                 1          4h47m</span><br><span class="line">coredns-7ff77c879f-q76jr        1/1     Running                 1          4h47m</span><br><span class="line">etcd-node1                      1/1     Running                 2          4h47m</span><br><span class="line">kube-apiserver-node1            1/1     Running                 2          4h47m</span><br><span class="line">kube-controller-manager-node1   1/1     Running                 2          4h47m</span><br><span class="line">kube-flannel-ds-amd64-2jn8n     0/1     Init:ImagePullBackOff   0          3h49m</span><br><span class="line">kube-flannel-ds-amd64-ftpxl     1/1     Running                 1          3h49m</span><br><span class="line">kube-proxy-5q8wp                1/1     Running                 2          4h47m</span><br><span class="line">kube-proxy-wfcjq                0/1     ContainerCreating       0          5m46s</span><br><span class="line">kube-scheduler-node1            1/1     Running                 2          4h47m</span><br></pre></td></tr></table></figure><p>k8s有些服务会在各个节点上启动，比如这里的proxy，flannel。</p><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><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">$ kubectl describe pod -n kube-system kube-flannel-ds-amd64-2jn8n</span><br><span class="line">.....</span><br><span class="line">Events:</span><br><span class="line">  Type     Reason                  Age                    From            Message</span><br><span class="line">  ----     ------                  ----                   ----            -------</span><br><span class="line">  Normal   Pulling                 6m51s                  kubelet, node2  Pulling image <span class="string">"quay.io/coreos/flannel:v0.12.0-amd64"</span></span><br><span class="line">  Warning  Failed                  5m48s                  kubelet, node2  Failed to pull image <span class="string">"quay.io/coreos/flannel:v0.12.0-amd64"</span>: rpc error: code = Unknown desc = Error response from daemon: Get https://quay.io/v2/coreos/flannel/manifests/v0.12.0-amd64: received unexpected HTTP status: 500 Internal Server Error</span><br><span class="line">  Warning  Failed                  5m48s                  kubelet, node2  Error: ErrImagePull</span><br><span class="line">  Normal   BackOff                 5m47s                  kubelet, node2  Back-off pulling image <span class="string">"quay.io/coreos/flannel:v0.12.0-amd64"</span></span><br><span class="line">  Warning  Failed                  5m47s                  kubelet, node2  Error: ImagePullBackOff</span><br><span class="line">  Normal   Pulling                 5m36s (x2 over 5m51s)  kubelet, node2  Pulling image <span class="string">"quay.io/coreos/flannel:v0.12.0-amd64"</span></span><br></pre></td></tr></table></figure><p>最常见的是ImagePull失败。比如master node上镜像拉取正常，而其他节点拉取失败。</p><h4 id="解决方法"><a class="markdownIt-Anchor" href="#解决方法"></a> 解决方法</h4><h5 id="1-在slave节点上手工拉取镜像"><a class="markdownIt-Anchor" href="#1-在slave节点上手工拉取镜像"></a> 1. 在slave节点上手工拉取镜像</h5><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">$ docker pull quay.io/coreos/flannel:v0.12.0-amd64</span><br></pre></td></tr></table></figure><h5 id="2-将master节点上的镜像导入slave节点"><a class="markdownIt-Anchor" href="#2-将master节点上的镜像导入slave节点"></a> 2. 将master节点上的镜像导入slave节点</h5><ul><li>查看master节点上的镜像</li></ul><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><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></pre></td><td class="code"><pre><span class="line">(master)$ docker images</span><br><span class="line">REPOSITORY                                                        TAG                 IMAGE ID            CREATED             SIZE</span><br><span class="line">kubernetesui/dashboard                                            v2.0.0              8b32422733b3        3 weeks ago         222MB</span><br><span class="line">registry.aliyuncs.com/google_containers/kube-proxy                v1.18.2             0d40868643c6        4 weeks ago         117MB</span><br><span class="line">registry.aliyuncs.com/google_containers/kube-scheduler            v1.18.2             a3099161e137        4 weeks ago         95.3MB</span><br><span class="line">registry.aliyuncs.com/google_containers/kube-apiserver            v1.18.2             6ed75ad404bd        4 weeks ago         173MB</span><br><span class="line">registry.aliyuncs.com/google_containers/kube-controller-manager   v1.18.2             ace0a8c17ba9        4 weeks ago         162MB</span><br><span class="line">kubernetesui/metrics-scraper                                      v1.0.4              86262685d9ab        7 weeks ago         36.9MB</span><br><span class="line">quay.io/coreos/flannel                                            v0.12.0-amd64       4e9f801d2217        2 months ago        52.8MB</span><br><span class="line">registry.aliyuncs.com/google_containers/pause                     3.2                 80d28bedfe5d        3 months ago        683kB</span><br><span class="line">registry.aliyuncs.com/google_containers/coredns                   1.6.7               67da37a9a360        3 months ago        43.8MB</span><br><span class="line">registry.aliyuncs.com/google_containers/etcd                      3.4.3-0             303ce5db0e90        6 months ago        288MB</span><br></pre></td></tr></table></figure><ul><li>将镜像导出为文件</li></ul><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">(master)$ docker save quay.io/coreos/flannel  &gt; flannel.tar</span><br></pre></td></tr></table></figure><ul><li>将文件传输到slave节点上</li><li>slave节点上导入镜像</li></ul><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><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line">(slave)$ docker load &lt; flannel.tar</span><br><span class="line">256a7af3acb1: Loading layer [==================================================&gt;]  5.844MB/5.844MB</span><br><span class="line">d572e5d9d39b: Loading layer [==================================================&gt;]  10.37MB/10.37MB</span><br><span class="line">57c10be5852f: Loading layer [==================================================&gt;]  2.249MB/2.249MB</span><br><span class="line">7412f8eefb77: Loading layer [==================================================&gt;]  35.26MB/35.26MB</span><br><span class="line">05116c9ff7bf: Loading layer [==================================================&gt;]   5.12kB/5.12kB</span><br><span class="line">Loaded image: quay.io/coreos/flannel:v0.12.0-amd64</span><br></pre></td></tr></table></figure><p><strong>Now， all is OK</strong></p>]]></content>
    
    <summary type="html">
    
      &lt;ul&gt;
&lt;li&gt;阿里云源&lt;/li&gt;
&lt;li&gt;Ubuntu20.04&lt;/li&gt;
&lt;li&gt;master + slave&lt;/li&gt;
&lt;/ul&gt;
    
    </summary>
    
    
      <category term="k8s" scheme="http://www.isimble.com/categories/k8s/"/>
    
    
      <category term="docker" scheme="http://www.isimble.com/tags/docker/"/>
    
      <category term="Kubernetes" scheme="http://www.isimble.com/tags/Kubernetes/"/>
    
  </entry>
  
  <entry>
    <title>Ubuntu安装IPSAN</title>
    <link href="http://www.isimble.com/2020/04/17/setup-ipsan-ubuntu/"/>
    <id>http://www.isimble.com/2020/04/17/setup-ipsan-ubuntu/</id>
    <published>2020-04-17T09:00:27.000Z</published>
    <updated>2020-04-17T09:08:44.200Z</updated>
    
    <content type="html"><![CDATA[<p><a href="https://www.howtoforge.com/how-to-setup-iscsi-storage-server-on-ubuntu-1804/" target="_blank" rel="noopener">参考文章</a></p><p>IPSAN的定义就不讲了，主要讲一下搭建环境。IPSAN主要包括两种node：</p><ul><li>initiator：可以理解为客户端</li><li>target：可以理解为服务器端</li></ul><p>实际上也不存在客户端服务器端的理解。target端主要是把磁盘share出来给其他设备用的。initiator相当于用来映射target端的磁盘到本地的。</p><a id="more"></a><h2 id="安装及配置target端"><a class="markdownIt-Anchor" href="#安装及配置target端"></a> 安装及配置target端</h2><h3 id="服务器准备ip-1921680100"><a class="markdownIt-Anchor" href="#服务器准备ip-1921680100"></a> 服务器准备(ip: 192.168.0.100)</h3><p>服务器需要有两块磁盘，如果使用虚拟机环境，则特别简单</p><ul><li>第一块硬盘用来安装系统，大小40G就够了</li><li>第二块硬盘用来通过IPSAN来share，按需来创建，最小2G</li></ul><h3 id="安装软件包"><a class="markdownIt-Anchor" href="#安装软件包"></a> 安装软件包</h3><p>在Ubuntu上安装target端很简单，主要是安装tgt软件包</p><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"><span class="comment"># 升级软件包</span></span><br><span class="line">$ apt update -y</span><br><span class="line">$ apt upgrade -y</span><br><span class="line"><span class="comment"># 安装tgt</span></span><br><span class="line">$ apt install tgt -y</span><br></pre></td></tr></table></figure><p>默认状况下，安装完毕后，tgt服务就应该已经正常运行了。当然，可以确认是否已经运行正常</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">$ systemctl status tgt</span><br></pre></td></tr></table></figure><h3 id="配置"><a class="markdownIt-Anchor" href="#配置"></a> 配置</h3><p>安装完成后，一般情况是没有这个文件的，需要自己创建一个。创建配置文件<code>/etc/tgt/conf.d/iscsi.conf</code></p><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></pre></td><td class="code"><pre><span class="line"><span class="tag">&lt;<span class="name">target</span> <span class="attr">abc.id123.testsite.xyz:lun1</span>&gt;</span></span><br><span class="line">     backing-store /dev/sdb</span><br><span class="line">     initiator-address 192.168.0.0/16</span><br><span class="line">     incominguser test password</span><br><span class="line">     outgoinguser test password</span><br><span class="line"><span class="tag">&lt;/<span class="name">target</span>&gt;</span></span><br></pre></td></tr></table></figure><h4 id="配置说明"><a class="markdownIt-Anchor" href="#配置说明"></a> 配置说明</h4><ol><li>target后面为节点名称，随便写</li><li>backing-store，即将要share出去的磁盘</li><li>initiator-address，即可以允许连接的IP地址或地址范围</li><li>incominguser，入的用户名密码（我的理解是写权限）</li><li>outgoinguser，出的用户名密码（我的理解是读权限）</li></ol><h4 id="检查配置"><a class="markdownIt-Anchor" href="#检查配置"></a> 检查配置</h4><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">$ systemctl restart tgt</span><br></pre></td></tr></table></figure><ul><li>查看状态</li></ul><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><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></pre></td><td class="code"><pre><span class="line">$ tgtadm --mode target --op show</span><br><span class="line">Target abc.id123.testsite.xyz:lun1</span><br><span class="line">    System information:</span><br><span class="line">        Driver: iscsi</span><br><span class="line">        State: ready</span><br><span class="line">    I_T nexus information:</span><br><span class="line">    LUN information:</span><br><span class="line">        LUN: 0</span><br><span class="line">            Type: controller</span><br><span class="line">            SCSI ID: IET     00010000</span><br><span class="line">            SCSI SN: beaf10</span><br><span class="line">            Size: 0 MB, Block size: 1</span><br><span class="line">            Online: Yes</span><br><span class="line">            Removable media: No</span><br><span class="line">            Prevent removal: No</span><br><span class="line">            Readonly: No</span><br><span class="line">            SWP: No</span><br><span class="line">            Thin-provisioning: No</span><br><span class="line">            Backing store <span class="built_in">type</span>: null</span><br><span class="line">            Backing store path: None</span><br><span class="line">            Backing store flags: </span><br><span class="line">        LUN: 1</span><br><span class="line">            Type: disk</span><br><span class="line">            SCSI ID: IET     00010001</span><br><span class="line">            SCSI SN: beaf11</span><br><span class="line">            Size: 2146 MB, Block size: 512</span><br><span class="line">            Online: Yes</span><br><span class="line">            Removable media: No</span><br><span class="line">            Prevent removal: No</span><br><span class="line">            Readonly: No</span><br><span class="line">            SWP: No</span><br><span class="line">            Thin-provisioning: No</span><br><span class="line">            Backing store <span class="built_in">type</span>: rdwr</span><br><span class="line">            Backing store path: /dev/sdb</span><br><span class="line">            Backing store flags: </span><br><span class="line">    Account information:</span><br><span class="line">        <span class="built_in">test</span></span><br><span class="line">        <span class="built_in">test</span> (outgoing)</span><br><span class="line">    ACL information:</span><br><span class="line">        192.168.0.0/16</span><br></pre></td></tr></table></figure><h2 id="安装及配置initiator"><a class="markdownIt-Anchor" href="#安装及配置initiator"></a> 安装及配置initiator</h2><p>如果你只是想创建一个IPSAN共享存储出去，那么不需要安装initiator。本例则同样通过另外一台Ubuntu服务器来连接target端</p><h3 id="安装及配置initiator1921680200"><a class="markdownIt-Anchor" href="#安装及配置initiator1921680200"></a> 安装及配置initiator(192.168.0.200)</h3><ul><li>安装open-iscsi软件包</li></ul><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">$ apt-get install open-iscsi -y</span><br></pre></td></tr></table></figure><ul><li>探测target端</li></ul><figure class="highlight bash"><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">$ iscsiadm -m discovery -t st -p 192.168.0.100</span><br><span class="line">192.168.0.100:3260,1 abc.id123.testsite.xyz:lun1</span><br></pre></td></tr></table></figure><ul><li>修改配置文件</li></ul><p>探测完成后，将会在<code>/etc/iscsi/nodes/</code>目录和<code>/etc/iscsi/send_targets/</code>目录下看到对应的target</p><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><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">$ ls -l /etc/iscsi/nodes/abc.id123.testsite.xyz\:lun1/192.168.0.100\,3260\,1/ </span><br><span class="line">total 4</span><br><span class="line">-rw------- 1 root root 1840 Nov  8 13:17 default</span><br><span class="line"></span><br><span class="line">$ ls -l /etc/iscsi/send_targets/192.168.0.100,3260/</span><br><span class="line">total 8</span><br><span class="line">lrwxrwxrwx 1 root root  66 Nov  8 13:17 abc.id123.testsite.xyz:lun1,192.168.0.100,3260,1,default -&gt; /etc/iscsi/nodes/abc.id123.testsite.xyz:lun1/192.168.0.100,3260,1</span><br><span class="line">-rw------- 1 root root 547 Nov  8 13:17 st_config</span><br></pre></td></tr></table></figure><p>修改default文件，增加CHAP的配置（认证相关）</p><p><code>vim /etc/iscsi/nodes/abc.id123.testsite.xyz\:lun1/192.168.0.100\,3260\,1/default</code>，新增如下内容</p><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><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line">node.session.auth.authmethod = CHAP</span><br><span class="line">node.session.auth.username = <span class="built_in">test</span></span><br><span class="line">node.session.auth.password = password</span><br><span class="line">node.session.auth.username_in = <span class="built_in">test</span></span><br><span class="line">node.session.auth.password_in = password</span><br><span class="line">node.startup = automatic</span><br></pre></td></tr></table></figure><h3 id="验证"><a class="markdownIt-Anchor" href="#验证"></a> 验证</h3><ul><li>重启服务</li></ul><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">$ systemctl restart open-iscsi</span><br></pre></td></tr></table></figure><ul><li>检查是否映射完成</li></ul><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><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">$ lsblk</span><br><span class="line">NAME   MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT</span><br><span class="line">sda      8:0    0   40G  0 disk</span><br><span class="line">├─sda1   8:1    0  512M  0 part /boot/efi</span><br><span class="line">└─sda2   8:2    0 39.5G  0 part /</span><br><span class="line">sdb      8:16   0  120G  0 disk</span><br><span class="line">└─sdb1   8:17   0  120G  0 part</span><br><span class="line">sr0     11:0    1 1024M  0 rom</span><br></pre></td></tr></table></figure><p>其中的sdb即为通过IPSAN连接的磁盘。可以以本地磁盘的方式进行访问</p><h2 id="更多内容"><a class="markdownIt-Anchor" href="#更多内容"></a> 更多内容</h2><p>可以参看<a href="https://www.cnblogs.com/kevingrace/p/8467141.html" target="_blank" rel="noopener">这篇文章</a>来创建多台target，创建LVM并share出去一组成IPSAN存储设备组</p>]]></content>
    
    <summary type="html">
    
      &lt;p&gt;&lt;a href=&quot;https://www.howtoforge.com/how-to-setup-iscsi-storage-server-on-ubuntu-1804/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;参考文章&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;IPSAN的定义就不讲了，主要讲一下搭建环境。IPSAN主要包括两种node：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;initiator：可以理解为客户端&lt;/li&gt;
&lt;li&gt;target：可以理解为服务器端&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;实际上也不存在客户端服务器端的理解。target端主要是把磁盘share出来给其他设备用的。initiator相当于用来映射target端的磁盘到本地的。&lt;/p&gt;
    
    </summary>
    
    
      <category term="cloud" scheme="http://www.isimble.com/categories/cloud/"/>
    
    
      <category term="network" scheme="http://www.isimble.com/tags/network/"/>
    
  </entry>
  
  <entry>
    <title>Openstack学习 —— 跨主机虚拟机访问2</title>
    <link href="http://www.isimble.com/2019/11/27/openstack-cross-host-vm-2/"/>
    <id>http://www.isimble.com/2019/11/27/openstack-cross-host-vm-2/</id>
    <published>2019-11-27T06:47:24.000Z</published>
    <updated>2019-11-27T06:51:27.597Z</updated>
    
    <content type="html"><![CDATA[<p>上篇文章梳理了分别在两个node上创建了VM后，底层的Linux系统上的namespace、linux bridge以及ovs中发生的事情。</p><p>本文将来着重关注两个node上的VM相互访问的流量通路。特别是令人头疼的ovs流表以及两个node是如何通过VXLAN网络将两台虚拟机连在了一起的。</p><a id="more"></a><p><img src="/2019/11/27/openstack-cross-host-vm-2/create_vm_with_2node.png" alt="create_vm_with_2node" /></p><h3 id="br-tun"><a class="markdownIt-Anchor" href="#br-tun"></a> br-tun</h3><p><strong>在前面收集信息时，你或许已经关注到了linux bridge和ovs中还有其他变化，那么，来看看 <code>br-tun</code></strong></p><ul><li>ovs</li></ul><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><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></pre></td><td class="code"><pre><span class="line">(node0)$ ovs-vsctl show</span><br><span class="line">...</span><br><span class="line">    Bridge br-tun</span><br><span class="line">        ...</span><br><span class="line">        Port <span class="string">"vxlan-ac0a000b"</span></span><br><span class="line">            Interface <span class="string">"vxlan-ac0a000b"</span></span><br><span class="line">                <span class="built_in">type</span>: vxlan</span><br><span class="line">                options: &#123;df_default=<span class="string">"true"</span>, in_key=flow, local_ip=<span class="string">"172.10.0.10"</span>, out_key=flow, remote_ip=<span class="string">"172.10.0.11"</span>&#125;</span><br><span class="line">        ...</span><br><span class="line">        </span><br><span class="line">(node1)$ ovs-vsctl show</span><br><span class="line">...</span><br><span class="line">    Bridge br-tun</span><br><span class="line">        ...</span><br><span class="line">        Port <span class="string">"vxlan-ac0a000a"</span></span><br><span class="line">            Interface <span class="string">"vxlan-ac0a000a"</span></span><br><span class="line">                <span class="built_in">type</span>: vxlan</span><br><span class="line">                options: &#123;df_default=<span class="string">"true"</span>, in_key=flow, local_ip=<span class="string">"172.10.0.11"</span>, out_key=flow, remote_ip=<span class="string">"172.10.0.10"</span>&#125;</span><br><span class="line">        ...</span><br></pre></td></tr></table></figure><p>当环境搭建完毕后，并不会立即创建这个接口，而是当创建了虚拟机后，会创建VXLAN的VTEP接口。</p><p><img src="/2019/11/27/openstack-cross-host-vm-2/create_vm_with_2node_vxlan.png" alt="create_vm_with_2node_vxlan" /></p><h3 id="流表"><a class="markdownIt-Anchor" href="#流表"></a> 流表</h3><h4 id="node0"><a class="markdownIt-Anchor" href="#node0"></a> node0</h4><ul><li><strong>br-int</strong></li></ul><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><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">$ ovs-ofctl dump-flows br-int</span><br><span class="line"> table=0, ..., priority=65535,vlan_tci=0x0fff/0x1fff actions=drop</span><br><span class="line"> table=0, ..., priority=10,icmp6,in_port=<span class="string">"qvo02407769-97"</span>,icmp_type=136 actions=resubmit(,24)</span><br><span class="line"> table=0, ..., priority=10,arp,in_port=<span class="string">"qvo02407769-97"</span> actions=resubmit(,24)</span><br><span class="line"> table=0, ..., priority=2,in_port=<span class="string">"int-br-provider"</span> actions=drop</span><br><span class="line"> table=0, ..., priority=2,in_port=<span class="string">"int-br-ext"</span> actions=drop</span><br><span class="line"> table=0, ..., priority=9,in_port=<span class="string">"qvo02407769-97"</span> actions=resubmit(,25)</span><br><span class="line"> table=0, ..., priority=0 actions=resubmit(,60)</span><br><span class="line"> table=23, ..., priority=0 actions=drop</span><br><span class="line"> table=24, ..., priority=2,icmp6,in_port=<span class="string">"qvo02407769-97"</span>,icmp_type=136,nd_target=fe80::f816:3eff:fead:669e actions=resubmit(,60)</span><br><span class="line"> table=24, ..., priority=2,arp,in_port=<span class="string">"qvo02407769-97"</span>,arp_spa=200.0.0.219 actions=resubmit(,25)</span><br><span class="line"> table=24, ..., priority=0 actions=drop</span><br><span class="line"> table=25, ..., priority=2,in_port=<span class="string">"qvo02407769-97"</span>,dl_src=fa:16:3e:ad:66:9e actions=resubmit(,60)</span><br><span class="line"> table=60, ..., priority=3 actions=NORMAL</span><br></pre></td></tr></table></figure><p><strong>table 0</strong></p><ol><li>从<code>qvo02407769-97</code>送入的icmp，arp报文，送往table 24</li><li>从<code>qvo02407769-97</code>送入其他报文送往table 25</li><li>其他报文送table 60</li></ol><p><strong>table 24</strong></p><ol><li>从<code>qvo02407769-97</code>送入的报文，送往table 60。<code>fe80::f816:3eff:fead:669e</code>是vm-1的IPv6地址</li><li>从<code>qvo02407769-97</code>送入的arp报文，arp源地址为<code>200.0.0.219</code>即vm-1来的报文，送往table 25</li></ol><p><strong>table 25</strong></p><p>从<code>qvo02407769-97</code>送入的报文，源mac为<code>fa:16:3e:ad:66:9e</code>即vm-1来的报文，送往table 60</p><p><strong>table 60</strong></p><p>正常转发</p><blockquote><p>综上，从vm-1来的报文以及其他报文，都将正常在<code>br-int</code>上转发</p></blockquote><ul><li><strong>br-tun</strong></li></ul><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><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></pre></td><td class="code"><pre><span class="line">$ ovs-ofctl dump-flows br-tun</span><br><span class="line"> table=0, ..., priority=1,in_port=<span class="string">"patch-int"</span> actions=resubmit(,2)</span><br><span class="line"> table=0, ..., priority=1,in_port=<span class="string">"vxlan-ac0a000b"</span> actions=resubmit(,4)</span><br><span class="line"> table=0, ..., priority=0 actions=drop</span><br><span class="line"> table=2, ..., priority=0,dl_dst=00:00:00:00:00:00/01:00:00:00:00:00 actions=resubmit(,20)</span><br><span class="line"> table=2, ..., priority=0,dl_dst=01:00:00:00:00:00/01:00:00:00:00:00 actions=resubmit(,22)</span><br><span class="line"> table=3, ..., priority=0 actions=drop</span><br><span class="line"> table=4, ..., priority=1,tun_id=0xf actions=mod_vlan_vid:1,resubmit(,10)</span><br><span class="line"> table=4, ..., priority=0 actions=drop</span><br><span class="line"> table=6, ..., priority=0 actions=drop</span><br><span class="line"> table=10, ..., priority=1 actions=learn(table=20,hard_timeout=300,priority=1,cookie=0x9c915752f14d2544,NXM_OF_VLAN_TCI[0..11],NXM_OF_ETH_DST[]=NXM_OF_ETH_SRC[],load:0-&gt;NXM_OF_VLAN_TCI[],load:NXM_NX_TUN_ID[]-&gt;NXM_NX_TUN_ID[],output:OXM_OF_IN_PORT[]),output:<span class="string">"patch-int"</span></span><br><span class="line"> table=20, ..., priority=2,dl_vlan=1,dl_dst=fa:16:3e:f5:ca:f5 actions=strip_vlan,load:0xf-&gt;NXM_NX_TUN_ID[],output:<span class="string">"vxlan-ac0a000b"</span></span><br><span class="line"> table=20, ..., hard_timeout=300, priority=1,vlan_tci=0x0001/0x0fff,dl_dst=fa:16:3e:f5:ca:f5 actions=load:0-&gt;NXM_OF_VLAN_TCI[],load:0xf-&gt;NXM_NX_TUN_ID[],output:<span class="string">"vxlan-ac0a000b"</span></span><br><span class="line"> table=20, ..., priority=0 actions=resubmit(,22)</span><br><span class="line"> table=22, ..., priority=1,dl_vlan=1 actions=strip_vlan,load:0xf-&gt;NXM_NX_TUN_ID[],output:<span class="string">"vxlan-ac0a000b"</span></span><br><span class="line"> table=22, ..., priority=0 actions=drop</span><br></pre></td></tr></table></figure><p><strong>table 0</strong></p><ol><li>从<code>br-int</code>来的报文（即需要从本节点送出的报文），送到table 2</li><li>从<code>vxlan-ac0a000b</code>送来的报文（即从其他节点送到node 0的），送到table 4</li></ol><p><strong>table 2</strong>： 将要送出本节点的报文</p><ol><li>送往table 20</li><li>送往table 22</li></ol><p><strong>table 4</strong>： 从其他节点送到本节点的报文</p><p>tun_id为15（0xf）的报文，打上vlan标签1，送往table 10</p><blockquote><p>即从vxlan的tunnel出来的报文，如果tunnel id是15，则报文设置vlan为1</p><p>而<code>qvo02407769-97</code>（与vm-1相连）和<code>tap17a89323-fd</code>（DHCP的tap接口）的vlan tag正是<code>1</code></p></blockquote><p><strong>table 10</strong></p><blockquote><p>learn(table=20,hard_timeout=300,priority=1,cookie=0x9c915752f14d2544,NXM_OF_VLAN_TCI[0…11],NXM_OF_ETH_DST[]=NXM_OF_ETH_SRC[],load:0-&gt;NXM_OF_VLAN_TCI[],load:NXM_NX_TUN_ID[]-&gt;NXM_NX_TUN_ID[],output:OXM_OF_IN_PORT[]),output:“patch-int”</p></blockquote><p>这个action是如此的复杂，但不看<code>learn()</code>中的内容，报文最终被送往了<code>br-int</code></p><blockquote><p>learn则是在table20中增加对于回程报文的转发规则</p></blockquote><p><strong>table 20</strong></p><p>送往table 22</p><p><strong>table 22</strong></p><p>VLAN tag为1的报文，去掉VLAN，设置tun_id为15（0xf）后，送往<code>vxlan-ac0a000b</code></p><blockquote><p>综上：</p><ol><li>从vm-1送来的报文，携带VLAN tag为1，去掉VLAN tag，设置tun_id为15，从vxlan接口送出</li><li>从其他节点送来的报文，如果tun_id为15，设置VLAN tag为1，送往br-int</li></ol></blockquote><h3 id="总结"><a class="markdownIt-Anchor" href="#总结"></a> 总结</h3><p>完整的分析了node0上的流表，node1上的流表内容基本相似，就不再展开。</p><p>至此，跨节点的虚拟机相互访问的实验及分析正式完结。你会发现</p><ol><li>每一个port在连接到虚拟机的时候，都创建了一个网桥</li><li>每个虚拟机连在br-int上的接口，都按照subnet分配了一个VLAN tag，且每个节点的并不相同</li><li>当虚拟机的报文要送出/进入当前节点时，会有VLAN tag和VXLAN的tun_id相互转换</li></ol><p>现在，思考一下：</p><ol><li>node1上的vm-1是如何通过DHCP获取IP地址的？</li><li>为什么虚拟机不直接连在br-int上，而是要通过一个linux bridge连接到br-int上呢？</li></ol>]]></content>
    
    <summary type="html">
    
      &lt;p&gt;上篇文章梳理了分别在两个node上创建了VM后，底层的Linux系统上的namespace、linux bridge以及ovs中发生的事情。&lt;/p&gt;
&lt;p&gt;本文将来着重关注两个node上的VM相互访问的流量通路。特别是令人头疼的ovs流表以及两个node是如何通过VXLAN网络将两台虚拟机连在了一起的。&lt;/p&gt;
    
    </summary>
    
    
      <category term="cloud" scheme="http://www.isimble.com/categories/cloud/"/>
    
    
      <category term="openstack" scheme="http://www.isimble.com/tags/openstack/"/>
    
  </entry>
  
</feed>
