k8s部署-20-k8s的服务发现原理,k8s有几种服务发现规则_80端口


到现在为止,我们分别掌握了k8s部署、k8s镜像存储之harbor高可用,那么接下来是不是就应该实操了呢?不过不着急,实操之前我们要考虑下,还需要掌握什么呢?是不是通信呀,这所有的前提都是在可以通信的情况下进行的,彼此之间如何通信,通信的方式是什么,本文就来介绍下。

k8s部署-20-k8s的服务发现原理,k8s有几种服务发现规则_ip地址_02


情形

我们集群的通信方式,根据不同的条件,可以分为以下三种方式:

1、集群内相互通信;

2、集群内访问集群外;

3、集群外访问集群内。

本文就按照这三种场景,每种场景分别使用不同的方法,在实际情况中根据需要来选择。


集群内相互通信

1、DNS+ClustreIP

k8s部署-20-k8s的服务发现原理,k8s有几种服务发现规则_80端口_03


图释:

如果podA访问podB,由于pod的IP是会经常发生变化的,所以不能直接配置podB的IP地址,所以k8s提出了一个概念为service,它包含了一个clusterIP,也就是图中的10.1.1.1,那么这样子是不是就可以了呢?显然还是不太好,因为我们配置IP地址也很麻烦,这个时候service又提供了一个dns,可以理解为别名,这样我们直接配置dns就好了。


2、headless(去中心化)

k8s部署-20-k8s的服务发现原理,k8s有几种服务发现规则_ip地址_04


图释:我们在部署整个架构的时候,是不是经常会遇到一些去中心化的服务,比如zookeeper服务,本意是为了保证高可用的,但是这样子就面临一个问题,我们应该访问谁呢?这时候k8s就提出了一个概念,hadeless类型的service,这个服务的作用是什么呢,你可以理解为透传,就是当PodA访问这PodB的时候,他就会给你返回一个列表,podA自己做选择访问谁。


集群内访问集群外

1、Ip+Port

k8s部署-20-k8s的服务发现原理,k8s有几种服务发现规则_ip地址_05

图释:集群内的PodA直接通过IP和port地址,访问集群外的数据库就行。


2、endprint

k8s部署-20-k8s的服务发现原理,k8s有几种服务发现规则_80端口_06

图释:如果有100个服务要访问外部的mysql呢?难道我们配置100次吗?万一哪天mysql的IP地址变了,我们怎么办呢?这个时候就引入了一个endpring。使用endprint来做代理,它有一个和它同名的service,再往上面呢,它还有一个DNS,以供内部使用,我们的endpring上面配置上外部服务的地址。这个有什么好处呢?好处就是内部的服务访问的地址不会变,有变化的仅仅是endpring,有问题的时候我们只需要修改endpring即可立刻恢复服务。


集群外访问集群内

1、node-port

k8s部署-20-k8s的服务发现原理,k8s有几种服务发现规则_ip地址_07


图释:

当集群外的服务,想访问集群内的PodA的时候,每个node都会开启一个8080端口,虽然实际上podA只在node1上,但是也还是每个node都会开启一个8080端口号,然后client随便访问一个node节点的8080端口,然后内部都会转到podA上,但是这种方式不推荐,因为这样的话会形成资源浪费。


2、hostport

k8s部署-20-k8s的服务发现原理,k8s有几种服务发现规则_80端口_08


图释:

从上面看,差别不大,就是少了个端口,少了两条线嘛,实际上也就是相差不大,nodeport的方式是每个节点都开了8080端口,hostport的方式,是只在podA服务存在的节点上开启8080端口,节省了资源,提高了命中率。


3、Ingress

k8s部署-20-k8s的服务发现原理,k8s有几种服务发现规则_ip地址_09


图释:当我们要通过域名,访问到内部的pod服务的时候,由于pod的IP存在不稳定性,所以不能直接做在内部通过nginx做映射,这个时候k8s提供一个ingress的概念来帮我们实现,也就是通过ingress配置域名映射到哪个路径下的哪个服务,让他来帮你转发到具体的服务就行了。


以上就是k8s中几乎所有的通信方式了,在实际部署之前我们需要提前了解,我们在接下来的实操过程中都会慢慢掌握上面的通信方式。


至此,本文结束。


k8s部署-20-k8s的服务发现原理,k8s有几种服务发现规则_mysql_10