traefik
Traefik介绍traefik是一个开源的可以使服务发布变得轻松有趣的边缘路由器,它负责接收你系统的请求,然后使用合适的组件来对这些请求进行处理特点:1、traefik的与众不同在于他会自动发现适合你服务的配置,当traefik在检查你的服务时,会找到服务的相关信息并找到合适的服务来满足对应的请求2、traefik兼容所有主流的集群技术,比如k8s,docker,dockerswarm,aws,
Traefik介绍
traefik是一个开源的可以使服务发布变得轻松有趣的边缘路由器,它负责接收你系统的请求,然后使用合适的组件来对这些请求进行处理
特点:
1、traefik的与众不同在于他会自动发现适合你服务的配置,当traefik在检查你的服务时,会找到服务的相关信息并找到合适的服务来满足对应的请求
2、traefik兼容所有主流的集群技术,比如k8s,docker,docker swarm,aws,mesos等等,并且可以同时处理多种方式
使用 Traefik,不需要维护或者同步一个独立的配置文件:因为一切都会自动配置,实时操作的(无需重新启动,不会中断连接)。使用 Traefik,你可以花更多的时间在系统的开发和新功能上面,而不是在配置和维护工作状态上面花费大量时间。
核心概念:
traefik是一个边缘路由器,是你整个平台的大门,拦截并路由每个传入的请求,它知道所有的逻辑和规则,这些规则确实哪些服务处理哪些请求,传统的反向代理需要一个配置文件,其中包含路由到你服务的所有可能路由,而Traefik会实时监测服务并自动更新路由规则,可以自动服务发现
首先,当启动Traefik时,需要定义entrypoints(入口点),然后,根据连接到这些entrypoints的路由来分析传入的请求,来查看他们是否与一组规则相匹配,如果匹配,则路由可能会将请求通过一系列中间件转换过后再转发到你的服务上去,再了解Traefik之前有几个核心概念我们必须要了解:
1. Providers
Providers
用来自动发现平台上的服务,可以是编排工具、容器引擎或者 key-value 存储等,比如 Docker、Kubernetes、File
2. Entrypoints
Entrypoints
监听传入的流量(端口等…),是网络入口点,它们定义了接收请求的端口(HTTP 或者 TCP)。
3. Routers
Routers
分析请求(host, path, headers, SSL, …),负责将传入请求连接到可以处理这些请求的服务上去。
4. Services
Services
将请求转发给你的应用(load balancing, …),负责配置如何获取最终将处理传入请求的实际服
5. Middlewares
Middlewares
中间件,用来修改请求或者根据请求来做出一些判断(authentication, rate limiting, headers, ...),中间件被附件到路由上,是一种在请求发送到你的服务之前(或者在服务的响应发送到客户端之前)调整请求的一种方法。
安装:
由于 Traefik 2.X 版本和之前的 1.X 版本不兼容,我们这里选择功能更加强大的 2.X 版本来和大家进行讲解,我们这里使用的镜像是 traefik:2.2.0
。
在 Traefik 中的配置
可以使用两种不同的方式:
-
动态配置:完全动态的路由配置
-
静态配置:启动配置
1、静态配置
静态配置中的元素(这些元素不会经常更改)连接到 providers 并定义 Treafik 将要监听的 entrypoints。
在 Traefik 中有三种方式定义静态配置:在配置文件中、在命令行参数中、通过环境变量传递
2、动态配置
动态配置包含定义系统如何处理请求的所有配置内容,这些配置是可以改变的,而且是无缝热更新的,没有任何请求中断或连接损耗。
3、安装 Traefik
安装 Traefik 到 Kubernetes 集群中的资源清单文件提前准备好了
编辑crd.yaml
apiVersion: apiextensions.k8s.io/v1beta1
kind: CustomResourceDefinition
metadata:
name: ingressroutes.traefik.containo.us
spec:
group: traefik.containo.us
version: v1alpha1
names:
kind: IngressRoute
plural: ingressroutes
singular: ingressroute
scope: Namespaced
---
apiVersion: apiextensions.k8s.io/v1beta1
kind: CustomResourceDefinition
metadata:
name: ingressroutetcps.traefik.containo.us
spec:
group: traefik.containo.us
version: v1alpha1
names:
kind: IngressRouteTCP
plural: ingressroutetcps
singular: ingressroutetcp
scope: Namespaced
---
apiVersion: apiextensions.k8s.io/v1beta1
kind: CustomResourceDefinition
metadata:
name: middlewares.traefik.containo.us
spec:
group: traefik.containo.us
version: v1alpha1
names:
kind: Middleware
plural: middlewares
singular: middleware
scope: Namespaced
---
apiVersion: apiextensions.k8s.io/v1beta1
kind: CustomResourceDefinition
metadata:
name: tlsoptions.traefik.containo.us
spec:
group: traefik.containo.us
version: v1alpha1
names:
kind: TLSOption
plural: tlsoptions
singular: tlsoption
scope: Namespaced
---
apiVersion: apiextensions.k8s.io/v1beta1
kind: CustomResourceDefinition
metadata:
name: traefikservices.traefik.containo.us
spec:
group: traefik.containo.us
version: v1alpha1
names:
kind: TraefikService
plural: traefikservices
singular: traefikservice
scope: Namespaced
编辑traefik-rbac.yaml
kind: ClusterRole
apiVersion: rbac.authorization.k8s.io/v1
metadata:
name: traefik
rules:
- apiGroups:
- ""
resources:
- pods
- services
- endpoints
- secrets
verbs:
- get
- list
- watch
- apiGroups:
- extensions
resources:
- ingresses
verbs:
- get
- list
- watch
- apiGroups:
- extensions
resources:
- ingresses/status
verbs:
- update
- apiGroups:
- traefik.containo.us
resources:
- ingressroutes
- ingressroutetcps
- middlewares
- tlsoptions
- traefikservices
verbs:
- get
- list
- watch
---
kind: ServiceAccount
apiVersion: v1
metadata:
name: traefik
namespace: kube-system
---
kind: ClusterRoleBinding
apiVersion: rbac.authorization.k8s.io/v1
metadata:
name: traefik
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: ClusterRole
name: traefik
subjects:
- kind: ServiceAccount
name: traefik
namespace: kube-system
编辑traefik-deploy.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: traefik
namespace: kube-system
labels:
app: traefik
spec:
selector:
matchLabels:
app: traefik
strategy:
type: Recreate
template:
metadata:
labels:
app: traefik
spec:
serviceAccountName: traefik
tolerations:
- operator: "Exists"
nodeSelector:
kubernetes.io/hostname: 192.168.1.151
##volumes:
##- name: acme
## hostPath:
## path: /data/k8s/traefik/acme
containers:
- image: traefik:2.1.1
name: traefik
ports:
- name: web
containerPort: 80
hostPort: 80
- name: websecure
containerPort: 443
hostPort: 443
- name: mongo
hostPort: 27017
containerPort: 27017
- name: postgres
hostPort: 5432
containerPort: 5432
- name: redis
hostPort: 6379
containerPort: 6379
args:
- --entryPoints.web.address=:80
- --entryPoints.websecure.address=:443
- --entryPoints.mongo.address=:27017
- --entryPoints.postgres.address=:5432
- --entryPoints.redis.address=:6379
- --api=true
- --api.dashboard=true
- --ping=true
- --providers.kubernetesingress
- --providers.kubernetescrd
- --serversTransport.insecureSkipVerify=true
# - --providers.file.filename=/config/traefik-tls.toml
- --log.level=INFO
- --accesslog
# 使用 dns 验证方式
##- --certificatesResolvers.ali.acme.dnsChallenge.provider=alidns
# 邮箱配置
##- --certificatesResolvers.ali.acme.email=ych_1024@163.com
# 保存 ACME 证书的位置
##- --certificatesResolvers.ali.acme.storage=/etc/acme/acme.json
# 下面是用于测试的ca服务,如果https证书生成成功了,则移除下面参数
## - --certificatesresolvers.ali.acme.caserver=https://acme-staging-v02.api.letsencrypt.org/directory
##envFrom:
##- secretRef:
## name: traefik-alidns-secret
## # ALICLOUD_ACCESS_KEY
## # ALICLOUD_SECRET_KEY
## # ALICLOUD_REGION_ID
##volumeMounts:
##- name: acme
## mountPath: /etc/acme
## - name: config
## mountPath: /config
## - name: certs
## mountPath: /certs
resources:
requests:
cpu: "50m"
memory: "50Mi"
limits:
cpu: "200m"
memory: "100Mi"
securityContext:
allowPrivilegeEscalation: true
capabilities:
drop:
- ALL
add:
- NET_BIND_SERVICE
readinessProbe:
httpGet:
path: /ping
port: 8080
failureThreshold: 1
initialDelaySeconds: 10
periodSeconds: 10
successThreshold: 1
timeoutSeconds: 2
livenessProbe:
httpGet:
path: /ping
port: 8080
failureThreshold: 3
initialDelaySeconds: 10
periodSeconds: 10
successThreshold: 1
timeoutSeconds: 2
编辑dashboard.yaml
apiVersion: traefik.containo.us/v1alpha1
kind: IngressRoute
metadata:
name: traefik-dashboard
spec:
routes:
- match: Host(`traefik.ronnie.com`)
kind: Rule
services:
- name: api@internal
kind: TraefikService
kubectl apply -f ./ #部署所有资源
在本地的etc/hosts里面添加上域名traefik.domain.com
的映射即可访问 Traefik 的 Dashboard 页面了:
更多推荐
所有评论(0)