发布信息

细说kubernetes (细说昆明工作室品茶)

     2024-10-22 14:07:04     577

本文目录导航:

细说kubernetes - 为什么是pod?

k8s作为如今最火的容器编排调度平台,好用我也就不用多说了。

当咱们初识k8s的时刻一个新的概念就到了咱们眼前,那就是pod。

咱们在经常使用了之后也就慢慢的接受了pod这个物品,然而你有没有想过,为什么是pod?k8s为什么会有这样的设计?当天咱们就来细细说说这个pod

首先咱们来回想看看k8s的架构图是什么样子的

从架构图中咱们可以看到,整个k8s的设计架构有以下几个要点:

当然其余组件都十分关键,这个咱们以后再说,咱们当天就来看看主角“pod”

一开局用的时刻我就猎奇为什么k8s要弄出一个pod,由于咱们一开局经常使用的是docker,操作的是docker容器,构建的也是docker镜像,为什么不间接调度docker容器就好了,这样粒度不是愈加粗疏,调度也会愈加繁难吗? 咱们在经常使用k8s之前也经常使用过docker-compose,从另一个角度说,这也是一种容器的控制,看起来也挺好的。 上方咱们就来说说pod

从上方的图你大略可以感遭到pod在k8s中其实是一个什么样的角色。

咱们假设经常使用虚构机,那么上方就会有一系列的服务这些服务或许会有一些依赖,而这样的依赖就似乎在主机中运转的一个个进程组,往往其中也有着相关的依赖,而pod中的容器也是一样的情理,其中也会有相似这样的依赖,为了更好的形容和控制这样的依赖,于是就有了pod。

其实这样的理念往往可以类比出很多这样的设计。

必定会有这样的相关吗?我的觉得是,在现代技术服务的开发的环节中,这样的相关是无法防止的。

我上方来举几个例子。

咱们知道 java 的 web 运行往往要求部署在tomcat这样的容器之中,在 springboot 还没有产生以前,要求自己启动一个 tomcat 容器,而后将要求部署的运行打包部署到容器中去。

在以前你或许会想着,将 javaweb 打包一个war,而后编写一个 dockerfile 将 war 包cp到 tomcat 中的 webapp 目录中。

然而这样带来的就是每次降级颁布的时刻,镜像会很大,由于每次构建都会有一个基础的tomcat镜像。

而在k8s经常使用的时刻,会有的设计的是,将tomcat作为一个不变的镜像(它也不应该扭转)而把 war 包作为另外一个容器,而这样个容器同时挂载同一个目录,将 webapp 挂载的目录与 war包挂载的目录相反来到达目标,而后将他们放到同一个 pod 中。

相似的操作还有:外面说的就是前端静态页面和 nginx 的相关。

上方援用官方设计理念中的一句话:“ 比如你运转一个操作系统发行版的软件仓库,一个Nginx容器用来颁布软件,另一个容器专门用来从源仓库做同步,这两个容器的镜像不太或许是一个团队开发的,然而他们一块儿上班能力提供一个微服务;这种状况下,不同的团队各自开发构建自己的容器镜像,在部署的时刻组分解一个微服务对外提供服务。 ”

在经常使用 docker 部署名目标时刻会遇到一个疑问就是日志耐久化的疑问,由于 docker 容器假设被删除的话,其中的文件也会被删除,那么咱们的日志文件同时也会被删除,也就是说咱们必定要将日志耐久化。

最经常出现的形式是,将日志存储的目录挂载到宿主机上,这样容器被删除的时刻日志不会被删除。 而在k8s中经常出现的日志处置架构是怎样样的呢?

经常使用的是 sidecar,这个是什么呢?其实就是一个辅佐性质的容器,同时与主容器放在同一个 pod 中,读取主容器挂载进去的日志目录。

其实后续还可以做更多的操作,比如日志发送es等等。

总之咱们可以看到,在一个pod中的容器相关是十分亲密的,他们可以领有同一个目录,甚至可以领有同一个网络,可以领有相互的服务,这样的相关我听过的名词叫做“超亲密相关”。

就相似一对夫妻之间的相关了。

由于在如今的多说运行中,曾经简直做不到一团体顶天立地了,总是会有各种各样的依赖,依赖一些组件,依赖一些工具,依赖一些网络服务等等,一个进程组有很多的进程相互协助来最终成功性能一样。

