kubernetes中kube-proxy的工作原理是什么

  介绍

本篇内容主要讲解“kubernetes中kube-proxy的工作原理是什么”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“kubernetes中kube-proxy的工作原理是什么”吧!

kube-proxy,服务必要说明

说到kube-proxy,就不得不提到k8中服务、下面对它们两做简单说明:

<李>

kube-proxy其实就是管理服务的访问入口,包括集群内舱到服务的访问和集群外访问服务。

<李>

kube-proxy管理服务的端点,该服务对外暴露一个虚拟IP,也成为集群IP,集群内通过访问这个<代码>集群IP:端口> <李>

服务是通过选择器选择的一组豆荚的服务抽象,其实就是一个微服务,提供了服务的磅和反向代理的能力,而kube-proxy的主要作用就是负责服务的实现。

<李>

服务另外一个重要作用是,一个服务后端的豆荚可能会随着生存灭亡而发生IP的改变,服务的出现,给服务提供了一个固定的IP,而无视后端端点的变化。

服务发现

k8提供了两种方式进行服务发现:

<李>

环境变量:当你创建一个豆荚的时候,kubelet会在该舱中注入集群内所有服务的相关环境变量。需要注意的是,要想一个豆荚中注入某个服务的环境变量,则必须服务要先比该吊舱创建。这一点,几乎使得这种方式进行服务发现不可用。

比如,一个名为redis-master的服务,对应的ClusterIP:港口为10.0.0.11:6379,则其对应的环境变量为:

 redis_master_service_host=10.0.0.11
  REDIS_MASTER_SERVICE_PORT=6379
  REDIS_MASTER_PORT=tcp://10.0.0.11:6379
  REDIS_MASTER_PORT_6379_TCP=tcp://10.0.0.11:6379
  REDIS_MASTER_PORT_6379_TCP_PROTO=tcp
  REDIS_MASTER_PORT_6379_TCP_PORT=6379
  REDIS_MASTER_PORT_6379_TCP_ADDR=10.0.0.11 


<李>

DNS:这也是k8官方强烈推荐的方式,可以通过集群扩展的方式轻松的创建KubeDNS来对集群内的服务进行服务发现。更多关于KubeDNS的内容,请查看我的博文:Kubernetes DNS服务技术研究,在此不再赘述。

发布(暴露)服务

k8原生的,一个服务的ServiceType决定了其发布服务的方式。

<李>

ClusterIP:这是k8默认的ServiceType。通过集群内的ClusterIP在内部发布服务。

<李>

NodePort:这种方式是常用的,用来对集群外暴露服务,你可以通过访问集群内的每个NodeIP: NodePort的方式,访问到对应服务后端的端点。

<李>

loadbalance:这也是用来对集群外暴露服务的,不同的是这需要云提供商的支持,比如AWS等。

<李>

ExternalName:这个也是在集群内发布服务用的,需要借助KubeDNS(版本祝辞=1.7)的支持,就是用KubeDNS将该服务和ExternalName做一个地图,KubeDNS返回一个CNAME记录。

# # kube-proxy内部原理

kube-proxy当前实现了两种proxyMode:用户空间和iptables。其中用户空间模式是v1.0及之前版本的默认模式,从v1.1版本中开始增加了iptables模式,在v1.2版本中正式替代用户空间模式成为默认模式。

# # #用户空间模式的用户是在用户空间,通过kube-proxy来实现服务的代理服务。废话不多说,其原理如下如图所示: Kubernetes中kube-proxy的工作原理是什么

可见,这种模式最大的问题是,服务的请求会先从用户空间进入内核iptables,然后再回到用户空间,由kube-proxy完成后端端点的选择和代理工作,这样流量从用户空间进出内核带来的性能损耗是不可接受的。这也是k8 v1.0及之前版本中对kube-proxy质疑最大的一点,因此社区就开始研究iptables模式。

# # # #示例

<>之前,美元kubectl  get 服务   NAME ,,,,,,,,,,,, LABELS ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, SELECTOR ,,,,,,,,,,,,, IP (S),,,,,,,,,,,,港口(S)   kubernetes ,,,,,,组件=apiserver提供者=kubernetes ,, & lt; none>,,,,,,,,,,,,,,,, 10.254.0.1 ,,,,,, 443/TCP   ssh-service1 ,,,,的名字=ssh,角色=service ,,,,,,,,,,,,,,,,,,,, ssh服务=true ,,,,, 10.254.132.107 , 2222/TCP      美元,kubectl  describe  service  ssh-service1    名称:ssh-service1   名称空间:默认   标签:name=ssh、角色=服务   选择器:ssh服务=true   类型:loadbalance   知识产权:10.254.132.107   端口:& lt; unnamed>2222/TCP   NodePort: & lt; unnamed>30239/TCP   端点:& lt; none>   Session 亲和力:没有   No 事件。

kubernetes中kube-proxy的工作原理是什么