0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

关于K8s最详细的解析

Linux爱好者 来源:CSDN技术社区 作者:stackpush 2021-04-08 13:55 次阅读

一个目标:容器操作;两地三中心;四层服务发现;五种Pod共享资源;六个CNI常用插件;七层负载均衡;八种隔离维度;九个网络模型原则;十类IP地址;百级产品线;千级物理机;万级容器;相如无亿,K8s有亿:亿级日服务人次。

一个目标:容器操作

Kubernetes(k8s)是自动化容器操作的开源平台。这些容器操作包括:部署、调度和节点集群间扩展。

具体功能:

自动化容器部署和复制。

实时弹性收缩容器规模。

容器编排成组,并提供容器间的负载均衡。调度:容器在哪个机器上运行。

组成:

kubectl:客户端命令行工具,作为整个系统的操作入口。

kube-apiserver:以REST API服务形式提供接口,作为整个系统的控制入口。

kube-controller-manager:执行整个系统的后台任务,包括节点状态状况、Pod个数、Pods和Service的关联等。

kube-scheduler:负责节点资源管理,接收来自kube-apiserver创建Pods任务,并分配到某个节点。

etcd:负责节点间的服务发现和配置共享。

kube-proxy:运行在每个计算节点上,负责Pod网络代理。定时从etcd获取到service信息来做相应的策略。

kubelet:运行在每个计算节点上,作为agent,接收分配该节点的Pods任务及管理容器,周期性获取容器状态,反馈给kube-apiserver。

DNS:一个可选的DNS服务,用于为每个Service对象创建DNS记录,这样所有的Pod就可以通过DNS访问服务了。下面是K8s的架构拓扑图:

3b2e3086-97c4-11eb-8b86-12bb97331649.jpg

两地三中心

两地三中心包括本地生产中心、本地灾备中心、异地灾备中心。

3b392d42-97c4-11eb-8b86-12bb97331649.jpg

两地三中心要解决的一个重要问题就是数据一致性问题。k8s使用etcd组件作为一个高可用、强一致性的服务发现存储仓库。用于配置共享和服务发现。

它作为一个受到Zookeeper和doozer启发而催生的项目。除了拥有他们的所有功能之外,还拥有以下4个特点:

简单:基于http+json的api让你用curl命令就可以轻松使用。

安全:可选SSL客户认证机制。

快速:每个实例每秒支持一千次写操作。

可信:使用Raft算法充分实现了分布式。四层服务发现

先一张图解释一下网络七层协议:

3b44af28-97c4-11eb-8b86-12bb97331649.jpg

k8s提供了两种方式进行服务发现:

环境变量:当创建一个Pod的时候,kubelet会在该Pod中注入集群内所有Service的相关环境变量。需要注意的是,要想一个Pod中注入某个Service的环境变量,则必须Service要先比该Pod创建。这一点,几乎使得这种方式进行服务发现不可用。

比如,一个ServiceName为redis-master的Service,对应的ClusterIP:Port为10.0.0.11:6379,则对应的环境变量为:

3b56a7e6-97c4-11eb-8b86-12bb97331649.jpg

DNS:可以通过cluster add-on的方式轻松的创建KubeDNS来对集群内的Service进行服务发现。

以上两种方式,一个是基于tcp,众所周知,DNS是基于UDP的,它们都是建立在四层协议之上。

五种Pod共享资源

Pod是K8s最基本的操作单元,包含一个或多个紧密相关的容器,一个Pod可以被一个容器化的环境看作应用层的“逻辑宿主机”;一个Pod中的多个容器应用通常是紧密耦合的,Pod在Node上被创建、启动或者销毁;每个Pod里运行着一个特殊的被称之为Volume挂载卷,因此他们之间通信和数据交换更为高效,在设计时我们可以充分利用这一特性将一组密切相关的服务进程放入同一个Pod中。

3b62b5ae-97c4-11eb-8b86-12bb97331649.jpg

同一个Pod里的容器之间仅需通过localhost就能互相通信。

一个Pod中的应用容器共享五种资源:

PID命名空间:Pod中的不同应用程序可以看到其他应用程序的进程ID。

网络命名空间:Pod中的多个容器能够访问同一个IP和端口范围。

