前文已經介紹過了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