代码之家  ›  专栏  ›  技术社区  ›  Andrew D.

Istio使用Kubernetes服务离开

  •  1
  • Andrew D.  · 技术社区  · 8 年前

    (客户端/服务器使用Istio 0.5.1、kubectl 1.9.1/1.9.0、minikube 0.25.0)

    我试图让Istio EgressRules与Kubernetes服务一起工作,但遇到了一些问题。

    我试着用三种方式设置EgressRules:

    1. 指向另一个域的ExternalName服务(如 www.google。com)
    2. 没有选择器但关联 Endpoint对象(对于具有IP地址但没有DNS的服务 名称)
    3. (供比较)没有Kubernetes服务,只有一个EgressRule

    我想我可以使用kubernetes服务的FQDN作为基于HTTP的EgressRule目标服务(如 ext-service.default.svc.cluster.local ),这就是我为ExternalName服务以及没有选择器但有关联Endpoints对象的服务所尝试的。

    对于前者,我创建了以下内容 yaml 文件:

    kind: Service
    apiVersion: v1
    metadata:
      name: ext-service
    spec:
      type: ExternalName
      externalName: www.google.com
    ---
    apiVersion: config.istio.io/v1alpha2
    kind: EgressRule
    metadata:
      name: ext-egress-rule
    spec:
      destination:
        service: ext-service.default.svc.cluster.local
      ports:
        - port: 443
          protocol: https
    

    对于后者,我创建了这个 亚马尔 文件(我刚刚ping了google并抓取了IP地址):

    kind: Endpoints
    apiVersion: v1
    metadata:
      name: ext-service
    subsets:
      - addresses:
          - ip: 216.58.198.78
        ports:
          - port: 443
    ---
    kind: Service
    apiVersion: v1
    metadata:
      name: ext-service
    spec:
      ports:
      - protocol: TCP
        port: 443
        targetPort: 443
    ---
    apiVersion: config.istio.io/v1alpha2
    kind: EgressRule
    metadata:
      name: ext-service-egress-rule
    spec:
      destination:
        service: ext-service.default.svc.cluster.local
      ports:
        - port: 443
          protocol: https
    

    在这两种情况下,在应用程序代码中,我访问:

    http://ext-service.default.svc.cluster.local:443
    

    我的假设是,交通流量如下:

    [[ app -> envoy proxy -> (tls origination) -> kubernetes service ]] -> external service
    

    哪里 [[ ... ]] 是服务网格(以及Kubernetes集群)的边界

    结果:

    • 这个 ExternalName 服务 几乎 工作如期进行,但它将我带到了Google的404页面(有时响应似乎是空的,不知道如何具体复制其中一个)
    • 带有Endpoint对象的服务不起作用,而是打印此消息(通过Golang发出请求时,但我认为这无关紧要):

      收到 http://ext-service.default.svc.cluster.local:443 :EOF

      这有时也会给出一个空洞的回答。

    我想使用Kubernetes服务(即使是用于外部流量),原因如下:

    1. 您不能将IP地址用于EgressRule的目标服务。从…起 Egress Rules configuration :“出口规则的目标…可以是完全限定的或通配符域名”。
    2. 对于没有域名的外部服务(一些prem legacy/monolith服务上没有DNS名称),我希望应用程序能够通过kube DNS(或与Istio相关的类似名称)访问它们,而不是通过IP地址。
    3. (与前一个相关)我喜欢Kubernetes服务提供的额外抽象层,因此我可以在不更改EgressRule的情况下更改底层目的地(除非我弄错了,这不是构建这个的正确方法)。EgressRule是否意味着完全替代Kubernetes服务进行外部通信,而不创建额外的Kubernetes服务?

    使用 https:// 应用程序中的代码不是一个选项,因为由于kube dns名称与证书上的任何名称都不匹配,因此请求必须禁用TLS验证。它也不会被观察到。

    如果我使用以下EgressRule(没有任何Kubernetes服务),通过 http://www.google.com:443 工作正常,获得了我所期望的准确html表示:

    apiVersion: config.istio.io/v1alpha2
    kind: EgressRule
    metadata:
      name: google-egress-rule
    spec:
      destination:
        service: www.google.com
      ports:
        - port: 443
          protocol: https
    

    我看到有一个TCP EgressRule,但我不想为每个IP块指定规则。从…起 TCP Egress :“在TCP出口规则中,与基于HTTP的出口规则相反,目的地由IP或CIDR表示法中的IP块指定。”。

    此外,我仍然希望L7而不是L4提供基于HTTP的可观察性,因此我更喜欢基于HTTP的出口。(对于TCP出口,“应用程序发起的HTTPS流量将被Istio视为不透明TCP”)。

    任何帮助获得一个Kubernetes服务作为EgressRule的“目的地服务”(或者帮助理解为什么在这种情况下这是不必要的)都是非常感谢的。谢谢

    1 回复  |  直到 8 年前
        1
  •  1
  •   Vadim Eisenberg    8 年前

    解决方案是:

    1. 定义Kubernetes ExternalName服务以指向www.google。com公司
    2. 不要定义任何出口规则
    3. 创建路由器文件以设置主机标头。

    在您的情况下,使用端口和协议定义ExternalName服务:

    kind: Service
    apiVersion: v1
    metadata:
      name: ext-service
    spec:
      type: ExternalName
      externalName: www.google.com
       ports:
       - port: 80
       # important to set protocol name
       name: http
    ---
    

    定义HTTP重写路由规则以设置主机标头:

    apiVersion: config.istio.io/v1alpha2
    kind: RouteRule
    metadata:
      name: externalgoogle-rewrite-rule
      #namespace: default
    spec:
      destination:
        name: ext-service
      rewrite:
        authority: www.google.com
    ---
    

    然后使用访问它 curl ,例如: curl ext-service

    如果没有路由规则,请求将到达google。com,主机标头为 ext-service 。自从google之后,web服务器不知道在哪里转发这样的请求。com没有这样的虚拟主机。这就是您所经历的:

    它把我带到了谷歌的404页面

    推荐文章