目录

一、service简介

二、IPVS模式

1.开启kube-proxy的ipvs模式

三、集群内部通信

1.ClusterIP方式

2.Headless无头服务

四、实现外部访问

1.NodePort方式

2.LoadBalancer模式

3.ExternalName方式

4.手动分配公网IP方式


一、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

Logo

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

更多推荐