1.Traefik 介绍

traefik 是一款反向代理、负载均衡服务,使用 golang 实现的。和 nginx 最大的不同是,它支持自动化更新反向代理和负载均衡配置。
在微服务架构越来越流行的今天,一个业务恨不得有好几个数据库、后台服务和 webapp,开发团队拥有一款 “智能” 的反向代理服务,
为他们简化服务配置。traefik 就是为了解决这个问题而诞生的。

2.部署 Traefik 2.0

在 traefik v2.0 版本后,开始使用 CRD(Custom Resource Definition)来完成路由配置等,
所以需要提前创建 CRD 资源。下面进行安装过程。
注:我们这里是将traefik部署在ingress-traefik命名空间,如果你需要部署在其他命名空间,需要更改资源清单,
如果你是部署在和我同样的命令空间中,你需要创建该命名空间。

mkdir -p /home/yaml/traefik
cd /home/yaml/traefik

2.1 创建CRD资源

Traefik 2.0版本后开始使用CRD来对资源进行管理配置,所以我们需要先创建CRD资源。

cat >traefik-crd.yaml<<EOF
## Namspace
apiVersion: v1
kind: Namespace
metadata:name: ingress-traefik
---
## IngressRoute
apiVersion: apiextensions.k8s.io/v1beta1
kind: CustomResourceDefinition
metadata:name: ingressroutes.traefik.containo.us
spec:scope: Namespacedgroup: traefik.containo.usversion: v1alpha1names:kind: IngressRouteplural: ingressroutessingular: ingressroute
---
## IngressRouteTCP
apiVersion: apiextensions.k8s.io/v1beta1
kind: CustomResourceDefinition
metadata:name: ingressroutetcps.traefik.containo.us
spec:scope: Namespacedgroup: traefik.containo.usversion: v1alpha1names:kind: IngressRouteTCPplural: ingressroutetcpssingular: ingressroutetcp
---
## Middleware
apiVersion: apiextensions.k8s.io/v1beta1
kind: CustomResourceDefinition
metadata:name: middlewares.traefik.containo.us
spec:scope: Namespacedgroup: traefik.containo.usversion: v1alpha1names:kind: Middlewareplural: middlewaressingular: middleware
---
apiVersion: apiextensions.k8s.io/v1beta1
kind: CustomResourceDefinition
metadata:name: tlsoptions.traefik.containo.us
spec:scope: Namespacedgroup: traefik.containo.usversion: v1alpha1names:kind: TLSOptionplural: tlsoptionssingular: tlsoption
---
## TraefikService
apiVersion: apiextensions.k8s.io/v1beta1
kind: CustomResourceDefinition
metadata:name: traefikservices.traefik.containo.us
spec:scope: Namespacedgroup: traefik.containo.usversion: v1alpha1names:kind: TraefikServiceplural: traefikservicessingular: traefikservice---
## TraefikTLSStore
apiVersion: apiextensions.k8s.io/v1beta1
kind: CustomResourceDefinition
metadata:name: tlsstores.traefik.containo.us
spec:scope: Namespacedgroup: traefik.containo.usversion: v1alpha1names:kind: TLSStoreplural: tlsstoressingular: tlsstore---
## IngressRouteUDP
apiVersion: apiextensions.k8s.io/v1beta1
kind: CustomResourceDefinition
metadata:name: ingressrouteudps.traefik.containo.us
spec:scope: Namespacedgroup: traefik.containo.usversion: v1alpha1names:kind: IngressRouteUDPplural: ingressrouteudpssingular: ingressrouteudp
EOF#部署 CRD 资源
kubectl apply -f traefik-crd.yaml

2.2 创建 RBAC 权限

Kubernetes 在 1.6 以后的版本中引入了基于角色的访问控制(RBAC)策略,方便对 Kubernetes 资源和 API 进行细粒度控制。
Traefik 需要一定的权限,所以这里提前创建好 Traefik ServiceAccount 并分配一定的权限。