这样的相关太过经常出现,于是k8s就将它设计为了pod。

假设你曾经对docker的成功比拟相熟,其实pod的成功并不复杂。(假设对docker成功不相熟可以翻看之前的博客) 其实pod是一个逻辑上的概念,其实pod做的事件很繁难:

其实k8s做的就是初始化一个infra的容器(这是一个很小的容器),应用这个容器去当先占用要求经常使用的 Namespace ,而后在将用户指定的容器加载出去,同时经常使用的就是相反的 Namespace 了。(假设有 InitContainer 会优先按顺序初始化它,图上就不做说明了)

这样共享网络应该是没有疑问了,那么要共享Volume也很繁难。

pod 只有要将 Volume 目录挂载到宿主机,让外部的容器挂载这个目录就可以了。

再来说说pod还有哪些性能,这些性能也是k8s为什么设计pod的要素之一

经过Probe:LivenessProbe或许ReadinessProbe,可以探测运行能否处于肥壮形态,假设不肥壮做出相关的反响。

这就好比k8s可以活期的帮你监控、维持一整个运行的肥壮。

其真实咱们看来,很多时刻服务挂了,要求重启,要求做高可用,那么nginx呢?tomcat呢?也是一样的。

所以pod的肥壮能保障整个服务的所有肥壮经常使用。

咱们可以经过给Pod参与/ingress-bandwidth和/egress-bandwidth这两个annotation来限度Pod的网络带宽。

为什么我提到了这特性能呢?由于在实践的业务开发环节中经常会经常使用一些网络插件,这些网络插件在流量的控制上十分有用,有的时刻咱们会依据网络流量来做一系列的操作,用户的突然增长造成的流量剧增能否要扩容等等...而这样的监控和限度关于pod来说无疑会愈加繁难,而不要求管pod外部的容器的流量。

重启的战略,这个也算是一特性能吧

官方:一个Pod(就像一群鲸鱼,或许一个豌豆夹)。

细说kubernetes

我觉得 Pod 更证实了一种设计形式“组合”,在有的时刻会,组合的正当,就会繁难很多物品,比如设计了一堆组件,组合在一同;ps画图的时刻方块更圆组合在一同,就可以一同多复制几个组合。

当然咱们在看法到为什么要这样设计 Pod 的同时要求看法到,咱们应该将什么样的容器组合搁置在同一个 Pod 之中才比拟适合。

遵照必定的“容器设计形式”启动编排,调度的时刻才会愈加随心所欲。

程序员罕用网址导航

程序员的环球似乎一座迷宫,充溢了丰盛的资源和工具。

为了协助你更好地探求和导航,我整顿了各类编程资源的精选列表,包含Java、前端开发、数据库控制、框架与工具,以及云计算平台。

这些网址导航将助你在技术探求的路线上更顺畅。

**Java技术栈**:

- 把握Java基础?Oracle官方是你的终点:学习JDK?JDK (Oracle)官方资源在此:想要深入学习?JDK8文档是学习宝典:进阶JavaSE开发?单元测试不容漠视:JUnit官方地址:测试笼罩率优化?Cobertura是你的帮手:代码品质把关?FindBugs帮你扫描:性能监控,用VisualVM:运行容器化,Docker是首选:散布式架构,Kubernetes助你一臂之力:包控制利器Helm:阿里云镜像减速,让部署更高效:前端开发**:

- UI设计与组件库:Element UI ,轻量级前端框架:灵活可视化,ECharts在此:图标库,阿里巴巴小图标库:Bootstrap,照应式设计基石:数据库与衔接池**:

- MySQL数据库:Redis:高效键值对存储,MongoDB:散布式文档数据库,高性能数据库,Nginx官方:及文档衔接池选项:HikariCP -Druid -构建与部署**:

- Maven:开源构建工具,Gradle:初级构建系统,代码托管平台:GitHub -Gitee - 国际优质开源资源

**其余工具与框架**:

- Spring框架:片面的Java后端处置打算:MyBatis:数据耐久层框架,MyBatis Plus更易用:Zookeeper:散布式协调服务:服务控制与性能组件:Nacos -Apollo, Disconf

这个列表只是冰山一角,随着技术的始终开展,更多工具和资源期待你去发现。

记得活期降级你的常识库,坚持技术敏理性,这样你就能在编程的陆地中自在飞行。

