龙空技术网

kubernetes基础知识之ingress

王啸皓月山巅 62

前言:

现时咱们对“标签选择器用什么表示”都比较关注,小伙伴们都需要知道一些“标签选择器用什么表示”的相关知识。那么小编同时在网络上网罗了一些对于“标签选择器用什么表示””的相关内容,希望朋友们能喜欢,小伙伴们一起来了解一下吧!

Ingress是k8s集群的请求入口,是k8s集群中非常重要的外网流量入口。k8s默认的是nginx ingress。

Ingress增加了对七层的识别能力,可以根据http header、path等进行路由转发。

kubernetes对外暴露服务,最常用的方式有三种:nodePort LoadBalancer ingress。其实还有集群内部访问时候使用的ClusterIP,还有一种方式是External IP的方式。

pod的IP是动态变化的,把动态的IP暴露出去,需要借助于k8s的service机制。service可以使用标签lables的形式选择一组带有指定标签的pod,并且监控和自动负载它们的IP。

------我是华丽的分隔线-------

k8s的service和pod之间的服务,通过endpoints实现。

k8s的service中的Selector标签选择器和pod中的Labels标签进行关联,一般是app=xxx的标签,service通过label selector访问pod组。

service可以提供负载均衡能力,但是只是支持四层负载均衡的能力,不能支持7层负载均衡能力。

clusterIP,自动分配一个k8s集群内部访问的虚拟IP,是k8s服务暴露的默认方式,只是其他pod去访问的方式。

nodePort:在clusterIP的基础上,为service在每台服务器上绑定一个端口。这样可以通过节点IP:节点端口的方式访问服务。

loadBalancer:在nodeport的基础上,借助云服务提供商创建一个外部负载均衡器,并将请求转发到nodeport。

External Name:把集群外部的服务引入到集群内部来,在集群内部直接使用。

Ingress:支持七层功能。k8s引入ingress和ingress-controller进行调度,修改nginx的配置操作被抽象成了ingress对象。ingress-controller通过与kubernetes API交互,动态去感知集群中ingress规则变化,然后读取它,按照它自己的模板生成一段nginx配置文件,最后写入nginx pod中,再reload一下。

Nginx通过虚拟主机不同的域名区分不同的服务,而每个服务通过upstream进行定义不同的负载均衡池,再加上location进行负载均衡的反向代理。在日常使用中只需要修改nginx.conf即可实现。

当用户在kubernetes集群中创建了含有lables的service之后,同时会在集群中创建出一个同名的endpoints的对象,用来存储这个service下的pod IP,最终service和endpoint的对象都会存入etcd。

k8s集群中,service服务类型是LoadBalancer的,通过kubectl get svc --all-namespaces 查看LoadBalancer类型的服务的EXTERNAL-IP,我们可以通过external ip去访问服务。

NodePort的工作原理就是把service的端口映射到Node上的一个端口上,然后就可以通过NodeIP:NodePort来访问service了。

Port:service服务端口

TargetPort: Pod端口

nodePort: 主机端口,或者是节点端口。

Pod和ingress是通过service进行关联的,ingress作为统一的入口,由service关联到一组pod中。

一般执行kubectl describe ingress ${ingress_name} -n ${namespace}

执行结果里面的Backends对应的就是service_name和服务的端口。

可以执行kubectl get endpoints ${service_name} 查看到后端的pod和pod服务端口。

因为服务名会对应一个相同名称的endpoint对象。

可以执行kubectl describe endpoints ${service_name} -n ${namespace} 查看到pod和端口。

配置完成ingress规则,还需要客户端配置主机的hosts文件。

ingress是浏览器输入域名之后,根据域名解析记录,解析到域名的IP地址。然后根据ingress-rule规则判断来源,转发到相对应的service服务,接着转发到服务关联的pod端口,完成请求。

k8s定义了一种抽象:一组pod的逻辑分组,并且一种可以访问它们的策略--通常称为微服务。

k8s服务访问流程:

①:clusterIP类型服务:

other pod-->ClusterIP:Port

②: NodePort类型服务:

Client---><nodeIP>:NodePort--->ClusterIP:Port--->PodIP:Port

③:loadBalancer类型服务:

client--->负载均衡器EXTERNAL-IP---><NodeIP>:<nodePort>--->ClusterIP:Port--->PodIP:Port

④:Ingress类型服务:

client--->域名--->service的名称和端口--->PodIP:port。

四层路由的负载通过srrvice实现,七层路由的负载通过ingress实现。service是k8s流量负载组件的一种。service使用标签lable与pod进行关联。

①:查看服务:

kubectl get svc -n ${namespace} | grep name

②:描述服务,查看标签labels:

kunectl describe svc ${service_name} -n ${namespace}

③:查看pod:

kubectl get pod -n ${namespace} -o wide | grep name

④:描述服务终端:

kubectl describe endpoints ${endpoints_name} -n ${namespace}

service仅仅是一个概念,真正起作用的是每个worker node节点上的kube-proxy进程。每个worker node节点上都运行着一个kube-proxy进程。当创建service的时候,在master节点会通过api-server向etcd写入创建的service信息。而worker node节点上的kube-proxy会基于监听机制,发现service的变动,然后它会将最新的service信息转换成对应的访问规则。

马拉多纳 梅西

鼓励的话语:富在术数,不在劳身;利在势居,不在力耕!

标签: #标签选择器用什么表示