我使用 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 应用程序除外)都按预期工作。
要使用 Istio 而不是 NGINX Ingress 在 Azure Kubernetes 集群中公开 GRPC 应用程序,您需要设置 Istio 自己的 Gateway 和 VirtualService 资源。这些资源将流量从网格边缘引导到网格内的服务中。确保您的集群中安装了 Istio,并且为您的命名空间启用了自动 sidecar 注入(如果不是默认设置)。
kubectl label namespace your-namespace istio-injection=enabled
就我而言是这样的
因此,需要在
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
验证部署和服务
kubectl get gateway -n aks-istio-ingress
kubectl get virtualservice -n aks-istio-ingress
kubectl get svc -n aks-istio-ingress
现在假设您的 .NET 应用程序已准备好处理端口 7010 上的 GRPC 流量,并且您已将应用程序配置为在适当的命名空间中运行。只需根据需要调整服务名称和命名空间以适合您的实际部署详细信息。