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

咱们在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

创建完文件,给他 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"

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

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

此时内部服务去访问外部服务,不出意外的话是访问不通的。因为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
    }

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
    }

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

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值