k8s Service 详解

k8s Service 详解

做一个服务发现的功能
k8s Service 详解_第1张图片
通过标签选择匹配pod,每一个svc可以理解为一个微服务

deployment 创建了三个pod,每个pod 里都有三个标签,接着又定义了一个 svc(frontend service),他的标签是 app = webapp role = frontend。匹配成功后,pod的信息会被写入到svc中,当我们访问到svc 时会随机访问到一个pod,轮巡算法(RR)。当后期有新的pod创建时,该pod的信息也会同样被更新到 svc 中

限制

在这里插入图片描述
只能通过ip和端口来实现负载均衡,无法通过计算机 域名来负载均衡(默认无法实现,可以通过其他方式实现)

SVC 类型

k8s Service 详解_第2张图片

cluster IP

svc创建成功后会创建一个集群内部ip(cluster ip),该标签匹配的pod 可以被集群内部其他pod 访问,直接通过cluster ip 访问到。
k8s Service 详解_第3张图片

nodeport

在每一个node物理机上开启端口,可以供外部访问
k8s Service 详解_第4张图片
Nginx,负载均衡器

loadBalance

不采用nginx 作为 负载均衡器,而用的是云供应商做负载均衡
k8s Service 详解_第5张图片

ExternalName

在集群内部记录访问外部的 ip 和端口,后续如果被访问的服务更新,只需修改本集群内部记录的信息即可
k8s Service 详解_第6张图片

svc 架构

需要以下组件进行配合
k8s Service 详解_第7张图片

apiserver 监听服务和端点,通过 kube-proxy 监控,kube-proxy 负责监控到对应匹配的pod的信息,并写入到 iptables 的规则中,当客户端想要访问我们的svc的时候,其实访问的就是iptables规则。然后导向到后端的 pod

需要注意的是:

  • 客户端访问服务是通过 访问 iptables 规则
  • iptables 规则是通过kube-proxy 写入的
  • apiserver 通过监控 kube-proxy 进行服务和端点信息的发现(监控)
  • kube-proxy 通过 pod的标签去判断 端点信息是否写入到 apiserver (svc)对应的endpoint

实验

cluster ip

k8s Service 详解_第8张图片
先创建 deployment pod

模板
k8s Service 详解_第9张图片

填写模板信息
在这里插入图片描述
创建pod,deployment 是声明式的,所以应 apply
在这里插入图片描述
查看是否创建成功
在这里插入图片描述

pod创建后会有很多随机的ip地址,我们当然可以直接访问这些ip地址,但是ip地址很多,而且如果有的pod 重建后ip地址会发生变化,造成我们访问起来很麻烦,所以我们需要建立一个svc

创建 SVC

模板信息
k8s Service 详解_第10张图片
vim 填写模板信息
apply 创建
在这里插入图片描述
查看svc是否创建成功
在这里插入图片描述

删除资源的时候也可以通过 直接删除 文件来进行删除
在这里插入图片描述
故一些重要的资源要保存在特性的目录下

有时不需要负载均衡时,不需要 svc ip ,这种情况下 可以通过指定 cluster ip 的值为 none 来创建的 Headless Service,也叫无头服务

这种的 svc 不会分配cluster ip , kube-proxy 不会处理他们,平台也不会为他们做负载均衡和路由

无头服务也是cluster ip,只是比较特殊

NodePort

在这里插入图片描述
模板
k8s Service 详解_第11张图片

一组pod 可以对应多个svc,只要标签一致

查询流程
在这里插入图片描述

LoadBalance

在这里插入图片描述

和nodeport类似,只是支持通过 云供应商做节点导流。客户访问到云供应商时,云供应商会根据负载,导流到对应的nodeport上
收费的

ExternalName

在这里插入图片描述
模板
k8s Service 详解_第12张图片
创建
在这里插入图片描述
查看
在这里插入图片描述

在这里插入图片描述

DNS内部的CNAME(别名记录),iptables 和 ipvs 都不需要进行处理
主要是想将外部的应用转换至集群内部

你可能感兴趣的:(k8s)