960x60
  当前位置:海洋目录网 » 站长资讯 » 站长资讯 » 文章详细 订阅RssFeed

Kubernetes 1.20.5 安装traefik在腾讯云下的实践

来源:本站原创 浏览:176次 时间:2021-05-15

背景

个人使用traefik有差不多1-2年时间,kubernetes ingress controller 代理有很多种方式 例如 ingress-nginx kong istio 等等。个人比较习惯traefik。从19年就开始使用。最早使用traefik 不直接使用腾讯云公有云的slb是因为当时slb不能挂载多个证书,而我kubernetes的自建集群实在不想挂载多个slb.就偷懒用了slb udp绑定运行traefik节点的 80 443端口。证书tls的secret 直接挂载在traefik代理层上面。hsts http跳转https的特性都配置在了traefik代理层上面。应用比较少。qps也没有那么高,这样的简单应用就满足了我的需求了

关于traefik的结缘

最早接触traefik是Google上面看ingress controller 找到的 然后再阳明大佬的博客看到了traefik的实践https://www.qikqiak.com/post/traefik2-ga/,还有超级小豆丁的博客http://www.mydlq.club/article/41 。两位大佬的博客是kubernetes初学者的宝藏博客值得收藏拜读。
顺便吐个糟,用的traefik2.4版本… 抄的豆丁大佬的…http://www.mydlq.club/article/107/哈哈哈

ingress controller对比:

参照https://zhuanlan.zhihu.com/p/109458069。

1. Kubernetes Gateway API

v2.4版本的改变(在 Traefik v2.4 版本中增加了对 Kubernetes Gateway API 的支持)一下部分抄自豆丁大佬与官方文档https://gateway-api.sigs.k8s.io/。

1、Gateway API 是什么

Gateway API是由SIG-NETWORK 社区管理的一个开源项目。它是在Kubernetes中对服务网络建模的资源的集合。这些资源- ,GatewayClass,Gateway,HTTPRoute, TCPRoute,Service等-旨在通过表现力,可扩展和面向角色由很多供应商实现的,并具有广泛的行业支持接口演进Kubernetes服务网络。
_注意:此项目以前被称为“服务API”,直到2021年2月被重命名为“_Gateway API ”。

2、Gateway API 的目标

Gateway API 旨在通过提供可表达的,可扩展的,面向角色的接口来改善服务网络,这些接口已由许多供应商实施并获得了广泛的行业支持。
网关 API 是 API 资源(服务、网关类、网关、HTTPRoute、TCPRoute等)的集合。这些资源共同为各种网络用例建模。

Gateway API 如何根据 Ingress 等当前标准进行改进?

  • 以下设计目标驱动了Gateway API的概念。这些证明了Gateway如何旨在改进Ingress等当前标准。
  • 面向角色-网关由API资源组成,这些API资源对使用和配置Kubernetes服务网络的组织角色进行建模。
  • 便携式-这不是改进,而是应该保持不变。就像Ingress是具有许多实现的通用规范一样 ,Gateway API也被设计为受许多实现支持的可移植规范。
  • 富有表现力-网关API资源支持核心功能,例如基于标头的匹配,流量加权以及其他只能通过自定义批注在Ingress中实现的功能。
  • 可扩展-网关API允许在API的各个层上链接自定义资源。这样就可以在API结构内的适当位置进行精细的自定义。

其他一些值得注意的功能包括:

  • GatewayClasses -GatewayClasses形式化负载平衡实现的类型。这些类使用户可以轻松,明确地了解通过Kubernetes资源模型可以使用的功能。
  • 共享网关和跨命名空间支持-通过允许独立的Route资源绑定到同一网关,它们可以共享负载平衡器和VIP。这允许团队(甚至跨命名空间)在没有直接协调的情况下安全地共享基础结构。
  • 类型化路由和类型化后端-网关API支持类型化路由资源以及不同类型的后端。这使API可以灵活地支持各种协议(例如HTTP和gRPC)和各种后端目标(例如Kubernetes Services,存储桶或函数)。

