首页 体育 教育 财经 社会 娱乐 军事 国内 科技 互联网 房产 国际 女人 汽车 游戏

从零开始入门 K8s:Kubernetes 中的服务发现与负载均衡

2019-12-16

在 K8s 集群里边会经过 pod 去布置运用,与传统的运用布置不同,传统运用布置在给定的机器上面去布置,咱们知道怎样去调用其他机器的 IP 地址。但是在 K8s 集群里边运用是经过 pod 去布置的, 而 pod 生命周期是时间短的。在 pod 的生命周期过程中,比方它创立或毁掉,它的 IP 地址都会发生改变,这样就不能运用传统的布置方法,不能指定 IP 去拜访指定的运用。

别的在 K8s 的运用布置里,之前尽管学习了 deployment 的运用布置形式,但仍是需求创立一个 pod 组,然后这些 pod 组需求供给一个一致的拜访进口,以及怎样去操控流量负载均衡到这个组里边。比方说测验环境、预发环境和线上环境,其实在布置的过程中需求坚持相同的一个布置模板以及拜访方法。由于这样就可以用同一套运用的模板在不同的环境中直接发布。

最终运用服务需求露出到外部去拜访,需求供给给外部的用户去调用的。咱们上节了解到 pod 的网络跟机器不是同一个段的网络,那怎样让 pod 网络露出到去给外部拜访呢?这时就需求服务发现。

在 K8s 里边,服务发现与负载均衡便是 K8s Service。上图便是在 K8s 里 Service 的架构,K8s Service 向上供给了外部网络以及 pod 网络的拜访,即外部网络可以经过 service 去拜访,pod 网络也可以经过 K8s Service 去拜访。

向下,K8s 对接了别的一组 pod,即可以经过 K8s Service 的方法去负载均衡到一组 pod 上面去,这样相当于处理了前面所说的复发性问题,或许供给了一致的拜访进口去做服务发现,然后又可以给外部网络拜访,处理不同的 pod 之间的拜访,供给一致的拜访地址。

下面进行实践的一个用例解读,看 pod K8s 的 service 要怎样去声明、怎样去运用?

首要来看 K8s Service 的一个语法,上图实践便是 K8s 的一个声明结构。这个结构里有许多语法,跟之前所介绍的 K8s 的一些规范目标有许多相似之处。比方说标签 label 去做一些挑选、selector 去做一些挑选、label 去声明它的一些 label 标签等。

这儿有一个新的知识点,便是界说了用于 K8s Service 服务发现的一个协议以及端口。持续来看这个模板,声明晰一个名叫 my-service 的一个 K8s Service,它有一个 app:my-service 的 label,它挑选了 app:MyApp 这样一个 label 的 pod 作为它的后端。

最终是界说的服务发现的协议以及端口,这个示例中咱们界说的是 TCP 协议,端口是 80,意图端口是 9376,作用是拜访到这个 service 80 端口会被路由到后端的 targetPort,便是只需拜访到这个 service 80 端口的都会负载均衡到后端 app:MyApp 这种 label 的 pod 的 9376 端口。

怎样去创立方才声明的这个 service 目标,以及它创立之后是什么样的作用呢?经过简略的指令:

 仿制代码

-kubectl apply -f service.yaml

或许是

 仿制代码

-kubectl created -f service.yaml

上面的指令可以简略地去创立这样一个 service。创立好之后,可以经过:

 仿制代码

- kubectl discribeservice

去检查 service 创立之后的一个成果。

service 创立好之后,你可以看到它的姓名是 my-service。Namespace、Label、Selector 这些都跟咱们之前声明的相同,这儿声明完之后会生成一个 IP 地址,这个 IP 地址便是 service 的 IP 地址,这个 IP 地址在集群里边可以被其它 pod 所拜访,相当于经过这个 IP 地址供给了一致的一个 pod 的拜访进口,以及服务发现。

这儿还有一个 Endpoints 的特点,便是咱们经过 Endpoints 可以看到:经过前面所声明的 selector 去挑选了哪些 pod?以及这些 pod 都是什么样一个状况?比方说经过 selector,咱们看到它挑选了这些 pod 的一个 IP,以及这些 pod 所声明的 targetPort 的一个端口。