祝你在技术探求的路线上善报多磨!

基于Linux自己初步搭建Kubernetes(k8s)集群基础,具体教程

k8s官方网站:,可自行检查相关文档说明

k8s-master:Ubuntu--192.168.152.100

k8s-node01:Ubuntu--192.168.152.101

k8s-node02:Ubuntu--192.168.152.102

所有已装置docker,未装置可依据官方文档装置:1,制止swap分区

K8s的要求,确保制止掉swap分区,不由止,初始化会报错。

在每个宿主机上口头:

2,确保时区和期间正确

时区设置

3,封锁防火墙和selinux

ubuntu 检查防火墙命令,ufw status可检查形态,ubuntu20.04自动所有封锁,无需设置。

4,主机名和hosts设置(可选)

非必定,然而为了直观繁难控制,倡导设置。

在宿主机区分设置主机名:k8s-master,k8s-node01,k8s-node02

hosts设置

1,更改docker自动驱动为systemd

为防止初始化产生一系列的失误,请审核docker和kubectl驱动能否分歧,否则kubectl没法启动形成报错。

版本不一样,docker有些为cgroupfs,而kubectl自动驱动为systemd,所以要求更改docker驱动。

可检查自己docker驱动命令:

更改docker驱动,编辑 /etc/docker/ (没有就新建一个),参与如下启动项参数即可:

重启docker

要求在每台机器上装置以下的软件包:

2,降级 apt 包索引并装置经常使用 Kubernetes apt 仓库所要求的包

装置软件包以准许apt经过HTTPS经常使用存储库,已装置软件的可以疏忽

3,下载地下签名秘钥、并参与k8s库

国外 :下载 Google Cloud 地下签名秘钥:

国际:可以用阿里源即可:

请留意,在命令中,经常使用的是Ubuntu 16.04 Xenial 版本, 是可用的最新 Kubernetes 存储库。

所以而非20.04 的focal。

4,降级 apt 包索引,装置 kubelet、kubeadm 和 kubectl,并锁定其版本

锁定版本,防止产生不兼容状况,例如,1.7.0 版本的 kubelet 可以齐全兼容 1.8.0 版本的 API 主机,反之则无法以。

只有要在master上操作即可。

1,初始化失误处置(没有报错的可以跳过这条)

失误揭示1:

要素:kubectl没法启动,journalctl -xe检查启动失误消息。

处置打算:k8s倡导systemd驱动,所以更改docker驱动即可,编辑 /etc/docker/ (没有就新建一个),参与如下启动项参数即可:

重启docker和kubectel

失误揭示2:

要素:初始化消费的文件,从新初始化,要求删除即可

失误揭示3:

处置方法:重置性能

2,初始化成功

无报错,最后产生以下,示意初始化成功,依据揭示还要求操作。

依据用户是root或许个别用户操作,由于大多环境不会是root用户,我也是个别用户,所以选用个别用户操作命令:

假设是root用户,口头以下命令:

初始化成功,用最后的揭示命令 kubeadm join.... 在node机器上参与集群即可。

3,主节点pod网络设置

主节点支持网络插件:这里装置Calico网络插件:Calico官方提供三种装置形式,1)低于50个节点,2)高于50个节点,3)etcd datastore(官方不倡导此方法)。

这里选用第一种:

装置成功后, kubectl get node可检查节点形态,由NotReady变成Ready则反常,要求等几分钟成功。

1,node参与master节点

在一切node节点机器操作,一致已装置成功 kubelet、kubeadm 和 kubectl,用master初始化成功后最后揭示命令参与,切记要用root用户。

参与成功后,揭示如下:

再次检查kubelet服务已反常启动。

2,需留意的坑

1:参与主节点,要求 root 用户口头词条命令,才可以参与master主节点。

node在没有参与主节点master之前,kubelet服务是没法启动的,是反常状况,会报错如下:

要素是缺失文件,主节点master初始化 `kubeadm init`生成。

node节点是不要求初始化的,所以只有要用root用户`kubeadm join`参与master即可生成。

2:假设参与揭示某些文件已存在,如:

要素是参与过主节点,即使没成功参与,文件也会创立,所以要求重置节点,从新参与即可,重置命令:

3,在master检查节点

参与成功后,在master节点 kubectl get node 可检查已参与的一切节点:

相关内容 查看全部