Nginx 同一K8S群集上的两个入口控制器
我在DigitalOcean管理的K8S群集上安装了以下两个不同的入口控制器:Nginx 同一K8S群集上的两个入口控制器,nginx,kubernetes,kubernetes-ingress,istio,Nginx,Kubernetes,Kubernetes Ingress,Istio,我在DigitalOcean管理的K8S群集上安装了以下两个不同的入口控制器: Nginx 伊斯蒂奥 它们被分配到两个不同的IP地址。我的问题是,如果在同一个K8S集群上有两个不同的入口控制器是错误的 我之所以这么做,是因为nginx用于harbor、argocd等工具,而istio用于微服务 我还发现,当两者并排安装时,有时在部署期间,K8S会突然下降 例如,我部署了: apiVersion: v1 kind: Service metadata: name: hello-kuberne
- Nginx
- 伊斯蒂奥
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
这两种产品都有各自的特点,可以解决不同类型的问题。因此,在集群上安装这两个组件没有问题 称之为入口控制器不正确: -Nginx是一个著名的web服务器 -Nginx入口控制器是基于Nginx(负载平衡、HTTPS终止、身份验证、流量路由等)的Kubernetes入口控制器的实现 -Istio是一个服务网格(微服务架构非常熟悉,用于在POD级别以标准方式解决横切关注点,如日志、跟踪、Https终止等) 你能提供更多关于“K8S突然下降”的细节吗。你说的是集群节点还是内部运行的吊舱
谢谢。您看过这里提到的指定ingres.class(
kubernetes.io/ingres.class:“nginx”
)了吗在回答你的问题之前,你已经提出了几点意见,让我们后退一步。
Istio不建议使用K8s入口 重要的是要注意Istio如何不建议使用K8s入口: 建议使用而不是入口,以利用Istio提供的完整功能集,例如丰富的流量管理和安全功能 参考: 如前所述,Istio网关(Istio入口网关和出口网关)充当边缘,您可以在中找到更多信息
Istio中的多个端点 如果您需要为业务需求分配一个公共端点,为监视分配另一个端点(如您提到的Argo CD、Harbor),那么您可以仅通过使用Istio来实现这一点。这大约有两种方法
Istio IngressGateway
,如下所示(我过度简化了YAML定义):
apiVersion:v1
种类:服务
元数据:
标签:
应用程序:istio ingressgateway
伊斯蒂奥:入口大道
姓名:istio ingressgateway
名称空间:istio系统
# ... 其他属性。。。
规格:
类型:负载平衡器
# ... 其他属性。。。
这个LB服务将成为您的端点。(我不熟悉DigitalOcean K8s env,但我想他们会处理LB创建。)
然后,您可以创建如下所示的网关定义:
apiVersion:networking.istio.io/v1alpha3
种类:网关
元数据:
名称:您的网关
名称空间:istio系统
规格:
选择器:
应用程序:istio ingressgateway
伊斯蒂奥:入口大道
服务器:
-端口:
电话:3000
名称:https您的系统
协议:HTTPS
主持人:
-“您的业务域.com”
-“*.monitoring domain.com”
# ... 其他属性。。。
然后可以创建两个或多个定义
apiVersion:networking.istio.io/v1alpha3
种类:虚拟服务
元数据:
名称:商务virtsvc
规格:
网关:
-istio-ingressgateway.istio-system.svc.cluster.local
主持人:
-“您的业务域.com”
http:
-匹配:
-港口:3000
路线:
-目的地:
主持人:一些商务舱
端口:
电话:3000
# ... 其他属性。。。
apiVersion:networking.istio.io/v1alpha3
种类:虚拟服务
元数据:
名称:监控virtsvc
规格:
网关:
-istio-ingressgateway.istio-system.svc.cluster.local
主持人:
-“harbor.monitoring domain.com”
http:
-匹配:
-港口:3000
路线:
-目的地:
主持人:港口吊舱
端口:
电话:3000
# ... 其他属性。。。
注意:以上假设了很多事情,例如端口映射、流量处理等。。详情请查阅官方文件
那么,在绕道很长一段时间后,回到问题上来: 问题:[在同一K8S群集上使用两个不同的入口控制器是否错误[?] 我相信这是可以的,尽管这可能会导致一个错误,正如您所看到的,因为两个入口控制器争夺K8s入口资源 如上所述,如果您使用的是Istio,那么最好使用Istio IngressGateway而不是K8s Ingress。如果出于某些特定原因需要K8s入口,可以使用其他入口控制器进行K8s入口,如Nginx 至于您看到的错误,它来自Nginx部署的webhook,
ingres Nginx controller acmission.Nginx.svc
不可用。这意味着您已经使用kubernetes.io/ingres.class:istio
注释创建了一个K8s入口helloworld入口
,但Nginx webhook正在干扰K8s入口处理。然后,webhook无法处理资源,因为负责webhook流量的Pod/Svc正在运行