一、service

1.简介:

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。

2.IPVS模式的service

开启kube-proxy的ipvs模式
所有节点(server2/3/4)都先安装IPVS
请添加图片描述
server2/3/4分别查看ipvs模式
请添加图片描述
修改模式为ipvs模式
请添加图片描述
请添加图片描述
修改未生效
请添加图片描述
更新kube-proxy pod(删除之前的pod会自动重建,重建后的pod会生效刚才修改的配置)
请添加图片描述
再次查看,可以看到mysvc的访问地址是10.100.43.88
请添加图片描述
此时mysvc没有后端pod
请添加图片描述
修改清单deployment.yaml 的镜像为myapp:v1,副本数为3
请添加图片描述
执行清单后,查看mysvc的详细信息,可以看到后端pod
请添加图片描述
再次查看当前连接情况,可以看到此时mysvc有3个pod;
kube-proxy通过linux的IPVS模块,以rr方式调度service中的Pod
请添加图片描述
测试访问该服务6次
请添加图片描述
可以看到每次访问以rr方式分配给每个pod,因为每个pod的权值相同,所以分别响应了2次
请添加图片描述
IPVS模式下,kube-proxy会在service创建后,在宿主机上添加一个虚拟网卡:kube-ipvs0,并分配service IP,ip addr也可以看到这个ip
请添加图片描述

二、实现外部访问

1.NodePort方式

编辑mysvc 的svc配置文件,将type改为NodePort
请添加图片描述
请添加图片描述
修改成功,打开的端口是31934
请添加图片描述server2/3也打开了该端口
请添加图片描述
请添加图片描述
客户端访问测试,实现了负载均衡(三个后端)
请添加图片描述
查看kube-system的pod,看到两个coredns,kube-system的svc,服务端口为53
请添加图片描述
请添加图片描述
查看kube-system的kube-dns服务的详细说明,可以看到有两个后端pod(就是两个coredns)
请添加图片描述

2.Headless Service “无头服务”

Headless Service不需要分配一个VIP,而是直接以DNS记录的方式解析出被代理Pod的IP地址。
域名格式:$ (servicename).$(namespace).svc.cluster.local
请添加图片描述
查看pod运行状态
请添加图片描述
编辑headless.yaml文件,将headless.yml文件中的配置应用到pod,查看svc信息
请添加图片描述
进入容器终端查看解析,可以看到nginx-svc服务的域名解析,对应三个负载均衡服务器
请添加图片描述
拉起的pod如下所示
请添加图片描述
安装dig插件用以查看解析的A记录,查看10.96.0.10服务的A记录
请添加图片描述
编辑deployment.yml配置文件,将myapp的镜像版本改为v2;
应用配置文件之后,再次使用dig命令查看A记录解析,此时三个应答ip发生变化(Pod滚动更新后,依然可以解析)
请添加图片描述
查看ngix-svc服务的详细信息,可以看到对应的三个后端
请添加图片描述

3. LoadBalancer 类型的 Service

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

修改kube-proxy的配置
请添加图片描述
请添加图片描述
批量删除之前的kube-proxy,控制器会自动重新建立,更新kube-proxy pod
请添加图片描述
确保真机可以上网,添加iptables规则,使得虚拟机可以上网
请添加图片描述
在harbor仓库中创建新项目metallb
请添加图片描述
真机将metallb tar包传给server1
请添加图片描述
server1导入镜像并上传至仓库
请添加图片描述
请添加图片描述
新建目录
请添加图片描述
官网下载metallb.yaml
在这里插入图片描述
请添加图片描述
修改yaml配置文件中speaker和controller镜像的路径
请添加图片描述
请添加图片描述
server2应用metallb.yaml清单,拉起pod
请添加图片描述
查看命名空间,可以看到metallb-system;
查看metallb-system空间的所有信息,看到一个controller和三个speaker
请添加图片描述
查看自动生成的secrets memberlist
请添加图片描述
编辑configmap.yaml文件,指定分配的IP地址范围;
查看metallb-system的configmap
请添加图片描述
将之前实验的svc删掉
请添加图片描述
编辑lb-svc.yml 文件,建立svc并获取分配的ip(ip地址是我们之前设定范围里的)
请添加图片描述
查看pod运行状态
请添加图片描述
客户端测试访问分配的外部ip,可以看到实现了负载均衡
请添加图片描述
查看当前配置的虚拟服务和各个RS的权重,可以看到lb-svc有3个pod
请添加图片描述
在server2/3上都可以看到ip 172.25.36.20
请添加图片描述
请添加图片描述
实验完毕,删除lb-svc
请添加图片描述

4.External IP

编辑ex-svc.yaml文件,应用exc-ip.yaml清单并查看SVC状态
请添加图片描述
查看当前配置的虚拟服务和RS的权重
请添加图片描述
但此时真机无法访问172.25.36.100
请添加图片描述
这是由于没有在server3/4上添加172.25.36.100的IP地址,该ip地址不能自动解析,需要手动添加
请添加图片描述
请添加图片描述
此时客户端访问成功
请添加图片描述

5.ExternalName 类型的 service

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

编辑ex-svc.yaml文件,通过给定域名访问;
创建服务,可以看到对应的外部地址是www.westos.org
请添加图片描述
dig查看详细解析A记录,当查找服务时,DNS服务返回 CNAME 记录,其值为 www.westos.org;
访问 my-service 的方式与其他服务的主要区别在于,重定向发生在 DNS 级别,而不是通过代理或转发
请添加图片描述
运行busyboxplus镜像容器,可以看到my-service服务的ip为10.96.0.10
请添加图片描述
kubectl edit svc my-service进入my-service,修改ExternalName为www.baidu.com
请添加图片描述
请添加图片描述
再使用dig查看解析,看到CNAME记录变成www.baidu.com
请添加图片描述

Logo

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

更多推荐