高性能七层反向代理(达到NGINX的八九成效率),支持热更新,并对接到包括容器编排框架在内的多种后端服务web
由于是七层反向代理,因此是经过开放http,https端口接收域名请求并转发,不支持直接经过ip和端口进行转发 docker
配置加载优先级:KV Store(包括Consule、etcd、ZK) > Arguments命令参数 > ConfigFile配置文件 > Defaultexpress
#entrypoints配置 [entryPoints] [entryPoints.http] address = ":80" [entryPoints.http.redirect] entryPoint = "https" [entryPoints.https] address = ":443" #frontends配置 [frontends] [frontends.myfront] backend = "mybackend" passHostHeader = true passTLSCert = true priority = 10 entrypoints = ["https"] [frontends.myfront.headers.customresponseheaders] #自定义头部 X-MY-Response-Header = "xxx" [frontends.myfront.headers.customrequestheaders] X-MY-Request-Herder = "xxx" [frontends.myfront.routes.test_1] rule = "Host:my.com" #backends配置 [backends] [backends.mybackend] [backends.mybackend.circuitbreaker] expression = "NetworkErrorRatio() > 0.5" [backends.mybackend.LoadBalancer] method = "drr" #或者使用静态值wrr [backends.mybackend.loadbalancer.stickiness] #基于cookie的会话黏性配置 cookieName = "my_cookie" #自定义植入的黏性cookie名 [backends.mybackend.healthcheck] path = "/health" interval = "10s" port = 8080 [backends.mybackend.maxconn] amount = 1000 #并发上限 extractorfunc = "request.host" #其余候选值:client.ip、request.header.字段名 [backends.mybackend.servers.server1] url = "http://172.17.0.2:80" weight = 1 [backends.mybackend.servers.server2] url = "http://172.17.0.3:80" weight = 2 [acme] email = "xxx@yyy.com" storage = "acme.json" onHostRule = true #自动为acme.entryPoint下的新域名申请证书 onDemand = true #在新域名接受第一次https请求时申请证书 caServer = "https://acme-staging.api.letsencrypt.org/directory" #默认是申请生产证书,这里改成申请staging证书进行测试 entryPoint = "https" [acme.httpChallenge] entryPoint = "http" [[acme.domains]] main = "local1.com" sans = ["test1.local1.com", "test2.local1.com"] [[acme.domains]] main = "local2.com" sans = ["test1.local2.com", "test2.local2.com"] #ping健康检查配置(健康时:traefik healthcheck命令退出码为0,/ping接口返回200状态) [ping] entryPoint = "traefik" #指定是哪一个entrypoint
traefik支持自动解析service对象的标签(具体参考https://docs.traefik.io/configuration/backends/rancher/#labels-overriding-default-behaviour)json
* traefik.enable=true * traefik.frontend.rule=Host:test.traefik.io * traefik.backend=someservice
version: '2' services: reverse-proxy: image: traefik command: --api --docker #启用WebUI,监听docker ports: - "80:80" #http端口 - "8080:8080" #WebUI(--api选项) volumes: - /var/run/docker.sock:/var/run/docker.sock - ~/traefik.toml:/etc/traefik/traefik.toml #自定义配置(可选)
若是集群配置了RBAC,则须要对traefik受权访问后端
--- 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
--- 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 hostNetwork: true containers: - image: traefik name: traefik-ingress-lb ports: - name: http containerPort: 80 hostPort: 80 - name: admin containerPort: 8080 securityContext: privileged: true args: - --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: web - protocol: TCP port: 8080 name: admin type: NodePort
apiVersion: v1 kind: Service metadata: name: traefik-web-ui namespace: kube-system spec: selector: k8s-app: traefik-ingress-lb ports: - port: 80 targetPort: 8080 --- apiVersion: extensions/v1beta1 kind: Ingress metadata: name: traefik-web-ui namespace: kube-system annotations: kubernetes.io/ingress.class: traefik spec: rules: - host: traefik-ui.example.com http: paths: - backend: serviceName: traefik-web-ui servicePort: 80
针对TraefikUI的访问认证保护api
htpasswd -c ./auth 用户名 #根据提示输入密码 kubectl create secret generic mysecret --from-file auth --namespace=monitoring #在traefik ui ingress对象上注册以下annotations ingress.kubernetes.io/auth-type: "basic" ingress.kubernetes.io/auth-secret: "mysecret"