在同一个 kubernetes 集群上安装两个 traefik ingress controller
Install two traefik ingress controller on same kubernetes Cluster
我有一种情况,我计划在 Kubernetes 集群中使用两个单独的 traefik 入口控制器。
我有几个 URL 我希望只能通过 VPN 访问,还有一些可以 public 访问。
在当前架构中,我有一个 traefik-ingress 控制器和两个独立的 ALB,一个内部的和一个面向互联网的,都指向 traefik。
比方说,我有一个 URL public.example.com
和 private.example.com
。 public.example.com
指向面向 Internet 的 ALB,private.example.com
指向内部 ALB。但是,如果有人知道 public.example.com
的指向并将 private.example.com
指向他的 /etc/hosts
中的相同指向,他将能够访问我的私人网站。
为了避免这种情况,我计划 运行 两个单独的 traefik-ingress-controller,一个将仅服务于私有 URL 和一个 public URL .这可以做到吗?或者有没有其他方法可以避免这种情况
您可以使用集群内的单个 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
对于 Public 网站:-
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
多个 Træfik Deployment 可以 运行 在同一个 cluster.For 实例中并发,可以想象一个 Deployment 处理内部流量,另一个 Deployment 处理外部流量。
对于这种情况,建议通过标签对 Ingress 对象进行分类,并相应地为每个 Træfik 部署配置 labelSelector 选项。为了坚持上面的 internal/external 示例,所有用于内部流量的 Ingress 对象都可以接收到 traffic-type: internal
标签,而指定用于外部流量的对象接收到 traffic-type: external
标签。 Træfik 部署上的标签选择器将分别为 traffic-type=interna
l 和 traffic-type=external
。
为了部署两个单独的 traefik-ingress 控制器,分别为私有和 public 流量提供服务,我使用了 kubernetes.ingressclass=traefik
args。
这是 kubernetes.ingressclass
的文档必须说明的内容:
--kubernetes.ingressclass Value of kubernetes.io/ingress.class annotation to watch for
我创建了两个部署,kubernetes.ingressclass
具有不同的值。
一个 kubernetes.ingressclass=traefik
,位于 public ALB 之后,kubernetes.ingressclass=traefik-internal
,位于 private/internal ALB
之后
对于我想私下提供的服务,我在入口对象中使用了以下注释:
annotations:
kubernetes.io/ingress.class: traefik-internal
和 public
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"
希望这对某人有所帮助。
我有一种情况,我计划在 Kubernetes 集群中使用两个单独的 traefik 入口控制器。
我有几个 URL 我希望只能通过 VPN 访问,还有一些可以 public 访问。
在当前架构中,我有一个 traefik-ingress 控制器和两个独立的 ALB,一个内部的和一个面向互联网的,都指向 traefik。
比方说,我有一个 URL public.example.com
和 private.example.com
。 public.example.com
指向面向 Internet 的 ALB,private.example.com
指向内部 ALB。但是,如果有人知道 public.example.com
的指向并将 private.example.com
指向他的 /etc/hosts
中的相同指向,他将能够访问我的私人网站。
为了避免这种情况,我计划 运行 两个单独的 traefik-ingress-controller,一个将仅服务于私有 URL 和一个 public URL .这可以做到吗?或者有没有其他方法可以避免这种情况
您可以使用集群内的单个 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
对于 Public 网站:-
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
多个 Træfik Deployment 可以 运行 在同一个 cluster.For 实例中并发,可以想象一个 Deployment 处理内部流量,另一个 Deployment 处理外部流量。
对于这种情况,建议通过标签对 Ingress 对象进行分类,并相应地为每个 Træfik 部署配置 labelSelector 选项。为了坚持上面的 internal/external 示例,所有用于内部流量的 Ingress 对象都可以接收到 traffic-type: internal
标签,而指定用于外部流量的对象接收到 traffic-type: external
标签。 Træfik 部署上的标签选择器将分别为 traffic-type=interna
l 和 traffic-type=external
。
为了部署两个单独的 traefik-ingress 控制器,分别为私有和 public 流量提供服务,我使用了 kubernetes.ingressclass=traefik
args。
这是 kubernetes.ingressclass
的文档必须说明的内容:
--kubernetes.ingressclass Value of kubernetes.io/ingress.class annotation to watch for
我创建了两个部署,kubernetes.ingressclass
具有不同的值。
一个 kubernetes.ingressclass=traefik
,位于 public ALB 之后,kubernetes.ingressclass=traefik-internal
,位于 private/internal ALB
对于我想私下提供的服务,我在入口对象中使用了以下注释:
annotations:
kubernetes.io/ingress.class: traefik-internal
和 public
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"
希望这对某人有所帮助。