IPC命名空间:Pod中的多个容器能够使用SystemV IPC或POSIX消息队列进行通信。

UTS命名空间:Pod中的多个容器共享一个主机名。

Volumes(共享存储卷):Pod中的各个容器可以访问在Pod级别定义的Volumes。Pod的生命周期通过Replication Controller来管理;通过模板进行定义,然后分配到一个Node上运行,在Pod所包含容器运行结束后,Pod结束。

Kubernetes为Pod设计了一套独特的网络配置,包括:为每个Pod分配一个IP地址,使用Pod名作为荣期间通信的主机名等。

六个CNI常用插件

CNI(Container Network Interface)容器网络接口,是Linux容器网络配置的一组标准和库,用户需要根据这些标准和库来开发自己的容器网络插件。CNI只专注解决容器网络连接和容器销毁时的资源释放,提供一套框架,所以CNI可以支持大量不同的网络模式,并且容易实现。

下面用一张图表示六个CNI常用插件:

3b998d36-97c4-11eb-8b86-12bb97331649.jpg

七层负载均衡

提负载均衡就不得不先提服务器之间的通信。

IDC(Internet Data Center),也可称 数据中心、机房,用来放置服务器。IDC网络是服务器间通信的桥梁。

3ba405e0-97c4-11eb-8b86-12bb97331649.jpg

上图里画了很多网络设备,它们都是干啥用的呢?

路由器、交换机、MGW/NAT都是网络设备,按照性能、内外网划分不同的角色。

内网接入交换机:也称为TOR(top of rack),是服务器接入网络的设备。每台内网接入交换机下联40-48台服务器,使用一个掩码为/24的网段作为服务器内网网段。

内网核心交换机:负责IDC内各内网接入交换机的流量转发及跨IDC流量转发。

MGW/NAT:MGW即LVS用来做负载均衡,NAT用于内网设备访问外网时做地址转换。

外网核心路由器:通过静态互联运营商或BGP互联美团统一外网平台。先说说各层负载均衡:

二层负载均衡:基于MAC地址的二层负载均衡。

三层负载均衡:基于IP地址的负载均衡。

四层负载均衡:基于IP+端口的负载均衡。

七层负载均衡:基于URL等应用层信息的负载均衡。这里用一张图来说说四层和七层负载均衡的区别:

3baef9c8-97c4-11eb-8b86-12bb97331649.jpg

上面四层服务发现讲的主要是k8s原生的kube-proxy方式。K8s关于服务的暴露主要是通过NodePort方式,通过绑定minion主机的某个端口,然后进行pod的请求转发和负载均衡,但这种方式有下面的缺陷:

Service可能有很多个,如果每个都绑定一个node主机端口的话,主机需要开放外围的端口进行服务调用,管理混乱。

无法应用很多公司要求的防火墙规则。理想的方式是通过一个外部的负载均衡器,绑定固定的端口,比如80,然后根据域名或者服务名向后面的Service ip转发,Nginx很好的解决了这个需求,但问题是如果有的心得服务加入,如何去修改Nginx的配置,并且加载这些配置?Kubernetes给出的方案就是Ingress。这是一个基于7层的方案。

八种隔离维度

3bb7c832-97c4-11eb-8b86-12bb97331649.jpg

K8s集群调度这边需要对上面从上到下从粗粒度到细粒度的隔离做相应的调度策略。

九个网络模型原则

K8s网络模型要符合4个基础原则,3个网络要求原则,1个架构原则,1个IP原则。

每个Pod都拥有一个独立的IP地址,而且假定所有Pod都在一个可以直接连通的、扁平的网络空间中,不管是否运行在同一Node上都可以通过Pod的IP来访问。

K8s中的Pod的IP是最小粒度IP。同一个Pod内所有的容器共享一个网络堆栈,该模型称为IP-per-Pod模型。

Pod由docker0实际分配的IP

Pod内部看到的IP地址和端口与外部保持一致

同一个Pod内的不同容器共享网络,可以通过localhost来访问对方的端口,类似同一个VM内不同的进程。IP-per-Pod模型从端口分配、域名解析、服务发现、负载均衡、应用配置等角度看,Pod可以看做是一台独立的VM或物理机。

所有容器都可以不用NAT的方式同别的容器通信。

