同一K8S集群上的两个入口控制器



我在DigitalOcean管理的K8S集群上安装了以下两个不同的入口控制器:

  • Nginx

  • Istio

并且它们被分配到两个不同的IP地址。我的问题是,如果在同一个K8S集群上有两个不同的入口控制器是错误的?

我之所以这么做,是因为nginx是用于像港湾、argocd等工具的,istio是用于微服务的。

我还发现,当两者并排安装时,有时在部署过程中,K8S会突然停机。

例如,我部署了:

apiVersion: v1
kind: Service
metadata:
name: hello-kubernetes-first
namespace: dev
spec:
type: ClusterIP
ports:
- port: 80
targetPort: 8080
selector:
app: hello-kubernetes-first
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: hello-kubernetes-first
namespace: dev
spec:
replicas: 3
selector:
matchLabels:
app: hello-kubernetes-first
template:
metadata:
labels:
app: hello-kubernetes-first
spec:
containers:
- name: hello-kubernetes
image: paulbouwer/hello-kubernetes:1.7
ports:
- containerPort: 8080
env:
- name: MESSAGE
value: Hello from the first deployment!
---
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
annotations:
kubernetes.io/ingress.class: istio
name: helloworld-ingress
namespace: dev
spec:
rules:
- host: hello.service.databaker.io
http:
paths:
- path: /*
backend:
serviceName: hello-kubernetes-first
servicePort: 80
---

然后我得到了:

Error from server (InternalError): error when creating "istio-app.yml": Internal error occurred: failed calling webhook "validate.nginx.ingress.kubernetes.io": Post https://ingress-nginx-controller-admission.nginx.svc:443/extensions/v1beta1/ingresses?timeout=30s: dial tcp 10.245.107.175:443: i/o timeout  

您已经提出了几点——在回答您的问题之前,让我们后退一步。


K8s入口不是Istio推荐的

值得注意的是,Istio不建议使用K8s Ingress:

建议使用Istio网关,而不是Ingress,以利用Istio提供的完整功能集,例如丰富的流量管理和安全功能。

参考:https://istio.io/latest/docs/tasks/traffic-management/ingress/kubernetes-ingress/

如前所述,Istio网关(Istio IngressGateway和EgressGateway)充当边缘,您可以在https://istio.io/latest/docs/tasks/traffic-management/ingress/ingress-control/.


Istio中的多个端点

如果您需要为业务需求分配一个公共端点,为监控分配另一个端点(如您提到的Argo CD、Harbor),您可以只使用Istio来实现这一点。对此,大致有两种方法。

  1. 创建单独的Istio入口网关-一个用于主流量,另一个用于监控
  2. 创建一个Istio IngressGateway,并使用Gateway定义来处理多种访问模式

两者都是有效的,根据要求,您可能需要选择其中一种方式。

至于方法#2,它是Istio流量管理系统的亮点。这是Istio强大功能的一个很好的例子,但如果你是新手,设置会稍微复杂一些。

方法#2示例

当您按照默认安装创建Istio IngressGateway时,它会创建istio-ingressgateway,如下所示(我过度简化了YAML的定义):

apiVersion: v1
kind: Service
metadata:
labels:
app: istio-ingressgateway
istio: ingressgateway
name: istio-ingressgateway
namespace: istio-system
# ... other attributes ...
spec:
type: LoadBalancer
# ... other attributes ...

这个LB服务将成为您的端点。(我不熟悉DigitalOcean K8s的env,但我想他们会处理LB创建。)

然后,您可以创建如下网关定义:

apiVersion: networking.istio.io/v1alpha3
kind: Gateway
metadata:
name: your-gateway
namespace: istio-system
spec:
selector:
app: istio-ingressgateway
istio: ingressgateway
servers:
- port:
number: 3000
name: https-your-system
protocol: HTTPS
hosts:
- "your-business-domain.com"
- "*.monitoring-domain.com"
# ... other attributes ...

然后,您可以创建2个或多个VirtualService定义。

apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
name: business-virtsvc
spec:
gateways:
- istio-ingressgateway.istio-system.svc.cluster.local
hosts:
- "your-business-domain.com"
http:
- match:
- port: 3000
route:
- destination:
host: some-business-pod
port:
number: 3000
# ... other attributes ...
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
name: monitoring-virtsvc
spec:
gateways:
- istio-ingressgateway.istio-system.svc.cluster.local
hosts:
- "harbor.monitoring-domain.com"
http:
- match:
- port: 3000
route:
- destination:
host: harbor-pod
port:
number: 3000
# ... other attributes ...

注:以上假设了很多事情,如港口地图、交通处理等。请查看官方文档了解详细信息。


那么,回到绕了很长一段路之后的问题:

问题:在同一K8S集群上有两个不同的入口控制器[是错误的吗?]

我相信这是可以的,尽管这可能会导致像您所看到的那样的错误,因为两个入口控制器争夺K8s入口资源。

如上所述,如果您使用的是Istio,最好使用Istio IngressGateway,而不是K8s Ingress。如果您出于某种特定原因需要K8s Ingress,您可以使用其他用于K8s Ingess的Ingress控制器,如Nginx。

至于您看到的错误,它来自Nginx部署的webhook,ingress-nginx-controller-admission.nginx.svc不可用。这意味着您已经创建了一个带有kubernetes.io/ingress.class: istio注释的K8s Ingresshelloworld-ingress,但Nginx webhook正在干扰K8s Ingess处理。由于找不到负责webhook流量的Pod/Svc,因此webhook无法处理资源。

错误本身只是说K8s中有一些不健康的地方——可能没有足够的Node分配给集群,因此没有进行Pod分配。值得注意的是,Istio确实需要一些CPU和内存占用,这可能会给集群带来更大的压力。

这两种产品都有不同的特点,可以解决不同类型的问题。因此,将两者都安装在集群上没有问题。

将其称为入口控制器是不正确的:-Nginx是一个众所周知的网络服务器-Nginx入口控制器是基于Nginx的Kubernetes入口控制器的实现(负载平衡、HTTPS终止、身份验证、流量路由等)-Istio是一个服务网格(微服务架构众所周知,用于在POD级别以标准方式解决交叉问题,如日志记录、跟踪、Https终止等)

你能提供更多关于"K8S突然宕机"的细节吗。你说的是集群节点还是内部运行的POD?

谢谢。

你有没有看过指定ingress.class(kubernetes.io/ingress.class: "nginx"),就像这里提到的那样?-https://kubernetes.github.io/ingress-nginx/user-guide/multiple-ingress/

相关内容

  • 没有找到相关文章

最新更新