当前位置:   article > 正文

k8s集群内部服务,调用外部服务出现15秒超时的问题(基于k8s+Istio)_k8s集群超时

k8s集群超时

咱们在k8s集群中的服务,去访问外部服务会有超时时间,这时候处理思路就是创建一个虚拟服务,指向这个外部服务地址,也就是变相的将外部服务放在istio管理下,主要应对超时问题。

步骤概括:

1、建serviceentries.networking.istio.io,
2、然后建一个virtualservices.networking.istio.io,
3、属于将外部服务纳入到istio管理,然后调大超时时间。

具体实现步骤如下:
1、创建一个 ServiceEntry.yaml 文件,作为外部服务的服务入口。内容如下:

apiVersion: networking.istio.io/v1alpha3
kind: ServiceEntry
metadata:
 name: TestService
spec:
 hosts:
 - TestService.xxx.com
 endpoints:
 - address: xx.xx.xx.xx
 ports:
 - number: 80
   name: http
   protocol: HTTP
 resolution: DNS
 location: MESH_EXTERNAL
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15

创建完文件,给他 kubectl apply -f ServiceEntry.yaml 执行一下,让他在集群中生成我们自定义的这个服务入口。

2、创建 VirtualService.yaml 文件,作为外部服务的虚拟服务。内容如下:

apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
  name: TestService
spec:
  hosts:
  - TestService.xxx.com
  http:
  - timeout: 600s
    route:
    - destination:
        host: TestService.xxx.com
      weight: 100"
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13

上边配置了超时时间是600s,各位可以根据需要进行配置。
然后依旧给他 kubectl apply -f VirtualService.yaml 执行一下,让他在集群中生成我们自定义的这个虚拟服务。

注意:host不能设置为ip,访问外部服务只能通过host,否则设置超时时间无效。"
  • 1

此时内部服务去访问外部服务,不出意外的话是访问不通的。因为ServiceEntry中的host,有着在pod中无法解析的问题。下面开始处理这个问题。

3、修改coredns的configmap。
命令:kubectl edit cm -n kube-system coredns

Corefile: |
    .:53 {
        errors
        health
        ready
        kubernetes cluster.local in-addr.arpa ip6.arpa {
          pods insecure
          upstream /etc/resolv.conf
          fallthrough in-addr.arpa ip6.arpa
        }
        hosts {
          xx.xx.xx.xx xx.xxx.com
          yy.yy.yy.yy yy.xxx.com
          此处加上自己的服务的ip和域名,别的全不用动!
          fallthrough
        }
        prometheus :9153
        forward . /etc/resolv.conf {
          prefer_udp
        }
        cache 30
        loop
        reload
        loadbalance
    }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25

3(续)、补充一个快速方法,不推荐使用。
在deployment中添加对应的配置(此处有问题,每个服务要访问都需要加,因此不推荐使用这个方案,尽量使用上边的正规方案)。
在deployment中添加配置:
hostAliases:
- hostnames:
- xxx.xxx.com
ip: xx.xx.xx.xx

4、若是集群同时使用了nodelocaldns(旧k8s,现在的k8s和istio都没这个问题),则继续修改:

先查询 kubectl get service -n kube-system -o wide 中coredns的地址,然后
在查询kubectl get cm -n kube-system nodelocaldns -o yaml,看看forward . 后边是不是全为coredns中的地址,如果不是,则继续:
命令:kubectl edit cm -n kube-system nodelocaldns

 .:53 {
        errors
        cache 30
        reload
        loop
        bind 169.254.25.10
        forward . 10.233.0.3 {               #forward . 后边全部改为此为codedns服务的ip()
            force_tcp
        }
        prometheus :9253
    }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

注意:在代码中访问时,请访问域名。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/不正经/article/detail/73333
推荐阅读
相关标签
  

闽ICP备14008679号