我曾经使用Type:LoadBalancer通过反向代理公开我的服务。没有Istio,一切工作正常。 但是,当我将Istio应用于群集时会发生错误。
我试图通过Istio Ingress在Kubernetes中公开我的服务,但是我认为在使用Istio路由服务时我误会了一些东西。
我在同一名称空间中有2个部署(请参见下图):
1:应用程序(公交车ID)
2:应用程序的反向代理(总线代理):将HTTP转换为gRPC
https://drive.google.com/file/d/1tby9_taJb9WMHi0ssO9Os7MQAWRMga6k/view?usp=sharing
版本:
Kubernetes版本(启用RBAC的AKS):
客户端版本:v1.15.0
服务器版本:v1.12.8
Istio版本:1.1.3(AKS表示他们已在1.1.3上进行测试)
头盔:
客户端:&version.Version {SemVer:“ v2.13.0”,GitCommit:“ 79d07943b03aea2b76c12644b4b54733bc5958d6”,GitTreeState:“干净”}
服务器:&version.Version {SemVer:“ v2.14.1”,GitCommit:“ 5270352a09c7e8b6e8c9593002a73535276507c0”,GitTreeState:“干净”}}
我尝试了 Istio (https://istio.io/docs/examples/bookinfo/)中的 BookInfo 示例,
但是,我在 AKS (https://docs.microsoft.com/en-us/azure/aks/istio-scenario-routing)中尝试了投票示例,但无法使用外部负载均衡器的IP访问示例,它重新调整了“超时”
部署文件:
1。 bus-id.yaml
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
name: bus-id
namespace: smart-id
labels:
k8s-app: bus-id
spec:
selector:
matchLabels:
k8s-app: bus-id
template:
metadata:
name: bus-id
labels:
k8s-app: bus-id
spec:
containers:
- name: bus-id
image: mydockerhub/mydockerhub:bus-id
ports:
- containerPort: 50001
env:
- name: APP_NAME
value: bus-id
---
apiVersion: v1
kind: Service
metadata:
name: bus-id
namespace: smart-id
labels:
service: bus-id
spec:
ports:
- name: http
port: 50001
targetPort: 50001
protocol: TCP
selector:
k8s-app: bus-id
2。 bus-proxy.yaml
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
labels:
k8s-app: bus-proxy
name: bus-proxy
namespace: smart-id
spec:
selector:
matchLabels:
k8s-app: bus-proxy
replicas: 1
template:
metadata:
labels:
k8s-app: bus-proxy
spec:
imagePullSecrets:
- name: duynd
containers:
- image: mydockerhub/mydockerhub:bus-proxy
name: bus-proxy
ports:
- containerPort: 40001
name: http
env:
- name: APP_NAME
value: bus-proxy
---
apiVersion: v1
kind: Service
metadata:
name: bus-proxy
namespace: smart-id
labels:
service: bus-proxy
spec:
ports:
- port: 8080
targetPort: 40001
protocol: TCP
selector:
k8s-app: bus-proxy
3。 ingress.yaml
apiVersion: networking.istio.io/v1alpha3
kind: Gateway
metadata:
name: smartid-gateway
namespace: smart-id
spec:
selector:
istio: ingressgateway # use istio default controller
servers:
- port:
number: 80
name: http
protocol: HTTP
hosts:
- "*"
---
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
name: smartid
namespace: smart-id
spec:
hosts:
- "*"
gateways:
- smart-id/smartid-gateway
http:
- match:
- uri:
prefix: /api
route:
- destination:
host: bus-proxy.smart-id.svc.cluster.local
port:
number: 8080
我希望它可以与ingress-ip:ingress-port / api / my-function(方法POST)一起使用。但是,它返回错误500, bus-proxy 的POD也会打印日志(我认为请求已成功发送到 bus-proxy ,但可以通过 bus-id )。
答案 0 :(得分:2)
首先,如果使用Istio在AKS中运行所有应用程序,我建议您按照AKS在Install and use Istio in Azure Kubernetes Service (AKS)中提供的步骤安装Istio。
现在,看看AKS提供的示例here,您需要了解以下几点:
Istio本身具有代理。因此,您需要选择使用哪个或 使用两个代理,但是您需要确保它支持两个代理。
如果您使用Istio的代理,则还需要像示例一样为应用程序的名称空间启用istio-injection
:
kubectl label namespace voting istio-injection=enabled
此标签指示Istio自动将istio代理作为边车注入该名称空间中的所有pod中。并且您应该在ingress.yaml中为虚拟服务使用正确的网关。
答案 1 :(得分:0)
我的问题不在部署中。问题在于内部2个服务之间的连接,它们被传递元数据所困扰。 如果您使用的是 gRPC ,请检查白元数据白名单。