k8s~跨namespace的service相互访问
在k8s里,你可以通过服务名去访问相同namespace里的服务,然后服务可以解析到对应的pod,从而再由pod转到对应的容器里,我们可以认为这个过程有两个port的概念,service port 就是服务的port,在k8s配置文件里用port
表示,还有一个是pod和容器的port,用targetPort表示,其中pod和容器的port你可以认为它是一个。
多namespace的service场景
我们通常会把mysql,redis,rabbitmq,mongodb这些公用组件放在一个namespace里,或者每个公用组件都有自己的namespace,而你的业务组件会统一放在自己的namespace里,这时就涉及到了跨namespace的数据通讯问题。
k8s的服务名DNS解析
Kubernetes 目前使用的kube-dns来实现集群内部的service dns记录解析。默认情况下/etc/resolv.conf里,它的内容是统一的格式。
/ # more /etc/resolv.conf
nameserver 172.19.0.10
search saas.svc.cluster.local svc.cluster.local cluster.local
options ndots:5
search doamin列表默认情况下,它只包含本地域名
。这可以通过在search关键字后面列出所需的域搜索路径来添加。kubernetes为每个容器配置默认是${namespace}.svc.cluster.local
svc.cluster.local
cluster.local
。在一次dns域名查询时,将会尝试使用每个search doamin依次搜索少于ndots点(默认值为1)的解析器查询,直到找到匹配项。对于具有多个子域的环境,建议调整选项ndots:n,以避免man-in-the-middle攻击和root-dns-servers的不必要通信。
noots:5
这个我们可以把它理解成服务名dns解析的层次,例如{服务名}是一级,而{服务名}.{命名空间}为二层,{服务名}.{命名空间}.svc.cluster.local是第三层,上面的配置一共有5层,同时也开启了5层,这样做可以保证最大限度的找到你的服务,但对于解析的性能是有影响的。
请注意,如果搜索域对应的服务器不是本地的,那么这个查询过程可能会很慢,并且会产生大量的网络流量。如果其中一个搜索域域没有可用的服务器,则查询将超时。
同一集群跨namespace访问
如果你要连接namespace是redis的,服务名是redis-master的服务,你可以这样去配置你的连接:
spring:
profiles: redis-prod
redis:
host: redis-master.redis
port: 6379
password: 123456
database: 1
它采用了服务名+命名空间的格式,如果是相同的namespace,可以直接使用服务名来解析。
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 一个奇形怪状的面试题:Bean中的CHM要不要加volatile?
· [.NET]调用本地 Deepseek 模型
· 一个费力不讨好的项目,让我损失了近一半的绩效!
· .NET Core 托管堆内存泄露/CPU异常的常见思路
· PostgreSQL 和 SQL Server 在统计信息维护中的关键差异
· CSnakes vs Python.NET:高效嵌入与灵活互通的跨语言方案对比
· DeepSeek “源神”启动!「GitHub 热点速览」
· 我与微信审核的“相爱相杀”看个人小程序副业
· Plotly.NET 一个为 .NET 打造的强大开源交互式图表库
· 上周热点回顾(2.17-2.23)
2013-12-17 爱上MVC~为CheckBoxFor和RadioButtonFor加个扩展方法吧(希望MVC5把这方法收纳——呵呵)
2013-12-17 不忘本~抽象类
2012-12-17 数据结构~工作流的设计(链表结构)
2012-12-17 爱上MVC3~实体级标准验证
2011-12-17 LINQ TO SQL三层架构~更新操作
2011-12-17 LINQ TO SQL三层架构~添加操作