cat >traefik-rbac.yaml<<EOF
apiVersion: v1
kind: ServiceAccount
metadata:namespace: ingress-traefik name: traefik-ingress-controller
---
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"]- apiGroups: ["extensions"]resources: ["ingresses/status"]verbs: ["update"]- apiGroups: ["traefik.containo.us"]resources: ["middlewares"]verbs: ["get","list","watch"]- apiGroups: ["traefik.containo.us"]resources: ["ingressroutes","traefikservices"]verbs: ["get","list","watch"]- apiGroups: ["traefik.containo.us"]resources: ["ingressroutetcps","ingressrouteudps"]verbs: ["get","list","watch"]- apiGroups: ["traefik.containo.us"]resources: ["tlsoptions","tlsstores"]verbs: ["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: ingress-traefik
EOF#部署 Traefik RBAC 资源
kubectl apply -f traefik-rbac.yaml

2.3 安装 Kubernetes Gateway CRD 资源

由于目前 Kubernetes 集群上默认没有安装 Service APIs,我们需要提前安装 Gateway API 的 CRD 资源,
需要确保在 Traefik 安装之前启用 Service APIs 资源。

git clone https://github.com/kubernetes-sigs/gateway-api.git
cd gateway-api/config/crd/bases/
#安装
kubectl apply -f .
customresourcedefinition.apiextensions.k8s.io/backendpolicies.networking.x-k8s.io created
customresourcedefinition.apiextensions.k8s.io/gatewayclasses.networking.x-k8s.io created
customresourcedefinition.apiextensions.k8s.io/gateways.networking.x-k8s.io created
customresourcedefinition.apiextensions.k8s.io/httproutes.networking.x-k8s.io created
customresourcedefinition.apiextensions.k8s.io/tcproutes.networking.x-k8s.io created
customresourcedefinition.apiextensions.k8s.io/tlsroutes.networking.x-k8s.io created
customresourcedefinition.apiextensions.k8s.io/udproutes.networking.x-k8s.io created

2.4 创建 Traefik 配置文件

由于 Traefik 配置很多,使用 CLI 定义操作过于繁琐,尽量使用将其配置选项放到配置文件中,然后存入 ConfigMap,将其挂入 traefik 中。

cat >traefik-config.yaml<<EOF
kind: ConfigMap
apiVersion: v1
metadata:name: traefik-confignamespace: ingress-traefik
data:traefik.yaml: |-serversTransport:insecureSkipVerify: trueapi:insecure: truedashboard: truedebug: truemetrics:prometheus: ""entryPoints:web:address: ":80"websecure:address: ":443"providers:kubernetesCRD: ""kubernetesingress: ""log:filePath: ""level: errorformat: jsonaccessLog:filePath: ""format: jsonbufferingSize: 0filters:retryAttempts: trueminDuration: 20fields:defaultMode: keepnames:ClientUsername: dropheaders:defaultMode: keepnames:User-Agent: redactAuthorization: dropContent-Type: keep
EOF#部署 Traefik ConfigMap 资源
kubectl apply -f traefik-config.yaml

2.5 设置Label标签

由于使用的Kubernetes DeamonSet方式部署Traefik,所以需要提前给节点设置Label,当程序部署Pod会自动调度到设置Label的node节点上。

设置标签
kubectl label nodes k8s-master1 IngressProxy=true
#查看标签
kubectl  get node --show-labels
NAME          STATUS   ROLES    AGE   VERSION   LABELS
k8s-master1   Ready    <none>   24h   v1.20.4   IngressProxy=true,beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,kubernetes.io/arch=amd64,kubernetes.io/hostname=k8s-master1,kubernetes.io/os=linux
k8s-node1     Ready    <none>   23h   v1.20.4   beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,kubernetes.io/arch=amd64,kubernetes.io/hostname=k8s-node1,kubernetes.io/os=linux
k8s-node2     Ready    <none>   23h   v1.20.4   beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,kubernetes.io/arch=amd64,kubernetes.io/hostname=k8s-node2,kubernetes.io/os=linux#节点删除Label标签
kubectl label nodes k8s-master1 IngressProxy-

