关于K8S的Ingress Controller, 顾名思义,是负责处理Ingress请求的模块。如果熟悉CloudFoundry的话,可以把它想像成Gorouter的功能,由于在PaaS/CaaS中,每一个业务后端实际是由多个容器来支撑,如何将用户的请求按照一定的算法,round-robin 抑或是least-connection,分配到不同的容器当中,这个是Ingress Controller的作用。
关于K8S当中的Ingress 的定义,可以参考 官方文档

Traefik 其功能是HTTP层的方向代理以及负载均衡器,可以在其它的容器调度平台,如K8S、Mesos、Docker上部署微服务。本文主要介绍如何通过 traefik 在Minikube上配合 nip.io 为微服务提供访问服务。


前置条件

【1】 kubernetes 环境 本文以minikube 为例
【2】kubectl 客户端安装
【3】internet 访问权限

安装 traefik

在其官方文档中,提供了安装步骤,抽取了关键步骤,想要看详细介绍的,移步 ->

RBAC 配置

如果k8s cluster启用了RBAC之后,需要对Traefik 授权 ClusterRole 以及ClusterRoleBinding 来使用Kubernets 的API

kubectl apply -f https://raw.githubusercontent.com/containous/traefik/master/examples/k8s/traefik-rbac.yaml

安装Traefik

关于DeploymentSet 以及 Deployment有以下的区别

  1. 相比较DaemonSet 而言,Deployment 有更好的扩展性,如果使用了DS,那么在每一个node上只有一个pod

  2. 通过taints tolerations, DS可以在专有的机器上运行Service.可以参考

  3. 除此之外, DS可以直接访问任意Node上面的80, 443 端口,但是如果使用Deployment的话,那么需要设置一个Service 对象.

通过DaemonSet 安装

kubectl apply -f https://raw.githubusercontent.com/containous/traefik/master/examples/k8s/traefik-ds.yaml

配置Ingress 并启用UI

Traefik 提供了webui供查看其上的配置信息

kubectl apply -f https://raw.githubusercontent.com/yacloud-io/k8s-hands-on/master/ingress-controller/traefik-ui.yml

通过浏览器访问 http://traefik-ui.192.168.99.100.nip.io/dashboard/#/

Treafik UI with nip.io

安装terrific 并为其配置ingress

terrific web server,访问后,会显示所运行的容器/宿主机的IP 地址信息

安装terrific deployment

kubectl apply -f https://raw.githubusercontent.com/yacloud-io/k8s-hands-on/master/ingress-controller/terrific-deployment.yml

为其配置Service
kubectl apply -f https://raw.githubusercontent.com/yacloud-io/k8s-hands-on/master/ingress-controller/terrific-service.yml

配置Ingress 规则
kubectl apply -f https://raw.githubusercontent.com/yacloud-io/k8s-hands-on/master/ingress-controller/nip.io-ingress.yml

在deployment的pod 启动后,访问 http://my-terrific.192.168.99.100.nip.io/ 查看结果

terrific ingress
刷新浏览器,可以看到访问到不同的容器上

总结

traefik作为K8S的负载均衡器,为其上部署的应用提供外部访问的能力。默认情况下,K8S提供了NodePort、LoadBalancer 的方式来访问,但是在IP资源有限的情况下,特别是以NodePort报露外部请求时,Worker 节点有时不是公网IP,用Traefik可以很方便的解决这个问题,并提供负载均衡。