Kubernetes Ingress: HTTP 7层路由机制

原创 k8s kubernetes
半兽人 发表于: 2019-03-04   最后更新时间: 2020-11-20 19:58:05  

Ingress

Kubernetes 暴露服务的方式目前只有三种:LoadBlancer ServiceNodePort ServiceIngress

Ingress 可以提供负载均衡、SSL 和基于名称的虚拟托管。

Ingress 是什么?

Ingress 公开了从集群外部到集群内服务的 HTTP 和 HTTPS 路由。 流量路由由 Ingress 资源上定义的规则控制。

下面是一个将所有流量都发送到同一 Service 的简单 Ingress 示例:

screenshot

可以将 Ingress 配置为服务提供外部可访问的 URL、负载均衡流量、终止 SSL/TLS,以及提供基于名称的虚拟主机等能力。 Ingress 控制器通常负责通过负载均衡器来实现 Ingress,尽管它也可以配置边缘路由器或其他前端来帮助处理流量。

Ingress 不会公开任意端口或协议。将 HTTP 和 HTTPS 以外的服务公开到 Internet 时,通常使用 Service.Type=NodePortService.Type=LoadBalancer 类型的服务。

使用Ingress的好处:

  1. 端口管理。减少不必要端口暴露,便于管理。
    所有的请求,通过Ingress对应的IP:PORT进入,过滤/转发/负载均衡到相应的service/pod

  2. NodePort会在每个node上暴露对应的port,不便管理。

环境准备

你必须安装 Ingress 控制器 才能使用 Ingress。

你需要先安装 Ingress 控制器,例如 ingress-nginx。 你可以从许多 Ingress 控制器 中进行选择。

安装ingress 控制器

本例使用谷歌提供的 nginx-ingress-controller 镜像创建 ingress-controller,并以 Pod + Service 方式运行,其中 Service 使用 nodePort 方式将80443端口映射至物理机上。

部署过程中使用到的文档参考:https://github.com/kubernetes/ingress-nginx/blob/master/docs/deploy/index.md#bare-metal

  1. 下载各所需的yaml文件

    curl https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-v0.41.2/deploy/static/provider/cloud/deploy.yaml >deploy.yaml
    
  2. 启动上述yaml文件

    kubectl create -f deploy.yaml
    

上述yaml文件中可以不用修改,直接运行。

注意:国内下载:需要将 k8s.gcr.io/ingress-nginx/controller:v0.41.2 替换成 kubebiz/ingress-nginx:controller-v0.41.2
也可到这里下载:https://www.kubebiz.com/orchome/ingress-nginx (镜像已替换为国内的)

Ingress

Ingress由两部分组成:Ingress ControllerIngress 服务

核心逻辑:Ingress Contronler 通过与 Kubernetes API 交互,动态的去感知集群中 Ingress 规则变化,然后读取它,按照自定义的规则,规则就是写明了哪个域名对应哪个service,生成一段 Nginx 配置,再写到 Nginx-ingress-control的 Pod 里,这个 Ingress Contronler 的pod里面运行着一个nginx服务,控制器会把生成的nginx配置写入/etc/nginx.conf文件中,然后 reload 一下 使用配置生效。以此来达到域名分配置及动态更新。

screenshot

  • https://mywebsite.com/api的访问将被路由到后端名为"api"的 Service。
  • https://mywebsite.com/web的访问将被路由到后端名为"web"的 Service。
  • https:/mywebsite.com/doc的访问将被路由到后端名为"doc"的 Service。

下面通过一个例子分三步说明Ingress ControllerIngress 策略客户端如何访问 Ingress 提供的服务。

ingress规则编写

下面是一个简单的例子:

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: test-ingress
  annotations:
    ingress.kubernetes.io/ssl-redirect: "false"  ##关闭强制使用HTTPS的设置
spec:
  rules:
  ## 根据URL路径实现转发,域名为 *
  - https:
      paths:
      - path: /demo
        backend:
          serviceName: mydemo
          servicePort: 8080
      - path: /test
        backend:
          serviceName: mytest
          servicePort: 8080

根据域名实现转发:

$ cat mytest.yaml      
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: pand-ingress
  annotations:
    ingress.kubernetes.io/ssl-redirect: "false"
spec:
  rules:
  ## 根据域名实现转发
  - host: www.mywebsite1.com
    https:
      paths:
      - backend:
          serviceName: mydemo
          servicePort: 8080
  - host: www.mywebsite2.com
    https:
      paths:
      - backend:
          serviceName: mytest
          servicePort: 8080

创建上述ingress,在客户端配置好域名解析,实现访问。

也可以通过curl指定解析访问:

curl --resolve www.mywebsite1.com:80:172.10.18.3 www.mywebsite1.com/mydemo

总结

优点:Ingress支持L7负载均衡;Ingress基于Pod部署,并将Pod网络设置成external network;Ingress controller支持Nginx、Haproxy,能够满足企业内部使用。

缺点:因为pod是临时的,由于Ingress Controller也是基于Pod部署,这样Ingress对外的IP会发生变化。在企业内部都会在防火墙上给Service的访问IP设定规则,而IP变动对这一机制是致命的,因为企业不可能经常手动修改防火墙规则。

更多详情,请参考官方:https://kubernetes.io/zh/docs/concepts/services-networking/ingress/



您需要解锁本帖隐藏内容请: 点击这里
本帖隐藏的内容


上一条: Kubernetes之ConfigMap
下一条: 将Pod分配给指定的节点 - Kubernetes