Kubernetes 部署 Traefik Ingress 控制器 (1.7.12)
目錄[-]
- . 一、Ingress 介紹
- . 二、Traefik 介紹
- . 三、部署 Ingress 控制器 Traefik
- . 1、Traefik 兩種部署方式介紹
- . 2、創(chuàng)建 Traefik 配置文件
- . 3、將 Traefik 配置文件掛載到 ConfigMap
- . 4、設(shè)置 CA 證書
- . 5、給節(jié)點(diǎn)設(shè)置 Label
- . 6、創(chuàng)建 Traefik 服務(wù)賬戶與角色權(quán)限
- . 7、創(chuàng)建 Traefik Ingress Controller
- . 四、配置 Ingress 訪問(wèn)策略
- . 1、Ingress 規(guī)則配置簡(jiǎn)介
- . 2、創(chuàng)建 Traefik Dashboard Ingress
前言:
Ingress 可以為 Kubernetes 集群外部訪問(wèn)集群內(nèi)部 Service 提供配置,Ingress Controller 控制器可以充當(dāng)網(wǎng)關(guān),提供路由策略、負(fù)載均衡流量、SSL,并提供基于名稱的虛擬主機(jī),提供統(tǒng)一的入口供流量涌入,是一個(gè)邊緣路由器或額外的前端。這里使用 Traefik 來(lái)充當(dāng) Ingress Controller 控制器,下面將介紹如何在 Kubernetes 中部署 Traefik 這個(gè)過(guò)程。
Ingress 不會(huì)暴露任意端口或協(xié)議。將除 HTTP 和 HTTPS 之外的服務(wù)暴露給互聯(lián)網(wǎng)通常使用 Service.Type = NodePort 或 Service.Type = LoadBalancer 類型的服務(wù)。
系統(tǒng)環(huán)境:
- 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 介紹
對(duì)于基于 HTTP 的服務(wù),不同的 URL 對(duì)應(yīng)不同的后端服務(wù)或者虛擬服務(wù)器(Virtual Host),這些應(yīng)用層的轉(zhuǎn)發(fā)無(wú)法通過(guò) Kubernetes Service 機(jī)制實(shí)現(xiàn),所以從 Kubernetes 1.1 版本開始新增 Ingress 資源。Ingress 是一種將不同的URL的訪問(wèn)請(qǐng)求轉(zhuǎn)發(fā)到不同的 Service 實(shí)現(xiàn)Http層業(yè)務(wù)路由機(jī)制。
Kubernetes Ingress 包含 Ingress 策略和 Ingress 控制器兩部分組成,Ingress 策略是配置路由規(guī)則,而 Ingress 控制器則是將服務(wù)進(jìn)行轉(zhuǎn)發(fā)。Ingress Controller 基于 Ingress 規(guī)則將客戶端請(qǐng)求轉(zhuǎn)發(fā)到 Service 對(duì)應(yīng)的后端 Endpoints(Pod) 上,這樣會(huì)跳過(guò) Kube-proxy 轉(zhuǎn)發(fā)功能避免增加開銷。
例如下圖,展示了集群外部客戶端通過(guò) Ingress 地址訪問(wèn)集群,根據(jù)配置的 Ingress 規(guī)則,將所有訪問(wèn) host 為 www.mydlq.club ,且 path 為 “/test” 或者 “/dev” 的外部流量轉(zhuǎn)發(fā)到對(duì)應(yīng)的 Pod 上。
?
二、Traefik 介紹
Traefik 是一個(gè)輕松與微服務(wù)配合且流行的 HTTP 反向代理和負(fù)載均衡器。Traefik 與現(xiàn)有的基礎(chǔ)架構(gòu)組件(如 Docker、Swarm、Kubernetes、Marathon、Consul、Etcd、Rancher、Amazon ECS ……)集成,并自動(dòng)動(dòng)態(tài)配置。在你的控制器上指向 Traefik 應(yīng)該是你唯一需要配置的步驟。
?
三、部署 Ingress 控制器 Traefik
在定義 Ingress 之前我先首先擁有 Ingresss 控制器,以實(shí)現(xiàn)為后端所有服務(wù)統(tǒng)一入口。Ingresss 控制器也是以 Pod 形式運(yùn)行在 Kubernetes 集群中,監(jiān)控 API Server 的 /ingress 接口后端的backend services,如果 Service 發(fā)送變化,則 Ingress 控制器將自動(dòng)更新其轉(zhuǎn)發(fā)規(guī)則,下面我們開始部署 Traefik 到 Kubernetes 集群。
步驟簡(jiǎn)介:
- (1)、創(chuàng)建 Traefik 配置文件,并將其以 ConfigMap 方式掛載到 Kubernetes 集群中。
- (2)、生成 CA 證書,并將其以 Secret 方式掛載到 Kubernetes 集群中。
- (3)、創(chuàng)建 Traefik Label 設(shè)置到 Kubernetes 節(jié)點(diǎn)(相當(dāng)于設(shè)置了 Label 的節(jié)點(diǎn)是 Ingress 入口)。
- (4)、創(chuàng)建 Traefik ServiceAccount 以提供 Traefik 一定權(quán)限。
- (5)、創(chuàng)建 Traefik 控制器。
1、Traefik 兩種部署方式介紹
在 Kubernetes 下有兩種部署 Kubernetes 的方式:
- Deployment
- DeamonSet
兩種部署方式的區(qū)別:
在 Kubernetes 利用 DaemonSet 方式部署的應(yīng)用會(huì)在設(shè)置對(duì)應(yīng) Label 的 Kubernetes 節(jié)點(diǎn)上部署一個(gè) Pod,每當(dāng)新增 Kubernetes 節(jié)點(diǎn)后只要對(duì)新增的 Kubernetes 節(jié)點(diǎn)設(shè)置對(duì)應(yīng) Label 就可將 Traefik 擴(kuò)展到該節(jié)點(diǎn)。但是也是因?yàn)槿绱?#xff0c;一個(gè)節(jié)點(diǎn)只能啟用一個(gè) Pod,這樣對(duì)于 Traefik 的擴(kuò)展非常不利,如果將外部流量大量指向某個(gè)節(jié)點(diǎn),那么很可能會(huì)致使該節(jié)點(diǎn)的 Traefik 崩潰,但也是非常方便限制兩個(gè) Traefik Pod 起在不在同一節(jié)點(diǎn)上。使用 Deployment 方式的部署方式一般是部署無(wú)狀態(tài)應(yīng)用的,所以通過(guò)這種方式能夠很輕松的擴(kuò)展 Traefik 應(yīng)用副本數(shù)。
如果用 DaemonSet 方式部署 Traefik 就可與使用該 “NET_BIND_SERVICE” 功能,這將允許它綁定到每個(gè)主機(jī)上的 80/443/etc 端口。這將允許繞過(guò) kube-proxy,并減少流量跳躍。而 Deployment 這種部署方式是通過(guò) kube-proxy 代理將流量轉(zhuǎn)發(fā)到 Traefik,所以可以利用集群中所有節(jié)點(diǎn)的 IP 地址訪問(wèn) Traefik,但是每新增一個(gè) Kubernetes 節(jié)點(diǎn)后,如果想在該節(jié)點(diǎn)上設(shè)置 Traefik ,那么必須更改 Traefik Deployment 配置,增加副本數(shù)且使其在新節(jié)點(diǎn)上調(diào)度。
所以兩種部署方式區(qū)別大概如下:
- DaemonSet 方式能夠確定有哪些節(jié)點(diǎn)在運(yùn)行 Traefik,可以確定的知道后端 IP,但是不能方便的伸縮。 Deployment 可以方便的伸縮,但是不能確定有哪些節(jié)點(diǎn)在運(yùn)行 Traefik ,所以不能確定的知道后端 IP。
- 使用 Deployment 時(shí)可伸縮性可以更好,DaemonSet 方式在新增節(jié)點(diǎn)時(shí)更易擴(kuò)展。
- DaemonSet 確保每個(gè)節(jié)點(diǎn)只有一個(gè) Traefik Pod 在運(yùn)行。而 Deployment 可以有多個(gè)副本。如果要確保兩個(gè)pod不在同一節(jié)點(diǎn)上,則可以設(shè)置成Deployment。
- DeamonSet 可以使用 “NET_BIND_SERVICE” 功能,這將允許它綁定到每個(gè)主機(jī)上的端口 80/443/etc。這將允許繞過(guò)kube-proxy,并減少流量跳躍。
這兩張方式可以根據(jù)自己的需求選擇其一即可。這里將介紹如何通過(guò) DaemonSet 方式部署 Traefik Ingress。
2、創(chuàng)建 Traefik 配置文件
為了方便配置 Traefik,一般情況下將 Traefik 配置文件放置到容器外,這里以 ConfigMap 方式將配置文件存入 Kubernetes 集群,然后通過(guò)掛載方式將 ConfigMap 掛入 Traefik 容器中。
創(chuàng)建 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 配置文件中設(shè)置該 Traefik Ingress 允許以 HTTP、HTTPS 方式進(jìn)入;
- 設(shè)置 SSL 統(tǒng)一的 CA 證書文件地址為“/ssl/tls.crt”,“/ssl/tls.key”方便后續(xù)通過(guò) ConfigMap 方式將 CA 證書文件掛入其中。
3、將 Traefik 配置文件掛載到 ConfigMap
- n 指定程序啟的 Namespace
- --from-file 讀取文件生成 ConfigMap
4、設(shè)置 CA 證書
這里設(shè)置 Traefik 統(tǒng)一的 CA 證書文件,如果已經(jīng)有擁有認(rèn)證的證書文件可以直接拿來(lái)用,或者也可以用 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、給節(jié)點(diǎn)設(shè)置 Label
由于是 Kubernetes DeamonSet 這種方式部署 Traefik,所以需要提前給節(jié)點(diǎn)設(shè)置 Label,這樣當(dāng)程序部署時(shí) Pod 會(huì)自動(dòng)調(diào)度到設(shè)置 Label 的點(diǎn)上。
節(jié)點(diǎn)設(shè)置 Label 標(biāo)簽
- 格式:kubectl label nodes [節(jié)點(diǎn)名] [key=value]
查看節(jié)點(diǎn)是否設(shè)置 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可以看到已經(jīng)設(shè)置上了 Label
6、創(chuàng)建 Traefik 服務(wù)賬戶與角色權(quán)限
Kubernetes 在 1.6 版本中引入了基于角色的訪問(wèn)控制(RBAC)策略,方便對(duì) Kubernetes 資源和 API 進(jìn)行細(xì)粒度控制。所以這里提前創(chuàng)建好 Traefik ServiceAccount 并分配一定的權(quán)限。
創(chuàng)建 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創(chuàng)建 Traefik RBAC
$ kubectl apply -f traefik-rbac.yaml7、創(chuàng)建 Traefik Ingress Controller
創(chuàng)建 traefik.yaml 文件
這里設(shè)置部署 Traefik 的 yaml 文件,里面包含 Traefik 的 Service 和 DaemonSet。Service 里面需要設(shè)置三個(gè)端口,分別為 80、443、8080,這三個(gè)端口分別對(duì)應(yīng) http端口、https端口、traefik admin控制臺(tái)端口。DaemonSet 里面設(shè)置容器也暴露三個(gè)端口,其中 “80/443” 是使用特權(quán)端口的守護(hù)進(jìn)程,闡述了靜態(tài)(非NodePort)hostPort 綁定,這樣相當(dāng)于暴露當(dāng)前 Traefik Pod 所在節(jié)點(diǎn) IP,外部流量能通過(guò)該節(jié)點(diǎn) IP 進(jìn)入 Traefik Ingress。而 8080 是供 Traefik Dashboard 用的控制臺(tái)端口,可以通過(guò)該端口訪問(wèn) Traefik 控制臺(tái)。
例如這里設(shè)置 Traefik 啟動(dòng)到 “k8s-master-2-11”,此節(jié)點(diǎn)的 IP 為 “192.168.2.11” ,這樣外部想通過(guò) Traefik Ingress 訪問(wèn)集群服務(wù),必須通過(guò)該 IP 地址而不應(yīng)通過(guò) Kubernetes 集群 IP,相當(dāng)于該節(jié)點(diǎn)充當(dāng)了 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方式,將端口暴露到集群節(jié)點(diǎn)- name: httpscontainerPort: 443hostPort: 443 #hostPort方式,將端口暴露到集群節(jié)點(diǎn)- 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: #設(shè)置容忍所有污點(diǎn),防止節(jié)點(diǎn)被設(shè)置污點(diǎn)- operator: "Exists"nodeSelector: #設(shè)置node篩選器,在特定label的節(jié)點(diǎn)上啟動(dòng)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 控制器已經(jīng)部署完成,下面將同過(guò)暴露 Traefik Dashboard Ingres 來(lái)進(jìn)行 Igress 配置示例。
四、配置 Ingress 訪問(wèn)策略
1、Ingress 規(guī)則配置簡(jiǎn)介
一個(gè)常規(guī)的路由策略如下所示,這里根據(jù)注解詳細(xì)描述 Ingress 訪問(wèn)配置。
apiVersion: extensions/v1beta1 kind: Ingress metadata:name: test-ingress #Ingress 資源名稱annotations:kubernetes.io/ingress.class: traefik #指定用 traefik 控制器,如果為 nginx 控制器則設(shè)置為 nginx spec:rules:- host: cloud.mydlq.club #設(shè)置 host 匹配規(guī)則,外部流量訪問(wèn)該 host 時(shí)候進(jìn)行代理操作http:paths:- path: /traefik #設(shè)置 path,當(dāng) host 匹配后進(jìn)行 path 匹配,根據(jù) path 不同轉(zhuǎn)發(fā)不同的服務(wù) backend:serviceName: traefik-ingress-service #設(shè)置 service 名稱,和要跳轉(zhuǎn)的 service 一致servicePort: 8080 #設(shè)置 service 端口2、創(chuàng)建 Traefik Dashboard Ingress
上面部署的 Traefik 控制器默認(rèn)有控制臺(tái)服務(wù),即 Traefik Service 的 8080 端口。
這里配置一個(gè) Ingress, 將這個(gè) Dashboard 設(shè)置域名為?http://cloud.mydlq.club/traefik?暴露出去,其它服務(wù)也是類似這種方法將 Service 暴露出去。
創(chuàng)建 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 #跳轉(zhuǎn)后端時(shí)忽略 pathtraefik.ingress.kubernetes.io/frontend-entry-points: http #指定只能以 http,方式訪問(wèn),也可以設(shè)置 https spec:rules:- host: cloud.mydlq.club #設(shè)置 hosthttp:paths:- path: /traefik #設(shè)置 pathbackend:serviceName: traefik-ingress-service #設(shè)置 service 名稱,和要跳轉(zhuǎn)的 service 一致servicePort: 8080 #設(shè)置 service 端口創(chuàng)建 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>設(shè)置 Host 映射
客戶端想通過(guò)域名訪問(wèn)服務(wù),必須要進(jìn)行DNS解析,由于這里沒(méi)有 DNS 服務(wù)器進(jìn)行域名解析,所以修改 hosts 文件將 Traefik 指定節(jié)點(diǎn)的 IP 和自定義 host 綁定。
$ vi /etc/hosts添加下面內(nèi)容:
192.168.2.11 cloud.mydlq.club通過(guò)域名訪問(wèn) Traefik Dashboard
訪問(wèn)地址?http://cloud.mydlq.club/traefik?查看 Traefik 控制臺(tái)。
?
?
總結(jié)
以上是生活随笔為你收集整理的Kubernetes 部署 Traefik Ingress 控制器 (1.7.12)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: SpringBoot部署项目到Linux
- 下一篇: oracle应收模块核销点不上,详解EB