2.6 Kubernetes 部署 Traefik

使用DaemonSet类型部署,以便于在多服务器间扩展,使用 hostport 方式占用服务器 80、443 端口,方便流量进入

cat >traefik-deploy.yam<<EOF
apiVersion: v1
kind: Service
metadata:name: traefiknamespace: ingress-traefik
spec:ports:- name: webport: 80- name: websecureport: 443- name: adminport: 8080selector:app: traefik
---
apiVersion: apps/v1
kind: DaemonSet
metadata:name: traefik-ingress-controllernamespace: ingress-traefiklabels:app: traefik
spec:selector:matchLabels:app: traefiktemplate:metadata:name: traefiklabels:app: traefikspec:serviceAccountName: traefik-ingress-controllerterminationGracePeriodSeconds: 1containers:- image: traefik:2.2.0name: traefik-ingress-lbports:- name: webcontainerPort: 80hostPort: 80           #hostPort方式,将端口暴露到集群节点- name: websecurecontainerPort: 443hostPort: 443          #hostPort方式,将端口暴露到集群节点- name: admincontainerPort: 8080resources:limits:cpu: 2000mmemory: 1024Mirequests:cpu: 1000mmemory: 1024MisecurityContext:capabilities:drop:- ALLadd:- NET_BIND_SERVICEargs:- --configfile=/config/traefik.yamlvolumeMounts:- mountPath: "/config"name: "config"volumes:- name: configconfigMap:name: traefik-configtolerations:              #设置容忍所有污点,防止节点被设置污点- operator: "Exists"nodeSelector:             #设置node筛选器,在特定label的节点上启动IngressProxy: "true"
EOF#部署 Traefik
kubectl apply -f traefik-deploy.yaml

3.Traefik 路由规则基础配置

配置 HTTP 路由规则 (Traefik Dashboard 为例)
Traefik 应用已经部署完成,但是想让外部访问 Kubernetes 内部服务,还需要配置路由规则,这里开启了 Traefik Dashboard 配置,
所以首先配置 Traefik Dashboard 看板的路由规则,使外部能够访问 Traefik Dashboard。

cat >traefik-dashboard-route.yaml<<EOF
apiVersion: traefik.containo.us/v1alpha1
kind: IngressRoute
metadata:name: traefik-dashboard-routenamespace: ingress-traefik
spec:entryPoints:- webroutes:- match: Host(`traefik.example.cn`)kind: Ruleservices:- name: traefikport: 8080
EOF#部署Traefik Dashboard 路由规则对象
kubectl apply -f traefik-dashboard-route.yaml

windows 修改本地的hosts

C:\Windows\System32\drivers\etc

追加一行:

节点IP   traefik.example.cn

浏览器访问
http://traefik.example.cn/

参考:
https://cloud.tencent.com/developer/article/1806896
https://www.cnblogs.com/heian99/p/14608414.html

