Linux企业运维##Kubernetes(六)service
一、service简介Service可以看作是一组提供相同服务的Pod对外的访问接口。借助Service,应用可以方便地实现服务发现和负载均衡。Service默认只支持4层负载均衡能力,没有7层功能。(可以通过Ingress实现)Service的类型:ClusterIP:默认值,k8s系统给service自动分配的虚拟IP,只能在集群内部访问。NodePort:将Service通过指定的Node上
目录
一、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 设定)
二、IPVS模式
- Service 是由 kube-proxy 组件,加上 iptables 来共同实现的。
- kube-proxy 通过 iptables 处理 Service 的过程,需要在宿主机上设置相当多的iptables
规则,如果宿主机有大量的Pod,不断刷新iptables规则,会消耗大量的CPU资源。 - IPVS模式的service,可以使K8s集群支持更多量级的Pod。
1.开启kube-proxy的ipvs模式
(1)所有节点先安装IPVS
yum install -y ipvsadm //所有节点安装ipvs
(2)修改kube-proxy模式为ipvs模式
kubectl -n kube-system edit cm kube-proxy
(3)更新kube-proxy pod:删除之前的pod后控制器会自动重建,重建后的pod会生效刚才修改的配置
kubectl get pod -n kube-system |grep kube-proxy | awk '{system("kubectl delete pod "$1" -n kube-system")}'
(6)查看当前ipvs模块中记录的连接
kube-proxy通过linux的IPVS模块,以rr轮询方式调度service中的Pod
三、集群内部通信
1.ClusterIP方式
(1)test1上开启harbor仓库,test2编辑deploy.yml,将副本数置为6,设置标签为app=myapp
读取应用该文件,现在有6个pod,可看到标签为app=myapp
(2)新建文件夹service,编辑clusterip.yml,selector下设置app为myapp
应用配置,可以看到新创建了一个名为web-service的service
(3)查看web-service的详细信息,可看到后端pod有6个,即步骤(1)创建的6个标签app=myapp的pod
web-service的访问地址是10.98.243.46
(4)查看当前连接情况,可以看到kube-proxy通过linux的IPVS模块,以rr轮询方式调度service中的Pod。
(5)测试访问该服务
可以看到每次访问以轮询的方式分配给每一个pod
(6)进入容器中并查看web-service服务的dns解析
kubectl run -it demo --image=busyboxplus --restart=Never
可知web-service服务的dns解析来自service 10.96.0.10(kube-system内的kube-dns服务)
2.Headless无头服务
以DNS记录的方式解析出被代理Pod的IP地址,不需要通过Ip地址访问,可直接访问服务名称
(1)删除已有service,编辑clusterip.yml
应用配置,可以看到新创建了一个web-service的服务,且cluster-ip为None
(2)测试访问
(3)安装dig插件用以查看解析的A记录
(4)查看kube-system空间内的service,可看到微服务kube-dns的ip为10.96.0.10
kube-dns服务有两个后端pod,就是kube-system空间内的两个coredns
(5)输入命令查看10.96.0.10服务的A记录,有6个应答ip
dig -t A web-service.default.svc.cluster.local. @10.96.0.10
(6)查看kube-system中coredns的ip地址
输入命令查看coredns地址的服务的A记录
四、实现外部访问
1.NodePort方式
(1)删除已有service,编辑clusterip.yml
应用配置,可以看到新创建了一个web-service的服务,且cluster-ip为10.111.201.206,类型为NodePort,开放的端口是31565
(2)查看当前连接情况,可以看到kube-proxy通过linux的IPVS模块,以rr轮询方式调度service中的Pod
(3)使用宿主机访问服务,可以看到来自6个后端轮询应答
2.LoadBalancer模式
适用于公有云上的Kubernetes 服务。
可以指定一个LoadBalancer 类型的Service,在service提交后,Kubernetes就会调用CloudProvider 在公有云上为你创建一个负载均衡服务,并且把被代理的 Pod 的 IP地址配置给负载均衡服务做后端。
(1)编辑微服务web-service,设置类型为LoadBalancer(也可使用yml文件设置)
kubectl edit svc web-service
(2)更改kube-proxy配置,设置strictARP为true
kubectl edit configmap -n kube-system kube-proxy
删除之前的kube-proxy,控制器会自动重建kube-proxy使更改生效
kubectl get pod -n kube-system | grep kube-proxy | awk '{system("kubectl delete pod "$1" -n kube-system")}'
(3)新建metallb目录并在目录内下载metallb.yaml和namespace.yaml
wget https://raw.githubusercontent.com/metallb/metallb/v0.11.0/manifests/namespace.yaml
wget https://raw.githubusercontent.com/metallb/metallb/v0.11.0/manifests/metallb.yaml
(4)使用namespace.yaml新建一个命为metallb-system的namespace
(5)查看metallb.yaml中所需的镜像
(6)在harbor仓库中新建metallb项目
(7)在test1(作为harbor仓库的主机)上拉取这两个镜像并上传到harbor仓库中
docker pull quay.io/metallb/speaker:v0.11.0
docker pull quay.io/metallb/controller:v0.11.0
docker tag quay.io/metallb/speaker:v0.11.0 reg.westos.org/metallb/speaker:v0.11.0
docker tag quay.io/metallb/controller:v0.11.0 reg.westos.org/metallb/controller:v0.11.0
docker push reg.westos.org/metallb/speaker:v0.11.0
docker push reg.westos.org/metallb/controller:v0.11.0
(8)修改metallb.yaml配置文件中speaker和controller的镜像路径为harbor仓库
(9)完成配置并应用metallb.yaml文件
查看metallb-system空间的pod信息,看到一个controller和三个speaker
(10)编辑configmap.yaml文件,指定分配的IP地址范围
(11)配置完成并应用,查看服务,可以看到external-ip地址在configmap.yaml文件指定的范围之中
(12)真实主机测试访问,可以看到负载均衡
3.ExternalName方式
externalName Service是k8s中一个特殊的service类型,它不需要指定selector去选择哪些pods实例提供服务,而是使用DNS CNAME机制把自己CNAME到你指定的另外一个域名上,可以提供集群内的名字,也可以指定外部真实域名。
(1)编辑ex-svc.yaml文件并应用
可以看到my-service的类型为ExternalName,外部地址为test.westos.org
(2)通过dig命令查看一下解析过程
dig -t A my-service.default.svc.cluster.local. @10.96.0.10
当查找服务时,群集DNS服务返回 CNAME 记录,其值为 test.westos.org。 访问 my-service 的方式与其他服务的方式相同,但主要区别在于重定向发生在 DNS 级别,而不是通过代理或转发。
(3)重新编辑ex-svc.yaml文件,将externalName改为www.baidu.com,应用文件
外部地址为www.baidu.com
(4)再使用dig查看解析,看到CNAME记录变成www.baidu.com
4.手动分配公网IP方式
(1)编辑ex-ip.yml文件,设置标签app为myapp,外部ip为172.25.73.111
(2)查看标签app=myapp的pod
(3)应用ex-ip.yml文件,生成名为ex-ip的svc,其中包含6个标签app=myapp的pod
外部ip为172.25.73.111
(4)集群内部测试访问,可看到负载均衡,此时其他主机无法访问到172.25.73.111
(5)手动将ip172.25.73.111加到网卡接口上、
ip addr add 172.25.73.111/24 dev eth0 ##添加地址
ip addr del 172.25.73.111/24 dev eth0 ##删除地址
此时便可实现从外部访问172.25.73.111
更多推荐
所有评论(0)