实践的架构如上图所示。在 service 创立之后,它会在集群里边创立一个虚拟的 IP 地址以及端口,在集群里,一切的 pod 和 node 都可以经过这样一个 IP 地址和端口去拜访到这个 service。这个 service 会把它挑选的 pod 及其 IP 地址都挂载到后端。这样经过 service 的 IP 地址拜访时,就可以负载均衡到后端这些 pod 上面去。

当 pod 的生命周期有改变时,比方说其间一个 pod 毁掉,service 就会主动从后端去除这个 pod。这样完成了:就算 pod 的生命周期有改变,它拜访的端点是不会发生改变的。

在集群里边,其他 pod 要怎样拜访到咱们所创立的这个 service 呢?有三种方法:

首要咱们可以经过 service 的虚拟 IP 去拜访,比方说刚创立的 my-service 这个服务,经过 kubectl get svc 或许 kubectl discribe service 都可以看到它的虚拟 IP 地址是 172.29.3.27,端口是 80,然后就可以经过这个虚拟 IP 及端口在 pod 里边直接拜访到这个 service 的地址。

第二种方法直接拜访服务名,依托 DNS 解析,便是同一个 namespace 里 pod 可以直接经过 service 的姓名去拜访到方才所声明的这个 service。不同的 namespace 里边,咱们可以经过 service 姓名加“.”,然后加 service 地点的哪个 namespace 去拜访这个 service,例如咱们直接用 curl 去拜访,便是 my-service:80 就可以拜访到这个 service。

第三种是经过环境变量拜访,在同一个 namespace 里的 pod 发动时,K8s 会把 service 的一些 IP 地址、端口,以及一些简略的装备,经过环境变量的方法放到 K8s 的 pod 里边。在 K8s pod 的容器发动之后,经过读取体系的环境变量比读取到 namespace 里边其他 service 装备的一个地址,或许是它的端口号等等。比方在集群的某一个 pod 里边,可以直接经过 curl $ 取到一个环境变量的值,比方取到 MY_SERVICE_SERVICE_HOST 便是它的一个 IP 地址,MY_SERVICE 便是方才咱们声明的 MY_SERVICE,SERVICE_PORT 便是它的端口号,这样也可以恳求到集群里边的 MY_SERVICE 这个 service。

service 有一个特其他形状便是 Headless Service。service 创立的时分可以指定 clusterIP:None,告知 K8s 说我不需求 clusterIP,然后 K8s 就不会分配给这个 service 一个虚拟 IP 地址,它没有虚拟 IP 地址怎样做到负载均衡以及一致的拜访进口呢?

它是这样来操作的:pod 可以直接经过 service_name 用 DNS 的方法解析到一切后端 pod 的 IP 地址,经过 DNS 的 A 记载的方法会解析到一切后端的 Pod 的地址,由客户端挑选一个后端的 IP 地址,这个 A 记载会跟着 pod 的生命周期改变,回来的 A 记载列表也发生改变,这样就要求客户端运用要从 A 记载把一切 DNS 回来到 A 记载的列表里边 IP 地址中,客户端自己去挑选一个适宜的地址去拜访 pod。

可以从上图看一下跟方才咱们声明的模板的差异,便是在中心加了一个 clusterIP:None,即标明不需求虚拟 IP。实践作用便是集群的 pod 拜访 my-service 时,会直接解析到一切的 service 对应 pod 的 IP 地址,回来给 pod,然后 pod 里边自己去挑选一个 IP 地址去直接拜访。

前面介绍的都是在集群里边 node 或许 pod 去拜访 service,service 怎样去向外露出呢?怎样把运用实践露出给公网去拜访呢?这儿 service 也有两种类型去处理这个问题,一个是 NodePort,一个是 LoadBalancer。

NodePort 的方法便是在集群的 node 上面去露出节点上的一个端口,这样相当于在节点的一个端口上面拜访到之后就会再去做一层转发,转发到虚拟的 IP 地址上面,便是刚刚宿主机上面 service 虚拟 IP 地址。

LoadBalancer 类型便是在 NodePort 上面又做了一层转化,方才所说的 NodePort 其实是集群里边每个节点上面一个端口,LoadBalancer 是在一切的节点前又挂一个负载均衡。比方在阿里云上挂一个 SLB,这个负载均衡会供给一个一致的进口,并把一切它接触到的流量负载均衡到每一个集群节点的 node pod 上面去。然后 node pod 再转化成 ClusterIP,去拜访到实践的 pod 上面。

