应用在k8s上运行的几种网络模式

简介: 应用部署在k8s上,首先想到的是应用k8s的默认service模式配置。 应用通过service向集群内部(ClusterIP)和集群外部(NodePort)暴露服务。k8s中的其他应用通过kube-dns提供的dns解析功能,访问servicename:port即可访问service后面的pod的服务。

应用部署在k8s上,首先想到的是应用k8s的默认service模式配置。

应用通过service向集群内部(ClusterIP)和集群外部(NodePort)暴露服务。k8s中的其他 应用通过kube-dns提供的dns解析功能,访问servicename:port即可访问service后面的pod的服务。这需要两个应用服务之间的交互不需要记录对方的hostname或者IP,例如,假如应用服务通过socket连接到另一个应用服务,并通过记录他的IP或者Hostname,以便下次连接时作为验证对方。这样的话会出现servicename:port与podname:port或者podIP:port不符。

k8s hostnetwork配置

57c7e484779d49f1b5e149bc7e53e50df6eb390757c7e484779d49f1b5e149bc7e53e50df6eb3907

解决servicename:port与podname:port或者podIP:port不符的问题,可以把被验证的应用使用hostnetwork。

应用与宿主机共享网络空间,也就是k8s节点的IP,端口占用与宿主机一样。这样应用的IP就是宿主机的IP,与另一个应用的连接也不经过service IP这一层。另一个应用仍然采用kubernetes的pod网络模型,为使使用hostnetwork的应用能对其他应用的service name进行DNS解析,需要设置参数hostNetwork: true和dnsPolicy: ClusterFirstWithHostNet。

该配置的缺点:应用的网络与宿主机一样,需保证应用需要监听的网络端口在宿主机上没有被占用。并且无法使用容器漂移,动态伸缩特性。

k8s headless service配置

解决servicename:port与podname:port或者podIP:port不符的问题,还有一种方法,就是把被验证的应用配置使用headless service。headless service即是把service type为ClusterIP的service配置spec.clusterIP为None,这样的话就不会为其分配serviceIP,kube-dns解析servicename:port就会变成podIP:port。在把servicename配置和pod的hostname一样,这样的kube-dns解析servicename:port就与podhostname:port一样。达到了获得实际podIP的目的。相比hostnetwork配置,这个配置没有它所具有的缺点。

k8s statefulset headless service配置

上面提到headless service可以解决servicename:port与podname:port或者podIP:port不符的问题。这是针对一个应用pod在service后面,另一个应用pod在service的前面。现在假设同一个service后面的pod之间需要获悉对方的hostname或者podIP进行通信,怎么办?例如,storm的worker组件之间需要通过hostname通信,我们想要能快速伸缩worker组件,因此把所有的worker放到同一个service后面。

一种解决办法就是使用statefulset加headless service配置,这种配置kube-dns可以解析

podname.servicename.namespacename.svc.cluster.local对应到podIP。在同一个statefulset的pod的podname都是podname-0,podname-1,podname-2等数字递增的命名。对于podname-0可以解析

podname-1.servicename.namespacename.svc.cluster.local到podname-1的podIP。

在podname-0中使用命令

nslookup podname-1

会解析podname-1.namespacename.svc.cluster.local。因此需要我们修改/etc/resolv.conf

文件

在search 后面加上 servicename.namespacename.svc.cluster.local,这样就达到了解析到

podname-1.servicename.namespacename.svc.cluster.local的目的。

具体做法就是在statefulset的pod配置中加入lifecycle的postStart配置

lifecycle:

postStart:

exec:

command:

- /bin/sh

- -c

- >

if [ -z "$(grep servicename /etc/resolv.conf)" ]; then

sed "s/^search \([^ ]\+\)/search servicename.\1 \1/" /etc/resolv.conf > /etc/resolv.conf.new;

cat /etc/resolv.conf.new > /etc/resolv.conf;

rm /etc/resolv.conf.new;

fi;

至此,headless service后面的statefulset的pod之间可以相互通信了。

本文转自CSDN-应用在k8s上运行的几种网络模式

