Kubernetes 部署 Traefik Ingress 控制器 (1.7.12)
目錄[-]
- . 一、Ingress 介紹
- . 二、Traefik 介紹
- . 三、部署 Ingress 控制器 Traefik
- . 1、Traefik 兩種部署方式介紹
- . 2、創建 Traefik 配置文件
- . 3、將 Traefik 配置文件掛載到 ConfigMap
- . 4、設置 CA 證書
- . 5、給節點設置 Label
- . 6、創建 Traefik 服務賬戶與角色權限
- . 7、創建 Traefik Ingress Controller
- . 四、配置 Ingress 訪問策略
- . 1、Ingress 規則配置簡介
- . 2、創建 Traefik Dashboard Ingress
前言:
Ingress 可以為 Kubernetes 集群外部訪問集群內部 Service 提供配置,Ingress Controller 控制器可以充當網關,提供路由策略、負載均衡流量、SSL,并提供基于名稱的虛擬主機,提供統一的入口供流量涌入,是一個邊緣路由器或額外的前端。這里使用 Traefik 來充當 Ingress Controller 控制器,下面將介紹如何在 Kubernetes 中部署 Traefik 這個過程。
Ingress 不會暴露任意端口或協議。將除 HTTP 和 HTTPS 之外的服務暴露給互聯網通常使用 Service.Type = NodePort 或 Service.Type = LoadBalancer 類型的服務。
系統環境:
- kubernetes 版本:1.14.0
- traefik 版本:1.7.12
Github 示例部署文件
- 部署文件 github 地址:?https://github.com/my-dlq/blog-example/tree/master/kubernetes/traefik-v1.7-deploy
一、Ingress 介紹
對于基于 HTTP 的服務,不同的 URL 對應不同的后端服務或者虛擬服務器(Virtual Host),這些應用層的轉發無法通過 Kubernetes Service 機制實現,所以從 Kubernetes 1.1 版本開始新增 Ingress 資源。Ingress 是一種將不同的URL的訪問請求轉發到不同的 Service 實現Http層業務路由機制。
Kubernetes Ingress 包含 Ingress 策略和 Ingress 控制器兩部分組成,Ingress 策略是配置路由規則,而 Ingress 控制器則是將服務進行轉發。Ingress Controller 基于 Ingress 規則將客戶端請求轉發到 Service 對應的后端 Endpoints(Pod) 上,這樣會跳過 Kube-proxy 轉發功能避免增加開銷。
例如下圖,展示了集群外部客戶端通過 Ingress 地址訪問集群,根據配置的 Ingress 規則,將所有訪問 host 為 www.mydlq.club ,且 path 為 “/test” 或者 “/dev” 的外部流量轉發到對應的 Pod 上。
?
二、Traefik 介紹
Traefik 是一個輕松與微服務配合且流行的 HTTP 反向代理和負載均衡器。Traefik 與現有的基礎架構組件(如 Docker、Swarm、Kubernetes、Marathon、Consul、Etcd、Rancher、Amazon ECS ……)集成,并自動動態配置。在你的控制器上指向 Traefik 應該是你唯一需要配置的步驟。
?
三、部署 Ingress 控制器 Traefik
在定義 Ingress 之前我先首先擁有 Ingresss 控制器,以實現為后端所有服務統一入口。Ingresss 控制器也是以 Pod 形式運行在 Kubernetes 集群中,監控 API Server 的 /ingress 接口后端的backend services,如果 Service 發送變化,則 Ingress 控制器將自動更新其轉發規則,下面我們開始部署 Traefik 到 Kubernetes 集群。
步驟簡介:
- (1)、創建 Traefik 配置文件,并將其以 ConfigMap 方式掛載到 Kubernetes 集群中。
- (2)、生成 CA 證書,并將其以 Secret 方式掛載到 Kubernetes 集群中。
- (3)、創建 Traefik Label 設置到 Kubernetes 節點(相當于設置了 Label 的節點是 Ingress 入口)。
- (4)、創建 Traefik ServiceAccount 以提供 Traefik 一定權限。
- (5)、創建 Traefik 控制器。
1、Traefik 兩種部署方式介紹
在 Kubernetes 下有兩種部署 Kubernetes 的方式:
- Deployment
- DeamonSet
兩種部署方式的區別:
在 Kubernetes 利用 DaemonSet 方式部署的應用會在設置對應 Label 的 Kubernetes 節點上部署一個 Pod,每當新增 Kubernetes 節點后只要對新增的 Kubernetes 節點設置對應 Label 就可將 Traefik 擴展到該節點。但是也是因為如此,一個節點只能啟用一個 Pod,這樣對于 Traefik 的擴展非常不利,如果將外部流量大量指向某個節點,那么很可能會致使該節點的 Traefik 崩潰,但也是非常方便限制兩個 Traefik Pod 起在不在同一節點上。使用 Deployment 方式的部署方式一般是部署無狀態應用的,所以通過這種方式能夠很輕松的擴展 Traefik 應用副本數。
如果用 DaemonSet 方式部署 Traefik 就可與使用該 “NET_BIND_SERVICE” 功能,這將允許它綁定到每個主機上的 80/443/etc 端口。這將允許繞過 kube-proxy,并減少流量跳躍。而 Deployment 這種部署方式是通過 kube-proxy 代理將流量轉發到 Traefik,所以可以利用集群中所有節點的 IP 地址訪問 Traefik,但是每新增一個 Kubernetes 節點后,如果想在該節點上設置 Traefik ,那么必須更改 Traefik Deployment 配置,增加副本數且使其在新節點上調度。
所以兩種部署方式區別大概如下:
- DaemonSet 方式能夠確定有哪些節點在運行 Traefik,可以確定的知道后端 IP,但是不能方便的伸縮。 Deployment 可以方便的伸縮,但是不能確定有哪些節點在運行 Traefik ,所以不能確定的知道后端 IP。
- 使用 Deployment 時可伸縮性可以更好,DaemonSet 方式在新增節點時更易擴展。
- DaemonSet 確保每個節點只有一個 Traefik Pod 在運行。而 Deployment 可以有多個副本。如果要確保兩個pod不在同一節點上,則可以設置成Deployment。
- DeamonSet 可以使用 “NET_BIND_SERVICE” 功能,這將允許它綁定到每個主機上的端口 80/443/etc。這將允許繞過kube-proxy,并減少流量跳躍。
這兩張方式可以根據自己的需求選擇其一即可。這里將介紹如何通過 DaemonSet 方式部署 Traefik Ingress。
2、創建 Traefik 配置文件
為了方便配置 Traefik,一般情況下將 Traefik 配置文件放置到容器外,這里以 ConfigMap 方式將配置文件存入 Kubernetes 集群,然后通過掛載方式將 ConfigMap 掛入 Traefik 容器中。
創建 traefik.toml 文件
traefik.toml
# traefik.toml debug = true InsecureSkipVerify = true defaultEntryPoints = ["http","https"] [entryPoints][entryPoints.http]address = ":80"compress = true[entryPoints.https]address = ":443"compress = true[entryPoints.https.tls][[entryPoints.https.tls.certificates]]CertFile = "/ssl/tls.crt"KeyFile = "/ssl/tls.key"[entryPoints.traefik]address = ":8080" [kubernetes] [traefikLog]format = "json"#filePath = "/data/traefik.log" [accessLog]#filePath = "/data/access.log"format = "json"[accessLog.filters]retryAttempts = trueminDuration = "10ms"[accessLog.fields]defaultMode = "keep"[accessLog.fields.names]"ClientUsername" = "drop"[accessLog.fields.headers]defaultMode = "keep"[accessLog.fields.headers.names]"User-Agent" = "redact""Authorization" = "drop""Content-Type" = "keep" [api]entryPoint = "traefik"dashboard = true- Traefik 配置文件中設置該 Traefik Ingress 允許以 HTTP、HTTPS 方式進入;
- 設置 SSL 統一的 CA 證書文件地址為“/ssl/tls.crt”,“/ssl/tls.key”方便后續通過 ConfigMap 方式將 CA 證書文件掛入其中。
3、將 Traefik 配置文件掛載到 ConfigMap
- n 指定程序啟的 Namespace
- --from-file 讀取文件生成 ConfigMap
4、設置 CA 證書
這里設置 Traefik 統一的 CA 證書文件,如果已經有擁有認證的證書文件可以直接拿來用,或者也可以用 openssl 程序生成自簽名證書。
生成自簽名 CA 證書
openssl 工具生成 CA 自簽名的證書
$ openssl req -newkey rsa:2048 -nodes -keyout tls.key -x509 -days 9999 -out tls.crt生成 secret 到 Kubernetes
$ kubectl create secret generic traefik-ui-tls-cert --from-file=tls.crt --from-file=tls.key -n kube-system5、給節點設置 Label
由于是 Kubernetes DeamonSet 這種方式部署 Traefik,所以需要提前給節點設置 Label,這樣當程序部署時 Pod 會自動調度到設置 Label 的點上。
節點設置 Label 標簽
- 格式:kubectl label nodes [節點名] [key=value]
查看節點是否設置 Label 成功
$ kubectl get nodes --show-labelsNAME STATUS ROLES VERSION LABELS k8s-master-2-11 Ready master v1.14.0 IngressProxy=true,kubernetes.io/hostname=k8s-master-2-11,kubernetes.io/os=linux,node-role.kubernetes.io/master= k8s-node-2-12 Ready <none> v1.14.0 kubernetes.io/hostname=k8s-node-2-12,storagenode=glusterfs k8s-node-2-13 Ready <none> v1.14.0 kubernetes.io/hostname=k8s-node-2-13,storagenode=glusterfs k8s-node-2-14 Ready <none> v1.14.0 kubernetes.io/hostname=k8s-node-2-14,storagenode=glusterfs可以看到已經設置上了 Label
6、創建 Traefik 服務賬戶與角色權限
Kubernetes 在 1.6 版本中引入了基于角色的訪問控制(RBAC)策略,方便對 Kubernetes 資源和 API 進行細粒度控制。所以這里提前創建好 Traefik ServiceAccount 并分配一定的權限。
創建 traefik-rbac.yaml 文件
traefik-rbac.yaml
apiVersion: v1 kind: ServiceAccount metadata:name: traefik-ingress-controllernamespace: kube-system---kind: ClusterRole apiVersion: rbac.authorization.k8s.io/v1beta1 metadata:name: traefik-ingress-controller rules:- apiGroups: [""]resources: ["services","endpoints","secrets"]verbs: ["get", "watch", "list"] - apiGroups: ["extensions"]resources: ["ingresses"]verbs: ["get", "watch", "list"] - apiGroups: ["extensions"]resources: ["ingresses/status"]verbs: ["update"] ---kind: ClusterRoleBinding apiVersion: rbac.authorization.k8s.io/v1beta1 metadata:name: traefik-ingress-controller subjects: - kind: ServiceAccount name: traefik-ingress-controllernamespace: kube-system roleRef:kind: ClusterRolename: traefik-ingress-controllerapiGroup: rbac.authorization.k8s.io創建 Traefik RBAC
$ kubectl apply -f traefik-rbac.yaml7、創建 Traefik Ingress Controller
創建 traefik.yaml 文件
這里設置部署 Traefik 的 yaml 文件,里面包含 Traefik 的 Service 和 DaemonSet。Service 里面需要設置三個端口,分別為 80、443、8080,這三個端口分別對應 http端口、https端口、traefik admin控制臺端口。DaemonSet 里面設置容器也暴露三個端口,其中 “80/443” 是使用特權端口的守護進程,闡述了靜態(非NodePort)hostPort 綁定,這樣相當于暴露當前 Traefik Pod 所在節點 IP,外部流量能通過該節點 IP 進入 Traefik Ingress。而 8080 是供 Traefik Dashboard 用的控制臺端口,可以通過該端口訪問 Traefik 控制臺。
例如這里設置 Traefik 啟動到 “k8s-master-2-11”,此節點的 IP 為 “192.168.2.11” ,這樣外部想通過 Traefik Ingress 訪問集群服務,必須通過該 IP 地址而不應通過 Kubernetes 集群 IP,相當于該節點充當了 Kubernetes 入口。
traefik.yaml
kind: Service apiVersion: v1 metadata:name: traefik-ingress-servicenamespace: kube-system spec:selector:k8s-app: traefik-ingress-lbports:- protocol: TCPport: 80name: http- protocol: TCPport: 443name: https- protocol: TCPport: 8080name: admin---apiVersion: extensions/v1beta1 kind: DaemonSet metadata:name: traefik-ingress-controllernamespace: kube-systemlabels:k8s-app: traefik-ingress-lb spec:template:metadata:labels:k8s-app: traefik-ingress-lbname: traefik-ingress-lbspec:serviceAccountName: traefik-ingress-controllerterminationGracePeriodSeconds: 60containers:- image: traefik:1.7.12name: traefik-ingress-lbports:- name: httpcontainerPort: 80hostPort: 80 #hostPort方式,將端口暴露到集群節點- name: httpscontainerPort: 443hostPort: 443 #hostPort方式,將端口暴露到集群節點- name: admincontainerPort: 8080securityContext:capabilities:drop:- ALLadd:- NET_BIND_SERVICEargs:- --api- --kubernetes- --logLevel=INFO- --configfile=/config/traefik.tomlvolumeMounts:- mountPath: "/ssl"name: "ssl"- mountPath: "/config"name: "config"volumes:- name: sslsecret:secretName: traefik-ui-tls-cert- name: configconfigMap:name: traefik-config tolerations: #設置容忍所有污點,防止節點被設置污點- operator: "Exists"nodeSelector: #設置node篩選器,在特定label的節點上啟動IngressProxy: "true"部署 Traefik
$ kubectl apply -f traefik.yaml查看 Traefik 資源
$ kubectl get daemonset,service,pod -o wide -n kube-systemNAME DESIRED CURRENT READY UP-TO-DATE AVAILABLE NODE SELECTOR CONTAINERS IMAGES daemonset.extensions/traefik-ingress-controller 1 1 1 1 1 IngressProxy=true traefik-ingress-lb traefik:1.7.12 ------------------------------------------------------------------------------------------------------------------------------------------------------ NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) SELECTOR service/traefik-ingress-service ClusterIP 10.10.114.105 <none> 80/TCP,443/TCP,8080/TCP k8s-app=traefik-ingress-lb ------------------------------------------------------------------------------------------------------------------------------------------------------ NAME READY STATUS RESTARTS IP NODE NOMINATED NODE READINESS GATES pod/traefik-ingress-controller-8rzwt 1/1 Running 3 10.20.0.29 k8s-master-2-11 <none> <none>到這里 Traefik 控制器已經部署完成,下面將同過暴露 Traefik Dashboard Ingres 來進行 Igress 配置示例。
四、配置 Ingress 訪問策略
1、Ingress 規則配置簡介
一個常規的路由策略如下所示,這里根據注解詳細描述 Ingress 訪問配置。
apiVersion: extensions/v1beta1 kind: Ingress metadata:name: test-ingress #Ingress 資源名稱annotations:kubernetes.io/ingress.class: traefik #指定用 traefik 控制器,如果為 nginx 控制器則設置為 nginx spec:rules:- host: cloud.mydlq.club #設置 host 匹配規則,外部流量訪問該 host 時候進行代理操作http:paths:- path: /traefik #設置 path,當 host 匹配后進行 path 匹配,根據 path 不同轉發不同的服務 backend:serviceName: traefik-ingress-service #設置 service 名稱,和要跳轉的 service 一致servicePort: 8080 #設置 service 端口2、創建 Traefik Dashboard Ingress
上面部署的 Traefik 控制器默認有控制臺服務,即 Traefik Service 的 8080 端口。
這里配置一個 Ingress, 將這個 Dashboard 設置域名為?http://cloud.mydlq.club/traefik?暴露出去,其它服務也是類似這種方法將 Service 暴露出去。
創建 traefik-dashboard-ingress.yaml 文件
apiVersion: extensions/v1beta1 kind: Ingress metadata:name: traefik-dashboardnamespace: kube-systemannotations:kubernetes.io/ingress.class: traefik #指定用 traefik 控制器traefik.frontend.rule.type: PathPrefixStrip #跳轉后端時忽略 pathtraefik.ingress.kubernetes.io/frontend-entry-points: http #指定只能以 http,方式訪問,也可以設置 https spec:rules:- host: cloud.mydlq.club #設置 hosthttp:paths:- path: /traefik #設置 pathbackend:serviceName: traefik-ingress-service #設置 service 名稱,和要跳轉的 service 一致servicePort: 8080 #設置 service 端口創建 Traefik Dashboard Ingress
$ kubectl apply -f traefik-dashboard-ingress.yaml查看 Ingress
$ kubectl describe ingress traefik-dashboard -n kube-systemName: traefik-dashboard Namespace: kube-system Address: Default backend: default-http-backend:80 (<none>) TLS:SNI routes Rules:Host Path Backends---- ---- --------cloud.mydlq.club /traefik traefik-ingress-service:8080 (10.20.0.29:8080) Annotations:kubernetes.io/ingress.class: traefiktraefik.frontend.rule.type: PathPrefixStriptraefik.ingress.kubernetes.io/frontend-entry-points: http Events: <none>設置 Host 映射
客戶端想通過域名訪問服務,必須要進行DNS解析,由于這里沒有 DNS 服務器進行域名解析,所以修改 hosts 文件將 Traefik 指定節點的 IP 和自定義 host 綁定。
$ vi /etc/hosts添加下面內容:
192.168.2.11 cloud.mydlq.club通過域名訪問 Traefik Dashboard
訪問地址?http://cloud.mydlq.club/traefik?查看 Traefik 控制臺。
?
?
總結
以上是生活随笔為你收集整理的Kubernetes 部署 Traefik Ingress 控制器 (1.7.12)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: SpringBoot部署项目到Linux
- 下一篇: oracle应收模块核销点不上,详解EB