kubernetes 5(service、实现外部访问)
service简介Service可以看作是一组提供相同服务的Pod对外的访问接口。借助Service,应用可以方便地实现服务发现和负载均衡。service默认只支持4层负载均衡能力,没有7层功能。(可以通过Ingress实现)2、service的类型:ClusterIP:默认值,k8s系统给service自动分配的虚拟IP,只能在集群内部访问。NodePort:将Service通过指定的Node上
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
更多推荐
所有评论(0)