在自定义界面上进入自托管 Kubernetes
Ingress on self-hosted Kubernetes on custom interface
我想在我的自托管 Kubernetes (microk8s) 上部署一个 ngingx-ingress 控制器,该控制器可配置为侦听一个或多个接口(外部 IP)。
甚至不确定这是否容易实现,我应该切换到外部解决方案,例如 HAProxy 或 nginx。
要求的行为:
192.168.0.1-H"domain.com":443/frontend -> 192.168.0.1 (eth0) -> ingress -> service-frontend
192.168.0.1-H"domain.com":443/backend -> 192.168.0.1 (eth0) -> ingress -> service-backend
88.88.88.88-H"domain.com":443/frontend -> 88.88.88.88 (eth1) -> ? -> [403 or timeout]
88.88.88.88-H"domain.com":443/backend -> 88.88.88.88 (eth1) -> ? -> [403 or timeout]
稍后应该可以打开 eth1 接口,以便该接口上的请求与 eth0 上的请求行为相同。
我希望能够部署多个服务实例以实现负载平衡。我想将配置保留在我的命名空间中(如果可能的话),这样我就可以随时删除并立即应用所有内容。
我正在使用本指南作为参考:https://kubernetes.github.io/ingress-nginx/deploy/baremetal/
我能够使用 minikube 进行一些操作,但显然无法公开任何外部 IP,而且性能非常糟糕。为此,我只是配置了一个“kind: Ingress”,仅此而已。
到目前为止,microk8s 默认的入口控制器似乎监听所有接口,我只能在它自己的命名空间中配置它。自己定义ingress好像没有什么效果
I would like to deploy an ngingx-ingress controller on my self-hosted
Kubernetes (microk8s) that is configurable to listen on one or more
interfaces (external IPs).
对于上述场景,您必须部署 Nginx 入口的多个入口控制器,并在其中保留不同的 class 名称。
官方文档:https://kubernetes.github.io/ingress-nginx/user-guide/multiple-ingress/
所以在这种情况下,您必须使用 Loadbalancer IP 创建 Kubernetes 服务,每个服务都将指向各自的部署,class 将在入口中使用对象。
如果您希望通过单个入口控制器使用多个域,您可以通过将主机提及到入口来轻松实现。
两个域的示例:
- bar.foo.dev
- foo.bar.dev
YAML 示例
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
name: frontdoor-bar
annotations:
kubernetes.io/ingress.class: nginx
cert-manager.io/cluster-issuer: letsencrypt-prod
nginx.ingress.kubernetes.io/rewrite-target: /
nginx.ingress.kubernetes.io/use-regex: "true"
spec:
tls:
- hosts:
- bar.foo.dev
secretName: tls-secret-bar
rules:
- host: bar.foo.dev
http:
paths:
- backend:
serviceName: barfoo
servicePort: 80
path: /(.*)
---
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
name: frontdoor-foo
annotations:
kubernetes.io/ingress.class: nginx
cert-manager.io/cluster-issuer: letsencrypt-prod
spec:
tls:
- hosts:
- foo.bar.dev
secretName: tls-secret-foo
rules:
- host: foo.bar.dev
http:
paths:
- backend:
serviceName: foobar
servicePort: 9000
path: /(.*)
一个潜在的修复比预期的要简单得多,不需要弄乱 MetalLB 或其他任何东西。
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: my-ingress
annotations:
kubernetes.io/ingress.class: "public"
nginx.ingress.kubernetes.io/whitelist-source-range: 192.168.0.0/24
...
这并没有解决跨多个接口拆分 Ingress 的问题,但它确实解决了限制 public 访问的问题。
默认情况下,裸机入口将监听所有接口,这可能是一个安全问题。
此解决方案无需在 Microk8s 上启用入口即可工作:
- 安装入口控制器:kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-v0.34.1/deploy/static/provider/baremetal/deploy.yaml
- 创建您的部署和服务并添加此 Ingress 资源(全部在一个命名空间中):
kind: Ingress
metadata:
annotations:
ingress.kubernetes.io/service-upstream: 'true'
nginx.ingress.kubernetes.io/rewrite-target: "/"
name: ingress-resource
namespace: namespace-name
spec:
rules:
- http:
paths:
- backend:
service:
name: service-name
port:
number: service-port
path: /namespace-name/service-name(/|$)(.*)
pathType: Prefix
kubectl get svc -n ingress-nginx
现在获取 CLUSTER-IP 或 EXTERNAL-IP 并且:
卷曲ip/namespace-here/service-here
我想在我的自托管 Kubernetes (microk8s) 上部署一个 ngingx-ingress 控制器,该控制器可配置为侦听一个或多个接口(外部 IP)。
甚至不确定这是否容易实现,我应该切换到外部解决方案,例如 HAProxy 或 nginx。
要求的行为:
192.168.0.1-H"domain.com":443/frontend -> 192.168.0.1 (eth0) -> ingress -> service-frontend
192.168.0.1-H"domain.com":443/backend -> 192.168.0.1 (eth0) -> ingress -> service-backend
88.88.88.88-H"domain.com":443/frontend -> 88.88.88.88 (eth1) -> ? -> [403 or timeout]
88.88.88.88-H"domain.com":443/backend -> 88.88.88.88 (eth1) -> ? -> [403 or timeout]
稍后应该可以打开 eth1 接口,以便该接口上的请求与 eth0 上的请求行为相同。
我希望能够部署多个服务实例以实现负载平衡。我想将配置保留在我的命名空间中(如果可能的话),这样我就可以随时删除并立即应用所有内容。
我正在使用本指南作为参考:https://kubernetes.github.io/ingress-nginx/deploy/baremetal/
我能够使用 minikube 进行一些操作,但显然无法公开任何外部 IP,而且性能非常糟糕。为此,我只是配置了一个“kind: Ingress”,仅此而已。
到目前为止,microk8s 默认的入口控制器似乎监听所有接口,我只能在它自己的命名空间中配置它。自己定义ingress好像没有什么效果
I would like to deploy an ngingx-ingress controller on my self-hosted Kubernetes (microk8s) that is configurable to listen on one or more interfaces (external IPs).
对于上述场景,您必须部署 Nginx 入口的多个入口控制器,并在其中保留不同的 class 名称。
官方文档:https://kubernetes.github.io/ingress-nginx/user-guide/multiple-ingress/
所以在这种情况下,您必须使用 Loadbalancer IP 创建 Kubernetes 服务,每个服务都将指向各自的部署,class 将在入口中使用对象。
如果您希望通过单个入口控制器使用多个域,您可以通过将主机提及到入口来轻松实现。
两个域的示例:
- bar.foo.dev
- foo.bar.dev
YAML 示例
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
name: frontdoor-bar
annotations:
kubernetes.io/ingress.class: nginx
cert-manager.io/cluster-issuer: letsencrypt-prod
nginx.ingress.kubernetes.io/rewrite-target: /
nginx.ingress.kubernetes.io/use-regex: "true"
spec:
tls:
- hosts:
- bar.foo.dev
secretName: tls-secret-bar
rules:
- host: bar.foo.dev
http:
paths:
- backend:
serviceName: barfoo
servicePort: 80
path: /(.*)
---
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
name: frontdoor-foo
annotations:
kubernetes.io/ingress.class: nginx
cert-manager.io/cluster-issuer: letsencrypt-prod
spec:
tls:
- hosts:
- foo.bar.dev
secretName: tls-secret-foo
rules:
- host: foo.bar.dev
http:
paths:
- backend:
serviceName: foobar
servicePort: 9000
path: /(.*)
一个潜在的修复比预期的要简单得多,不需要弄乱 MetalLB 或其他任何东西。
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: my-ingress
annotations:
kubernetes.io/ingress.class: "public"
nginx.ingress.kubernetes.io/whitelist-source-range: 192.168.0.0/24
...
这并没有解决跨多个接口拆分 Ingress 的问题,但它确实解决了限制 public 访问的问题。 默认情况下,裸机入口将监听所有接口,这可能是一个安全问题。
此解决方案无需在 Microk8s 上启用入口即可工作:
- 安装入口控制器:kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-v0.34.1/deploy/static/provider/baremetal/deploy.yaml
- 创建您的部署和服务并添加此 Ingress 资源(全部在一个命名空间中):
kind: Ingress
metadata:
annotations:
ingress.kubernetes.io/service-upstream: 'true'
nginx.ingress.kubernetes.io/rewrite-target: "/"
name: ingress-resource
namespace: namespace-name
spec:
rules:
- http:
paths:
- backend:
service:
name: service-name
port:
number: service-port
path: /namespace-name/service-name(/|$)(.*)
pathType: Prefix
kubectl get svc -n ingress-nginx
现在获取 CLUSTER-IP 或 EXTERNAL-IP 并且:
卷曲ip/namespace-here/service-here