下面进行实践操作演示,在阿里云的容器服务上面进去体会一下怎样运用 K8s Service。

咱们现已创立好了一个阿里云的容器集群,然后而且装备好本地终端到阿里云容器集群的一个衔接。

首要可以经过 kubectl get cs ,可以看到咱们现已正常衔接到了阿里云容器服务的集群上面去。

今日将经过这些模板实践去体会阿里云服务上面去运用 K8s Service。有三个模板,首要是 client,便是用来模仿经过 service 去拜访 K8s 的 service,然后负载均衡到咱们的 service 里边去声明的一组 pod 上。

K8s Service 的上面,跟方才介绍相同,咱们创立了一个 K8s Service 模板,里边 pod,K8s Service 会经过前端指定的 80 端口负载均衡到后端 pod 的 80 端口上面,然后 selector 挑选到 run:nginx 这样标签的一些 pod 去作为它的后端。

然后去创立带有这样标签的一组 pod,经过什么去创立 pod 呢?便是之前所介绍的 K8s deployment,经过 deployment 咱们可以轻松创立出一组 pod,然后上面声明 run:nginx 这样一个 label,而且它有两个副本,会一起跑出来两个 pod。

先创立一组 pod,便是创立这个 K8s deployment,经过 kubectl create -f service.yaml。这个 deployment 也创立好了,再看一下 pod 有没有创立出来。如下图看到这个 deployment 所创立的两个 pod 都现已在 running 了。经过 kubectl get pod -o wide 可以看到 IP 地址。经过 -l,即 label 去做挑选,run=nginx。如下图所示可以看到,这两个 pod 分别是 10.0.0.135 和 10.0.0.12 这样一个 IP 地址,而且都是带 run=nginx 这个 label 的。

下面咱们去创立 K8s service,便是方才介绍的经过 service 去挑选这两个 pod。这个 service 现已创立好了。

依据方才介绍,经过 kubectl describe svc 可以看到这个 service 实践的一个状况。如下图所示,方才创立的 nginx service,它的挑选器是 run=nginx,经过 run=nginx 这个挑选器挑选到后端的 pod 地址,便是方才所看到那两个 pod 的地址:10.0.0.12 和 10.0.0.135。这儿可以看到 K8s 为它生成了集群里边一个虚拟 IP 地址,经过这个虚拟 IP 地址,它就可以负载均衡到后边的两个 pod 上面去。

现在去创立一个客户端的 pod 实践去感受一下怎样去拜访这个 K8s Service,咱们经过 client.yaml 去创立客户端的 pod,kubectl get pod 可以看到客户端 pod 现已创立好而且现已在运转中了。

经过 kubectl exec 到这个 pod 里边,进入这个 pod 去感受一下方才所说的三种拜访方法,首要可以直接去拜访这个 K8s 为它生成的这个 ClusterIP,便是虚拟 IP 地址,经过 curl 拜访这个 IP 地址,这个 pod 里边没有装 curl。经过 wget 这个 IP 地址,输入进去测验一下。可以看到经过这个去拜访到实践的 IP 地址是可以拜访到后端的 nginx 上面的,这个虚拟是一个一致的进口。

第二种方法,可以经过直接 service 姓名的方法去拜访到这个 service。相同经过 wget,拜访咱们方才所创立的 service 名 nginx,可以发现跟方才看到的成果是相同的。

在不同的 namespace 时,也可以经过加上 namespace 的一个姓名去拜访到 service,比方这儿的 namespace 为 default。

最终咱们介绍的拜访方法里边还可以经过环境变量去拜访,在这个 pod 里边直接经过履行 env 指令看一下它实践注入的环境变量的状况。看一下 nginx 的 service 的各种装备现已注册进来了。

可以经过 wget 相同去拜访这样一个环境变量,然后可以拜访到咱们的一个 service。

介绍完这三种拜访方法,再看一下怎样经过 service 外部的网络去拜访。咱们 vim 直接修正一些方才所创立的 service。

最终咱们增加一个 type,便是 LoadBalancer,便是咱们前面所介绍的外部拜访的方法。

然后经过 kubectl apply,这样就把刚刚修正的内容直接收效在所创立的 service 里边。

现在看一下 service 会有哪些改变呢?经过 kubectl get svc -o wide,咱们发现刚刚创立的 nginx service 多了一个 EXTERNAL-IP,便是外部拜访的一个 IP 地址,方才咱们所拜访的都是 CLUSTER-IP,便是在集群里边的一个虚拟 IP 地址。