部署traefik2.2相关推荐

  1. k8s 1.23 使用 helm3部署traefik2

    traefik详细说明:https://www.qikqiak.com/traefik-book/ 参考: https://mp.weixin.qq.com/s/nMMN7hAJK6SFn1V1Yyx ...

  2. 一文搞懂 Traefik2.1 的使用

    原文链接:一文搞懂 Traefik2.1 的使用 一文搞懂 Traefik2.1 的使用 核心概念 安装 ACME 中间件 灰度发布 流量复制 TCP 简单 TCP 服务 带 TLS 证书的 TCP ...

  3. 我为什么要选择traefik2做网关?

    单体架构 下图简单展示了单体架构的工作流程 单体架构是把所有的模块和功能集中到一起,部署到一台服务器中,这种一把梭的方式,赢了还好,输了就下海干活.如果请求过大,一台机器撑不住,也只能通过添加机器的方 ...

  4. 部署k3s + Rancher

    文章目录 一. 部署k3s 1.1 初始化机器 1.2 安装Docker 1.3 安装K3S-Server(master节点) 1.4 安装K3S-Agent(node节点) 1.5 搭建NFS Se ...

  5. Kubernetes 中 设置pod不部署在同一台节点上

    在k8s中,节点的调度主要由亲和性和污点来进行控制的.   而在亲和性部分由分为了节点亲和性和节点反亲和性.   节点亲和性是指在pod部署时,尽量(软策略)或者必须满足(硬策略)部署在某些节点上. ...

  6. 将jar包部署在docker上,将jar包打成镜像,使用docker部署jar包

    假设你已经准备好以下东西,即可进行服务部署 一台安装好docker的linux服务器(安装docker见安装docker) 准备好的jar包 接下来开始吧! 将jar包上传至服务器(建好文件夹存放以方 ...

  7. jar包升级部署到服务器详细流程,将服务部署在linux中

    假设你已经准备好以下东西,即可进行服务部署 一台服务器(云服务器或虚拟机皆可) 已安装好的jdk 1.8 + 的环境(可自行百度) 打好的jar包(maven打jar包) 1. 在服务器中新建好你的项 ...

  8. jar包部署shell脚本编写,在服务器上部署jar包,在Linux服务器上部署服务,设置编码格式,设置内存管理

    准备步骤: 1.安装java环境,知道java安装目录 2.将jar包拖放或发送至服务器中(目录自定义) 一.编写shell脚本,将以下代码放在shell脚本中,将shell脚本放在jar包同级目录下 ...

  9. 在docker上安装部署tomcat项目 超简单,拿来主义

    在docker中部署tomcat,非常简单,而且省去了手动安装jdk等步骤,只需要将war包复制在容器tomcat实例中的webapps下面即可.以下将详细讲解流程: 在windows中打好包以后用w ...

最新文章

  1. 云计算技术 — 混合云
  2. android实践项目一实现简单的验证码和spinner下拉选项效果
  3. C语言中struct, union, enum 三大复合数据类型
  4. 利用pickle保存模型
  5. 小康陪你学JAVA--------三大循环之Do-while循环
  6. EntityFramework Core 健康检查
  7. C语言 函数递归例题解析
  8. C++实用技巧(一) - λ-calculus(惊愕到手了欧耶,GetBlogPostIds.aspx) - C++博客
  9. 用Docker搭建Laravel和Vue项目的开发环境
  10. 解决虚拟机克隆后eth0不见的问题
  11. oracle起定时任务,每隔1秒执行一次
  12. 【SolidWorks、URDF】在SolidWorks里面插入URDF方法步骤以及无法启动的解决问题
  13. 总结(6)--- python基础知识点小结(细全)
  14. Atitit.attilax的 case list 项目经验 案例列表
  15. 极客时间 MySQL 字段
  16. web前端开发技术实验与实践(第三版)储久良编著 项目6 文本与段落标记的应用
  17. “我去图书馆”公众号代码抢座的实现
  18. Android 消息通知滚动
  19. linux的账号锁定
  20. c语言设计温控系统,基于单片机的智能温控系统的设计与实现

热门文章

  1. VASP输出文件——OUTCAR,OSZICAR
  2. 隐藏windows 登录_如何在Windows 10登录屏幕上隐藏您的个人信息
  3. 串联分压电路mos防反接电路
  4. 记录局域网内金蝶云无法访问服务器故障
  5. 个人所得税java程序怎么编写_java个人所得税代码.doc
  6. 怎么用python实现五子棋 : 第一节,画出五子棋棋盘
  7. c语言烟花生日快乐图片,html5 canvas生日快乐文字烟花背景动画特效代码下载
  8. 昨天的实况以及忽悠姐妹花
  9. 文本编辑程序(第四章 P85)
  10. 防水运动耳机排行榜、防水防汗的运动耳机介绍