王正一 發表於 2021-1-30 16:47:00

【Kubernetes】访问入口-Service

<h2 id="环境">环境</h2>
<ol>
<li>kubernetes 1.20.2</li>
<li>Spring Boot 2.5.0-M1</li>
</ol>
<h2 id="目标">目标</h2>
<p>在前面副本的扩容与缩容时,我们看到 Pod 的 IP 会变化,导致访问困难。<br>
k8s 提供了 Service 来提供稳定的访问入口,Service 也是 k8s 的一种资源。</p>
<h2 id="说明">说明</h2>
<p>除了 IP 会随着扩容与缩容变化,在 Pod 重启,Node 出现故障,Pod 被重新调度时,也都会变化。<br>
另一方面,在 Pod 启动之前,IP 是未知的,所以使用 IP 来访问 Pod,不太方便。</p>
<h2 id="创建-service">创建 Service</h2>
<h3 id="当前状态">当前状态</h3>
<pre><code># kubectl get pod,rc
NAME                READY   STATUS    RESTARTS   AGE
pod/rc-demo-5tshk   1/1   Running   0          4m35s
pod/rc-demo-8xdp6   1/1   Running   0          4m35s
pod/rc-demo-d95v4   1/1   Running   0          4m35s

NAME                            DESIRED   CURRENT   READY   AGE
replicationcontroller/rc-demo   3         3         3       4m35s
</code></pre>
<h3 id="命令行">命令行</h3>
<p><code>kubectl expose replicationcontroller rc-demo --port 8080</code></p>
<pre><code># kubectl expose replicationcontroller rc-demo --port 8080
service/rc-demo exposed
# kubectl get all
NAME                READY   STATUS    RESTARTS   AGE
pod/rc-demo-5tshk   1/1   Running   0          3m49s
pod/rc-demo-8xdp6   1/1   Running   0          3m49s
pod/rc-demo-d95v4   1/1   Running   0          3m49s

NAME                            DESIRED   CURRENT   READY   AGE
replicationcontroller/rc-demo   3         3         3       3m49s

NAME               TYPE      CLUSTER-IP      EXTERNAL-IP   PORT(S)    AGE
service/kubernetes   ClusterIP   10.96.0.1       &lt;none&gt;      443/TCP    6d
service/rc-demo      ClusterIP   10.101.188.48   &lt;none&gt;      8080/TCP   5s
</code></pre>
<h3 id="yaml-文件">yaml 文件</h3>
<pre><code class="language-yaml">apiVersion: v1
kind: Service
metadata:
name: svc-demo
spec:
selector:
    app: myapp
ports:
    - port: 8080
      targetPort: 8080
</code></pre>
<pre><code>oot@master kubernetes]# kubectl get svc
NAME         TYPE      CLUSTER-IP       EXTERNAL-IP   PORT(S)    AGE
kubernetes   ClusterIP   10.96.0.1      &lt;none&gt;      443/TCP    6d
rc-demo      ClusterIP   10.101.188.48    &lt;none&gt;      8080/TCP   2m59s
svc-demo   ClusterIP   10.106.217.209   &lt;none&gt;      8080/TCP   5s
</code></pre>
<h2 id="访问测试">访问测试</h2>
<h3 id="访问命令行创建的">访问命令行创建的</h3>
<pre><code># curl 10.101.188.48:8080/hostname
rc-demo-8xdp6 actuator# curl 10.101.188.48:8080/hostname
rc-demo-d95v4 actuator# curl 10.101.188.48:8080/hostname
rc-demo-5tshk actuator# curl 10.101.188.48:8080/hostname
rc-demo-8xdp6 actuator# curl 10.101.188.48:8080/hostname
rc-demo-d95v4 actuator# curl 10.101.188.48:8080/hostname
rc-demo-5tshk actuator# curl 10.101.188.48:8080/hostname
</code></pre>
<h3 id="访问文件创建的">访问文件创建的</h3>
<pre><code># curl 10.106.217.209:8080/hostname
rc-demo-5tshk actuator# curl 10.106.217.209:8080/hostname
rc-demo-8xdp6 actuator# curl 10.106.217.209:8080/hostname
rc-demo-d95v4 actuator# curl 10.106.217.209:8080/hostname
rc-demo-5tshk actuator# curl 10.106.217.209:8080/hostname
rc-demo-8xdp6 actuator# curl 10.106.217.209:8080/hostname
rc-demo-d95v4 actuator# curl 10.106.217.209:8080/hostname
rc-demo-5tshk actuator#
</code></pre>
<h3 id="实现原理">实现原理</h3>
<p>可能已经猜到了 Servide 也是通过标签选择器来选择对应的 Pod,然后把请求转发上去。<br>
在转发的同时,Service 还帮我们自动实现了负载均衡,轮询的方式访问每一个 Pod。</p>
<pre><code>c-demo-5tshk actuator# kubectl get svc -o wide
NAME         TYPE      CLUSTER-IP       EXTERNAL-IP   PORT(S)    AGE   SELECTOR
kubernetes   ClusterIP   10.96.0.1      &lt;none&gt;      443/TCP    6d      &lt;none&gt;
rc-demo      ClusterIP   10.101.188.48    &lt;none&gt;      8080/TCP   7m12s   app=myapp
svc-demo   ClusterIP   10.106.217.209   &lt;none&gt;      8080/TCP   4m18s   app=myapp
</code></pre>
<h2 id="总结">总结</h2>
<p>介绍了 Service 统一访问入口,实现的原理。并且通过命令行和文件的两种方式,创建 Service。</p>
<h2 id="附录">附录</h2><br><br>
来源:https://www.cnblogs.com/jiangbo4444/p/14349592.html
頁: [1]
查看完整版本: 【Kubernetes】访问入口-Service