如果想了解更多内容,可以访问 Kubernetes Gateway API 文档 。

2. traefik on kubernetes实践

部署玩Traefik 应用后,创建外部访问 Kubernetes 内部应用的路由规则,才能从外部访问kubernetes内部应用。Traefik 目前支持三种方式创建路由规则方式,一种是创建 Traefik 自定义 Kubernetes CRD 资源,另一种是创建 Kubernetes Ingress 资源,还有就是 v2.4 版本对 Kubernetes 扩展 API Kubernetes Gateway API 适配的一种方式,创建 GatewayClass、Gateway 与 HTTPRoute 资源
注意:这里 Traefik 是部署在 kube-system namespace 下,如果不想部署到配置的 namespace,需要修改下面部署文件中的 namespace 参数。当然了也可以新建一个单独的namespace去部署traefik

1. 创建CRD

参照https://doc.traefik.io/traefik/reference/dynamic-configuration/kubernetes-crd/

traefik-crd.yaml

cat <traefik-crd.yaml apiVersion: apiextensions.k8s.io/v1beta1kind: CustomResourceDefinitionmetadata:  name: ingre***outes.traefik.containo.usspec:  group: traefik.containo.us  version: v1alpha1  names:    kind: Ingre***oute    plural: ingre***outes    singular: ingre***oute  scope: Namespaced---apiVersion: apiextensions.k8s.io/v1beta1kind: CustomResourceDefinitionmetadata:  name: middlewares.traefik.containo.usspec:  group: traefik.containo.us  version: v1alpha1  names:    kind: Middleware    plural: middlewares    singular: middleware  scope: Namespaced---apiVersion: apiextensions.k8s.io/v1beta1kind: CustomResourceDefinitionmetadata:  name: ingre***outetcps.traefik.containo.usspec:  group: traefik.containo.us  version: v1alpha1  names:    kind: Ingre***outeTCP    plural: ingre***outetcps    singular: ingre***outetcp  scope: Namespaced---apiVersion: apiextensions.k8s.io/v1beta1kind: CustomResourceDefinitionmetadata:  name: ingre***outeudps.traefik.containo.usspec:  group: traefik.containo.us  version: v1alpha1  names:    kind: Ingre***outeUDP    plural: ingre***outeudps    singular: ingre***outeudp  scope: Namespaced---apiVersion: apiextensions.k8s.io/v1beta1kind: CustomResourceDefinitionmetadata:  name: tlsoptions.traefik.containo.usspec:  group: traefik.containo.us  version: v1alpha1  names:    kind: TLSOption    plural: tlsoptions    singular: tlsoption  scope: Namespaced---apiVersion: apiextensions.k8s.io/v1beta1kind: CustomResourceDefinitionmetadata:  name: tlsstores.traefik.containo.usspec:  group: traefik.containo.us  version: v1alpha1  names:    kind: TLSStore    plural: tlsstores    singular: tlsstore  scope: Namespaced---apiVersion: apiextensions.k8s.io/v1beta1kind: CustomResourceDefinitionmetadata:  name: traefikservices.traefik.containo.usspec:  group: traefik.containo.us  version: v1alpha1  names:    kind: TraefikService    plural: traefikservices    singular: traefikservice  scope: Namespaced---apiVersion: apiextensions.k8s.io/v1beta1kind: CustomResourceDefinitionmetadata:  name: serverstransports.traefik.containo.usspec:  group: traefik.containo.us  version: v1alpha1  names:    kind: ServersTransport    plural: serverstransports    singular: serverstransport  scope: NamespacedEOFkubectl apply -f traefik-crd.yaml