然后现在实践去拜访一下这个外部 IP 地址 39.98.21.187,感受一下怎样经过 service 去露出咱们的运用服务,直接在终端里边点一下,这儿可以看到咱们直接经过这个运用的外部拜访端点,可以拜访到这个 service,是不是很简略?

咱们最终再看一下用 service 去完成了 K8s 的服务发现,便是 service 的拜访地址跟 pod 的生命周期没有关系。咱们先看一下现在的 service 后边挑选的是这两个 pod IP 地址。

咱们现在把其间的一个 pod 删掉,经过 kubectl delete 的方法把前面一个 pod 删掉。

咱们知道 deployment 会让它主动生成一个新的 pod,现在看 IP 地址现已变成 137。

现在再去 describe 一下方才的 service,如下图, 看到前面拜访端点便是集群的 IP 地址没有发生改变,对外的 LoadBalancer 的 IP 地址也没有发生改变。在一切不影响客户端的拜访状况下,后端的一个 pod IP 现已主动放到了 service 后端里边。

这样就相当于在运用的组件调用的时分可以不必关怀 pod 在生命周期的一个改变。

以上便是一切演示。

最终是对 K8s 规划的一个简略的剖析以及完成的一些原理。

如上图所示,K8s 服务发现以及 K8s Service 是这样全体的一个架构。

K8s 分为 master 节点和 worker 节点:

master 里边主要是 K8s 管控的内容;

worker 节点里边是实践跑用户运用的一个当地。

在 K8s master 节点里边有 APIServer,便是一致管理 K8s 一切目标的当地,一切的组件都会注册到 APIServer 上面去监听这个目标的改变,比方说咱们方才的组件 pod 生命周期发生改变,这些事情。

这儿边最要害的有三个组件:

一个是 Cloud Controller Manager,担任去装备 LoadBalancer 的一个负载均衡器给外部去拜访;

别的一个便是 Coredns,便是经过 Coredns 去观测 APIServer 里边的 service 后端 pod 的一个改变,去装备 service 的 DNS 解析,完成可以经过 service 的姓名直接拜访到 service 的虚拟 IP,或许是 Headless 类型的 Service 中的 IP 列表的解析;

然后在每个 node 里边会有 kube-proxy 这个组件,它经过监听 service 以及 pod 改变,然后实践去装备集群里边的 node pod 或许是虚拟 IP 地址的一个拜访。

实践拜访链路是什么样的呢?比方说从集群内部的一个 Client Pod3 去拜访 Service,就类似于方才所演示的一个作用。Client Pod3 首要经过 Coredns 这儿去解分出 ServiceIP,Coredns 会回来给它 ServiceName 所对应的 service IP 是什么,这个 Client Pod3 就会拿这个 Service IP 去做恳求,它的恳求到宿主机的网络之后,就会被 kube-proxy 所装备的 iptables 或许 IPVS 去做一层阻拦处理,之后去负载均衡到每一个实践的后端 pod 上面去,这样就完成了一个负载均衡以及服务发现。

关于外部的流量,比方说方才经过公网拜访的一个恳求。它是经过外部的一个负载均衡器 Cloud Controller Manager 去监听 service 的改变之后,去装备的一个负载均衡器,然后转发到节点上的一个 NodePort 上面去,NodePort 也会经过 kube-proxy 的一个装备的一个 iptables,把 NodePort 的流量转化成 ClusterIP,紧接着转化成后端的一个 pod 的 IP 地址,去做负载均衡以及服务发现。这便是整个 K8s 服务发现以及 K8s Service 全体的结构。

后续再进阶部分咱们还会愈加深化地去解说 K8s Service 的完成原理,以及在 service 网络出问题之后,怎样去确诊以及去修正的技巧。

本文的主要内容就到此为止了,这儿为我们简略总结一下:

为什么云原生的场景需求服务发现和负载均衡,

在 Kubernetes 中怎样运用 Kubernetes 的 Service 做服务发现和负载均衡

Kubernetes 集群中 Service 涉及到的组件和大约完成原理

信任经过本文的学习与掌握,我们可以经过 Kubernetes Service 将杂乱的企业级运用快速并规范地编列起来。

热门文章

随机推荐

推荐文章