Проблема
Недавно я решил перейти из Swarm в Kubernetes и пытался настроить Traefik для маршрутизации моих запросов к ожидаемым внутренним службам на основе Path.
После прочтения документации и некоторых других тем, даже здесь, в StackOverflow, я пришел к выводу, что подходящим вариантом для этого было использование PathPrefixStrip , например:
Использовать* Strip matcher, если ваш бэкэнд прослушивает корневой путь (/), но должен быть маршрутизируемым с определенным префиксом.Например, PathPrefixStrip: / products будет соответствовать / products, а также / products / shoes и / products / shirts.Так как путь перед пересылкой удаляется, ожидается, что ваш бэкэнд прослушивает / .
Но, очевидно, я все еще что-то упустил.
Что вы ожидали увидеть?
Запросы на http://192.168.1.230/blog
перенаправляются на бэкэнд-сервис "где бы он ни был" на /
Что вы виделивместо этого?
Вместо этого я получаю 404's
http://192.168.1.230/blog
или http://192.168.1.230
или что-нибудь еще.
Версия Я пробовал Traefik 1.7 и Kubernetes v1.12,2
Файлы конфигурации
traefik-internal.yaml
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
name: traefik-ingress-controller
namespace: kube-system
labels:
k8s-app: traefik-ingress-lb
spec:
replicas: 1
selector:
matchLabels:
k8s-app: traefik-ingress-lb
template:
metadata:
labels:
k8s-app: traefik-ingress-lb
name: traefik-ingress-lb
spec:
serviceAccountName: traefik-ingress-controller
terminationGracePeriodSeconds: 60
containers:
- image: traefik
name: traefik-ingress-lb
imagePullPolicy: IfNotPresent
ports:
- name: http
containerPort: 80
- name: https
containerPort: 443
- name: admin
containerPort: 8080
args:
- --configfile=/etc/traefik/traefik.toml
livenessProbe:
httpGet:
path: /ping
port: 80
initialDelaySeconds: 3
periodSeconds: 3
timeoutSeconds: 1
volumeMounts:
- name: config
mountPath: /etc/traefik/traefik.toml
volumes:
- name: config
hostPath:
path: /nas/home-stack/3-traefik/traefik-internal.toml
type: File
affinity:
podAntiAffinity:
preferredDuringSchedulingIgnoredDuringExecution:
- weight: 100
podAffinityTerm:
labelSelector:
matchExpressions:
- key: role
operator: In
values:
- boss
topologyKey: kubernetes.io/hostname
---
apiVersion: v1
kind: Service
metadata:
name: traefik-ingress-service
namespace: kube-system
labels:
k8s-app: traefik-ingress-lb
spec:
selector:
k8s-app: traefik-ingress-lb
externalTrafficPolicy: Local
ports:
- protocol: TCP
port: 80
name: web
- protocol: TCP
port: 443
name: https
- protocol: TCP
port: 8080
name: admin
type: LoadBalancer
loadBalancerIP: 192.168.1.230
traefik-internal.toml
defaultEntryPoints = ["http","https"]
debug = false
logLevel = "INFO"
# Do not verify backend certificates (use https backends)
InsecureSkipVerify = true
[entryPoints]
[entryPoints.http]
address = ":80"
compress = true
[entryPoints.https]
address = ":443"
[entryPoints.https.tls]
[api]
[api.statistics]
recentErrors = 10
debug = true
[kubernetes]
labelselector = "traffic-type=internal"
[metrics]
[metrics.prometheus]
buckets=[0.1,0.3,1.2,5.0]
entryPoint = "traefik"
[ping]
entryPoint = "http"
ghost.yaml
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
name: blog-controller
labels:
app: blog
k8s-app: traefik-ingress-lb
spec:
replicas: 1
strategy:
type: RollingUpdate
selector:
matchLabels:
app: blog
k8s-app: traefik-ingress-lb
template:
metadata:
labels:
k8s-app: traefik-ingress-lb
app: blog
spec:
containers:
- name: ghost
image: allandequeiroz/ghost-the-shell:arm
imagePullPolicy: IfNotPresent
ports:
- containerPort: 2368
volumeMounts:
- name: ghost-database
mountPath: /var/www/ghost/content/data
- name: ghost-configuration
mountPath: /var/www/ghost/config.production.json
restartPolicy: Always
volumes:
- name: ghost-database
hostPath:
path: /nas/ghost
- name: ghost-configuration
hostPath:
path: /nas/home-stack/6-ghost/conf/config.production.json
type: File
---
apiVersion: v1
kind: Service
metadata:
name: blog
spec:
selector:
k8s-app: traefik-ingress-lb
app: blog
ports:
- port: 80
targetPort: 2368
type: NodePort
# type: LoadBalancer
# loadBalancerIP: 192.168.1.232
---
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: blog
labels:
traffic-type: internal
annotations:
kubernetes.io/ingress.class: traefik
traefik.frontend.rule.type: PathPrefixStrip
spec:
rules:
- host: allandequeiroz.com
http:
paths:
- path: /blog
backend:
serviceName: blog
servicePort: 80
Обратите внимание на ghost.yaml , если я приму услугу как LoadBalanderIP
это работает, я могу нажать ghost, просто указывая на http://192.168.1.232
, но вместо этого я хотел бы разделить внутренние и внешние службы и охватить их с помощью внутренней (192.168.1.230) и внешней (192.168.1.230) балансировщиков нагрузки.
Спасибо, ребята, и извините, если я что-то упустил и задаю глупый вопрос.