Traefik安装和域名配置

简介

Traefik 是一款 open-source 边缘路由器,可让你轻松地发布服务. 它接收来自你的系统请求,并找出负责处理它们的后端服务组件。

traefik 与众不同在于它能够自动发现适合你服务的配置。 当 Traefik 检查你的基础设施时,它会发现相关信息,并发现哪个服务服务于哪个请求。

Traefik 支持多种集群技术,如 Kubernetes,Kubernetes, Docker, Docker Swarm, AWS, Mesos, Marathon,下面为支持列表 ; 并且可以同时处理多个 providers。(它甚至适用于在裸机上运行的传统软件。)

使用 Traefik,无需维护和同步配置文件:所有操作都会自动实时完成(无重启,不用中断服务)。 使用 Traefik,你只需花时间于系统开发和部署新功能,而不是配置和维护其工作状态。

Traefik 是一个边缘路由器,是整个平台的大门,拦截并路由每个传入的请求,当启动 Traefik 时,需要定义entrypoints ,然后,根据连接到这些 entrypoints 的routes路由来分析传入的请求,来查看他们是否与一组rules相匹配,如果匹配,则路由可能会将请求通过一系列middlewares转换过后再转发到你的services上去。

安装

这里用helm安装在kubernetes集群为例,首先你得有一个可用的kubernetes集群并且安装了helm,可参考我之前的文章harbor安装手记 kubeadm高可用集群部署

获取helm chart包

git clone https://github.com/traefik/traefik-helm-chart
cd traefik-helm-chart

创建values配置文件

values.yaml

deployment:
  enabled: true
  kind: Deployment

ingressClass:
  enabled: true
  isDefaultClass: false

ingressRoute:  
  dashboard:  # dashboard后面手动创建
    enabled: false 

# 配置 providers
providers:
  kubernetesCRD:  # 开启 crd provider
    enabled: true
    allowCrossNamespace: true  # 是否允许跨命名空间
    allowExternalNameServices: true  # 是否允许使用ExternalName的服务

  kubernetesIngress:  # 开启ingress provider
    enabled: true
    allowExternalNameServices: true

logs:
  general:
    level: DEBUG
  access:
    enabled: true

ports:
  web:
    port: 8000
    hostPort: 80  # 使用hostport模式

  websecure:
    port: 8443
    hostPort: 443  # 使用hostport模式

  metrics:
    port: 9100
    hostPort: 9101

service:  # host 模式就不需要创建Service
  enabled: false

resources:
  requests:
    cpu: "100m"
    memory: "100Mi"
  limits:
    cpu: "100m"
    memory: "100Mi"

nodeSelector:   # 固定到node1这个边缘节点
  kubernetes.io/hostname: "node1"

我们使用hostport模式将traefik固定到一台node节点作为流量入口,如果是内网环境则选择一台有外网权限的node节点进行固定即可。

安装指令

helm upgrade --install traefik ./traefik -f values.yaml --namespace kube-system

检查安装状态

helm list -n kube-system

NAME    NAMESPACE   REVISION    UPDATED                                 STATUS      CHART           APP VERSION
traefik kube-system 1           2023-03-31 23:48:05.543829595 +0800 CST deployed    traefik-22.0.0  v2.9.9
kubectl get pods -n kube-system|grep traefik
traefik-f68b94cd5-f2wck                    1/1     Running   0               3d11h

安装后的traefik支持web(http)和websecure(https) 入口点,支持Ingress和IngressRoute 方式的crd,其中IngressRoute是traefik自己扩展的,这里用IngressRoute安装dashboard

安装dashboard

创建dashboard.yaml

apiVersion: traefik.containo.us/v1alpha1
kind: IngressRoute
metadata:
  name: traefik-dashboard
  namespace: kube-system
spec:
  entryPoints:
  - web
  routes:
  - match: Host(`traefik.chenjie.info`)  # 指定域名
    kind: Rule
    services:
    - name: api@internal
      kind: TraefikService  # 引用另外的Traefik Service

如果需要https方式则dashboard.yaml为

apiVersion: traefik.containo.us/v1alpha1
kind: IngressRoute
metadata:
  name: traefik-dashboard
  namespace: kube-system
spec:
  entryPoints:
  - websecure
  routes:
  - match: Host(`traefik.chenjie.info`)  # 指定域名
    kind: Rule
    services:
    - name: api@internal
      kind: TraefikService  # 引用另外的Traefik Service
  tls:
    secretName: chenjie-ssl

这里的secret需要自行根据私有证书或者权威证书签发信息进行生成, 以私有证书为例:

openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout tls.key -out tls.crt -subj "/CN=traefik.chenjie.info"

kubectl create secret tls chenjie-ssl -n kube-system  --cert=tls.crt --key=tls.key

因为dashboard本身不带登录认证,建议通过中间件进行验证限制,dashboard.yaml为

apiVersion: traefik.containo.us/v1alpha1
kind: Middleware
metadata:
  name: traefik-dashboard-basicauth  #basic auth 中间件
  namespace: kube-system
spec:
  basicAuth:
    secret: authsecret
---
apiVersion: v1
kind: Secret
metadata:
  name: authsecret   #basic auth 中间件Secret
  namespace: kube-system
type: kubernetes.io/basic-auth
stringData:
  username: admin
  password: admin
---
apiVersion: traefik.containo.us/v1alpha1
kind: IngressRoute
metadata:
  name: traefik-dashboard
  namespace: kube-system
spec:
  entryPoints:
  - websecure  #https
  routes:
  - match: Host(`traefik.chenjie.info`)  # 指定域名
    kind: Rule
    services:
    - name: api@internal
      kind: TraefikService  # 引用另外的Traefik Service
    middlewares:  
    - name: traefik-dashboard-basicauth  #引用basic auth 中间件
  tls:
    secretName: chenjie-ssl 

执行命令

kubectl apply -f dashboard.yaml

安装dashboard

kubectl get ingressroute -n kube-system

NAME                AGE
traefik-dashboard   19m

部署后可通过 /etc/hosts 中添加上域名 traefik.chenjie.info的映射即可访问 Traefik 的 Dashboard 页面

博客案例

以我博客为例,设置chenjie.info 和www.chenjie.info 的http 和https 路由,并且强制跳转http请求到https上来。这里用到redirect的中间件,可参考下面blog.yaml

apiVersion: traefik.containo.us/v1alpha1
kind: IngressRoute
metadata:
  name: chenjieinfo-tls        #https访问
  namespace: wordpress
spec:
  entryPoints:
    - websecure
  routes:
  - match: Host(`chenjie.info`,`www.chenjie.info`)  
    kind: Rule
    services:
    - name: wordpress-deploy
      port: 80
  tls:
    secretName: chenjie-ssl   #tls
---
apiVersion: traefik.containo.us/v1alpha1
kind: Middleware
metadata:
  name: redirect-https
  namespace: wordpress
spec:
  redirectScheme:       # 跳转中间件
    scheme: https
---
apiVersion: traefik.containo.us/v1alpha1
kind: IngressRoute
metadata:
  name: chenjieinfo       #http访问
  namespace: wordpress
spec:
  entryPoints:
    - web
  routes:
  - match: Host(`chenjie.info`,`www.chenjie.info`)  
    kind: Rule
    services:
    - name: wordpress-deploy
      port: 80
    middlewares:  #引用跳转中间件
    - name: redirect-https

上面是一个参考例子,实际使用还需要一个可用的WordPress服务,并且需要预先创建好wordpress命名空间。然后执行

kubectl apply -f blog.yaml

创建路由,创建后可通过dashboard查看访问链路

http

https

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据