2. 创建RBAC权限
cat <traefik-rbac.yamlkind: ClusterRoleapiVersion: rbac.authorization.k8s.io/v1beta1metadata:  name: traefik-ingress-controller  namespace: kube-systemrules:  - apiGroups:      - ""    resources:      - services      - endpoints      - secrets    verbs:      - get      - list      - watch  - apiGroups:      - extensions      - networking.k8s.io    resources:      - ingresses      - ingressclasses    verbs:      - get      - list      - watch  - apiGroups:      - extensions    resources:      - ingresses/status    verbs:      - update  - apiGroups:      - traefik.containo.us    resources:      - middlewares      - ingre***outes      - traefikservices      - ingre***outetcps      - ingre***outeudps      - tlsoptions      - tlsstores      - serverstransports    verbs:      - get      - list      - watch---kind: ClusterRoleBindingapiVersion: rbac.authorization.k8s.io/v1beta1metadata:  name: traefik-ingress-controllerroleRef:  apiGroup: rbac.authorization.k8s.io  kind: ClusterRole  name: traefik-ingress-controllersubjects:  - kind: ServiceAccount    name: traefik-ingress-controller    namespace: kube-systemEOF kubectl apply -f traefik-rbac.yaml

3. 创建 Traefik 配置文件

#号后为注释,跟2.X前几个版本一样。增加了kubernetesIngress kubernetesGateway两种路由方式,过去只部署了CRD的方式。

cat <traefik-config.yamlkind: ConfigMapapiVersion: v1metadata:  name: traefik-config  namespace: kube-systemdata:  traefik.yaml: |-    ping: ""                    ## 启用 Ping    serversTransport:      insecureSkipVerify: true  ## Traefik 忽略验证代理服务的 TLS 证书    api:      insecure: true            ## 允许 HTTP 方式访问 API      dashboard: true           ## 启用 Dashboard      debug: false              ## 启用 Debug 调试模式    metrics:      prometheus: ""            ## 配置 Prometheus 监控指标数据,并使用默认配置    entryPoints:      web:        address: ":80"          ## 配置 80 端口,并设置入口名称为 web      websecure:        address: ":443"         ## 配置 443 端口,并设置入口名称为 websecure    providers:      kubernetesCRD: ""         ## 启用 Kubernetes CRD 方式来配置路由规则      kubernetesIngress: ""     ## 启用 Kubernetes Ingress 方式来配置路由规则      kubernetesGateway: ""     ## 启用 Kubernetes Gateway API    experimental:                     kubernetesGateway: true   ## 允许使用 Kubernetes Gateway API    log:      filePath: ""              ## 设置调试日志文件存储路径,如果为空则输出到控制台      level: error              ## 设置调试日志级别      format: json              ## 设置调试日志格式    accessLog:      filePath: ""              ## 设置访问日志文件存储路径,如果为空则输出到控制台      format: json              ## 设置访问调试日志格式      bufferingSize: 0          ## 设置访问日志缓存行数      filters:        #statusCodes: ["200"]   ## 设置只保留指定状态码范围内的访问日志        retryAttempts: true     ## 设置代理访问重试失败时,保留访问日志        minDuration: 20         ## 设置保留请求时间超过指定持续时间的访问日志      fields:                   ## 设置访问日志中的字段是否保留(keep 保留、drop 不保留)        defaultMode: keep       ## 设置默认保留访问日志字段        names:                  ## 针对访问日志特别字段特别配置保留模式          ClientUsername: drop          headers:                ## 设置 Header 中字段是否保留          defaultMode: keep     ## 设置默认保留 Header 中字段          names:                ## 针对 Header 中特别字段特别配置保留模式            User-Agent: redact            Authorization: drop            Content-Type: keep    #tracing:                     ## 链路追踪配置,支持 zipkin、datadog、jaeger、instana、haystack 等     #  serviceName:               ## 设置服务名称(在链路追踪端收集后显示的服务名)    #  zipkin:                    ## zipkin配置    #    sameSpan: true           ## 是否启用 Zipkin SameSpan RPC 类型追踪方式    #    id128Bit: true           ## 是否启用 Zipkin 128bit 的跟踪 ID    #    sampleRate: 0.1          ## 设置链路日志采样率(可以配置0.0到1.0之间的值)    #    httpEndpoint: http://localhost:9411/api/v2/spans     ## 配置 Zipkin Server 端点EOFkubectl apply -f traefik-config.yaml

