1. 程式人生 > >kuberneters集群中使用traefik發布服務

kuberneters集群中使用traefik發布服務

k8s traefik ingress

前文已經介紹過了k8s ingress的實現原理和配置,本文將介紹替代方案traefik。在開始配置之前我們先回顧一下ingress發布k8s服務的實現方案,ingress方案需要使用下列的組件:
1、反向代理負載均衡器
2、ingress control
3、ingress
其中ingress control負責同apiserver進行通信,監測pod和service的變化,並更新反向代理負載均衡器的配置,同時讓反向代理負載均衡器重載配置。

接下來我們來看看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.

Traefik本質上是一個http的方向代理和負載均衡,可以支持Docker, Swarm mode, Kubernetes, Marathon, Consul, Etcd, Rancher, Amazon ECS等後端服務,動態的管理這些服務的配置文件(我們可以理解為自動發現這些後端服務的配置變更,並重新加載服務的配置)

下圖是traefik的工作原理示意圖:
技術分享圖片
Traefik的主要特點:
1、Go語音編寫、無需安裝其他依賴包、速度快
2、支持Rest API、多後端類型支持
3、支持配置文件熱加載,不需要重啟app進程
4、支持Round Robin, rebalancer load-balancers等負載均衡策略

5、自帶AngularJS Web UI圖形化界面
6、支持https、自動更新https證書
7、支持websocket、HTTP/2, GRPC、高可用集群等
8、支持網絡錯誤重試、後端自動熔斷(當後端應用錯誤數過多的時候,可以自動熔斷)

總而言之,在k8s集群中服務發布的方案選擇,Traefik可用作為ingress的替代解決方案,traefik的特點足夠說服我們將ingress替換成Traefik,下面我們開始在k8s 1.5.2集群環境中使用Traefik來發布服務。

一、通過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

二、通過yaml文件創建webui的service、ingress

# 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

三、通過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

三、通過上述yaml配置文件創建pod和ingress

# cd kubernetes/traefik/
# kubectl get pod
# kubectl get svc
# kubectl create -f .

技術分享圖片

# kubectl get pod
# kubectl get svc
# kubectl get ingress

技術分享圖片
四、訪問應用測試
修改測試機hosts文件,因為traefik采用demonset的方式運行,所以hosts記錄指向k8s集群中任意的節點均可
技術分享圖片
技術分享圖片
技術分享圖片
可以通過訪問集群內任意節點的8081端口查看taefik的圖形化界面
技術分享圖片
技術分享圖片

kuberneters集群中使用traefik發布服務