我遇到一种情况,我打算在Kubernetes集群中使用两个单独的traefik入口控制器。
我有一些URL只能通过VPN访问,而很少一些可以公开访问。
在当前体系结构中,我有一个traefik-inress控制器和两个单独的ALB,一个内部和一个面向Internet的,都指向traefik。
假设我有一个URL public.example.com
和private.example.com
。 public.example.com
指向面向互联网的ALB,private.example.com
指向内部ALB。但是,如果有人知道public.example.com
的指向并将private.example.com
指向其/etc/hosts
中的相同指向,该怎么办,他将能够访问我的私人网站。
为避免这种情况,我计划运行两个单独的traefik-ingress-controller,一个将仅提供私有URL,一个将提供公共URL。能做到吗?还是有其他方法可以避免这种情况
答案 0 :(得分:4)
您可以使用集群中的单个Ingress控制器来实现此目的,但是可以通过创建各种Ingress
Kubernetes对象来实现。
对于私有网站:-
考虑入口资源中的whitelist-source-range
注释。
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
name: test-ingress
annotations:
nginx.ingress.kubernetes.io/whitelist-source-range: 10.0.0.0/24,172.10.0.1
nginx.ingress.kubernetes.io/rewrite-target: /
spec:
rules:
- host: foo.bar.com
http:
paths:
- path: /testpath
pathType: Prefix
backend:
serviceName: test
servicePort: 80
对于公共网站:-
https://kubernetes.io/docs/concepts/services-networking/ingress/#the-ingress-resource
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
name: test-ingress
annotations:
nginx.ingress.kubernetes.io/rewrite-target: /
spec:
rules:
- host: foo.bar.com
http:
paths:
- path: /testpath
pathType: Prefix
backend:
serviceName: test
servicePort: 80
答案 1 :(得分:1)
为了部署两个单独的traefik-inress控制器,分别为私人和公共流量提供服务,我使用了kubernetes.ingressclass=traefik
参数。
这是kubernetes.ingressclass
的文档要说的:
--kubernetes.ingressclass Value of kubernetes.io/ingress.class annotation to watch for
我创建了两个部署,分别为kubernetes.ingressclass
分配了价值。
带有kubernetes.ingressclass=traefik
(位于公共ALB之后)和kubernetes.ingressclass=traefik-internal
(位于私人/内部ALB之后)的人
对于我想私下提供的服务,我在入口对象中使用以下注释:
annotations:
kubernetes.io/ingress.class: traefik-internal
并公开
annotations:
kubernetes.io/ingress.class: traefik
我的deployment.yaml
---
kind: Deployment
apiVersion: apps/v1
metadata:
name: traefik-internal-ingress-controller
namespace: kube-system
labels:
k8s-app: traefik-internal-ingress-lb
spec:
replicas: 1
selector:
matchLabels:
k8s-app: traefik-internal-ingress-lb
template:
metadata:
labels:
k8s-app: traefik-internal-ingress-lb
spec:
serviceAccountName: traefik-internal-ingress-controller
terminationGracePeriodSeconds: 60
containers:
- image: traefik:v1.7
name: traefik-internal-ingress-lb
ports:
- name: http
containerPort: 80
- name: admin
containerPort: 8080
args:
- --api
- --kubernetes
- --logLevel=INFO
- --accesslog=true
- --kubernetes.ingressclass=traefik-internal ##this makes it to watch only for ingress objects with annotaion "kubernetes.io/ingress.class: traefik-internal"
希望这对某人有帮助。
答案 2 :(得分:0)
多个Træfik部署可以在同一群集中同时运行。例如,可以设想一个部署处理内部事务,另一个部署处理外部流量。
对于这种情况,建议通过标签对Ingress对象进行分类,并根据每个Træfik部署相应地配置labelSelector选项。坚持上面的内部/外部示例,所有用于内部流量的Ingress对象都可以收到一个traffic-type: internal
标签,而指定用于外部流量的对象都可以收到一个traffic-type: external
标签。然后,Træfik部署中的标签选择器将分别为traffic-type=interna
l和traffic-type=external
。