产品展示

Products Classification

从零开始学K8s: 25.服务发现

  • 产品时间:2021-11-17 03:08
  • 价       格:

简要描述:建立服务之后,我们就拥有了一个单一的、牢固的IP地址和端口号,通过它就可以会见到pod。这个地址在服务的整个生命周期内都不会改变,而服务后面的pod可能变来变去。 它们的IP地址可能变化,数量也会增减,可是始终可以通过服务的单一稳定的IP地址会见到这些pod。可是客户端pod如何知道服务的IP和端口?是否需要先建立服务,然后手动查找它的IP地址并将IP地址通报给客户端pod的设置选项?固然不是。Kubernetes为客户端pod发现服务的IP地址和端口提供了几种方法。...

详细介绍
本文摘要:建立服务之后,我们就拥有了一个单一的、牢固的IP地址和端口号,通过它就可以会见到pod。这个地址在服务的整个生命周期内都不会改变,而服务后面的pod可能变来变去。 它们的IP地址可能变化,数量也会增减,可是始终可以通过服务的单一稳定的IP地址会见到这些pod。可是客户端pod如何知道服务的IP和端口?是否需要先建立服务,然后手动查找它的IP地址并将IP地址通报给客户端pod的设置选项?固然不是。Kubernetes为客户端pod发现服务的IP地址和端口提供了几种方法。

真人app游戏

建立服务之后,我们就拥有了一个单一的、牢固的IP地址和端口号,通过它就可以会见到pod。这个地址在服务的整个生命周期内都不会改变,而服务后面的pod可能变来变去。

它们的IP地址可能变化,数量也会增减,可是始终可以通过服务的单一稳定的IP地址会见到这些pod。可是客户端pod如何知道服务的IP和端口?是否需要先建立服务,然后手动查找它的IP地址并将IP地址通报给客户端pod的设置选项?固然不是。Kubernetes为客户端pod发现服务的IP地址和端口提供了几种方法。

通过情况变量发现服务当启动pod时,Kubernetes会初始化一组情况变量,指向当前存在的每个服务。如果在建立客户端pod之前就建立了服务,pod中的历程就可以通过检查情况变量而获取到服务的IP地址和端口。

当前情况中有三个pod:执行如下下令可以检察pod的情况变量:kubectl exec test-rc-8n2b8 -- env由于我们是在建立pod之后再建立的service,所以当前我们无法看到在上一节建立的service的情况变量。所以我们需要先删除之前由ReplicationController建立的所有pod,然后由ReplicationController再次重新建立新的pod:kubectl delete po --all检察自动建立的pod:可以在容器中运行env下令检察pod的情况变量:kubectl exec test-rc-j9j4w -- envTEST_SVC_SERVICE_HOST就是服务的集群IP地址,TEST_SVC_PORT是服务的端口。

在上一节我们提到了前端web服务器pod和后端数据库服务器pod的例子,如果前端pod需要使用后端数据库服务器pod,可以通过一个好比叫做backend-database的服务将后端pod袒露出去,然后让前端pod通过情况变量BACKEND_DATABASE_SERVICE_HOST和BACKEND_DATABASE_SERVICE_PORT查找服务的IP地址和端口。服务名中的横杠会被转换成下划线,当服务名被用作情况变量名前缀的时候所有字母转成大写情况变量是查找服务IP地址和端口的一种方式。Kubernetes还包罗了一个DNS服务器,可以通过DNS来查找服务IP地址。

通过DNS发现服务在kube-system命名空间下有一个叫做coredns的pod。从 K8S 1.11 开始,K8S 使用 CoreDNS替换KubeDNS作为DNS服务器:kubectl get po --namespace kube-system在该命名空间下还存在一个名为kube-dns的service:kubectl get svc --namespace kube-system通过名称可以看出该pod中运行了一个DNS服务器,集群中运行的所有其他pod会自动地设置使用该DNS服务器(Kubernetes通过修改每个容器的/etc/resolv.conf文件来实现)。Pod中运行历程执行的任何DNS查询都市被Kubernetes自身的DNS服务器处置惩罚,它知道系统中运行的所有服务。

可以通过在每个pod的spec区段中设置dnsPolicy属性来决议其是否使用内部的DNS服务器每个服务从内部的DNS服务器中获得一个DNS条目,客户端pod在知道服务名的情况下可以通过它的全限定域名(FQDN=Fully Qualified Domain Name)来会见服务,而不是使用情况变量。通过FQDN毗连服务一个前端pod可以通过打开一个到如下FQDN的毗连来与后端数据库服务建设毗连:backend-database.default.svc.cluster.localbackend-database对应于服务名称,default表现服务所在的命名空间,svc.cluster.local是一个在所有集群当地服务名中使用的可设置的集群domain后缀。客户端仍然必须知道服务的端口号。

如果服务正在使用一个尺度的端口(HTTP的80端口或者MySQL的3306端口),这样是不会有问题的。如果使用的是非尺度端口,客户端可以从情况变量获得端口号。

我们还可以去掉svc.cluster.local后缀,甚至命名空间(如果前端pod和数据库pod位于同一个命名空间下),因此可以简朴地只通过backend-database引用服务。现在我们试着通过FQDN来会见之前建立的service,这需要在一个已有的pod中来完成。可以使用kubectl exec下令在一个已有的pod中运行bash下令进入pod容器:kubectl exec -it test-rc-j9j4w -- bash当前我们处在容器中,因此可以通过如下几种方式使用curl下令会见test-svc服务:curl http://test-svc.default.svc.cluster.localcurl http://test-svc.defaultcurl http://test-svc在请求URL中,可以将服务名作为主机名来会见服务,因为凭据每个pod容器DNS剖析器的设置方式,可以将命名空间和svc.cluster.local后缀移除。

在容器中检察/etc/resolv.conf文件:如果我们试着直接ping服务,会发现无法ping通:ping test-svc为什么curl可以,而ping不行以呢?这是由于服务的集群IP是一个虚拟的IP,而且只有和服务端口号联合使用的时候才有意义。这点我们在后面的学习中再逐步相识详细原因以及服务的事情方式如果以为本文对您有资助,接待关注我的头条号订阅更新,我会不停推出更多学习教程、视频以及偏实战的文章!。


本文关键词:从,零,开始,学,真人app,K8s,25.,服务,发现,建立,服务

本文来源:真人app-www.zigongtk.com

 


产品咨询

留言框

  • 产品:

  • 留言内容:

  • 您的单位:

  • 您的姓名:

  • 联系电话:

  • 常用邮箱:

  • 详细地址:


推荐产品

Copyright © 2004-2021 www.zigongtk.com. 真人app科技 版权所有 备案号:ICP备39447808号-3

在线客服 联系方式 二维码

服务热线

058-624936802

扫一扫,关注我们