Kubernetes 部署 Ingress 控制器 Traefik v1.7.4
標簽:?kubernetes???ingress???traefik???nginx???haproxy???kong??
-
- 介紹
- Traefik
- Ingress 對象
上節課我們學習了在Kubernetes集群內部使用kube-dns實現服務發現的功能,那么我們部署在Kubernetes集群中的應用如何暴露給外部的用戶使用呢?我們知道前面我們使用 NodePort 和 LoadBlancer 類型的 Service 可以實現把應用暴露給外部用戶使用,除此之外,Kubernetes 還為我們提供了一個非常重要的資源對象可以用來暴露服務給外部用戶,那就是?ingress。對于小規模的應用我們使用NodePort或許能夠滿足我們的需求,但是當你的應用越來越多的時候,你就會發現對于 NodePort 的管理就非常麻煩了,這個時候使用 ingress 就非常方便了,可以避免管理大量的 Port。
介紹
Ingress其實就是從 kuberenets 集群外部訪問集群的一個入口,將外部的請求轉發到集群內不同的 Service 上,其實就相當于 nginx、haproxy 等負載均衡代理服務器,有的同學可能覺得我們直接使用 nginx 就實現了,但是只使用 nginx 這種方式有很大缺陷,每次有新服務加入的時候怎么改 Nginx 配置?不可能讓我們去手動更改或者滾動更新前端的 Nginx Pod 吧?那我們再加上一個服務發現的工具比如 consul 如何?貌似是可以,對吧?而且在之前單獨使用 docker 的時候,這種方式已經使用得很普遍了,Ingress 實際上就是這樣實現的,只是服務發現的功能自己實現了,不需要使用第三方的服務了,然后再加上一個域名規則定義,路由信息的刷新需要一個靠 Ingress controller 來提供。
Ingress controller 可以理解為一個監聽器,通過不斷地與 kube-apiserver 打交道,實時的感知后端 service、pod 的變化,當得到這些變化信息后,Ingress controller 再結合 Ingress 的配置,更新反向代理負載均衡器,達到服務發現的作用。其實這點和服務發現工具 consul consul-template 非常類似。
現在可以供大家使用的 Ingress controller 有很多,比如?traefik、nginx-controller、Kubernetes Ingress Controller for Kong、HAProxy Ingress controller,當然你也可以自己實現一個 Ingress Controller,現在普遍用得較多的是 traefik 和 nginx-controller,traefik 的性能較 nginx-controller 差,但是配置使用要簡單許多,我們這里會以更簡單的 traefik 為例給大家介紹 ingress 的使用。
Traefik
Traefik 是一款開源的反向代理與負載均衡工具。它最大的優點是能夠與常見的微服務系統直接整合,可以實現自動化動態配置。目前支持 Docker、Swarm、Mesos/Marathon、 Mesos、Kubernetes、Consul、Etcd、Zookeeper、BoltDB、Rest API 等等后端模型。
要使用 traefik,我們同樣需要部署 traefik 的 Pod,由于我們演示的集群中只有 master 節點有外網網卡,所以我們這里只有 master 這一個邊緣節點,我們將 traefik 部署到該節點上即可。
首先,為安全起見我們這里使用 RBAC 安全認證方式:(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- secretsverbs:- get- list- watch- apiGroups:- extensionsresources:- ingressesverbs:- get- list- watch --- kind: ClusterRoleBinding apiVersion: rbac.authorization.k8s.io/v1beta1 metadata:name: traefik-ingress-controller roleRef:apiGroup: rbac.authorization.k8s.iokind: ClusterRolename: traefik-ingress-controller subjects: - kind: ServiceAccountname: traefik-ingress-controllernamespace: kube-system直接在集群中創建即可:
$ kubectl create -f rbac.yaml serviceaccount "traefik-ingress-controller" created clusterrole.rbac.authorization.k8s.io "traefik-ingress-controller" created clusterrolebinding.rbac.authorization.k8s.io "traefik-ingress-controller" created然后使用 Deployment 來管理 Pod,直接使用官方的 traefik 鏡像部署即可(traefik.yaml)
--- apiVersion: apps/v1 kind: Deployment metadata:name: traefik-ingress-controllernamespace: kube-systemlabels:k8s-app: traefik-ingress-lb spec:replicas: 1selector:matchLabels:k8s-app: traefik-ingress-lbtemplate:metadata:labels:k8s-app: traefik-ingress-lbname: traefik-ingress-lbspec:serviceAccountName: traefik-ingress-controllerterminationGracePeriodSeconds: 60tolerations:- operator: "Exists"nodeSelector:kubernetes.io/hostname: mastercontainers:- image: traefik:v1.7.17name: traefik-ingress-lbports:- name: httpcontainerPort: 80- name: admincontainerPort: 8080args:- --api- --kubernetes- --logLevel=INFO --- kind: Service apiVersion: v1 metadata:name: traefik-ingress-servicenamespace: kube-system spec:selector:k8s-app: traefik-ingress-lbports:- protocol: TCPport: 80name: web- protocol: TCPport: 8080name: admintype: NodePort直接創建上面的資源對象即可:
$ kubectl create -f traefik.yaml deployment.apps "traefik-ingress-controller" created service "traefik-ingress-service" created要注意上面 yaml 文件:
tolerations: - operator: "Exists" nodeSelector:kubernetes.io/hostname: master由于我們這里的特殊性,只有 master 節點有外網訪問權限,所以我們使用nodeSelector標簽將traefik的固定調度到master這個節點上,那么上面的tolerations是干什么的呢?這個是因為我們集群使用的 kubeadm 安裝的,master 節點默認是不能被普通應用調度的,要被調度的話就需要添加這里的 tolerations 屬性,當然如果你的集群和我們的不太一樣,直接去掉這里的調度策略就行。
nodeSelector 和 tolerations 都屬于 Pod 的調度策略,在后面的課程中會為大家講解。
traefik 還提供了一個 web ui 工具,就是上面的 8080 端口對應的服務,為了能夠訪問到該服務,我們這里將服務設置成的 NodePort:
$ kubectl get pods -n kube-system -l k8s-app=traefik-ingress-lb -o wide NAME READY STATUS RESTARTS AGE IP NODE traefik-ingress-controller-57c4f787d9-bfhnl 1/1 Running 0 8m 10.244.0.18 master $ kubectl get svc -n kube-system NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE ... traefik-ingress-service NodePort 10.102.183.112 <none> 80:30539/TCP,8080:30486/TCP 8m ...現在在瀏覽器中輸入 master_node_ip:30486 就可以訪問到 traefik 的 dashboard 了:
Ingress 對象
現在我們是通過 NodePort 來訪問 traefik 的 Dashboard 的,那怎樣通過 ingress 來訪問呢? 首先,需要創建一個 ingress 對象:(ingress.yaml)
apiVersion: extensions/v1beta1 kind: Ingress metadata:name: traefik-web-uinamespace: kube-systemannotations:kubernetes.io/ingress.class: traefik spec:rules:- host: traefik.haimaxy.comhttp:paths:- backend:serviceName: traefik-ingress-serviceservicePort: 8080然后為 traefik dashboard 創建對應的 ingress 對象:
$ kubectl create -f ingress.yaml ingress.extensions "traefik-web-ui" created要注意上面的 ingress 對象的規則,特別是 rules 區域,我們這里是要為 traefik 的 dashboard 建立一個 ingress 對象,所以這里的 serviceName 對應的是上面我們創建的 traefik-ingress-service,端口也要注意對應 8080 端口,為了避免端口更改,這里的 servicePort 的值也可以替換成上面定義的 port 的名字:admin
創建完成后,我們應該怎么來測試呢?
- 第一步,在本地的/etc/hosts里面添加上 traefik.haimaxy.com 與 master 節點外網 IP 的映射關系
-
第二步,在瀏覽器中訪問:http://traefik.haimaxy.com,我們會發現并沒有得到我們期望的?dashboard 界面,這是因為我們上面部署 traefik 的時候使用的是 NodePort 這種 Service 對象,所以我們只能通過上面的 30539 端口訪問到我們的目標對象:http://traefik.haimaxy.com:30539加上端口后我們發現可以訪問到 dashboard 了,而且在 dashboard 當中多了一條記錄,正是上面我們創建的 ingress 對象的數據,我們還可以切換到 HEALTH 界面中,可以查看當前 traefik 代理的服務的整體的健康狀態
-
第三步,上面我們可以通過自定義域名加上端口可以訪問我們的服務了,但是我們平時服務別人的服務是不是都是直接用的域名啊,http 或者 https 的,幾乎很少有在域名后面加上端口訪問的吧?為什么?太麻煩啊,端口也記不住,要解決這個問題,怎么辦,我們只需要把我們上面的 traefik 的核心應用的端口隱射到 master 節點上的 80 端口,是不是就可以了,因為 http 默認就是訪問 80 端口,但是我們在 Service 里面是添加的一個 NodePort 類型的服務,沒辦法隱射 80 端口,怎么辦?這里就可以直接在 Pod 中指定一個 hostPort 即可,更改上面的 traefik.yaml 文件中的容器端口:
添加以后hostPort: 80,然后更新應用:
$ kubectl apply -f traefik.yaml更新完成后,這個時候我們在瀏覽器中直接使用域名方法測試下:
- 第四步,正常來說,我們如果有自己的域名,我們可以將我們的域名添加一條 DNS 記錄,解析到 master 的外網 IP 上面,這樣任何人都可以通過域名來訪問我的暴露的服務了。
如果你有多個邊緣節點的話,可以在每個邊緣節點上部署一個 ingress-controller 服務,然后在邊緣節點前面掛一個負載均衡器,比如 nginx,將所有的邊緣節點均作為這個負載均衡器的后端,這樣就可以實現 ingress-controller 的高可用和負載均衡了。
到這里我們就通過 ingress 對象對外成功暴露了一個服務,下節課我們再來詳細了解 traefik 的更多用法。
總結
以上是生活随笔為你收集整理的Kubernetes 部署 Ingress 控制器 Traefik v1.7.4的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: mac 启动php70 fpm,mac
- 下一篇: JQuery Datatables辅助函