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原理
從上圖可以看出,在我們日常業務開發中,我們會部署一系列微服務,外部網絡要通過 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