k8s使用Traefik發佈服務

Kubernetes 集羣中使用 Traefik 反向代理


在開始之前,需要先了解一下什麼是RBAC。RBAC(基於角色的訪問控制)使用 rbac.authorization.k8s.io API 組來實現權限控制,RBAC 允許管理員通過 Kubernetes API 動態的配置權限策略。在 1.6 版本中 RBAC 還處於 Beat 階段,如果想要開啓 RBAC 授權模式需要在 apiserver 組件中指定 –authorization-mode=RBAC 選項。

在 RBAC API 的四個重要概念:
Role:是一系列的權限的集合,例如一個角色可以包含讀取 Pod 的權限和列出 Pod 的權限
ClusterRole: 跟 Role 類似,但是可以在集羣中到處使用( Role 是 namespace 一級的)
RoloBinding:把角色映射到用戶,從而讓這些用戶繼承角色在 namespace 中的權限。
ClusterRoleBinding: 讓用戶繼承 ClusterRole 在整個集羣中的權限。

簡單點說RBAC實現了在k8s集羣中對api-server的鑑權,更多的RBAC知識點請查閱官方文檔:https://kubernetes.io/docs/admin/authorization/rbac/Cmd


Traefik原理

這裏寫圖片描述
Traefik內部結構
從上圖可以看出,在我們日常業務開發中,我們會部署一系列微服務,外部網絡要通過 domain、path、負載均衡等轉發到後端私有網絡中,微服務之所以稱爲微,是因爲它是動態變化的,它會經常被增加、刪除、幹掉或者被更新。而且傳統的反向代理對服務動態變化的支持不是很方便,也就是服務變更後,我們不是很容易立馬改變配置和熱加載。traefik 的出現就是爲了解決這個問題,它可以時刻監聽服務註冊或服務編排 API,隨時感知後端服務變化,自動重新更改配置並熱重新加載,期間服務不會暫停或停止,這對於用戶來說是無感知的。
Traefik 還有很多特性如下:

  • 速度快
  • 不需要安裝其他依賴,使用 GO 語言編譯可執行文件
  • 支持最小化官方 Docker 鏡像
  • 支持多種後臺,如 Docker, Swarm mode, Kubernetes, Marathon, Consul, Etcd, Rancher, Amazon ECS 等等
  • 支持 REST API
  • 配置文件熱重載,不需要重啓進程
  • 支持自動熔斷功能
  • 支持輪訓、負載均衡
  • 提供簡潔的 UI 界面
  • 支持 Websocket, HTTP/2, GRPC
  • 自動更新 HTTPS 證書
  • 支持高可用集羣模式

k8s上部署Traefik

參考文章
https://cloud.tencent.com/developer/article/1010575
http://docs.traefik.cn/basics

給集羣node打上label

因爲選擇deployment方式部署,所以要給集羣的節點打上label,後續選擇nodeSelector指定traefik=proxy,副本數和集羣節點數一致的時候,所有的節點上都會運行一個pod

#kubectl label  node modelxsitapp29 traefik=proxy
#kubectl label  node modelxsitapp30 traefik=proxy
#kubectl get nodes --show-labels

這裏寫圖片描述

準備yaml文件

1. rbac文件

# cat traefik-rbac.yaml 
---
kind: ClusterRole
apiVersion: rbac.authorization.k8s.io/v1beta1
metadata:
  name: traefik-ingress-controller
rules:
  - apiGroups:
      - ""
    resources:
      - services
      - endpoints
      - secrets
    verbs:
      - get
      - list
      - watch
  - apiGroups:
      - extensions
    resources:
      - ingresses
    verbs:
      - get
      - list
      - watch
---
kind: ClusterRoleBinding
apiVersion: rbac.authorization.k8s.io/v1beta1
metadata:
  name: traefik-ingress-controller
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: ClusterRole
  name: traefik-ingress-controller
subjects:
- kind: ServiceAccount
  name: traefik-ingress-controller
  namespace: kube-system

在啓用rbac的環境下,如果鑑權未配置清楚,則traefik pod會報錯如下

Failed to list *v1.Endpoints: endpoints is forbidden: User "system:serviceaccount:kube-system:default" cannot list endpoints at the cluster scope 

2. traefik的deployment文件

# cat traefik-deployment.yaml   
---
apiVersion: v1
kind: ServiceAccount
metadata:
  name: traefik-ingress-controller
  namespace: kube-system
---
kind: Deployment
apiVersion: extensions/v1beta1
metadata:
  name: traefik-ingress-controller
  namespace: kube-system
  labels:
    k8s-app: traefik-ingress-lb
spec:
  replicas: 2
  selector:
    matchLabels:
      k8s-app: traefik-ingress-lb
  template:
    metadata:
      labels:
        k8s-app: traefik-ingress-lb
        name: traefik-ingress-lb
    spec:
      serviceAccountName: traefik-ingress-controller
      hostNetwork: true
      nodeSelector:
        traefik: proxy
      terminationGracePeriodSeconds: 60
      containers:
      - image: traefik
        name: traefik-ingress-lb
        imagePullPolicy: Never
        ports:
        - name: web
          containerPort: 80
          hostPort: 80
        - name: admin
          containerPort: 8081
        args:
        - --web
        - --web.address=:8081
        - --kubernetes

3. traefik的service文件

# cat traefik-service.yaml
apiVersion: v1
kind: Service
metadata:
  name: traefik-web-ui
  namespace: kube-system
spec:
  selector:
    k8s-app: traefik-ingress-lb
  ports:
  - port: 80
    targetPort: 8081
  type:NodePort

4. 通過k8s創建yaml

# kubectl create -f traefik-rbac.yaml 
# kubectl create -f traefik-deployment.yaml 
# kubectl create -f traefik-service.yaml 

通過k8s dashboard查看部署情況
這裏寫圖片描述

通過yaml創建ingress

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: traefik-web-ui
  namespace: kube-system
  annotations:
    kubernetes.io/ingress.class: traefik
spec:
  rules:
  - host: traefik-ui
    http:
      paths:
      - backend:
          serviceName: traefik-web-ui
          servicePort: 80

通過k8s 查看

kubectl get ingress -n kube-system

這裏寫圖片描述

驗證

1.修改hosts文件將域名解析分配到兩臺node上

10.47.130.202 k8s.webui
10.47.130.203 traefik-ui
10.47.130.202 traefik-ui

2.瀏覽器測試訪問

http://traefik-ui/dashboard/
這裏寫圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章