traefik k3s配置
traefik 是什么
他是一个专门为了云设计的流量代理软件,还是开源免费的,类似nginx
traefik 如何配置
traefik 的配置有2种方式
- 静态配置:定义 entrypoints和 providers
- 动态配置:关于系统如何处理请求的所有配置,他是热加载的。可以保证配置被改的时候,不换有任何请求被打断和丢失连接。
详细的配置方法官方文档有不在这里赘述了。这里只说一个关键的。
静态配置需要在traefik 启动之前设置好,如果更改traefik的静态配置就必须重新部署他。而动态配置可以交给类似k8s这样的provider 由他们来设置。就是我们通过yaml 设置k8s,k8s 再去自动化配置traefik 的动态配置,从而在不停止traefik 的情况下更新traefik 的某些配置
【参考】
https://doc.traefik.io/traefik/getting-started/configuration-overview/
k8s 配置
对于k8s 由2种配置traefik的方法
- ingressRpute: 最新的方法,用老的ingress 要写很多annotations,所以官方使用 Kubernetes API. 的扩展语法 Custom Resource Definition (CRD) 定义了新的类型。听官方语气推荐的是这个。不建议用老的方法, 类似下面方法
# As a Kubernetes Traefik IngressRoute
---
apiVersion: traefik.io/v1alpha1
kind: MiddlewareTCP
metadata:
name: foo-ip-allowlist
spec:
ipAllowList:
sourcerange:
- 127.0.0.1/32
- 192.168.1.81
---
apiVersion: traefik.io/v1alpha1
kind: IngressRouteTCP
metadata:
name: ingressroute
spec:
# more fields...
routes:
# more fields...
middlewares:
- name: foo-ip-allowlist
- ingress
- :老方法,完全符合 Kubernetes Ingress controller 标准的一个控制器。类似下面语法
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: ingress-service
namespace: airflow # 确保命名空间与 Service 一致
annotations:
spec:
rules:
- http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: airflow-webserver # 确保这里替换为 Airflow 的 Service 名称
port:
number: 8080 # 确保这是 Airflow 服务监听的端口
【参考】
https://doc.traefik.io/traefik/providers/kubernetes-crd/
如何查看自己的k8s 使用的是什么ingress
# 查看所有ingress 的命令由那些
wen@ubuntuserver:~/kubeyml$ kubectl api-resources | grep ingress
ingressclasses networking.k8s.io/v1 false IngressClass
ingresses ing networking.k8s.io/v1 true Ingress
ingressroutes traefik.containo.us/v1alpha1 true IngressRoute
ingressroutetcps traefik.containo.us/v1alpha1 true IngressRouteTCP
ingressrouteudps traefik.containo.us/v1alpha1 true IngressRouteUDP
ingressroutes traefik.io/v1alpha1 true IngressRoute
ingressroutetcps traefik.io/v1alpha1 true IngressRouteTCP
ingressrouteudps traefik.io/v1alpha1 true IngressRouteUDP
# 查看现在用的是什么ingress
wen@ubuntuserver:~/kubeyml$ kubectl get ingressclass -A
NAME CONTROLLER PARAMETERS AGE
traefik traefik.io/ingress-controller <none> 9d
k3s 中的 自定义traefik 的方法
k3s 自带的ingress 就是traefik ,通过helm 安装的
# 搜索远程愿那些traefik chart
wen@ubuntuserver:~/kubeyml$ helm search repo traefik
WARNING: Kubernetes configuration file is group-readable. This is insecure. Location: /etc/rancher/k3s/k3s.yaml
WARNING: Kubernetes configuration file is world-readable. This is insecure. Location: /etc/rancher/k3s/k3s.yaml
NAME CHART VERSION APP VERSION DESCRIPTION
stable/traefik 1.87.7 1.7.26 DEPRECATED - A Traefik based Kubernetes ingress...
# 查看仓库url
helm repo list
# 查看以及安装的chart 详细信息
helm get all traefik -n kube-system
#查看远程chart 详细信息
helm show all stable/traefik -n kube-system
官方推荐的自定义方法可以参考官方的github readme中的Philosophy部分
k3s四种修改chart信息的方法
我们已自带的trafik 为例
- 修改本地的chart文件
# 查看traefik 的安装信息可以找到原始chart位置
helm get all traefik -n kube-system
# 你会发先他不是远程拉起的。是从本地的chart 安装下面是chart本地的位置
# /var/lib/rancher/k3s/server/static/charts/traefik-25.0.3+up25.0.0.tgz
-
创建一个一模一样的Deployment 文件进行覆盖,可以通过kubectl 输出已有的Deployment 文件。在修改apply
-
通过helm values.yaml 来配置。 这也是官方推荐的做法
#查看value 文件
helm get values traefik -n kube-system
- 使用一个 HelmChartConfig 来添加新的配置 官方文档,这个是k3s推荐的做法。
chart deployment源代码
traefil的values.yaml
traefik所有的cli参数
给k3s的traefik 添加新的entrypoint
使用k3s的推荐做法,添加一个airflow 的entrypoint
apiVersion: helm.cattle.io/v1
kind: HelmChartConfig
metadata:
name: traefik
namespace: kube-system
spec:
valuesContent: |-
#上面是追加的意思。下面同样也可以用在value.ymal中
#官方的模板代码读下面的配置自动给 traefik 发送cli参数,也会自动创建service(本来就是拿来创建服务的)
ports:
airflow:
expose: true
exposedPort: 8080
port: 8080
protocol: TCP
# 这个没用官方不解析
entryPoints:
airflow:
address: ":8080"
#这个是官方values中给的一种方法。可以自己指定traefik 的cli参数
deployment:
additionalArgs:
- "--entrypoints.airflow.address=:8080/tcp"
【参考】
https://doc.traefik.io/traefik/