kubernetes中无法访问集群外数据库问题分析及解决

文章讲述了在Kubernetes环境中,由于Istio的global.outboundTrafficPolicy.mode配置为REGISTRY_ONLY导致无法访问外部数据库的问题。通过添加ServiceEntry解决了这个问题,允许了对网格外部服务的访问。
摘要由CSDN通过智能技术生成

kubernetes中无法访问集群外数据库问题分析及解决

结论

       先说结论,是因为k8s中使用了服务网格 istio,Istio有一个安装选项,global.outboundTrafficPolicy.mode,它配置 Sidecar 对外部服务(那些没有在Istio 的内部服务注册中定义的服务)的处理方式。如果这个选项设置为 ALLOW_ANY, Istio代理允许调用未知的服务。如果这个选项设置REGISTRY_ONLY,那么 Istio 代理会阻止任何没有在网格中定义的 HTTP服务或 service entry 的主机。ALLOW_ANY 是默认值,不控制对外部服务的访问,方便你快速地评估Istio。尽管这为入门 Istio 带来了方便,但是,通常情况下,配置更严格的控制是更可取的。当k8s平台运维人员配置成REGISTRY_ONLY,就导致了网格内服务都访问不到网格外的数据库导致。
       通过设置ServiceEntry可以解决该问题。

问题描述

       系统突然全部转圈圈,前端返回超时。

问题分析

  1. 通过增加后端接口日志,发现是在查询数据库后一直没有返回,初步定位集群和数据库之间无法通信。
  2. 测试数据库连通性,在集群pod中使用命令测试与数据库ip端口是否连通
    nc -zv 10.xxx.xxx.xxx 3306
    
    测试后发现是连同的。
  3. 集群内部署新数据库,应用切换的新数据库,可返回数据,应用正常。 排除应用程序代码问题
  4. 在集群上重新创建一个服务,部署并选择上述应用程序代码的镜像,通过postman接口访问测试,发现也是可以通的,应用正常。
  5. 对比4中的部署的yalm与原有问题的部署yalm,发现有几个属性配置差异,其中一个即为:sidecar.istio.io/inject: ‘true’,通过增加该属性测试,最终定位为该 istio问题。

问题解决

       通过增加ServiceEntry来允许外部访问。

kubectl apply -f - <<EOF
apiVersion: networking.istio.io/v1alpha3
kind: ServiceEntry
metadata:
  name: mysqldb
spec:
  hosts:
  - mysqldb.svc.remote
  ports:
  - number: 3306
    name: mysql
    protocol: MySQL
  location: MESH_EXTERNAL
  resolution: STATIC
  endpoints:
  - address: 10.xxx.xxx.xxx
    ports:
      mysql: 3306
EOF
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

祺稷

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值