Kubernets學習筆記:traefik ingress

Kubernets學習筆記:traefik ingress

理解Ingress

簡單的說,ingress就是從kubernetes集群外訪問集群的入口,將用戶的URL請求轉發到不同的service上。Ingress相當於nginx、apache等負載均衡方向代理服務器,其中還包括規則定義,即URL的路由信息,路由信息得的刷新由Ingress controller來提供。

理解Ingress Controller

Ingress Controller 實質上可以理解為是個監視器,Ingress Controller 通過不斷地跟 kubernetes API 打交道,實時的感知後端 service、pod 等變化,比如新增和減少 pod,service 增加與減少等;當得到這些變化信息後,Ingress Controller 再結合下文的 Ingress 生成配置,然後更新反向代理負載均衡器,並刷新其配置,達到服務發現的作用。

Kubernets學習筆記:traefik ingress

從上圖中可以很清晰的看到,實際上請求進來還是被負載均衡器攔截,比如 nginx,然後 Ingress Controller 通過跟 Ingress 交互得知某個域名對應哪個 service,再通過跟 kubernetes API 交互得知 service 地址等信息;綜合以後生成配置文件實時寫入負載均衡器,然 後負載均衡器 reload 該規則便可實現服務發現,即動態映射。

介紹traefik

Traefik是一款開源的反向代理與負載均衡工具。它最大的優點是能夠與常見的微服務系統直接整合,可以實現自動化動態配置。目前支持Docker, Swarm, Mesos/Marathon, Mesos, Kubernetes, Consul, Etcd, Zookeeper, BoltDB, Rest API等等後端模型。由於微服務架構以及 Docker 技術和 kubernetes 編排工具最近幾年才開始逐漸流行,所以一開始的反向代理服務器比如 nginx、apache 並未提供其支持,畢竟他們也不是先知;所以才會出現 Ingress Controller 這種東西來做 kubernetes 和前端負載均衡器如 nginx 之間做銜接;即 Ingress Controller 的存在就是為了能跟 kubernetes 交互,又能寫 nginx 配置,還能 reload 它,這是一種折中方案;而最近開始出現的 traefik 天生就是提供了對 kubernetes 的支持,也就是說 traefik 本身就能跟 kubernetes API 交互,感知後端變化,因此可以得知: 在使用 traefik 時,Ingress Controller 已經無卵用了,所以整體架構如下

Kubernets學習筆記:traefik ingress

部署 Traefik

此次部署實現traefik代理http訪問,如果想實現https把對應的證書添加即可。

如果集群配置了RBAC,則需要賦予Traefik調用Kubernetes API的權限:

kubectl create -f 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

創建configmap保存Traefik配置文件

kubectl create configmap traefik-conf --from-file=traefik.toml --namespace=kube-system

cat traefik.toml

defaultEntryPoints = ["http"]

[entryPoints]

[entryPoints.http]

address = ":80"

查看configmap

kubectl get configmap --all-namespaces

Kubernets學習筆記:traefik ingress

通過DaemonSet部署Traefik,DaemonSet部署的好處是不用指定副本個數,他會自動在所有的節點創建一個traefik Pod,這是使用NodePort暴露8080端口。

kubectl create -f traefik-ds.yaml

cat traefik-ds.yaml

---

apiVersion: v1

kind: ServiceAccount

metadata:

name: traefik-ingress-controller

namespace: kube-system

---

kind: DaemonSet

apiVersion: extensions/v1beta1

metadata:

name: traefik-ingress-controller

namespace: kube-system

labels:

k8s-app: traefik-ingress-lb

spec:

template:

metadata:

labels:

k8s-app: traefik-ingress-lb

name: traefik-ingress-lb

spec:

serviceAccountName: traefik-ingress-controller

terminationGracePeriodSeconds: 60

volumes:

- name: config

configMap:

name: traefik-conf

hostNetwork: true

containers:

- image: traefik

name: traefik-ingress-lb

volumeMounts:

- mountPath: "/config"

name: "config"

ports:

- name: http

containerPort: 80

hostPort: 80

- name: admin

containerPort: 8080

securityContext:

capabilities:

drop:

- ALL

add:

- NET_BIND_SERVICE

args:

- --configfile=/config/traefik.toml

- --api

- --kubernetes

- --logLevel=INFO

---

kind: Service

apiVersion: v1

metadata:

name: traefik-ingress-service

namespace: kube-system

spec:

selector:

k8s-app: traefik-ingress-lb

ports:

- protocol: TCP

port: 80

name: http

- protocol: TCP

port: 8080

name: admin

type: NodePort

部署traefik-ui服務以及traefik-ui ingress

kubectl create -f ui.yaml

cat ui.yaml

---

apiVersion: v1

kind: Service

metadata:

name: traefik-web-ui

namespace: kube-system

spec:

selector:

k8s-app: traefik-ingress-lb

ports:

- name: web

port: 80

targetPort: 8080

---

apiVersion: extensions/v1beta1

kind: Ingress

metadata:

name: traefik-web-ui

namespace: kube-system

spec:

rules:

- host: traefik-ui.minikube

http:

paths:

- path: /

backend:

serviceName: traefik-web-ui

servicePort: web

查看pod運行狀態

kubectl get pods -n kube-system

Kubernets學習筆記:traefik ingress

查看ingress信息(之前已經新建了一組pods和ingress)

kubectl get ing --all-namespaces

Kubernets學習筆記:traefik ingress

訪問Traefik UI界面,綁定 traefik-ui.minikube Mster/NodeIP地址,這個主機頭已經在service裡定義了。

Kubernets學習筆記:traefik ingress

PROVIDERS界面

Kubernets學習筆記:traefik ingress

HEALTH界面

希望我寫的筆記可以幫助到大家,謝謝。

Kubernets學習筆記:traefik ingress


分享到:


相關文章: