我正在配置Traefik Proxy在GKE集群上运行,以处理各种微服务的代理。我通过他们的crd完成所有工作,并使用自定义部署将Traefik部署到集群。Traefik仪表板是可访问的,工作正常,但是当我试图为服务本身设置IngressRoute时,它是不可访问的,并且它没有出现在仪表板中。我试过用常规的k8s入口对象设置它,当这样做时,它确实出现在仪表板中,但是我遇到了一些中间件问题,为了便于使用,我更喜欢走CRD路线。此外,微服务的部署和服务似乎部署得很好,它们都出现在GKE仪表板中,并且正常运行。没有创建入口,但是我不确定自定义CRD IngressRoute是否应该创建一个。
关于配置的一些信息:
我使用Kustomize来处理覆盖和一般数据
我有一个设置,通过Kustomize将名称空间users
应用到所有
下面是我使用的配置文件,crd和RBAC是通过调用
来定义的kubectl apply -f https://raw.githubusercontent.com/traefik/traefik/v2.9/docs/content/reference/dynamic-configuration/kubernetes-crd-definition-v1.yml
kubectl apply -f https://raw.githubusercontent.com/traefik/traefik/v2.9/docs/content/reference/dynamic-configuration/kubernetes-crd-rbac.yml
deployment.yml
apiVersion: apps/v1
kind: Deployment
metadata:
name: users-service
spec:
replicas: 1
strategy:
rollingUpdate:
maxSurge: 1
maxUnavailable: 0
type: RollingUpdate
template:
metadata:
labels:
app: users-service
spec:
containers:
- name: users-service
image: ${IMAGE}
imagePullPolicy: IfNotPresent
ports:
- name: web
containerPort: ${HTTP_PORT}
readinessProbe:
httpGet:
path: /ready
port: web
initialDelaySeconds: 10
periodSeconds: 2
envFrom:
- secretRef:
name: users-service-env-secrets
service.yml
apiVersion: v1
kind: Service
metadata:
name: users-service
spec:
ports:
- name: web
protocol: TCP
port: 80
targetPort: web
selector:
app: users-service
ingress.yml
apiVersion: traefik.containo.us/v1alpha1
kind: Middleware
metadata:
name: users-stripprefix
spec:
stripPrefix:
prefixes:
- /userssrv
---
apiVersion: traefik.containo.us/v1alpha1
kind: IngressRoute
metadata:
name: users-service-ingress
spec:
entryPoints:
- service-port
routes:
- kind: Rule
match: PathPrefix(`/userssrv`)
services:
- name: users-service
namespace: users
port: service-port
middlewares:
- name: users-stripprefix
如果需要更多的信息,请点击。谢谢!
在Kubernetes上默认安装Traefik会创建两个入口点:
web
用于http访问,websecure
用于https访问
但是在IngressRoute
配置中有:
entryPoints:
- service-port
除非您显式地为Traefik配置了一个名为"service-port"的入口点,否则这可能是您的问题。您想要删除entryPoints
部分,或者指定如下内容:
entryPoints:
- web
如果省略entryPoints
配置,该服务将在所有入口点上可用。如果您包含显式入口点,那么服务将仅在这些特定入口点上可用(例如,使用上述配置,服务将通过http://
而不是通过https://
可用)。
与您的问题没有直接关系,但如果您正在使用Kustomize,请考虑:
从部署、服务选择器等中删除
app: users-service
标签,并使用commonLabels
指令在kustomization.yaml
中设置它。从IngressRoute的服务规范中删除显式名称空间,而使用自定义的名称空间转换器来设置它(这让您可以从
kustomization.yaml
独占地控制名称空间)。
我已经把这个答案中提到的所有更改都放在了一个可部署的示例中。