Linux企业运维——Kubernetesservice
Posted 是大姚呀
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Linux企业运维——Kubernetesservice相关的知识,希望对你有一定的参考价值。
Linux企业运维——Kubernetes(六)service
文章目录
1、service简介
Service可以看作是一组提供相同服务的Pod对外的访问接口。借助Service,应
用可以方便地实现服务发现和负载均衡。
Service默认只支持4层负载均衡能力,没有7层功能。(可以通过Ingress实现)
Service的类型:
- ClusterIP:默认值,k8s系统给service自动分配的虚拟IP,只能在集群内部访问。
- NodePort:将Service通过指定的Node上的端口暴露给外部,访问任意一个
NodeIP:nodePort
都将路由到ClusterIP。 - LoadBalancer:在 NodePort 的基础上,借助 cloud provider 创建一个外部的负 载均衡器,并将请求转发到
<NodeIP>:NodePort
,此模式只能在云服务器上使用。 - ExternalName:将服务通过 DNS CNAME 记录方式转发到指定的域名(通过 spec.externlName 设定)
2、IPVS模式的service
- Service 是由 kube-proxy 组件,加上 iptables 来共同实现的.
- kube-proxy 通过 iptables 处理 Service 的过程,需要在宿主机上设置相当多的iptables
规则,如果宿主机有大量的Pod,不断刷新iptables规则,会消耗大量的CPU资源。 - IPVS模式的service,可以使K8s集群支持更多量级的Pod。
所有节点都先安装IPVS
yum install -y ipvsadm //所有节点安装ipvs
server2、3、4分别查看ipvs模式
修改模式为ipvs模式
更新kube-proxy pod:删除之前的pod会自动重建,重建后的pod会生效刚才修改的配置
查看当前连接情况,可以看到mysvc的访问地址是10.103.165.189,不过没有后端pod
编辑deployment.yaml,将副本数置为3
读取应用该文件,现在有3个pod
查看mysvc的详细内容,可以看到后端pod有3个
再次查看当前连接情况,可以看到现在mysvc有3个pod
kube-proxy通过linux的IPVS模块,以rr轮询方式调度service中的Pod。
测试访问该服务6次
可以看到每次访问以轮询的方式分配给每一个pod,因为每个pod的权值相同,所以分别响应了2次
3、实现外部访问
3.1、NodePort方式
server1启动harbor
server2查看mysvc详细信息,并测试访问
编译mysvc的配置文件,修改类型为NodePort
可以看到修改成功,开放的端口是30017
node节点也可以看到该端口处于监听状态
使用真实主机访问服务,可以看到来自三个后端轮询应答
查看pod列表,可以发现轮询应答正是来自这3个pod
进入容器中并查看mysvc服务的dns解析
显示kube-system的pod,看到两个coredns
查看kube-system的svc,服务端口为53
查看kube-dns服务详细信息,有两个后端pod,对比一下ip可以发现,就是刚才的两个coredns
3.2、Headless无头模式
以DNS记录的方式解析出被代理Pod的IP地址,不需要通过Ip地址访问,可直接访问服务名称
查看所有的pod并显示标签
编辑headless.yaml文件
应用配置,可以看到新创建了一个nginx-svc的服务
查看nginx-svc服务的域名解析,可以看到对应三个负载均衡服务器,测试访问,三个ip轮询应答
安装dig插件用以查看解析的A记录
使用下图命令,查看10.96.0.10服务的A记录
编辑deployment.yml配置文件,将myapp的镜像版本改为v2
应用配置文件
再次使用Dig命令查看A记录解析,有三个应答ip
查看ngix-svc服务详细信息,后端pod对应刚才三个应答的ip
3.3、LoadBalancer模式
适用于公有云上的Kubernetes 服务。
可以指定一个 LoadBalancer 类型的Service,在service提交后,Kubernetes就会调用 CloudProvider 在公有云上为你创建一个负载均衡服务,并且把被代理的 Pod 的 IP地址配置给负载均衡服务做后端。
首先,更改kube-proxy配置
server2删除之前的kube-proxy
在harbor仓库中新建metallb项目
server1导入metallb镜像,然后上传至仓库
在网页上可以看到上传完成
真实主机获取metallb压缩文件及yaml配置文件
将metallb压缩文件发送给server1,将metallb.yaml配置文件发送给server2
修改yaml配置文件中speaker和controller的镜像路径
server2完成配置并应用
查看所有命名空间,看到metallb-system
查看metallb-system空间的所有信息,看到一个controller和三个speaker
编辑configmap.yaml文件,指定分配的IP地址范围
配置完成并应用,查看metallb-system的ConfigMap
编辑lb-svc.yml 文件,建立svc并获取分配的ip
完成并应用配置,查看服务,可以看到lb-svc服务,ip地址是我们之前配置的范围里的
真实主机测试访问,可以看到负载均衡
3.4、ExternalName方式
externalName Service是k8s中一个特殊的service类型,它不需要指定selector去选择哪些pods实例提供服务,而是使用DNS CNAME机制把自己CNAME到你指定的另外一个域名上,可以提供集群内的名字,也可以指定外部真实域名。
清理之前的lb-svc.yml配置文件,可以看到lb-svc服务已经删除
编辑ex-svc.yaml文件
查看my-service服务,看到对应的外部地址是www.westos.org
通过dig命令查看一下解析过程
当查找服务时,群集DNS服务返回 CNAME 记录,其值为 www.westos.org。 访问 my-service 的方式与其他服务的方式相同,但主要区别在于重定向发生在 DNS 级别,而不是通过代理或转发。
运行busyboxplus镜像容器,服务ip为10.96.0.10
kubectl edit svc my-service
进入my-service配置,将externalName改为www.baidu.com
再使用dig查看解析,看到CNAME记录变成www.baidu.com
以上是关于Linux企业运维——Kubernetesservice的主要内容,如果未能解决你的问题,请参考以下文章