Kubernetes,简称k8s,相信大家都不陌生了,它是专门为容器编排管理提供的一套解决方案。本质上就是一套集群环境。这个集群环境中,有两个角色,一个是master,一个是work,其中master充当着领导者的角色,work充当着干活的角色。大白话也就是,接到任务之后领导者负责任务管理指挥,work接受到任务之后,去执行,真正的去把工作落实。

master角色中又进行了分工,根据任务的不同,细分为以下组件:API server、scheduler、etcd、controller manager。

work角色中也是一样,根据任务的不同划分为:kubelet、kube proxy.

本文要介绍的就是kube proxy这个组件,它是个啥呢?

我们知道,k8s的初衷就是对容器进行管理编排,但是k8s不直接去管理容器,而是通过自己定义的pod去管理它,也就是说k8s管理的最小单元就是pod,而容器是跑在pod里面的。所以也是间接的管理容器了。

学过docker的人应该知道,容器其实就是类似虚拟化了一套操作系统,它是虚操作系统,和vmware不一样,VMware是虚硬件,是将整个硬件等全部划分,最后在这个上面装操作系统,虚机和虚机之间资源是隔离的。而容器不是,容器是公用硬件,只是操作系统隔离,他们公用宿主机上的一套硬件。既然有了操作系统,那么在操作系统上装上应用程序就可以跑起来了。

以上忽略,我其实也没有系统的学习过容器,就是知道容器和虚机都是虚拟化技术的两种方式,知道他们的大概区别。(后面学习了再更新容器和docker的相关文章)

回到正题。。。。。
kube proxy是个啥?pod是有ip的,这个ip是随机分配的,只要pod重启,那么这个ip地址就会变动,那么如果外部想要访问它,就很麻烦了,所以为了解决这个问题,对外提供一个统一的代理服务,用来接受请求,代理服务拿到请求之后,会根据映射关系把请求发到对应的pod上,那么这个代理就叫service,对应的k8s组件干活的就是kube proxy。

因为k8s中的资源都是通过yaml文件进行创建的,那么kube proxy是如何去工作呢?是通过yaml文件进行service参数声明,并进行创建之后,kube proxy这个组件就会按照这个模板就行工作,去把请求分发到不同的pod上。

下面来看下service这个资源的yaml文件中声明的参数:

kind: Service #资源类型
apiVersion: v1 #资源版本
metadata: #元数据
	name: service #资源名称
	namespace:dev
spec: #描述
	selector:#标签选择器,用于确定当前service代理哪些pod
		app:nginx
	type:#service类型,指定service的访问类型。
	clusterIP:#虚拟服务ip地址,会被k8s默认分配,只能集群内部访问
	sessionAffinity: #session亲和性,支持clientIP、None两个选项
	ports: #端口信息
		- protocol:TCP
		- Port:3017 #service端口
		- targetPort:5003 #pod端口
		- nodePort:31122 #主机端口

service和pod之间是怎么建立关联呢?是通过标签选择器,也就是上面的selector。

[admin@uc12 ~]$ kubectl describe svc test-alarm -n dev
Name:                     itom-alarm-dm-svc
Namespace:                dev
Labels:                   name=test-alarm
                          role=service
Annotations:              <none>
Selector:                 app=job-alarm
Type:                     NodePort
IP Family Policy:         SingleStack
IP Families:              IPv6
IP:                       fd00:10:96::f1cf
IPs:                      fd00:10:96::f1cf
Port:                     receiver  162/UDP
TargetPort:               162/UDP
NodePort:                 receiver  162/UDP
Endpoints:                [fd00:177:177:0:3ce3:e42f:5490:117d]:162,[fd00:177:177:0:a97b:6ba7:f54e:71f3]:162,[fd00:177:177:0:ad55:f79a:1f73:dbe3]:162
Port:                     check  162/TCP
TargetPort:               162/TCP
NodePort:                 check  162/TCP
Endpoints:                [fd00:177:177:0:3ce3:e42f:5490:117d]:162,[fd00:177:177:0:a97b:6ba7:f54e:71f3]:162,[fd00:177:177:0:ad55:f79a:1f73:dbe3]:162
Session Affinity:         None
External Traffic Policy:  Local
Events:                   <none>

上面的endpoints其实就是service映射的pod的ip地址和端口号。
Type:表示的是这个服务访问的权限范围,取值为:clusterIP和NodePort,loadbalancer和externalname.如果是clusterIp那么这个只能集群内部访问,不在集群内的节点是无法访问的,声明为NodePort的话,就是可以被不在集群内的节点访问。loadbalancer是在nodeport的外部再加个负载均衡的设备,外部服务器访问请求到这个负载均衡设备上之后,进行一个负载分发之后,后面就和nodeport一样了,这里就不做介绍了。externalname的作用就是指定一个外部服务的地址,然后在集群内部访问此service就可以访问到外部服务了。

session affinity—负载分发策略:
如果不设置,默认使用k8s的策略,比如随机或者是轮询。
用户可以通过设置为基于客户端地址的会话保持模式,即来自同一个客户端发起的所有请求都转发到固定的一个pod上,此模式可以使在spec中添加session affinity:clientIP选项

下面再来说一个知识点,就是我们的service是有一个集群ip,叫做clusterIP,这个地址可以自己配,可以不配,k8s会自动给我们生成。也可以配成None,那么这个时候就变成了没有iP地址,那么怎么访问呢,是通过域名来访问,当配置成None,就叫做无头服务。也就是,headliness类型。

下面再来介绍一下type,取值可以是clusterIP和NodePort.
声明为前者的话,那么pod只能在内部集群中访问,声明为NodePort,那么pod可以被外部服务器访问。
工作原理:既然是外部服务器可以访问,首先外部服务器的网络肯定是和集群内的节点的ip是通的,想访问的话,最简单的方式就是访问节点ip+端口号,这个端口号就是nodePort,那么只要把这个端口号和pod的service的端口号(也就是上面yaml文件中的Port做个映射),就可以访问pod了,后面的事就交给service了。
在这里插入图片描述
大概就是上面那样。
type是externalname:
配置如下:

spec:
	type: ExternalName
	externalName: www.baidu.com#ip 也是可以的。

表示将外部服务暴露给内部pod使用。

Logo

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

更多推荐