4. 设置节点label标签

Traefix 采用 DaemonSet方式构建,在需要安装的节点上面打上标签,这里在三个work节点都安装上了默认:

kubectl label nodes {sh-work-01,sh-work-02,sh-work-02} IngressProxy=truekubectl get nodes --show-labels



注意:如果想删除标签,可以使用 **kubectl label nodes k8s-node-03 IngressProxy- **命令。哈哈哈偶尔需要去掉标签,不调度。

5、安装 Kubernetes Gateway CRD 资源

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

kubectl apply -k "github.com/kubernetes-sigs/service-apis/config/crd?ref=v0.2.0"

不过由于github网络问题,基本无法安装的。我是直接把github上包下载到本地采用本地安装的方式安装
进入

进入base目录直接全部安装:

kubectl  apply  -f .

6. Kubernetes 部署 Traefik

其实我就可以忽略443了…因为我想在slb 哦 对也叫clb.直接做限制。对外只保留80端口。

cat <traefik-deploy.yamlapiVersion: v1kind: Servicemetadata:  name: traefik  namespace: kube-systemspec:  ports:    - name: web      port: 80    - name: websecure      port: 443    - name: admin      port: 8080  selector:    app: traefik---apiVersion: apps/v1kind: DaemonSetmetadata:  namespace: kube-system  name: traefik-ingress-controller  labels:    app: traefikspec:  selector:    matchLabels:      app: traefik  template:    metadata:      name: traefik      labels:        app: traefik    spec:      serviceAccountName: traefik-ingress-controller      terminationGracePeriodSeconds: 1      containers:        - image: ccr.ccs.tencentyun.com/XXXX/traefik:v2.4.3           name: traefik-ingress-lb          ports:            - name: web              containerPort: 80              hostPort: 80                 - name: websecure              containerPort: 443              hostPort: 443                    - name: admin              containerPort: 8080            resources:            limits:              cpu: 2000m              memory: 1024Mi            requests:              cpu: 1000m              memory: 1024Mi          securityContext:            capabilities:              drop:                - ALL              add:                - NET_BIND_SERVICE          args:            - --configfile=/config/traefik.yaml          volumeMounts:            - mountPath: "/config"              name: "config"          readinessProbe:            httpGet:              path: /ping              port: 8080            failureThreshold: 3            initialDelaySeconds: 10            periodSeconds: 10            successThreshold: 1            timeoutSeconds: 5          livenessProbe:            httpGet:              path: /ping              port: 8080            failureThreshold: 3            initialDelaySeconds: 10            periodSeconds: 10            successThreshold: 1            timeoutSeconds: 5          volumes:        - name: config          configMap:            name: traefik-config       tolerations:              ## 设置容忍所有污点,防止节点被设置污点        - operator: "Exists"      nodeSelector:             ## 设置node筛选器,在特定label的节点上启动        IngressProxy: "trueEOFkubectl apply -f traefik-deploy.yaml

kubectl get pods -n kube-system 验证

3. 配置路由规则,与腾讯云clb整合1. slb 绑定traefik http端口

关于腾讯云负载均衡 slb or clb可以参照文档https://cloud.tencent.com/document/product/214了解。过去使用slb用的tcp代理方式有一下原因:

  1. 过去的腾讯云slb不支持一个负载均衡挂载多个证书,个人不想启用多个slb绑定。
  2. 在slb上面配置域名比较麻烦…没有再traefik配置文件里面写对我个人来说方便。

那我现在怎么就用slb http https代理方式了呢?

  1. 当然了 首先是可以挂载多个证书了
  2. 我在slb上面直接绑定了泛域名,后面的具体域名解析还是在我的traefik配置。但是我不用绑定证书了…
  3. http https的方式我可以把日志直接写入他的cos对象存储和腾讯云自己的日志服务(感觉也是一个kibana)可以直接分析日志啊…


