谈谈Ingress

一、Ingress架构图简介

我们知道service的表现形式为IP:PORT,即工作在第四层传输层(TCP/IP层),那么对于不同的URL地址经常对应用不同的后端服务或者虚拟服务器,这些应用层的转发机制仅通过kubernetes的service机制是无法实现的,这种情况我么可以使用ingress策略定义和一个具体的ingress Controller,两者结合实现一个完整的Ingress 负载均衡,这个负载均衡是基于nginx七层反向代理来实现的,ingress工作原理如下图:

 

外部客户端通过访问负载均衡器,然后调度到service上,然后在调度到IngressController,IngressController通过Ingress规则(域名或虚拟主机)访问到后端pod,而在Ingress规则当中对应的主机是又service分组来设定的,可以看到,这幅图有2种service,最上面的service是用来对外提供服务的,而下面2个service仅仅是用来分pod组的 

 

上图是一个客户端访问k8s集群服务的示意图,本文只讲解ingress控制器、NodePort类型的Service对外暴露端口两部分。

Ingress和Ingress控制器的官方定义如下:

Ingress 是对集群中服务的外部访问进行管理的 API 对象,典型的访问方式是 HTTP,Ingress 可以提供负载均衡、SSL 终结和基于名称的虚拟托管。Ingress通常负责通过负载均衡器来实现 Ingress。

官方定义看得人云里雾里。我用大白话解释,打个比方Ingress控制器类似于与nginx,Ingress类似于nginx的配置文件。如果我们只安装nginx,不写nginx的配置文件,例如不写转发规则,则此nginx将毫无意义;反过来,若只有nginx的配置文件,但没装nginx,则配置文件无运行载体。所以Ingress和Ingress控制器是配合着使用的。

从上图可以看出Ingress和Ingress控制器是负责对外部请求的管理、转发,并没有对外暴露端口,需要在Ingress前面加一个NodePort类型的Service,通过这个Service对外暴露端口。

 

 二、Ingress安装和配置

控制器ingress-nginx的地址:https://github.com/kubernetes/ingress-nginx/tree/nginx-0.28.0/deploy

 

 

https://github.com/kubernetes/ingress-nginx/tree/nginx-0.28.0/deploy/static/provider/baremetal

 

 

 

常识

ClusterIP:只对集群内部可见

NodePort:对外部可见

[root@k8smaster dockerImages]# kubectl get svc -n ingress-nginx
NAME            TYPE        CLUSTER-IP    EXTERNAL-IP   PORT(S)                      AGE
ingress-nginx   NodePort    10.1.90.166   <none>        80:30080/TCP,443:30443/TCP   16h
service-nginx   ClusterIP   10.1.90.149   <none>        80/TCP                       16s

 

如果在POD中使用hostNetwork:true配置网络,pod中运行的应用程序可以直接看到宿主主机的网络接口,宿主主机所在的局域网上所有网络接口都可以访问到该应用程序。

附录

Kubernetes - 使用Ingress、Ingress控制器(Ingress Controller)转发请求

 

posted @ 2021-06-19 16:52  杨兮臣  阅读(281)  评论(0)    收藏  举报