kubernetes 5(service、实现外部访问)

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

原本的负载均衡

kubernetes 5(service、实现外部访问)_第1张图片
kubernetes 5(service、实现外部访问)_第2张图片
kubernetes 5(service、实现外部访问)_第3张图片
kubernetes 5(service、实现外部访问)_第4张图片
负载均衡,但是不够平均
默认通过iptable进行随机分配
kubernetes 5(service、实现外部访问)_第5张图片
如何找一个方式,可以让集群上容纳更多的策略?

ipvs

kubernetes 5(service、实现外部访问)_第6张图片
基本没有cpu消耗
cm=configmaps 用来存储服务的配置文件
kubernetes 5(service、实现外部访问)_第7张图片
修改模式
kubernetes 5(service、实现外部访问)_第8张图片
kubernetes 5(service、实现外部访问)_第9张图片
更新kube-proxy pod(删除之前的pod会自动重建,重建后的pod会生效刚才修改的配置)
kubernetes 5(service、实现外部访问)_第10张图片
kubernetes 5(service、实现外部访问)_第11张图片
IPVS模式下,kube-proxy会在service创建后,在宿主机上添加一个虚拟网卡:kube-ipvs0,并分配service IP,ip addr也可以看到这个ip
svc的地址,都会在ipvs0接口上,也在ipvsadm 中
kubernetes 5(service、实现外部访问)_第12张图片
现在轮叫更加均衡
kubernetes 5(service、实现外部访问)_第13张图片
扩容
kubernetes 5(service、实现外部访问)_第14张图片
kubernetes 5(service、实现外部访问)_第15张图片
kubernetes 5(service、实现外部访问)_第16张图片

ClusterIP

适用于集群内的节点,或者容器都可以访问
kubernetes 5(service、实现外部访问)_第17张图片
kubernetes 5(service、实现外部访问)_第18张图片
创建svc就会有相应的解析
自动补充后缀,所以不用打全也可以
kubernetes 5(service、实现外部访问)_第19张图片
kubernetes 5(service、实现外部访问)_第20张图片
kubernetes 5(service、实现外部访问)_第21张图片
如何放到集群外访问?

NodePort

kubernetes 5(service、实现外部访问)_第22张图片
kubernetes 5(service、实现外部访问)_第23张图片
外部访问时,此节点ip加端口就可以访问
kubernetes 5(service、实现外部访问)_第24张图片kubernetes 5(service、实现外部访问)_第25张图片
可以访问集群里任意节点,因为每个节点都有这个端口
在这里插入图片描述

LoadBalancer

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

kubernetes 5(service、实现外部访问)_第26张图片
因为外部目前没有负载均衡器,所以一直是pending状态
kubernetes 5(service、实现外部访问)_第27张图片
按照组件上的进行操作
https://metallb.universe.tf/installation/

kubernetes 5(service、实现外部访问)_第28张图片
修改kube-proxy的配置
kubernetes 5(service、实现外部访问)_第29张图片
在这里插入图片描述删除重新加载
在这里插入图片描述
https://raw.githubusercontent.com/metallb/metallb/v0.12.1/manifests/namespace.yaml
拉取下来
kubernetes 5(service、实现外部访问)_第30张图片
kubernetes 5(service、实现外部访问)_第31张图片
https://raw.githubusercontent.com/metallb/metallb/v0.12.1/manifests/metallb.yaml
kubernetes 5(service、实现外部访问)_第32张图片
准备好仓库镜像
在这里插入图片描述
kubernetes 5(service、实现外部访问)_第33张图片
kubernetes 5(service、实现外部访问)_第34张图片
修改此文件中的镜像
kubernetes 5(service、实现外部访问)_第35张图片
kubernetes 5(service、实现外部访问)_第36张图片
kubernetes 5(service、实现外部访问)_第37张图片
找一个Ping不通的vip
kubernetes 5(service、实现外部访问)_第38张图片
kubernetes 5(service、实现外部访问)_第39张图片
kubernetes 5(service、实现外部访问)_第40张图片
然后就外部主机可以Ping通

headless无头服务

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

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

ExternalName

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

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

kubernetes 5(service、实现外部访问)_第57张图片
kubernetes 5(service、实现外部访问)_第58张图片

你可能感兴趣的:(kubernetes,容器)