我仍在学习 kubernetes,并且偶然发现了对象“Ingress”和“IngressRoute”。这两个对象有什么不同?IngressRoute 是否取代了“旧”的 Ingress?我正在使用 Traefik 2.1 运行 Kubernetes Cluster V1.17。我的 IngressRoute 工作正常,但我也找到了解释如何定义入口的博客。
我在 Kubernetes 上运行 Traefik,并使用以下配置创建了一个 Ingress:
---
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: whitelist-ingress
annotations:
kubernetes.io/ingress.class: traefik
traefik.frontend.rule.type: PathPrefix
traefik.ingress.kubernetes.io/whitelist-source-range: "10.10.10.10/32, 10.10.2.10/23"
ingress.kubernetes.io/whitelist-x-forwarded-for: "true"
traefik.ingress.kubernetes.io/preserve-host: "true"
spec:
rules:
- host:
http:
paths:
- path: /endpoint
backend:
serviceName: endpoint-service
servicePort: endpoint-port
---
Run Code Online (Sandbox Code Playgroud)
当我在上述端点上执行 POST 时,Traefik 记录传入 IP 为 172.16.0.1,因此未触发我的白名单。做一个 ifconfig 我看到 IP 属于 Docker
docker0: flags=4099<UP,BROADCAST,MULTICAST> mtu 1500
inet 172.26.0.1 netmask 255.255.0.0 broadcast 172.26.255.255
Run Code Online (Sandbox Code Playgroud)
如何保留原始 IP 而不是 docker IP?
编辑
Traefik 作为 LoadBalancer 公开,端口是 443 通过 SSL
这是它的yml配置
---
kind: Service
apiVersion: …Run Code Online (Sandbox Code Playgroud) 我正在使用 k3s 的默认安装(版本 v1.17.0+k3s.1)并验证它在我的 Raspberry Pi 集群上正常工作。
使用推荐的说明(https://kubernetes.io/docs/tasks/access-application-cluster/web-ui-dashboard/)安装 kubernetes-dashboard后,我确认这是有效的,在我使用 k3s 将它暴露在集群之外之后基于 traefik 的负载均衡器。
但是,当我尝试使用 traefik 入口控制器公开它时,我无法连接到 kubernetes 仪表板,浏览器显示 HTTP 500 错误,即内部服务器错误。下面是我的入口 yaml 和 kubernetes-dashboard pod 日志,显示了 TLS 证书错误。我相信证书错误是由于 traefik 不知道(和信任)kubernetes 仪表板使用的 TLS 证书。
一种。k8s-dashboard-Ingress
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
labels:
k8s-app: kubernetes-dashboard
name: kubernetes-dashboard
namespace: kubernetes-dashboard
annotations:
kubernetes.io/ingress.class: traefik
traefik.ingress.kubernetes.io/ssl-redirect: "true"
spec:
rules:
- host: k8s-services
http:
paths:
- path: /k8s-dashboard
backend:
serviceName: kubernetes-dashboard
servicePort: 443
Run Code Online (Sandbox Code Playgroud)
笔记。域“k8s-services”域在我的 pi 集群机器和浏览计算机主机文件中定义。
湾 Kubernetes 仪表板 pod 日志
...
2020/01/18 06:04:19 Auto-generating …Run Code Online (Sandbox Code Playgroud) 我正在尝试使用https://docs.traefik.io/routing/providers/kubernetes-crd/提供的配置设置 traefik 入口路由
我可以看到 traefik 已启动并正在运行,也可以看到仪表板。但是我在仪表板上看不到 whoami 服务,也无法通过 url 访问它。
文件
# All resources definition must be declared
apiVersion: apiextensions.k8s.io/v1beta1
kind: CustomResourceDefinition
metadata:
name: ingressroutes.traefik.containo.us
spec:
group: traefik.containo.us
version: v1alpha1
names:
kind: IngressRoute
plural: ingressroutes
singular: ingressroute
scope: Namespaced
---
apiVersion: apiextensions.k8s.io/v1beta1
kind: CustomResourceDefinition
metadata:
name: middlewares.traefik.containo.us
spec:
group: traefik.containo.us
version: v1alpha1
names:
kind: Middleware
plural: middlewares
singular: middleware
scope: Namespaced
---
apiVersion: apiextensions.k8s.io/v1beta1
kind: CustomResourceDefinition
metadata:
name: ingressroutetcps.traefik.containo.us
spec:
group: traefik.containo.us
version: v1alpha1
names:
kind: IngressRouteTCP
plural: …Run Code Online (Sandbox Code Playgroud) 更新: ATM 这不能通过 traefik 实现。我有一个问题:https : //github.com/containous/traefik/issues/4228
我想向cache-control具有Content/Type application/json和 的文件添加标题image/png。
ATM 目前前进的方式是使用自定义响应头。
kind: Ingress
metadata:
annotations:
ingress.kubernetes.io/custom-response-headers: Cache-Control: private || Cache-Control: max-age=31536000
Run Code Online (Sandbox Code Playgroud)
下面是路径配置:
spec:
rules:
- http:
paths:
- backend:
serviceName: myabc
servicePort: 443
path: /myabc
- backend:
serviceName: myxyz
servicePort: 443
path: /myxyz
Run Code Online (Sandbox Code Playgroud)
我只希望在请求 .js 或 .png 等静态文件时应用自定义标头。
关于如何前进的任何指示?这可能通过traefik吗?
Traefik 入口控制器已经支持traefik.frontend.rule.type: PathPrefixStrip相当长一段时间了,当微服务的根路径需要在example.com/path/.
以下是带有清单的 yaml 示例:
\n\napiVersion: extensions/v1beta1\nkind: Ingress\nmetadata:\n name: example\n annotations:\n traefik.frontend.rule.type: PathPrefixStrip\nspec:\n rules:\n - host: example.com\n http:\n paths:\n - path: /path/\n backend:\n serviceName: example\n servicePort: http\nRun Code Online (Sandbox Code Playgroud)\n\n这种方法的问题在于,当客户端转到 \xe2\x80\x93 时,它不会添加尾部斜杠(example.com/path如果我理解正确的话),这只能通过额外的入口规则来实现。
traefik 的最新版本支持更广泛的注释集,这表明可以在一个规则内声明添加尾部斜杠。
\n\n这是我在 traefik 中解决这个问题的尝试1.7:
apiVersion: extensions/v1beta1\nkind: Ingress\nmetadata:\n name: example\n annotations:\n traefik.ingress.kubernetes.io/redirect-permanent: "true"\n traefik.ingress.kubernetes.io/redirect-regex: https?://example.com/path$\n traefik.ingress.kubernetes.io/redirect-replacement: https://example.com/path/\n traefik.ingress.kubernetes.io/request-modifier: "ReplacePathRegex: ^/path/(.*) /$1"\nspec:\n rules:\n - host: example.com\n http:\n paths:\n - path: /path\n backend:\n serviceName: example\n servicePort: http\n …Run Code Online (Sandbox Code Playgroud) 我正在尝试使用Kubernetes中Traefik入口控制器提供的基于路径的路由机制,但URL重写存在一些问题。
我的[更新]配置如下
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
annotations:
kubernetes.io/ingress.class: traefik
traefik.ingress.kubernetes.io/auth-type: "basic"
traefik.ingress.kubernetes.io/auth-tls-insecure: "true"
traefik.ingress.kubernetes.io/frontend-entry-points: "http,https"
traefik.ingress.kubernetes.io/app-root: "/"
traefik.ingress.kubernetes.io/rule-type: "PathPrefixStrip"
traefik.ingress.kubernetes.io/rewrite-target: "/"
name: webapp-ingress
namespace: my-company
spec:
rules:
- host: local-ubuntu
- http:
paths:
- path: /
backend:
serviceName: webapp
servicePort: 80
- path: /db
backend:
serviceName: db-manager
servicePort: 8081
Run Code Online (Sandbox Code Playgroud)
流量被路由到正确的服务,但是当我查看db-manager(kubernetes)服务的日志时,URL仍带有/ db前缀。我对PathPrefixStrip的预期是,流量将不带/ db前缀路由到运行db-manager微服务的容器,该容器正在后端监听/(http:// db-manager:8081)侧。
我想念什么吗?是traefik支持还是仅nginx支持?预先感谢您的反馈。
[编辑]
更具体地说,我将在下面讨论的当前注释中观察以下内容
网址:http:// local-ubuntu / db [确定]-> 200
然后其他资源正在加载,但指向错误的基本URL
例:
资源URL是:http://local-ubuntu/public/css/bootstrap.min.css
但这应该是:http://local-ubuntu/db/public/css/bootstrap.min.css (当我手动尝试时可以使用)
我不确定当前配置中缺少的内容。
我应该将 traefik 1.7.x 部署为 DaemonSet 还是 GKE (Google K8S) 中的部署?
Google 云中具有节点自动缩放器的 Kubernetes 集群,托管多个生产集群。集群最多可以扩展 90 个节点(最少 6 个节点),目前我们traefik在每个集群中部署了 10 个副本的 pod(我们使用 kustomize 在所有集群中部署相同的清单)。
europe-west1我们注意到,与具有 6 个节点的区域集群相比,具有 18 个节点(区域)的集群的响应时间较慢australia-southeast1。两个集群都有 10 个 traefik 副本。
traefik.toml:
[kubernetes]
# all namespaces!
namespaces = []
Run Code Online (Sandbox Code Playgroud)
服务.yaml
apiVersion: v1
kind: Service
metadata:
labels:
app: traefik
name: traefik-ingress
namespace: ingress-traefik
spec:
externalTrafficPolicy: Local
ports:
- name: http
port: 80
protocol: TCP
targetPort: 80
- name: https
port: 443
protocol: TCP …Run Code Online (Sandbox Code Playgroud) 最近我正在将一个项目转移到 Kubernetes 并使用 Traefik 作为入口控制器。对于 Traefik,我使用了 Traefik Kubernetes Ingress 提供程序进行路由。当我尝试添加 Traefik 仪表板时,我发现它似乎只能使用 IngressRoute 添加(即使用 Kubernetes CRD 作为提供程序)。
我有几个问题:
我正在尝试使用 traefik 获取 Kubernetes pod 的真实源 IP 地址。我正在使用启用了代理协议的数字海洋负载均衡器。我还配置了 K8s 服务 yaml,将外部流量策略设置为本地。
从我的 K8s 中的 Traefik Ingress configmap 中摘录。我已经编辑了我的实际 IP,但我使用我的负载均衡器 IP 和 Kubernetes 工作节点专用 IP
[entryPoints]
[entryPoints.http]
address = ":80"
compress = true
[entryPoints.http.redirect]
entryPoint = "https"
[entryPoints.https]
address = ":443"
compress = true
[entryPoints.https.tls]
[[entryPoints.https.tls.certificates]]
CertFile = "/ssl/client_co.crt"
KeyFile = "/ssl/tls.key"
[entryPoints.https.proxyProtocol]
trustedIPs = ["Load Balancer IP, Kubernetes Worker Node IPs"]
[entryPoints.https.redirect]
regex = "^https://(?:www\\.)(.*)"
replacement = "https://$1"
permanent = true
Run Code Online (Sandbox Code Playgroud)
这是部署文件服务yaml的一部分
kind: Service
apiVersion: v1
metadata:
name: traefik-ingress-service …Run Code Online (Sandbox Code Playgroud)