所有节点都可以在不同NAT方式下同所有容器心痛,反之亦然。

容器的地址和别人看到的地址是同一个地址。要符合下面的架构:

3bcf4ed0-97c4-11eb-8b86-12bb97331649.jpg

由上图架构引申出来IP概念从集群外部到集群内部

3bf60fe8-97c4-11eb-8b86-12bb97331649.jpg

十类IP地址

大家都知道IP地址分为ABCDE类,另外还有5类特殊用途的IP。

第一类

A 类:1.0.0.0-1226.255.255.255,默认子网掩码/8,即255.0.0.0。

B 类:128.0.0.0-191.255.255.255,默认子网掩码/16,即255.255.0.0。

C 类:192.0.0.0-223.255.255.255,默认子网掩码/24,即255.255.255.0。

D 类:224.0.0.0-239.255.255.255,一般用于组播。

E 类:240.0.0.0-255.255.255.255(其中255.255.255.255为全网广播地址)。E 类地址一般用于研究用途。

第二类

0.0.0.0

严格来说,0.0.0.0 已经不是一个真正意义上的 IP 地址了。它表示的是这样一个集合:所有不清楚的主机和目的网络。这里的不清楚是指在本机的路由表里没有特定条目指明如何到达。作为缺省路由。

127.0.0.1 本机地址。

第三类

224.0.0.1 组播地址。

如果你的主机开启了IRDP(internet路由发现,使用组播功能),那么你的主机路由表中应该有这样一条路由。

第四类

169.254.x.x

使用了 DHCP 功能自动获取了 IP 的主机,DHCP 服务器发生故障,或响应时间太长而超出了一个系统规定的时间,系统会为你分配这样一个 IP,代表网络不能正常运行。

第五类

10.xxx、172.16.x.x~172.31.x.x、192.168.x.x 私有地址。

大量用于企业内部。保留这样的地址是为了避免亦或是哪个接入公网时引起地址混乱。
编辑:lyn

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • IDC
    IDC
    +关注

    关注

    4

    文章

    387

    浏览量

    37169
  • DNS
    DNS
    +关注

    关注

    0

    文章

    216

    浏览量

    19786
  • 负载均衡
    +关注

    关注

    0

    文章

    105

    浏览量

    12354
  • kubernetes
    +关注

    关注

    0

    文章

    223

    浏览量

    8695

原文标题:K8s 超详细总结!

