同一个 K8S 集群上的两个入口控制器
Two ingress controller on same K8S cluster
我在我的 DigitalOcean 管理的 K8S 集群上安装了以下两个不同的入口控制器:
Nginx
Istio
而且他们被分配了两个不同的IP地址。我的问题是,如果在同一个 K8S 集群上有两个不同的入口控制器是错误的吗?
之所以这样做,是因为nginx是针对harbor、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
这两款产品各有特色,解决的问题也不同。因此,在您的集群上安装两者都没有问题。
称它们为 Ingress Controller 是不正确的:
- Nginx 是一个众所周知的网络服务器
- Nginx 入口控制器是基于 Nginx 的 Kubernetes 入口控制器的实现(负载平衡、HTTPS 终止、身份验证、流量路由等)
- Istio 是一个服务网格(微服务架构众所周知,用于以标准方式解决横切关注点——诸如日志记录、跟踪、Https 终止等——在 POD 级别)
你能否提供更多关于 "K8S suddenly goes down" 的含义的详细信息?你说的是集群节点还是里面的PODs运行?
谢谢。
您是否看过此处提到的指定 ingress.class (kubernetes.io/ingress.class: "nginx"
)? - https://kubernetes.github.io/ingress-nginx/user-guide/multiple-ingress/
你提出了几点——在回答你的问题之前,让我们退一步。
K8s Ingress 不 Istio 推荐
需要注意的是 Istio 不推荐使用 K8s Ingress:
Using the Istio Gateway, rather than Ingress, is recommended to make use of the full feature set that Istio offers, such as rich traffic management and security features.
参考:https://istio.io/latest/docs/tasks/traffic-management/ingress/kubernetes-ingress/
如前所述,Istio Gateway(Istio IngressGateway 和 EgressGateway)充当边缘,您可以在 https://istio.io/latest/docs/tasks/traffic-management/ingress/ingress-control/.
中找到更多信息
Istio 中的多个端点
如果您需要分配一个 public 端点用于业务需求,另一个端点用于监控(例如您提到的 Argo CD、Harbor),您可以仅使用 Istio 来实现。大致有两种方法。
- 创建单独的 Istio IngressGateways - 一个用于主要流量,另一个用于监控
- 创建一个 Istio IngressGateway,并使用 Gateway 定义来处理多种访问模式
两者都有效,根据需要,您可能需要选择一种方式。
至于方法#2,这是 Istio 的流量管理系统的亮点所在。这是 Istio 强大功能的一个很好的例子,但如果您是新手,设置会稍微复杂一些。所以这里有一个例子。
方法 #2 示例
当您按照 default installation 创建 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 Ingress 使用其他 Ingress 控制器,例如 Nginx。
至于您看到的错误,它来自 Nginx 部署的 webhook,ingress-nginx-controller-admission.nginx.svc
不可用。这意味着您已经创建了一个带有 kubernetes.io/ingress.class: istio
注释的 K8s Ingress helloworld-ingress
,但是 Nginx webhook 正在干扰 K8s Ingress 处理。然后 webhook 无法处理资源,因为找不到负责 webhook 流量的 Pod / Svc。
错误本身只是说明 K8s 中有些东西不健康——可能没有足够的节点分配给集群,因此 Pod 分配没有发生。还需要注意的是,Istio 确实需要一些 CPU 和内存占用,这可能会给集群带来更大的压力。
我在我的 DigitalOcean 管理的 K8S 集群上安装了以下两个不同的入口控制器:
Nginx
Istio
而且他们被分配了两个不同的IP地址。我的问题是,如果在同一个 K8S 集群上有两个不同的入口控制器是错误的吗?
之所以这样做,是因为nginx是针对harbor、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
这两款产品各有特色,解决的问题也不同。因此,在您的集群上安装两者都没有问题。
称它们为 Ingress Controller 是不正确的: - Nginx 是一个众所周知的网络服务器 - Nginx 入口控制器是基于 Nginx 的 Kubernetes 入口控制器的实现(负载平衡、HTTPS 终止、身份验证、流量路由等) - Istio 是一个服务网格(微服务架构众所周知,用于以标准方式解决横切关注点——诸如日志记录、跟踪、Https 终止等——在 POD 级别)
你能否提供更多关于 "K8S suddenly goes down" 的含义的详细信息?你说的是集群节点还是里面的PODs运行?
谢谢。
您是否看过此处提到的指定 ingress.class (kubernetes.io/ingress.class: "nginx"
)? - https://kubernetes.github.io/ingress-nginx/user-guide/multiple-ingress/
你提出了几点——在回答你的问题之前,让我们退一步。
K8s Ingress 不 Istio 推荐
需要注意的是 Istio 不推荐使用 K8s Ingress:
Using the Istio Gateway, rather than Ingress, is recommended to make use of the full feature set that Istio offers, such as rich traffic management and security features.
参考:https://istio.io/latest/docs/tasks/traffic-management/ingress/kubernetes-ingress/
如前所述,Istio Gateway(Istio IngressGateway 和 EgressGateway)充当边缘,您可以在 https://istio.io/latest/docs/tasks/traffic-management/ingress/ingress-control/.
中找到更多信息Istio 中的多个端点
如果您需要分配一个 public 端点用于业务需求,另一个端点用于监控(例如您提到的 Argo CD、Harbor),您可以仅使用 Istio 来实现。大致有两种方法。
- 创建单独的 Istio IngressGateways - 一个用于主要流量,另一个用于监控
- 创建一个 Istio IngressGateway,并使用 Gateway 定义来处理多种访问模式
两者都有效,根据需要,您可能需要选择一种方式。
至于方法#2,这是 Istio 的流量管理系统的亮点所在。这是 Istio 强大功能的一个很好的例子,但如果您是新手,设置会稍微复杂一些。所以这里有一个例子。
方法 #2 示例
当您按照 default installation 创建 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 Ingress 使用其他 Ingress 控制器,例如 Nginx。
至于您看到的错误,它来自 Nginx 部署的 webhook,ingress-nginx-controller-admission.nginx.svc
不可用。这意味着您已经创建了一个带有 kubernetes.io/ingress.class: istio
注释的 K8s Ingress helloworld-ingress
,但是 Nginx webhook 正在干扰 K8s Ingress 处理。然后 webhook 无法处理资源,因为找不到负责 webhook 流量的 Pod / Svc。
错误本身只是说明 K8s 中有些东西不健康——可能没有足够的节点分配给集群,因此 Pod 分配没有发生。还需要注意的是,Istio 确实需要一些 CPU 和内存占用,这可能会给集群带来更大的压力。