带有 Istio 的 Kubernetes 入口控制器

问题描述 投票:0回答:1

我使用 bitnami asp.net 代码舵图在 Azure K8 集群中部署了一个 GRPC 应用程序(.NET 应用程序)。我将以下值传递给图表。

aspnet-core:
  fullnameOverride: app-name
  image:
    registry: registrypath
    repository: repopath
    tag: latest
    pullPolicy: Always
 
  args: 
    - Service.dll

  bindURLs: http://+:5010;https://+:7010       
  service:
    type: ClusterIP
    ports:
      http: 7010

  containerPorts:
    http: 7010

  ingress:
    enabled: true
    pathType: Prefix
    hostname: host.domain.com
    path: /
    annotations:
      nginx.ingress.kubernetes.io/backend-protocol: "GRPCS"
      nginx.ingress.kubernetes.io/ssl-redirect: "true"
    tls: true
    ingressClassName: "nginx"

此应用程序使用 Kubernetes 入口 nginx 公开。从外部访问后,我就能够到达端点。

但是,安装Istio后,我无法访问端点。我尝试按照Istio文档创建一个新的ingressClass“istio”并在入口配置中使用它(ingressClassName:istio),但仍然无法到达端点并收到错误“404 Not Found nginx”

apiVersion: networking.k8s.io/v1
kind: IngressClass
metadata:
  name: istio
  labels:
    app.kubernetes.io/component: controller
    app.kubernetes.io/instance: ingress-nginx
spec:
  controller: istio.io/ingress-controller

在查看入口控制器日志时,我看到以下错误

I0412 02:00:10.148428       7 store.go:578] "ignoring ingressclass as the spec.controller is not the same of this ingress" ingressclass="istio"
W0412 02:01:59.300315       7 controller.go:331] ignoring ingress <serviceName> in <NAMESPACE> based on annotation : no object matching key "istio" in local store
I0412 02:01:59.300359       7 main.go:107] "successfully validated configuration, accepting" ingress="<NAMESPACE>/<SERVICENAME>"
I0412 02:01:59.307387       7 store.go:489] "removing ingress because of unknown ingressclass" ingress="<NAMESPACE>/<SERVICENAME>"

有什么建议或想法我缺少什么配置吗?我对 Istio 比较陌生,到目前为止,我试图避免使用 Istio 入口网关,因为大多数应用程序(GRPC 应用程序除外)都按预期工作。

kubernetes grpc azure-aks istio nginx-ingress
1个回答
0
投票

要使用 Istio 而不是 NGINX Ingress 在 Azure Kubernetes 集群中公开 GRPC 应用程序,您需要设置 Istio 自己的 Gateway 和 VirtualService 资源。这些资源将流量从网格边缘引导到网格内的服务中。确保您的集群中安装了 Istio,并且为您的命名空间启用了自动 sidecar 注入(如果不是默认设置)。

kubectl label namespace your-namespace istio-injection=enabled

就我而言是这样的 enter image description here

因此,需要在

Gateway
命名空间中定义一个
aks-istio-ingress
,用于管理入口流量

Grpc网关示例

apiVersion: networking.istio.io/v1alpha3
kind: Gateway
metadata:
  name: grpc-gateway
  namespace: aks-istio-ingress  # Use the namespace where the Istio ingress is running
spec:
  selector:
    istio: ingressgateway-external-asm-1-20  # Use the correct selector for your external gateway
  servers:
  - port:
      number: 7010
      name: grpc
      protocol: GRPC
    hosts:
    - "host.domain.com"

将主机修改为您自己的值。确保您要替换的占位符

host.domain.com
的实际值具有指向 Istio 入口网关的外部 IP
4.236.238.18
(您自己的外部 IP)的 DNS A 记录。

接下来是

VirtualService
,它将把流量从网关引导到集群中的特定服务。

Grpc 虚拟服务示例

apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
  name: grpc-virtualservice
  namespace: aks-istio-ingress  # Ensure this is the same namespace as your service
spec:
  hosts:
  - "host.domain.com"
  gateways:
  - grpc-gateway
  http:
  - match:
    - uri:
        prefix: "/"
    route:
    - destination:
        host: app-name.aks-istio-ingress.svc.cluster.local  # Adjust this to your service's DNS name
        port:
          number: 7010

应用它们

kubectl apply -f grpc-gateway.yaml
kubectl apply -f grpc-virtualservice.yaml

enter image description here

验证部署和服务

kubectl get gateway -n aks-istio-ingress
kubectl get virtualservice -n aks-istio-ingress
kubectl get svc -n aks-istio-ingress

enter image description here

现在假设您的 .NET 应用程序已准备好处理端口 7010 上的 GRPC 流量,并且您已将应用程序配置为在适当的命名空间中运行。只需根据需要调整服务名称和命名空间以适合您的实际部署详细信息。

© www.soinside.com 2019 - 2024. All rights reserved.