service

简介

Service可以看作是一组提供相同服务的Pod对外的访问接口。借助Service,应用可以方便地实现服务发现和负载均衡。service默认只支持4层负载均衡能力,没有7层功能。(可以通过Ingress实现)

2、service的类型:
ClusterIP:默认值,k8s系统给service自动分配的虚拟IP,只能在集群内部访问。
NodePort:将Service通过指定的Node上的端口暴露给外部,访问任意一个NodeIP:nodePort都将路由到ClusterIP。
LoadBalancer:在 NodePort 的基础上,借助 cloud provider 创建一个外部的负载均衡器,并将请求转发到 < NodeIP >:NodePort,此模式只能在云服务器上使用。
ExternalName:将服务通过 DNS CNAME 记录方式转发到指定的域名(通过 spec.externlName 设定)。

3、 kube-proxy 组件
Service 是由 kube-proxy 组件,加上 iptables 来共同实现的。kube-proxy 通过 iptables 处理 Service 的过程,需要在宿主机上设置相当多的 iptables 规则,如果宿主机有大量的Pod,不断刷新iptables规则,会消耗大量的CPU资源。IPVS模式的service,可以使K8s集群支持更多量级的Pod。

IPVS模式的service

原本的负载均衡

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
负载均衡,但是不够平均
默认通过iptable进行随机分配
在这里插入图片描述
如何找一个方式,可以让集群上容纳更多的策略?

ipvs

在这里插入图片描述
基本没有cpu消耗
cm=configmaps 用来存储服务的配置文件
在这里插入图片描述
修改模式
在这里插入图片描述
在这里插入图片描述
更新kube-proxy pod(删除之前的pod会自动重建,重建后的pod会生效刚才修改的配置)
在这里插入图片描述
在这里插入图片描述
IPVS模式下,kube-proxy会在service创建后,在宿主机上添加一个虚拟网卡:kube-ipvs0,并分配service IP,ip addr也可以看到这个ip
svc的地址,都会在ipvs0接口上,也在ipvsadm 中
在这里插入图片描述
现在轮叫更加均衡
在这里插入图片描述
扩容
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

ClusterIP

适用于集群内的节点,或者容器都可以访问
在这里插入图片描述
在这里插入图片描述
创建svc就会有相应的解析
自动补充后缀,所以不用打全也可以
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
如何放到集群外访问?

NodePort

在这里插入图片描述
在这里插入图片描述
外部访问时,此节点ip加端口就可以访问
在这里插入图片描述在这里插入图片描述
可以访问集群里任意节点,因为每个节点都有这个端口
在这里插入图片描述

LoadBalancer

适用于公有云上的 Kubernetes 服务,可以指定一个 LoadBalancer 类型的 Service。在service提交后,Kubernetes就会调用 CloudProvider 在公有云上创建一个负载均衡服务,并且把被代理的 Pod 的 IP地址配置给负载均衡服务做后端。

在这里插入图片描述
因为外部目前没有负载均衡器,所以一直是pending状态
在这里插入图片描述
按照组件上的进行操作
https://metallb.universe.tf/installation/

在这里插入图片描述
修改kube-proxy的配置
在这里插入图片描述
在这里插入图片描述删除重新加载
在这里插入图片描述
https://raw.githubusercontent.com/metallb/metallb/v0.12.1/manifests/namespace.yaml
拉取下来
在这里插入图片描述
在这里插入图片描述
https://raw.githubusercontent.com/metallb/metallb/v0.12.1/manifests/metallb.yaml
在这里插入图片描述
准备好仓库镜像
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
修改此文件中的镜像
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
找一个Ping不通的vip
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
然后就外部主机可以Ping通

headless无头服务

Headless Service不需要分配一个VIP,而是直接以DNS记录的方式解析出被代理Pod的IP地址。
域名格式:$ (servicename).$(namespace).svc.cluster.local

查看pod运行状态
在这里插入图片描述
编辑headless.yaml文件,将headless.yml文件中的配置应用到pod,查看svc信息
在这里插入图片描述
选择器(selector)和标签相符,所以自动有endpoint
在这里插入图片描述
进入容器终端查看解析,可以看到nginx-svc服务的域名解析,对应六个负载均衡服务器,6个地址分别是Pord的地址
在这里插入图片描述
不需要ip地址,直接通过域名访问,依然负载均衡
在这里插入图片描述
在这里插入图片描述
dig命令需要安装bind-utils
在这里插入图片描述
查看10.96.0.10服务的A记录
解析到pod地址
在这里插入图片描述
缩容之后依然可以解析
在这里插入图片描述

ExternalName

externalName Service是k8s中一个特殊的service类型,它不需要指定selector去选择哪些pods实例提供服务,而是使用DNS CNAME机制把自己CNAME到你指定的另外一个域名上,可以提供集群内的名字,也可以指定外部真实域名

在这里插入图片描述
dig查看详细解析A记录,当查找服务时,DNS服务返回 CNAME 记录,其值为 test.westos.org;
访问 my-service 的方式与其他服务的主要区别在于,重定向发生在 DNS 级别,而不是通过代理或转发
在这里插入图片描述、修改ExternalName为www.baidu.com
在这里插入图片描述
再使用dig查看解析,看到CNAME记录变成www.baidu.com
在这里插入图片描述
在容器中访问的都是ext-svc的地址
外部地址改了,只需要改域名映射就行
在这里插入图片描述
创建test
在这里插入图片描述
在容器中解析到了之前的地址
在这里插入图片描述
目前想curl web直接出来结果
在这里插入图片描述
修改yaml

在这里插入图片描述
在这里插入图片描述

Logo

K8S/Kubernetes社区为您提供最前沿的新闻资讯和知识内容

更多推荐