说明

Ingress是Kubernetes的一个资源对象,它是一种API对象,用于管理外部对集群中服务的访问。Ingress提供了HTTP和HTTPS路由到集群内部服务的功能,允许基于主机名和路径将请求路由到对应的服务。

具体来说,Ingress可以实现以下功能:

  1. 主机名和路径基础的路由:根据请求中的主机名和路径,将请求路由到相应的服务。
  2. SSL/TLS支持:Ingress可以配置为处理HTTPS流量,包括SSL证书的管理和HTTPS到HTTP的流量卸载。
  3. 负载均衡:Ingress可以配置为将流量均衡分配到后端的多个Pod上。
  4. 名称基础的虚拟托管:允许在同一个IP地址上通过不同的主机名来访问不同的服务。

在Kubernetes中,Ingress自身并不直接处理流量,而是需要依赖Ingress控制器来实现具体的路由功能。Ingress控制器是一个守护进程,它监视Ingress资源及其相关的Service,并根据Ingress的规则来配置负载均衡器和网络以转发流量。

组件

解析

Ingress

API

K8S上标准API资源类型之一

进定义了抽象路由配置信息,只是元数据,需要有相应的控制器动态加载

将代理配置抽象成一个Ingress对象,每个服务对应一个yaml资源清单

负责以K8S标准的资源格式定义流量调度,路由等规则

Ingress

控制器

反向代理服务

需要监视(watch)API Server上Ingress资源的变动,并声称具体应用的自身的配置文件格式,即将新加入的Ingress转化成反向代理的配置文见并动态加载是之生效,最终并据此完成流量转发

Ingress Contorller非内置控制器,需要额外部署。

通常以Pod形式运行于K8S集群之上。

一般应该由专用的LB Serveice负责为其接入集群外部流量。

从0开始搞K8S:Ingress-nginx 安装_ingress

Ingress资源定义了路由规则,但这些规则需要Ingress控制器来解读和实现。常见的Ingress控制器包括ingress-nginx、Contour、HAProxy Ingress等。

ingress访问过程

  • 从外部流量调度到K8S中的ingress service。
  • 从service调度到ingress-contorller
  • ingress-controller根据ingress Pod中的定义进行转发。
  • 根据虚拟主机名直接调度到后端的一组应用Pod中

从0开始搞K8S:Ingress-nginx 安装_ingress_02

注意:

  • 整个流程涉及到到了两处Service内容
  • Service ingress-nginx是帮助ingress Controller Pod接入外部流量的
  • 后端的服务对应的Service只起到帮助ingress Controller Pod找到具体服务的Pod,仅用于服务发现,流量不需要经过后端服务的SVC,而是直接从ingress controller Pod转到具体的Pod
  • 上图中,虚线表示SVC对后端应用进行分组,实现表示ingress实际的访问流向。

ingress-nginx

Ingress-Nginx 是常用的ingress控制器之一,其本质是基于nginx的一个ingress控制器。

Ingress-Nginx在Pod内部运行Nginx服务器。这个Nginx服务器作为反向代理,接收外部请求,并根据Ingress资源中定义的规则,将请求转发到集群内的相应服务。同时,Nginx还提供了负载均衡功能,可以将请求分发到多个后端Pod上。

Ingress-Nginx能够动态地根据Kubernetes集群中的Ingress资源生成Nginx的配置文件,并重新加载Nginx以使这些配置生效。这使得当Ingress规则发生变化时,Ingress-Nginx可以自动更新其配置以适应新的路由规则。

从0开始搞K8S:Ingress-nginx 安装_ingress_03

安装

根据官网Ingress-Nginx Controller 安装Ingress-nginx有多种方式,可以使用Helm,也可用资源清单方式安装。这篇文档用资源清单方式进行安装。

考虑到网络问题,建议将资源清单下载到本地后,将其中的image替换为国内镜像,再进行安装

wget https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-v1.10.1/deploy/static/provider/baremetal/deploy.yaml -O /opt/ingress/deploy.yaml

wget -e "https_proxy=http://192.168.0.15:7890"  https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-v1.10.1/deploy/static/provider/baremetal/deploy.yaml -O /opt/ingress/deploy.yaml

在这个deploy.yaml中主要有个以下两个镜像

registry.k8s.io/ingress-nginx/controller:v1.10.1

registry.k8s.io/ingress-nginx/kube-webhook-certgen:v1.4.1

将其改用国内镜像仓库进行替换,推送到自有仓库,编辑deploy.yaml,并部署。

# 拉取国内镜像
docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/nginx-ingress-controller:v1.10.1
docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/kube-webhook-certgen:v1.4.1

# 推送至自有harbor 
docker tag  registry.cn-hangzhou.aliyuncs.com/google_containers/nginx-ingress-controller:v1.10.1 harbor.tangotz.com/google_containers/nginx-ingress-controller:v1.10.1
docker tag  registry.cn-hangzhou.aliyuncs.com/google_containers/kube-webhook-certgen:v1.4.1 harbor.tangotz.com/google_containers/kube-webhook-certgen:v1.4.1
docker push harbor.tangotz.com/google_containers/nginx-ingress-controller:v1.10.1
docker push harbor.tangotz.com/google_containers/kube-webhook-certgen:v1.4.1

#编辑替换镜像源
sed -i 's|registry.k8s.io/ingress-nginx/kube-webhook-certgen:v1.4.1@sha256:36d05b4077fb8e3d13663702fa337f124675ba8667cbd949c03a8e8ea6fa4366|harbor.tangotz.com/google_containers/kube-webhook-certgen:v1.4.1|g' deploy.yaml
sed -i 's|registry.k8s.io/ingress-nginx/controller:v1.10.1@sha256:e24f39d3eed6bcc239a56f20098878845f62baa34b9f2be2fd2c38ce9fb0f29e|harbor.tangotz.com/google_containers/nginx-ingress-controller:v1.10.1|g' deploy.yaml


从0开始搞K8S:Ingress-nginx 安装_ingress_04