有个性的哪吒 發表於 2019-11-26 17:19:00

kubernetes学习Service之headless和statefulSet结合

<h3>一、首先说headless Service和普通Service的区别</h3>
<p><span style="color: rgba(255, 0, 255, 1)">headless</span>不分配<span style="color: rgba(255, 0, 255, 1)">clusterIP</span></p>
<p><span style="color: rgba(255, 0, 255, 1)">headless service</span>可以通过解析<span style="color: rgba(255, 0, 255, 1)">service</span>的<span style="color: rgba(255, 0, 255, 1)">DNS</span>,返回所有<span style="color: rgba(255, 0, 255, 1)">Pod</span>的地址和<span style="color: rgba(255, 0, 255, 1)">DNS</span>(statefulSet部署的Pod才有DNS)</p>
<p>普通的<span style="color: rgba(255, 0, 255, 1)">service</span>,只能通过解析<span style="color: rgba(255, 0, 255, 1)">service</span>的<span style="color: rgba(255, 0, 255, 1)">DNS</span>返回<span style="color: rgba(255, 0, 255, 1)">service</span>的<span style="color: rgba(255, 0, 255, 1)">ClusterIP</span></p>
<h3>二、statefulSet和Deployment控制器的区别</h3>
<p><span style="color: rgba(255, 0, 255, 1)">statefulSet</span>下的<span style="color: rgba(255, 0, 255, 1)">Pod</span>有<span style="color: rgba(255, 0, 255, 1)">DNS</span>地址,通过解析<span style="color: rgba(255, 0, 255, 1)">Pod</span>的<span style="color: rgba(255, 0, 255, 1)">DNS</span>可以返回<span style="color: rgba(255, 0, 255, 1)">Pod</span>的<span style="color: rgba(255, 0, 255, 1)">IP</span><br><span style="color: rgba(255, 0, 255, 1)">deployment</span>下的<span style="color: rgba(255, 0, 255, 1)">Pod</span>没有<span style="color: rgba(255, 0, 255, 1)">DNS</span></p>
<p><span style="color: rgba(0, 0, 0, 1)"><strong>三、通过StatefulSet和headless server部署的服务效果</strong></span></p>
<p><span style="color: rgba(255, 0, 255, 1)">1.另一个pod里 可以通过dns+访问到 该服务</span></p>
<p><span style="color: rgba(255, 0, 255, 1)"><img src="https://img2020.cnblogs.com/blog/929849/202101/929849-20210126103905037-1703894962.png" alt="" loading="lazy"></span></p>
<p>&nbsp;</p>
<p><span style="color: rgba(255, 0, 255, 1)"></span></p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<h3>四、普通<span style="color: rgba(255, 0, 255, 1)">Service</span>接续service的<span style="color: rgba(255, 0, 255, 1)">DNS</span>结果</h3>
<p>Service的ClusterIP工作原理:一个service可能对应一组endpoints(所有pod的地址+端口),client访问ClusterIP,通过iptables或者ipvs转发到Real Server(Pod),具体操作如下</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(255, 0, 0, 1)"># kubectl get svc -</span><span style="color: rgba(0, 0, 0, 1)"><span style="color: rgba(255, 0, 0, 1)">n ms   #获取所有svc,看到gateway这个service的clusterIP是10.0.0.14</span>
NAME               TYPE      CLUSTER</span>-IP   EXTERNAL-<span style="color: rgba(0, 0, 0, 1)">IP   PORT(S)    AGE
eureka             ClusterIP   None         </span>&lt;none&gt;      <span style="color: rgba(128, 0, 128, 1)">8888</span>/<span style="color: rgba(0, 0, 0, 1)">TCP   21h
gateway            ClusterIP   </span><span style="color: rgba(128, 0, 128, 1)">10.0</span>.<span style="color: rgba(128, 0, 128, 1)">0.14</span>    &lt;none&gt;      <span style="color: rgba(128, 0, 128, 1)">9999</span>/<span style="color: rgba(0, 0, 0, 1)">TCP   20h
mysql</span>-production   ClusterIP   <span style="color: rgba(128, 0, 128, 1)">10.0</span>.<span style="color: rgba(128, 0, 128, 1)">0.251</span>   &lt;none&gt;      <span style="color: rgba(128, 0, 128, 1)">3306</span>/<span style="color: rgba(0, 0, 0, 1)">TCP   23h
portal             ClusterIP   </span><span style="color: rgba(128, 0, 128, 1)">10.0</span>.<span style="color: rgba(128, 0, 128, 1)">0.124</span>   &lt;none&gt;      <span style="color: rgba(128, 0, 128, 1)">8080</span>/<span style="color: rgba(0, 0, 0, 1)">TCP   17h<br>
<span style="color: rgba(255, 0, 0, 1)"># kubectl describe svc gateway -</span><span style="color: rgba(0, 0, 0, 1)"><span style="color: rgba(255, 0, 0, 1)">n ms#看到gateway这个service的具体信息</span>
Name:            gateway
Namespace:         ms
Labels:            </span>&lt;none&gt;<span style="color: rgba(0, 0, 0, 1)">
Annotations:       kubectl.kubernetes.io</span>/last-applied-<span style="color: rgba(0, 0, 0, 1)">configuration:
                     {</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">apiVersion</span><span style="color: rgba(128, 0, 0, 1)">"</span>:<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">v1</span><span style="color: rgba(128, 0, 0, 1)">"</span>,<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">kind</span><span style="color: rgba(128, 0, 0, 1)">"</span>:<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">Service</span><span style="color: rgba(128, 0, 0, 1)">"</span>,<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">metadata</span><span style="color: rgba(128, 0, 0, 1)">"</span>:{<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">annotations</span><span style="color: rgba(128, 0, 0, 1)">"</span>:{},<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">name</span><span style="color: rgba(128, 0, 0, 1)">"</span>:<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">gateway</span><span style="color: rgba(128, 0, 0, 1)">"</span>,<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">namespace</span><span style="color: rgba(128, 0, 0, 1)">"</span>:<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">ms</span><span style="color: rgba(128, 0, 0, 1)">"</span>},<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">spec</span><span style="color: rgba(128, 0, 0, 1)">"</span>:{<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">ports</span><span style="color: rgba(128, 0, 0, 1)">"</span>:[{<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">name</span><span style="color: rgba(128, 0, 0, 1)">"</span>:<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">gateway</span><span style="color: rgba(128, 0, 0, 1)">"</span>,<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">po...</span>
Selector:          app=gateway,project=<span style="color: rgba(0, 0, 0, 1)">ms
Type:            ClusterIP
IP:                </span><span style="color: rgba(128, 0, 128, 1)">10.0</span>.<span style="color: rgba(128, 0, 128, 1)">0.14</span><span style="color: rgba(0, 0, 0, 1)">
Port:            gateway</span><span style="color: rgba(128, 0, 128, 1)">9999</span>/<span style="color: rgba(0, 0, 0, 1)">TCP
TargetPort:      </span><span style="color: rgba(128, 0, 128, 1)">9999</span>/<span style="color: rgba(0, 0, 0, 1)">TCP
Endpoints:         </span><span style="color: rgba(128, 0, 128, 1)">10.244</span>.<span style="color: rgba(128, 0, 128, 1)">1.212</span>:<span style="color: rgba(128, 0, 128, 1)">9999   #该service下的Pod地址</span><span style="color: rgba(0, 0, 0, 1)">
Session Affinity:None
Events:            </span>&lt;none&gt;<br><br><span style="color: rgba(255, 0, 0, 1)">
# kubectl exec -it gateway-6cd76c98fb-8w92t -n ms sh#进入一个容器测试解析
</span><span style="color: rgba(255, 0, 255, 1)">/</span><span style="color: rgba(0, 0, 0, 1)"><span style="color: rgba(255, 0, 255, 1)"> # nslookup gateway.ms.svc.cluster.local</span>         #测试解析gateway这个service的DNS
nslookup: can</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">t resolve </span><span style="color: rgba(128, 0, 0, 1)">'</span>(<span style="color: rgba(0, 0, 255, 1)">null</span>)<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">: Name does not resolve</span>
<span style="color: rgba(0, 0, 0, 1)">
Name:      gateway.ms.svc.cluster.local
Address </span><span style="color: rgba(128, 0, 128, 1)">1</span>: <span style="color: rgba(128, 0, 128, 1)">10.0</span>.<span style="color: rgba(128, 0, 128, 1)">0.14</span> gateway.ms.svc.cluster.local#这个结果就是gateway这个service的ClusterIP</pre>
</div>
<p>从上面的结果能看到,虽然<span style="color: rgba(255, 0, 255, 1)">Service</span>有1个<span style="color: rgba(255, 0, 255, 1)">endpoint</span>,但是DNS查询时只会返回<span style="color: rgba(255, 0, 255, 1)">Service</span>的<span style="color: rgba(255, 0, 255, 1)">ClusterIP</span>地址,具体<span style="color: rgba(255, 0, 255, 1)">Client</span>访问的是哪个<span style="color: rgba(255, 0, 255, 1)">real serve</span>r,由<span style="color: rgba(255, 0, 255, 1)">iptables</span>或者<span style="color: rgba(255, 0, 255, 1)">ipvs</span>决定</p>
<h3><span style="color: rgba(255, 0, 255, 1)"><span style="color: rgba(0, 0, 0, 1)">五</span>、headless Service</span>的解析service的<span style="color: rgba(255, 0, 255, 1)">DNS</span>结果</h3>
<div class="cnblogs_code">
<pre><span style="color: rgba(255, 0, 0, 1)"># kubectl get svc -</span><span style="color: rgba(0, 0, 0, 1)"><span style="color: rgba(255, 0, 0, 1)">n ms   #查看所有SVC,看到eureka的这个headless service</span>
NAME               TYPE      CLUSTER</span>-IP   EXTERNAL-<span style="color: rgba(0, 0, 0, 1)">IP   PORT(S)    AGE
<span style="color: rgba(255, 0, 255, 1)"><strong>eureka             ClusterIP   None         </strong></span></span><span style="color: rgba(255, 0, 255, 1)"><strong>&lt;none&gt;      8888/</strong></span><span style="color: rgba(0, 0, 0, 1)"><span style="color: rgba(255, 0, 255, 1)"><strong>TCP   21h</strong></span>
gateway            ClusterIP   </span><span style="color: rgba(128, 0, 128, 1)">10.0</span>.<span style="color: rgba(128, 0, 128, 1)">0.14</span>    &lt;none&gt;      <span style="color: rgba(128, 0, 128, 1)">9999</span>/<span style="color: rgba(0, 0, 0, 1)">TCP   20h
mysql</span>-production   ClusterIP   <span style="color: rgba(128, 0, 128, 1)">10.0</span>.<span style="color: rgba(128, 0, 128, 1)">0.251</span>   &lt;none&gt;      <span style="color: rgba(128, 0, 128, 1)">3306</span>/<span style="color: rgba(0, 0, 0, 1)">TCP   23h
portal             ClusterIP   </span><span style="color: rgba(128, 0, 128, 1)">10.0</span>.<span style="color: rgba(128, 0, 128, 1)">0.124</span>   &lt;none&gt;      <span style="color: rgba(128, 0, 128, 1)">8080</span>/<span style="color: rgba(0, 0, 0, 1)">TCP   18h
<span style="color: rgba(255, 0, 0, 1)"># kubectl describe svc eureka -</span><span style="color: rgba(0, 0, 0, 1)"><span style="color: rgba(255, 0, 0, 1)">n ms#看到eureka的这个headless service下面的endpoints</span>
Name:            eureka
Namespace:         ms
Labels:            </span>&lt;none&gt;<span style="color: rgba(0, 0, 0, 1)">
Annotations:       kubectl.kubernetes.io</span>/last-applied-<span style="color: rgba(0, 0, 0, 1)">configuration:
                     {</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">apiVersion</span><span style="color: rgba(128, 0, 0, 1)">"</span>:<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">v1</span><span style="color: rgba(128, 0, 0, 1)">"</span>,<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">kind</span><span style="color: rgba(128, 0, 0, 1)">"</span>:<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">Service</span><span style="color: rgba(128, 0, 0, 1)">"</span>,<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">metadata</span><span style="color: rgba(128, 0, 0, 1)">"</span>:{<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">annotations</span><span style="color: rgba(128, 0, 0, 1)">"</span>:{},<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">name</span><span style="color: rgba(128, 0, 0, 1)">"</span>:<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">eureka</span><span style="color: rgba(128, 0, 0, 1)">"</span>,<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">namespace</span><span style="color: rgba(128, 0, 0, 1)">"</span>:<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">ms</span><span style="color: rgba(128, 0, 0, 1)">"</span>},<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">spec</span><span style="color: rgba(128, 0, 0, 1)">"</span>:{<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">clusterIP</span><span style="color: rgba(128, 0, 0, 1)">"</span>:<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">None</span><span style="color: rgba(128, 0, 0, 1)">"</span>,<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">ports</span><span style="color: rgba(128, 0, 0, 1)">"</span>:[{<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">n...</span>
Selector:          app=eureka,project=<span style="color: rgba(0, 0, 0, 1)">ms
Type:            ClusterIP
IP:                None
Port:            eureka</span><span style="color: rgba(128, 0, 128, 1)">8888</span>/<span style="color: rgba(0, 0, 0, 1)">TCP
TargetPort:      </span><span style="color: rgba(128, 0, 128, 1)">8888</span>/<span style="color: rgba(0, 0, 0, 1)">TCP
<strong><span style="color: rgba(255, 0, 255, 1)">Endpoints:         </span></strong></span><strong><span style="color: rgba(255, 0, 255, 1)">10.244.1.210:8888,10.244.1.211:8888,10.244.2.45:8888</span></strong><span style="color: rgba(0, 0, 0, 1)">
Session Affinity:None
Events:            </span>&lt;none&gt;<span style="color: rgba(255, 0, 0, 1)">
# kubectl exec -it gateway-6cd76c98fb-8w92t -n ms sh#进入容器测试解析
/</span><span style="color: rgba(0, 0, 0, 1)"><span style="color: rgba(255, 0, 0, 1)"> # nslookup eureka.ms.svc.cluster.local                  #通过解析eureka这个headless service的DNS地址,可以看到关联的具体endpoints信息</span>
nslookup: can</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">t resolve </span><span style="color: rgba(128, 0, 0, 1)">'</span>(<span style="color: rgba(0, 0, 255, 1)">null</span>)<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">: Name does not resolve</span>
<span style="color: rgba(0, 0, 0, 1)">
Name:      eureka.ms.svc.cluster.local
<strong><span style="color: rgba(255, 0, 255, 1)">Address </span></strong></span><strong><span style="color: rgba(255, 0, 255, 1)">1: 10.244.1.211 eureka-2.eureka.ms.svc.cluster.local
Address 2: 10.244.1.210 eureka-0.eureka.ms.svc.cluster.local
Address 3: 10.244.2.45 eureka-1.eureka.ms.svc.cluster.local<br></span></strong></pre>
<p>&nbsp; <span style="color: rgba(255, 0, 0, 1)">/ # nslookup eureka-2.eureka.ms.svc.cluster.local&nbsp; #解析pod的DNS记录,也能返回Pod的IP</span><br>&nbsp; nslookup: can't resolve '(null)': Name does not resolve</p>
<pre></pre>
<p>&nbsp; Name: eureka-2.eureka.ms.svc.cluster.local<br><span style="color: rgba(255, 0, 255, 1)">&nbsp; Address 1: 10.244.1.211 eureka-2.eureka.ms.svc.cluster.local</span></p>
<pre><strong><span style="color: rgba(255, 0, 255, 1)">&nbsp;</span></strong></pre>
</div>
<ul>
<li>根据结果看到,<span style="color: rgba(255, 0, 255, 1)">dns</span>查询会返回3个<span style="color: rgba(255, 0, 255, 1)">endpoint</span>,也就是3个<span style="color: rgba(255, 0, 255, 1)">pod</span>地址和<span style="color: rgba(255, 0, 255, 1)">DNS</span>,通过解析<span style="color: rgba(255, 0, 255, 1)">pod</span>的<span style="color: rgba(255, 0, 255, 1)">DNS</span>也能返回<span style="color: rgba(255, 0, 255, 1)">Pod的IP</span></li>
</ul>
<h3><span style="color: rgba(255, 0, 255, 1)"><span style="color: rgba(0, 0, 0, 1)">六、</span>headless Service</span>就是没头的<span style="color: rgba(255, 0, 255, 1)">Service</span>,有什么使用场景呢?</h3>
<ul>
<li>第一种:自主选择权,有时候<span style="color: rgba(255, 0, 255, 1)">client</span>想自己决定使用哪个<span style="color: rgba(255, 0, 255, 1)">Real Server</span>,可以通过查询<span style="color: rgba(255, 0, 255, 1)">DNS</span>来获取<span style="color: rgba(255, 0, 255, 1)">Real Server</span>的信息</li>
<li>第二种:<span style="color: rgba(255, 0, 255, 1)">headless&nbsp; service</span>关联的每个<span style="color: rgba(255, 0, 255, 1)">endpoint(也就是Pod)</span>,都会有对应的<span style="color: rgba(255, 0, 255, 1)">DNS</span>域名;这样<span style="color: rgba(255, 0, 255, 1)">Pod</span>之间就可以互相访问</li>
</ul>
<div class="cnblogs_code">
<p>&nbsp;<span style="color: rgba(255, 0, 0, 1)"> # kubectl get sts -n ms</span> <br>&nbsp; &nbsp;NAME   READY   AGE<br>&nbsp; &nbsp;eureka   3/3   22h</p>
<pre><span style="color: rgba(255, 0, 0, 1)"># kubectl get svc -</span><span style="color: rgba(0, 0, 0, 1)"><span style="color: rgba(255, 0, 0, 1)">n ms</span>
NAME               TYPE      CLUSTER</span>-IP   EXTERNAL-<span style="color: rgba(0, 0, 0, 1)">IP   PORT(S)    AGE
eureka             ClusterIP   None         </span>&lt;none&gt;      <span style="color: rgba(128, 0, 128, 1)">8888</span>/<span style="color: rgba(0, 0, 0, 1)">TCP   21h</span><span style="color: rgba(255, 0, 0, 1)">
# kubectl describe svc eureka -</span><span style="color: rgba(0, 0, 0, 1)"><span style="color: rgba(255, 0, 0, 1)">n ms</span>
Name:            eureka
Namespace:         ms
Labels:            </span>&lt;none&gt;<span style="color: rgba(0, 0, 0, 1)">
Annotations:       kubectl.kubernetes.io</span>/last-applied-<span style="color: rgba(0, 0, 0, 1)">configuration:
                     {</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">apiVersion</span><span style="color: rgba(128, 0, 0, 1)">"</span>:<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">v1</span><span style="color: rgba(128, 0, 0, 1)">"</span>,<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">kind</span><span style="color: rgba(128, 0, 0, 1)">"</span>:<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">Service</span><span style="color: rgba(128, 0, 0, 1)">"</span>,<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">metadata</span><span style="color: rgba(128, 0, 0, 1)">"</span>:{<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">annotations</span><span style="color: rgba(128, 0, 0, 1)">"</span>:{},<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">name</span><span style="color: rgba(128, 0, 0, 1)">"</span>:<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">eureka</span><span style="color: rgba(128, 0, 0, 1)">"</span>,<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">namespace</span><span style="color: rgba(128, 0, 0, 1)">"</span>:<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">ms</span><span style="color: rgba(128, 0, 0, 1)">"</span>},<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">spec</span><span style="color: rgba(128, 0, 0, 1)">"</span>:{<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">clusterIP</span><span style="color: rgba(128, 0, 0, 1)">"</span>:<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">None</span><span style="color: rgba(128, 0, 0, 1)">"</span>,<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">ports</span><span style="color: rgba(128, 0, 0, 1)">"</span>:[{<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">n...</span>
Selector:          app=eureka,project=<span style="color: rgba(0, 0, 0, 1)">ms
Type:            ClusterIP
IP:                None
Port:            eureka</span><span style="color: rgba(128, 0, 128, 1)">8888</span>/<span style="color: rgba(0, 0, 0, 1)">TCP
TargetPort:      </span><span style="color: rgba(128, 0, 128, 1)">8888</span>/<span style="color: rgba(0, 0, 0, 1)">TCP
Endpoints:         </span><span style="color: rgba(128, 0, 128, 1)">10.244</span>.<span style="color: rgba(128, 0, 128, 1)">1.210</span>:<span style="color: rgba(128, 0, 128, 1)">8888</span>,<span style="color: rgba(128, 0, 128, 1)">10.244</span>.<span style="color: rgba(128, 0, 128, 1)">1.211</span>:<span style="color: rgba(128, 0, 128, 1)">8888</span>,<span style="color: rgba(128, 0, 128, 1)">10.244</span>.<span style="color: rgba(128, 0, 128, 1)">2.45</span>:<span style="color: rgba(128, 0, 128, 1)">8888</span><span style="color: rgba(0, 0, 0, 1)">
Session Affinity:None
Events:            </span>&lt;none&gt;<span style="color: rgba(255, 0, 0, 1)">
# kubectl exec -it gateway-6cd76c98fb-8w92t -n ms sh
/</span><span style="color: rgba(0, 0, 0, 1)"><span style="color: rgba(255, 0, 0, 1)"> # nslookup eureka.ms.svc.cluster.local</span>
nslookup: can</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">t resolve </span><span style="color: rgba(128, 0, 0, 1)">'</span>(<span style="color: rgba(0, 0, 255, 1)">null</span>)<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">: Name does not resolve</span>
<span style="color: rgba(0, 0, 0, 1)">
Name:      eureka.ms.svc.cluster.local
Address </span><span style="color: rgba(128, 0, 128, 1)">1</span>: <span style="color: rgba(128, 0, 128, 1)">10.244</span>.<span style="color: rgba(128, 0, 128, 1)">1.211</span> eureka-<span style="color: rgba(128, 0, 128, 1)">2</span><span style="color: rgba(0, 0, 0, 1)">.eureka.ms.svc.cluster.local
Address </span><span style="color: rgba(128, 0, 128, 1)">2</span>: <span style="color: rgba(128, 0, 128, 1)">10.244</span>.<span style="color: rgba(128, 0, 128, 1)">1.210</span> eureka-<span style="color: rgba(128, 0, 128, 1)">0</span><span style="color: rgba(0, 0, 0, 1)">.eureka.ms.svc.cluster.local
Address </span><span style="color: rgba(128, 0, 128, 1)">3</span>: <span style="color: rgba(128, 0, 128, 1)">10.244</span>.<span style="color: rgba(128, 0, 128, 1)">2.45</span> eureka-<span style="color: rgba(128, 0, 128, 1)">1</span><span style="color: rgba(0, 0, 0, 1)">.eureka.ms.svc.cluster.local
</span><span style="color: rgba(255, 0, 0, 1)">/ # nslookup eureka-2</span><span style="color: rgba(0, 0, 0, 1)"><span style="color: rgba(255, 0, 0, 1)">.eureka.ms.svc.cluster.local</span>
nslookup: can</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">t resolve </span><span style="color: rgba(128, 0, 0, 1)">'</span>(<span style="color: rgba(0, 0, 255, 1)">null</span>)<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">: Name does not resolve</span>
<span style="color: rgba(0, 0, 0, 1)">
Name:      eureka</span>-<span style="color: rgba(128, 0, 128, 1)">2</span><span style="color: rgba(0, 0, 0, 1)">.eureka.ms.svc.cluster.local
Address </span><span style="color: rgba(128, 0, 128, 1)">1</span>: <span style="color: rgba(128, 0, 128, 1)">10.244</span>.<span style="color: rgba(128, 0, 128, 1)">1.211</span> eureka-<span style="color: rgba(128, 0, 128, 1)">2</span><span style="color: rgba(0, 0, 0, 1)">.eureka.ms.svc.cluster.local
</span><span style="color: rgba(255, 0, 0, 1)">/ # nslookup eureka-1</span><span style="color: rgba(0, 0, 0, 1)"><span style="color: rgba(255, 0, 0, 1)">.eureka.ms.svc.cluster.local</span>
nslookup: can</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">t resolve </span><span style="color: rgba(128, 0, 0, 1)">'</span>(<span style="color: rgba(0, 0, 255, 1)">null</span>)<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">: Name does not resolve</span>
<span style="color: rgba(0, 0, 0, 1)">
Name:      eureka</span>-<span style="color: rgba(128, 0, 128, 1)">1</span><span style="color: rgba(0, 0, 0, 1)">.eureka.ms.svc.cluster.local
Address </span><span style="color: rgba(128, 0, 128, 1)">1</span>: <span style="color: rgba(128, 0, 128, 1)">10.244</span>.<span style="color: rgba(128, 0, 128, 1)">2.45</span> eureka-<span style="color: rgba(128, 0, 128, 1)">1</span><span style="color: rgba(0, 0, 0, 1)">.eureka.ms.svc.cluster.local
</span><span style="color: rgba(255, 0, 0, 1)">/ # nslookup eureka-0</span><span style="color: rgba(0, 0, 0, 1)"><span style="color: rgba(255, 0, 0, 1)">.eureka.ms.svc.cluster.local</span>
nslookup: can</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">t resolve </span><span style="color: rgba(128, 0, 0, 1)">'</span>(<span style="color: rgba(0, 0, 255, 1)">null</span>)<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">: Name does not resolve</span>
<span style="color: rgba(0, 0, 0, 1)">
Name:      eureka</span>-<span style="color: rgba(128, 0, 128, 1)">0</span><span style="color: rgba(0, 0, 0, 1)">.eureka.ms.svc.cluster.local
Address </span><span style="color: rgba(128, 0, 128, 1)">1</span>: <span style="color: rgba(128, 0, 128, 1)">10.244</span>.<span style="color: rgba(128, 0, 128, 1)">1.210</span> eureka-<span style="color: rgba(128, 0, 128, 1)">0</span>.eureka.ms.svc.cluster.local</pre>
</div>
<p>如上,<span style="color: rgba(255, 0, 255, 1)">eureka</span>就是我们场景的<span style="color: rgba(255, 0, 255, 1)">StatefulSet</span>,对应的<span style="color: rgba(255, 0, 255, 1)">pod</span>就是<span style="color: rgba(255, 0, 255, 1)">eureka-0,eureka-1,eureka-2</span>,他们之间能互相访问,这样对于一些集群类型的应用就可以解决互相身份识别的问题了</p>
<p>&nbsp;</p>
<h3>七、为什么要用<span style="color: rgba(255, 0, 255, 1)">headless service+statefulSet</span>部署有状态应用?</h3>
<p><strong>1.<span style="color: rgba(255, 0, 255, 1)">headless service</span>会为关联的<span style="color: rgba(255, 0, 255, 1)">Pod</span>分配一个域</strong><br>&lt;service name&gt;.$&lt;namespace name&gt;.svc.cluster.local<br><strong>2.<span style="color: rgba(255, 0, 255, 1)">StatefulSet</span>会为关联的<span style="color: rgba(255, 0, 255, 1)">Pod</span>保持一个不变的<span style="color: rgba(255, 0, 255, 1)">Pod Name</span></strong><br><span style="color: rgba(255, 0, 255, 1)">statefulset</span>中<span style="color: rgba(255, 0, 255, 1)">Pod</span>的<span style="color: rgba(255, 0, 255, 1)">hostname</span>格式为$(StatefulSet name)-$(pod序号)<br><strong>3.<span style="color: rgba(255, 0, 255, 1)">StatefulSet</span>会为关联的<span style="color: rgba(255, 0, 255, 1)">Pod</span>分配一个<span style="color: rgba(255, 0, 255, 1)">dnsName</span></strong><br>$&lt;Pod Name&gt;.$&lt;service name&gt;.$&lt;namespace name&gt;.svc.cluster.local</p>
<p>&nbsp;</p><br><br>
来源:https://www.cnblogs.com/chadiandianwenrou/p/11937041.html
頁: [1]
查看完整版本: kubernetes学习Service之headless和statefulSet结合