相关实践学习
深入解析Docker容器化技术
Docker是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux机器上,也可以实现虚拟化,容器是完全使用沙箱机制,相互之间不会有任何接口。Docker是世界领先的软件容器平台。开发人员利用Docker可以消除协作编码时“在我的机器上可正常工作”的问题。运维人员利用Docker可以在隔离容器中并行运行和管理应用,获得更好的计算密度。企业利用Docker可以构建敏捷的软件交付管道,以更快的速度、更高的安全性和可靠的信誉为Linux和Windows Server应用发布新功能。 在本套课程中,我们将全面的讲解Docker技术栈,从环境安装到容器、镜像操作以及生产环境如何部署开发的微服务应用。本课程由黑马程序员提供。     相关的阿里云产品:容器服务 ACK 容器服务 Kubernetes 版(简称 ACK)提供高性能可伸缩的容器应用管理能力,支持企业级容器化应用的全生命周期管理。整合阿里云虚拟化、存储、网络和安全能力,打造云端最佳容器化应用运行环境。 了解产品详情: https://www.aliyun.com/product/kubernetes
相关文章
|
10月前
|
机器学习/深度学习 PyTorch TensorFlow
卷积神经网络深度解析:从基础原理到实战应用的完整指南
蒋星熠Jaxonic,深度学习探索者。深耕TensorFlow与PyTorch,分享框架对比、性能优化与实战经验,助力技术进阶。
|
11月前
|
JavaScript
Vue中Axios网络请求封装-企业最常用封装模式
本教程介绍如何安装并配置 Axios 实例,包含请求与响应拦截器,实现自动携带 Token、错误提示及登录状态管理,适用于 Vue 项目。
439 1
|
监控 安全 Shell
管道符在渗透测试与网络安全中的全面应用指南
管道符是渗透测试与网络安全中的关键工具,既可用于高效系统管理,也可能被攻击者利用实施命令注入、权限提升、数据外泄等攻击。本文全面解析管道符的基础原理、实战应用与防御策略,涵盖Windows与Linux系统差异、攻击技术示例及检测手段,帮助安全人员掌握其利用方式与防护措施,提升系统安全性。
527 6
|
负载均衡 算法 安全
基于Reactor模式的高性能网络库之线程池组件设计篇
EventLoopThreadPool 是 Reactor 模式中实现“一个主线程 + 多个工作线程”的关键组件,用于高效管理多个 EventLoop 并在多核 CPU 上分担高并发 I/O 压力。通过封装 Thread 类和 EventLoopThread,实现线程创建、管理和事件循环的调度,形成线程池结构。每个 EventLoopThread 管理一个子线程与对应的 EventLoop(subloop),主线程(base loop)通过负载均衡算法将任务派发至各 subloop,从而提升系统性能与并发处理能力。
613 3
|
11月前
|
机器学习/深度学习 人工智能 算法
卷积神经网络深度解析:从基础原理到实战应用的完整指南
蒋星熠Jaxonic带你深入卷积神经网络(CNN)核心技术,从生物启发到数学原理,详解ResNet、注意力机制与模型优化,探索视觉智能的演进之路。
891 11
|
11月前
|
安全 测试技术 虚拟化
VMware-三种网络模式原理
本文介绍了虚拟机三种常见网络模式(桥接模式、NAT模式、仅主机模式)的工作原理与适用场景。桥接模式让虚拟机如同独立设备接入局域网;NAT模式共享主机IP,适合大多数WiFi环境;仅主机模式则构建封闭的内部网络,适用于测试环境。内容简明易懂,便于理解不同模式的优缺点与应用场景。
1554 0
|
缓存 索引
基于Reactor模式的高性能网络库之缓冲区Buffer组件
Buffer 类用于处理 Socket I/O 缓存,负责数据读取、写入及内存管理。通过预分配空间和索引优化,减少内存拷贝与系统调用,提高网络通信效率,适用于 Reactor 模型中的异步非阻塞 IO 处理。
395 3
|
12月前
|
数据采集 存储 数据可视化
Python网络爬虫在环境保护中的应用:污染源监测数据抓取与分析
在环保领域,数据是决策基础,但分散在多个平台,获取困难。Python网络爬虫技术灵活高效,可自动化抓取空气质量、水质、污染源等数据,实现多平台整合、实时更新、结构化存储与异常预警。本文详解爬虫实战应用,涵盖技术选型、代码实现、反爬策略与数据分析,助力环保数据高效利用。
639 0
|
安全 Linux
利用Libevent在CentOS 7上打造异步网络应用
总结以上步骤,您可以在CentOS 7系统上,使用Libevent有效地构建和运行异步网络应用。通过采取正确的架构和代码设计策略,能保证网络应用的高效性和稳定性。
298 0

热门文章

最新文章