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 页面了:

Logo

K8S/Kubernetes社区为您提供最前沿的新闻资讯和知识内容

更多推荐