综上所述,来实现一下我个人的过程与思路

  1. 创建slb .slb绑定 work节点 80端口(这里我用的是负载均衡型,没有用传统型),没有问题吧?老老实实ipv4了没有启用ipv6这个就看个人具体需求吧。



使用了极度不要脸的方式 泛域名…因为我常用的也就这两个域名,具体的解析都还是我自己在traefik配置了。

关于证书 我这里可是扔好了 两个主二级域名,泛域名证书直接扔上了…

四个后面配置我都绑定了80交给traefik处理吧。权重我都设置的一样的,有其他需求的可以根据自己需要设置呢。

2. 配置路由规则

Traefik 应用已经部署完成,并且和slb负载均衡集成也大致完成了。但是想让外部访问 Kubernetes 内部服务,还需要配置路由规则,上面部署 Traefik 时开启了 traefik dashboard,这是 Traefik 提供的视图看板,所以,首先配置基于 http 的 Traefik Dashboard 路由规则,使外部能够访问 Traefik Dashboard。这里分别使用 CRD、Ingress 和 Kubernetes Gateway API 三种方式进行演示,过去版本常用的是CRD的方式。https的方式我就忽略了交给slb负载均衡层了。

1. CRD方式

过去我个人部署应用都是crd方式,自己老把这种方式叫做ingre***oute方式。

