如何使用Istio Ingress公开AKS中的服务?

时间:2019-08-05 10:10:34

标签: azure kubernetes istio

我曾经使用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 )。

2 个答案:

答案 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 ,请检查白元数据白名单。