前文已经介绍过了k8s ingress的实现原理和配置,本文将介绍替代方案traefik。在开始配置以前咱们先回顾一下ingress发布k8s服务的实现方案,ingress方案须要使用下列的组件:
一、反向代理负载均衡器
二、ingress control
三、ingress
其中ingress control负责同apiserver进行通讯,监测pod和service的变化,并更新反向代理负载均衡器的配置,同时让反向代理负载均衡器重载配置。web
接下来咱们来看看traefik,官网地址:https://traefik.io/
Traefik (pronounced like traffic) is a modern HTTP reverse proxy and load balancer made to deploy microservices with ease. It supports several backends (Docker,Swarm mode,Kubernetes,Marathon, Consul,Etcd,Rancher,Amazon ECS, and a lot more) to manage its configuration automatically and dynamically.docker
Traefik本质上是一个http的方向代理和负载均衡,能够支持Docker, Swarm mode, Kubernetes, Marathon, Consul, Etcd, Rancher, Amazon ECS等后端服务,动态的管理这些服务的配置文件(咱们能够理解为自动发现这些后端服务的配置变动,并从新加载服务的配置)后端
下图是traefik的工做原理示意图:
Traefik的主要特色:
一、Go语音编写、无需安装其余依赖包、速度快
二、支持Rest API、多后端类型支持
三、支持配置文件热加载,不须要重启app进程
四、支持Round Robin, rebalancer load-balancers等负载均衡策略
五、自带AngularJS Web UI图形化界面
六、支持https、自动更新https证书
七、支持websocket、HTTP/2, GRPC、高可用集群等
八、支持网络错误重试、后端自动熔断(当后端应用错误数过多的时候,能够自动熔断)api
总而言之,在k8s集群中服务发布的方案选择,Traefik可用做为ingress的替代解决方案,traefik的特色足够说服咱们将ingress替换成Traefik,下面咱们开始在k8s 1.5.2集群环境中使用Traefik来发布服务。websocket
1、经过yaml文件已daemonset方式运行traefik网络
# mkdir traefik # cd traefik # docker pullk docker.io/traefik
# cat traefik.ds.yaml apiVersion: extensions/v1beta1 kind: DaemonSet metadata: name: traefik-ingress-lb namespace: default labels: k8s-app: traefik-ingress-lb spec: template: metadata: labels: k8s-app: traefik-ingress-lb name: traefik-ingress-lb spec: terminationGracePeriodSeconds: 60 hostNetwork: true restartPolicy: Always containers: - image: docker.io/traefik name: traefik-ingress-lb resources: limits: cpu: 200m memory: 30Mi requests: cpu: 100m memory: 20Mi ports: - name: http containerPort: 80 hostPort: 80 - name: admin containerPort: 8081 args: - --web - --web.address=:8081 - --kubernetes - --kubernetes.endpoint=http://192.168.115.5:8080
2、经过yaml文件建立webui的service、ingressapp
# cat ui.yaml apiVersion: v1 kind: Service metadata: name: traefik-web-ui namespace: default spec: selector: k8s-app: traefik-ingress-lb ports: - name: web port: 80 targetPort: 8081 --- apiVersion: extensions/v1beta1 kind: Ingress metadata: name: traefik-web-ui namespace: default spec: rules: - host: traefik-ui.local http: paths: - path: / backend: serviceName: traefik-web-ui servicePort: web
3、经过yaml文件建立 kubernetes-dashboard和frontend的ingress负载均衡
# cat traefik.ing.yaml apiVersion: extensions/v1beta1 kind: Ingress metadata: name: traefik-ingress spec: rules: - host: k8s.webui http: paths: - path: / backend: serviceName: kubernetes-dashboard servicePort: 80 - host: k8s.frontend http: paths: - path: / backend: serviceName: frontend servicePort: 80
3、经过上述yaml配置文件建立pod和ingressfrontend
# cd kubernetes/traefik/ # kubectl get pod # kubectl get svc # kubectl create -f .
# kubectl get pod # kubectl get svc # kubectl get ingress
4、访问应用测试
修改测试机hosts文件,由于traefik采用demonset的方式运行,因此hosts记录指向k8s集群中任意的节点都可
能够经过访问集群内任意节点的8081端口查看taefik的图形化界面
后续将研究一下如何在k8s集群中发布https协议的服务。socket