cat <traefik-dashboard-route-http.yamlapiVersion: traefik.containo.us/v1alpha1kind: Ingre***outemetadata:  name: traefik-dashboard-route  namespaces: kube-systemspec:  entryPoints:  - web  routes:  - match: Host(\`traefik.saynaihe.com\`)    kind: Rule    services:      - name: traefik        port: 8080EOFkubectl apply -f traefik-dashboard-route-http.yaml


关于 match: Host(`traefik.saynaihe.com`) 加转义符应该都能看明白了,不加转义符会是这样的

我貌似又忘了加namespace 截图中,实际我可是加上了…老容易往事。哎,我不是两个泛域名吗 ? 特意做了两个ingressoute 做下测试

然后绑定本地hosts绑定host

C:\Windows\System32\drivers\etc


遮挡的有点多…但是 这就是两个都路由过来了啊

关于https可以忽略了直接挂载在slb层了啊。然后http 强制跳转 https也可以在slb层上面配置了

流氓玩法强跳…测试也是成功的…

2. Ingress方式

ingress的方式基本就是https://kubernetes.io/zh/docs/concepts/services-networking/ingress/ kubernetes 常见的ingress方式吧?
继续拿dashboard做演示

cat <traefik-dashboard-ingress.yamlapiVersion: networking.k8s.io/v1kind: Ingressmetadata:  name: traefik-dashboard-ingress  namespace: kube-system  annotations:    kubernetes.io/ingress.class: traefik      traefik.ingress.kubernetes.io/router.entrypoints: webspec:  rules:  - host: traefik1.saynaihe.com    http:      paths:      - pathType: Prefix        path: /        backend:          service:            name: traefik            port:              number: 8080EOFkubectl apply -f traefik-dashboard-ingress.yaml


由于端口强制跳转了设置,直接https了哈哈哈验证完成

3、方式三:使用 Kubernetes Gateway API

关于Kubernetes Gateway API 可以通过CRD 方式创建路由规则
CRD 自定义资源强调一下
详情可以参考:https://doc.traefik.io/traefik/v2.4/routing/providers/kubernetes-gateway/

  • GatewayClass: GatewayClass 是基础结构提供程序定义的群集范围的资源。此资源表示可以实例化的网关类。一般该资源是用于支持多个基础设施提供商用途的,这里我们只部署一个即可。
  • Gateway: Gateway 与基础设施配置的生命周期是 1:1。当用户创建网关时,GatewayClass 控制器会提供或配置一些负载平衡基础设施。
  • HTTPRoute: HTTPRoute 是一种网关 API 类型,用于指定 HTTP 请求从网关侦听器到 API 对象(即服务)的路由行为。

1. 创建 GatewayClass

****#创建 GatewayClass 资源 kubernetes-gatewayclass.yaml 文件
**参照: **https://doc.traefik.io/traefik/v2.4/routing/providers/kubernetes-gateway/#kind-gatewayclass

cat <kubernetes-gatewayclass.yamlkind: GatewayClassapiVersion: networking.x-k8s.io/v1alpha1metadata:  name: traefikspec:  # Controller is a domain/path string that indicates  # the controller that is managing Gateways of this class.  controller: traefik.io/gateway-controllerEOFkubectl apply -f kubernetes-gatewayclass.yaml

2 配置 HTTP 路由规则 (Traefik Dashboard 为例)

创建 Gateway 资源 http-gateway.yaml 文件

cat <http-gateway.yamlapiVersion: networking.x-k8s.io/v1alpha1kind: Gatewaymetadata:   name: http-gateway  namespace: kube-systemspec:   gatewayClassName: traefik  listeners:     - protocol: HTTP      port: 80      routes:         kind: HTTPRoute        namespaces:          from: All        selector:          matchLabels:            app: traefikEOFkubectl apply -f http-gateway.yaml

创建 HTTPRoute 资源 traefik-httproute.yaml 文件

cat <traefik-httproute.yamlapiVersion: networking.x-k8s.io/v1alpha1kind: HTTPRoutemetadata:  name: traefik-dashboard-httproute  namespace: kube-system  labels:    app: traefikspec:  hostnames:    - "traefi2.saynaihe.com"  rules:    - matches:        - path:            type: Prefix            value: /      forwardTo:        - serviceName: traefik          port: 8080          weight: 1EOFkubectl apply -f traefik-httproute.yaml

这里就出问题了…,无法访问,仔细看了下文档https://doc.traefik.io/traefik/providers/kubernetes-gateway/

全部删除一次重新部署吧将2.5中版本变成v0.1.0就好了…图就不上了基本步骤是一样的。

注: 都没有做域名解析,本地绑定了host。 saynaihe.com域名只是做演示。没有实际搞…因为我没有做备案。现在不备案的基本绑上就被扫描到封了。用正式域名做的试验。另外养成的习惯用CRD习惯了…部署应用基本个人都用了CRD的方式 —ingre***oute。ingress的方式是更适合从ingress-nginx迁移到traefik使用了。至于Kubernetes Gateway API个人还是图个新鲜,没有整明白。v0.2.0不能用…就演示下了.

  推荐站点

  • At-lib分类目录At-lib分类目录

    At-lib网站分类目录汇集全国所有高质量网站,是中国权威的中文网站分类目录,给站长提供免费网址目录提交收录和推荐最新最全的优秀网站大全是名站导航之家

    www.at-lib.cn
  • 中国链接目录中国链接目录

    中国链接目录简称链接目录,是收录优秀网站和淘宝网店的网站分类目录,为您提供优质的网址导航服务,也是网店进行收录推广,站长免费推广网站、加快百度收录、增加友情链接和网站外链的平台。

    www.cnlink.org
  • 35目录网35目录网

    35目录免费收录各类优秀网站,全力打造互动式网站目录,提供网站分类目录检索,关键字搜索功能。欢迎您向35目录推荐、提交优秀网站。

    www.35mulu.com
  • 就要爱网站目录就要爱网站目录

    就要爱网站目录,按主题和类别列出网站。所有提交的网站都经过人工审查,确保质量和无垃圾邮件的结果。

    www.912219.com
  • 伍佰目录伍佰目录

    伍佰网站目录免费收录各类优秀网站,全力打造互动式网站目录,提供网站分类目录检索,关键字搜索功能。欢迎您向伍佰目录推荐、提交优秀网站。

    www.wbwb.net