Traefik Ingress
约 2 分钟阅读
- Traefik Ingress链接doc.traefik.io/traefik/providers/kubernetes-ingressTraefik 的 K8S 分为 CRD 方式和标准的 IngressController · CRD 支持更多功能 - Helm 安装 · Traefik 支持非常多的功能 - ACME, SNI, Dashboard, Tracing, Metrics笔记:Traefik Ingress
- Traefik 的 K8S 分为 CRD 方式和标准的 IngressController
- CRD 支持更多功能 - Helm 安装
- Traefik 支持非常多的功能 - ACME, SNI, Dashboard, Tracing, Metrics
- traefik 内置 acme, 但有不少问题 - 官方推荐使用 cert-manager
- 官方 issues 排前面有好几个关于证书的问题
- 只有 repilca 为 1 才支持 acme - 开源版不支持集群
- #5426GitHub Issuetraefik/traefik#5426 官方表明 社区版 不考虑集群
- Middleware 通过 CRD 引用 - 使用相对麻烦
- 使用 Ingress 方式很多功能得使用 annotation 非常不方便
- 但直接使用 IngressRoute 会导致 Vendor Lockin
# 转发 9000
kubectl port-forward $(kubectl get pods --selector "app.kubernetes.io/name=traefik" -n traefik --output=name) 9000:9000 -n traefikCRD
-
示例资源配置GitHub 文件containous/traefik/pkg/provider/kubernetes/crd/fixtures
-
启动参数
--global.checknewversion--global.sendanonymoususage--entryPoints.traefik.address=:9000--entryPoints.web.address=:8000--entryPoints.websecure.address=:8443--api.dashboard=true--ping=true--providers.kubernetescrd--providers.kubernetesingress
helm repo add traefik https://containous.github.io/traefik-helm-chart
helm repo update
helm install traefik traefik/traefik
# 可安装在独立命名空间
kubectl create ns traefik
helm install --namespace=traefik \
traefik traefik/traefik
# 转发 dashboard 到本地 9000
# 然后访问 http://localhost:9000/dashboard/
kubectl port-forward -n traefik $(kubectl get pods -n traefik --selector "app.kubernetes.io/name=traefik" --output=name) 9000:9000
# 可以配置一个 Ingress 然后即可通过域名访问
cat <<YAML
apiVersion: traefik.containo.us/v1alpha1
kind: IngressRoute
metadata:
name: traefik-dashboard
namespace: traefik
spec:
entryPoints:
- web
- traefik
routes:
- match: Host(`traefik.localhost`) && (PathPrefix(`/dashboard`) || PathPrefix(`/api`))
kind: Rule
services:
- name: api@internal
kind: TraefikService
YAMLapiVersion: traefik.containo.us/v1alpha1
kind: IngressRoute
metadata:
name: foo
namespace: bar
spec:
# 入口
entryPoints:
- foo
# 路由配置
routes:
- kind: Rule
# 路由匹配规则
match: Host(`test.example.com`)
# 匹配优先级
priority: 10
# 引用中间件
middlewares:
- name: middleware1
namespace: default
# 后端服务
services:
- kind: Service
name: foo
namespace: default
# 透传头信息
passHostHeader: true
port: 80
responseForwarding:
flushInterval: 1ms
scheme: https
# 粘性配置
sticky:
cookie:
httpOnly: true
name: cookie
secure: true
sameSite: none
# 负载策略
strategy: RoundRobin
weight: 10
# TLS
tls:
# 密钥信息
secretName: supersecret
# TLSOption
options:
name: opt
namespace: default
certResolver: foo # CertResolver
domains: # TLS 域名
- main: example.net
sans:
- a.example.net
- b.example.netIngress
- 示例资源配置GitHub 文件containous/traefik/pkg/provider/kubernetes/ingress/fixtures
- Kubernetes Ingress Controller
# 全局默认
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
name: cheese
spec:
backend:
serviceName: stilton
servicePort: 80
---
apiVersion: v1
kind: Service
metadata:
name: whoami
annotations:
# 修改 schema: http h2c https
traefik.ingress.kubernetes.io/service.serversscheme: https
# 透传 头
traefik.ingress.kubernetes.io/service.passhostheader: 'true'
# 粘性配置
traefik.ingress.kubernetes.io/service.sticky: 'true'
traefik.ingress.kubernetes.io/service.sticky.cookie.name: foobar
traefik.ingress.kubernetes.io/service.sticky.cookie.secure: 'true'
traefik.ingress.kubernetes.io/service.sticky.cookie.samesite: 'none'
traefik.ingress.kubernetes.io/service.sticky.cookie.httponly: 'true'
spec:
type: LoadBalancer
selector:
app: whoami
ports:
- protocol: TCP
port: 80
name: web
targetPort: 80
---
kind: Ingress
apiVersion: networking.k8s.io/v1beta1
metadata:
name: myingress
annotations:
# 终端
traefik.ingress.kubernetes.io/router.entrypoints: web,websecure
# 中间件
traefik.ingress.kubernetes.io/router.middlewares: <namespace>-<name>@kubernetescrd,cb@file
# 优先级
traefik.ingress.kubernetes.io/router.priority: '42'
# 路径匹配方式 Path, PathPrefix
traefik.ingress.kubernetes.io/router.pathmatcher: PathPrefix
# 是否 TLS
traefik.ingress.kubernetes.io/router.tls: 'true'
# 解析 TLS 方式
traefik.ingress.kubernetes.io/router.tls.certresolver: myresolver
# TLS 的 SNI 域名
traefik.ingress.kubernetes.io/router.tls.domains.0.main: example.org
traefik.ingress.kubernetes.io/router.tls.domains.0.sans: test.example.org,dev.example.org
traefik.ingress.kubernetes.io/router.tls.options: foobar
spec:
# 证书
tls:
- secretName: supersecret
rules:
- host: example.com
http:
paths:
- path: /bar
backend:
serviceName: whoami
servicePort: 80Cert Manager
FAQ
Cannot create service: subset not found
TBD
docs.traefik.io/routing/providers/kubernetes-ingress rancher/k3s#1141GitHub Issuerancher/k3s#1141 containous/traefik-helm-chartGitHubcontainous/traefik-helm-chart docs.traefik.io/getting-started/install-traefik
kubectl port-forward $(kubectl get pods --selector "app.kubernetes.io/name=traefik" --output=name) 9000:9000ClusterRoleBinding
error syncing 'traefik/traefik' handler svccontroller: Operation cannot be fulfilled on "svccontroller": delaying object set, requeuing
INOTIFY_USR
关联信息
反向链接、本文链接的其他页面和外部资料。
反向链接
- K3S vs K0S故事 · traefik
| vs. | k0s | k3s | · | since | 2020-06 | 2019-03 | · | by | Mirants | Rancher/SUSE | · | Governance | Mirants | CNCF | · | Github | [k0sproject/k0s] | [k3s-io/k3s] |
参考资料
GitHub6 条
- containous/traefik-helm-chartgithub.com/containous/traefik-helm-chart
- containous/traefik/pkg/provider/kubernetes/crd/fixturesgithub.com/containous/traefik/tree/v2.2/pkg/provider/kubernetes/crd/fixtures
- containous/traefik/pkg/provider/kubernetes/ingress/fixturesgithub.com/containous/traefik/tree/v2.2/pkg/provider/kubernetes/ingress/fixtures
- mmatur/traefik-cert-managergithub.com/mmatur/traefik-cert-manager
- rancher/k3s#1141github.com/rancher/k3s/issues/1141
- traefik/traefik#5426github.com/traefik/traefik/issues/5426
其他外链3 条
- docs.traefik.io/routing/providers/kubernetes-ingressdocs.traefik.io/routing/providers/kubernetes-ingress
- doc.traefik.io/traefik/providers/kubernetes-ingressdoc.traefik.io/traefik/providers/kubernetes-ingress
- docs.traefik.io/getting-started/install-traefikdocs.traefik.io/getting-started/install-traefik