文章出处:【微信号:LinuxHub,微信公众号:Linux爱好者】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    混合云部署k8s集群方法有哪些?

    混合云部署k8s集群方法是首先需在本地与公有云分别建立K8s集群,并确保网络连接。接着,配置kubeconfig文件连接两集群,并安装云服务插件以实现资源互通。然后,编写Deployment文件部署应用,并使用kubectl命令应用至集群。最后,验证应用状态并监控集群性能
    的头像 发表于 11-07 09:37 99次阅读

    Docker和k8s的核心概念

    这是在HWL负责网校云业务线测试时,给同事分享的基础概念文档。
    的头像 发表于 11-04 15:47 134次阅读
    Docker和<b class='flag-5'>k8s</b>的核心概念

    k8s可以部署私有云吗?私有云部署全攻略

    Kubernetes(简称K8S)可以部署私有云。Kubernetes是一个开源的容器编排引擎,能够自动化容器的部署、扩展和管理,使得应用可以在各种环境中高效运行。通过使用Kubernetes,企业可以在自己的数据中心或私有云环境中搭建和管理容器化的应用,实现高度的灵活性和可扩展性。
    的头像 发表于 10-25 09:32 121次阅读

    k8s云原生开发要求

    Kubernetes(K8s)云原生开发对硬件有一定要求。CPU方面,建议至少配备2个逻辑核心,高性能CPU更佳。内存至少4GB,但8GB或更高更推荐。存储需至少20-30GB可用空间,SSD提升
    的头像 发表于 10-24 10:03 158次阅读
    <b class='flag-5'>k8s</b>云原生开发要求

    k8s容器启动失败的常见原因及解决办法

    k8s容器启动失败的问题通常出现在开发者使用Kubernetes进行容器编排时,可能的原因有多种,例如:配置错误、镜像问题、资源限制、依赖问题、网络问题、节点状态异常、其他因素等,以下是对这些常见原因的详细分析:
    的头像 发表于 10-11 10:12 170次阅读

    云服务器部署k8s需要什么配置?

    云服务器部署K8s需要至少2核CPU、4GB内存、50GBSSD存储的主节点用于管理集群,工作节点建议至少2核CPU、2GB内存、20GBSSD。还需安装Docker,选择兼容的Kubernetes版本,配置网络插件,以及确保系统安全、监控和备份措施到位。
    的头像 发表于 10-09 15:31 165次阅读

    纳尼?自建K8s集群日志收集还能通过JMQ保存到JES

    作者:京东科技 刘恩浩 一、背景 基于K8s集群的私有化交付方案中,日志收集采用了ilogtail+logstash+kafka+es方案,其中ilogtail负责日志收集,logstash负责对数
    的头像 发表于 09-30 14:45 182次阅读

    常用的k8s容器网络模式有哪些?

    常用的k8s容器网络模式包括Bridge模式、Host模式、Overlay模式、Flannel模式、CNI(ContainerNetworkInterface)模式。K8s的容器网络模式多种多样
    的头像 发表于 09-19 11:29 196次阅读

    K8S集群中使用JDOS KMS服务对敏感数据安全加密

    基本概念 KMS,Key Management Service,即密钥管理服务,在K8S集群中,以驱动和插件的形式启用对Secret,Configmap进行加密。以保护敏感数据, 驱动和插件需要
    的头像 发表于 08-09 16:00 181次阅读
    <b class='flag-5'>K8S</b>集群中使用JDOS KMS服务对敏感数据安全加密

    K8S学习教程三:在PetaExpress KubeSphere 容器部署 Wiki 系统 wiki.js 并启用中文全文检索

    K8S学习教程(三):在PetaExpress KubeSphere 容器部署 Wiki 系统 wiki.js 并启用中文全文检索  。
    的头像 发表于 07-08 17:03 592次阅读
    <b class='flag-5'>K8S</b>学习教程三:在PetaExpress KubeSphere 容器部署 Wiki 系统 wiki.js 并启用中文全文检索

    K8S学习教程(二):在 PetaExpress KubeSphere容器平台部署高可用 Redis 集群

    并且需要手动重启节点,相较之下,使用 PetaExpress 提供的 Kubernetes(k8s) 服务 进行 Redis 集群的部署,则展现出了显著的优势: 1、安装便捷:使用镜像或者 yaml 配置文件即可一件安装,极大地简化了安装流程 2、缩扩容方便:在 扩容 、 缩容 方面的优点一键伸缩,
    的头像 发表于 07-03 15:30 665次阅读
    <b class='flag-5'>K8S</b>学习教程(二):在 PetaExpress KubeSphere容器平台部署高可用 Redis 集群

    关于STM8S103K3的数据保存问题求解

    关于STM8S103K3的数据保存问题,我用STM8S103K3开发一套温控板小批量投产,现在遇到的问题是,设置报警温度有的时候不能保存(断电后自动归零),并不是都不保存有的就可以保存,不知道是哪的问题,编程器换了也没效果,程序
    发表于 05-10 06:38

    Kubectl核心命令总结:如何快速掌握K8s

    设置 kubectl 命令交互的 kubernetes 集群并修改配置信息。参阅 使用 kubeconfig 文件进行跨集群验证 获取关于配置文件的详细信息。
    的头像 发表于 02-23 14:43 433次阅读
    Kubectl核心命令总结:如何快速掌握<b class='flag-5'>K8s</b>

    K8s容器debug高级技巧

    如果您在 Kubernetes 上运行软件,您会想要在某些时候去调试您所部署的软件的一些方面。对于习惯于使用虚拟机 (VMs) 的人来说能自然使用的一种简单的调试方法,就是连接到一个正在运行的 pod。
    的头像 发表于 01-12 11:31 527次阅读

    K8S落地实践经验分享

    k8s 即 Kubernetes,是一个开源的容器编排引擎,用来对容器化应用进行自动化部署、 扩缩和管理。
    的头像 发表于 01-02 11:45 1025次阅读
    <b class='flag-5'>K8S</b>落地实践经验分享