2.1 Kubernetes--Pod

本节重点有两个: 

1. Pod

2. 网络通讯

一. Pod

1.1 Pod的类型

1. 自主式Pod

  自主式Pod是不被控制器管理的Pod. 这种Pod死亡以后,不会被重新启动. 这个Pod死了以后,副本数就达不到期望值了,也不会有人去创建一个新的Pod为达到副本数的期望值.

   在传统情况下,我们运行一个容器,每一个容器都是独立存在的,每个容器都有自己的ip地址,每个容器都有自己的挂载卷. 但在k8s移植的时候,就不太容易了. 我们把一个没有在容器里运行的环境转移到或迁移到k8s的环境里,就比较难迁移.比如:LAMP,那么A和php之间有联系,我们把A和php分开了,他俩个是不同的地址,还要去配置反向代理,比较费劲. 

  说的是什么意思呢? 有些组件应该在一起,并且能互相见面,也就是通过localhost能访问到. 但是,使用标准的容器,你没办法这样做,除非你把两个进程封装在一个容器内部. K8S给我们建立了一个Pod,Pod是怎样实现的呢? 

  首先,要定义一个Pod,他会先启动第一个容器,这个容器需要注意,只要运行的Pod,这个容器就会被启动. 这个容器叫pause

  

   然后,在Pod里定义了两个容器,也可以是一个容器,然后这两个Pod会共用PAUSE的网络栈和存储卷. 

  

   也就是说,这两个容器没有自己独立的ip地址和存储卷,或者说,他们有的是PAUSE或者pod的ip地址. 这两个容器他们尾根隔离,但是进程不隔离. 也就是说,如果容器1运行的是php,容器2运行的是nginx,nginx想要反向代理访问php,只需要要写localhost:9000即可. 不需要写IP地址+端口映射. 原因是这两个容器共享的是PAUSE的网络栈. 

  这样就说明了,在同一个Pod里,容器之间的端口不能冲突. 

  

 

   下面一个要说明的是: 共享存储. 这里两个容器除了共享网络,同时也共享存储卷.

  

 

 

2. 控制器管理的Pod

  说控制器管理的Pod,先来看看控制器有哪些:

  • ReplicationController & ReplicaSet & Deployment : 这三种控制器为什么放在一块呢? 因为他们有很多相似的地方

    • ReplicationController: 简称rc. 原来确保容器英语的副本数始终保持在用户定义的副本数,即如果有容器异常退出,会自动创建新的Pod来代替;而如果异常多出来的容器也会自动回收. 在新版本的k8s中,建议使用ReplicaSet来取代ReplicationController.
    • ReplicaSet: 简称rs. 跟ReplicationController没有本质上的区别,只是名字不同,并且ReplicaSet支持集合式的selector.

  我们在创建Pod的时候,可以给他打标签. 比如: app = http,version = v1版本等等. 我们会打一堆的标签. 当我们想删除容器的时候,我们可以这样说: 当app=http,version = v1的时候,执行什么操作. rs支持这种集合方案,但是rc不支持. 所以在大型项目中,rs比rc会更简单,更有效率. 所以,在新版本中,官方抛弃rc,全部转用rs.

    • Deployment:  虽然replicaSet可以独立使用,但一般还是建议使用Deployment来自动管理ReplicaSet,这样就无需担心跟其他机制的不兼容问题(比如ReplicaSet不支持 rolling-update滚动更新,但Deployment支持) 

滚动更新还是很有意义的,尤其是在生成环境中

       

比如我们现在有两个容器,我们要将现在容器的版本从v1版本升级到v2版本. 这时候,怎么办呢? 我们可以进行一个滚动更新. 

      

首先,先生成一个新的pod.然删除一个旧的pod,如下如所示. 先生成一个v2版本的pod,然后删除一个v1版本的pod . 然后在创建一个新的v2版本,再把老的v1版本删除. 

最后就会出现一个最新版本的状态了.这就是滚动更新.

 

那么,Deployment是如何管理rs并滚动更新的呢?

 Deployment定义出来以后,他会定义一个rs,也就是说rs不是我们自己定义的,是Deployment自动生成的. RS会创建多个pod. 如下图

 当需要更新版本的时候. 

首先. Deployment会先创建出一个RS

 `      

 

 

       然后在创建一个新的 Pod,将其升级到v2版本. 然后下掉一个v1版本的Pod

      

 

      然后在创建一个Pod,将其版本升级到v2,在下掉一个v1版本的Pod

      

 

       直至全部下完.

 

       这就是Deployment`管理的滚动rolling-update滚动升级

 

      如果升级的过程中,发现新版本有一些小bug,我们还可以回滚. 如何回滚,执行undo即可. 回滚的逻辑和版本升级的原理一样. 恢复一个v1,下掉一个v2. 直至全部恢复. 

      

 

       为什么RS能够恢复呢? 因为,下掉的RS没有被删掉. 只是停用了. 当回滚的时候,老旧的RS就会被启动.

 

  • HPA(HorizontalPodAutoScale) : Horizontal Pod AutoScaling 仅适用于Deployment和ReplicaSet,在V1版本中仅支持根据Pod的CPU利用率扩缩容,在vlalpha版本中,支持根据内存和用户自定义的metric扩缩容. 

    我运行了一个RS,RS下管理两个Pod,

    

 

 

      然后,在定义一个HPA,HPA也是一个对象,他是基于RS创建的,那HPA怎么定义的呢? 当CPU>80%的时候,开始扩容,扩容的最大值是10个,最小值是2个

     

 

     也就是说HPA会去监控RS下Pod的资源利用率. 如果资源利用率>80%,那么开始扩展Pod,然后判断是否依然超过80%,如果是 继续扩展. 直到扩展到资源利用率低于80%,或者最大数达到10个. 

    

 

     一旦资源利用率变低以后,开始缩容. 他会先减掉一个pod. 看看是否达到80%,还没达到继续减. 但最少的pod数是两个. 也即是减到只剩2个pod,不能再减了. 

    这样就达到了一个水平扩展的目的. 这也是HPA帮我们实现的. 

 

 

  •  statefulSet:  主要解决的是有状态服务的问题.  

服务的分类: 
1. 无状态服务: 踢出去过段时间放回来,依然能正常工作. 比如LVS调度器,APACHE(http服务) 
    为什么apache是无状态服务呢? 因为apache中的数据可以通过共享服务来完成. 对于组件本身他不需要数据,也没有数据的更新. 所以,apache被定义到无状态服务里面.
    docker: 对于docker来说,他更适合运行的是无状态服务. 
2. 有状态服务: 踢出集群后过段时间再放回来,不能正常工作了,这样的服务就是有状态服务. 比如: 数据库DBMS,因为有很大一部分数据缺失了.     Kubernetes的一个难点就是必须要攻克有状态服务. 那么,有状态服务,有些数据需要持久化,需要保存起来,这时,我们就会引入存储的概念.

主要解决的是有状态服务的问题. docker主要面对的是无状态服务,无状态服务的含义时,没有对应的存储需要实时的保留. 或者是把他摘出来,经过一段时间以后,放回去依然能够工作. 典型的无状态服务有哪些呢? 比如: apache服务,LVS服务(负载均衡调度器) . 典型的有状态服务有哪些呢?mysql,mongodb,他们需要实时的对数据进行更新和存储. 把他抽离出集群,再放回来就没办法工作了. statefulSet就是为了解决有状态服务而诞生的. 

  对应的Deployment 和 ReplicaSet是无状态服务 

 

  应用场景包括:

  1. 稳定的持久化存储. 即Pod重新调度后还是能访问到相同的持久化数据. 基于PVC来实现.
    • 就是说Pod死亡以后,我们在调度会来,创建一个Pod取代他的时候,他的存储依然是之前的存储,并不会变,并且里面的数据也不会丢失.
  2. 稳定的网络标识: 即Pod重新调度后其PodName和HostName是不变的(之前叫什么,现在还叫什么). 基于Headless Service(即没有Cluster IP 的Service)来实现
  3. 有序部署. 有序扩展. 即Pod是有顺序的,再部署或扩展的时候,要依据定义的顺序一次进行(即从0到n-1,在下一个pod运行之前,所有之前的Pod必须都是Running和Ready的标志),基于init Containars实现
    • 有序部署会分为扩展和回收阶段. 只有当前一个Pod处于running和ready的状态,第二个才可以被创建. 为什么需要这样部署呢? 原因是,我们构建一个集群化,比如及群里有nginx,apache,mysql. 我们的启动顺序是先启mysql,再启apache,再启nginx,因为他们之间是有依赖关系的. nginx依赖apache,apache依赖mysql. 这就是有序部署. 回收也是一样的是有序的,不同的是,他是逆序回收. 从n-1开始,一直到0.
  4. 有序收缩, 有序删除(即从n-1到0)
  • DaemonSet: 确保全部(或一些)Node上运行一个Pod的副本. 当有Pod加入集群时,也会为他们增加一个Pod,当有Pod从集群移除时,Pod也会被回收,删除DeamonSet会删除对应的所有的Pod.

  使用DaemonSet的典型用法:

  1. 运行集群存储daemon,例如在每个Node上运行glusterd,ceph.
  2. 在每个节点上运行日志收集daemon,例如fluentd,logstash.
  3. 在每个节点上运行监控daemon, 例如Prometheus,Node Exporter.
  •  Job,CronJob

    • Job是负责批处理的任务.  仅执行一次的任务,它保证批处理任务的一个或多个Pod成功结束
      • 比如: 我想备份数据库,备份代码可以放在Pod里,我们将其放到定时器里去,到时间就可以把脚本运行,执行出来. 
    • CronJob管理基于时间的Pob,
      • 在给定的时间点只运行一次
      • 周期性的再交给时间点运行

 3. 服务发现

  

 

 

客户端想要访问一组pod,如果这些pod是无相干的话,是不能通过Service代理的. pod需要具有相关性,比如同一个rs / rc deployment创建的,或者拥有同一组标签. 都可以被service收集到. 即: service去搜集Pod是通过标签去选择到的. 这一点很重要. 选择到以后,service会有自己的ip+port,客户端就可以访问service的ip+端口. 客户端就可以访问service的ip + 端口. 间接访问pod. 并且这里有一个RR的算法存在.

 

假设我们现在有一个简单的集群环境: 

 

 

有一个myqsl,三台apache-fpm,三台缓存服务器SQUID,有一个负载均衡器LVS. 我们来分析一下,如果把它放到k8s中如何部署. 

1. mysql需要运行在一个Pod中, 

 

 2. apache-fpm,有三个,其实他们都是类似,所以我们可以把它放到Deployment控制器中创建,Deployment会指定apache-fpm的副本数有3个副本

 

 3. SQUID,缓存服务器也有三个,我们也可以把它放到Deployment控制器中创建. 

 

 

 4. LVS,可以考集群本身的功能,进行负载调度.

 

现在这种结构,我们发现,如果缓存服务器SQUID想要访问apapche-fpm,写反向代理的话,需要写三台服务器. 并且,我们说过,pod如果退出重新创建以后,pod的ip地址会变换. 除非采用的是statefulSet,但是在apache-fpm中没有意义,因为他是一个无状态服务 . 那怎么办呢? 我么可以在前面 加一个service,这个service就是Service-php-fpm的. 他会绑定我们的标签. 

 

 

 SQUID去进行反向代理设定的时候,不需要写php-fpm的三个ip地址了,而且,pod死亡以后,控制器会把他维持到三个副本,回在自动创建一个,  新创建的ip地址和原来的是不一样的. SQUID如果在里面填写的是目标ip,就有问题. 所以,SQUID里面写的是server-php-fpm的地址. 这样SQUID只要执行到Service-php-fpm上面即可. 

 

mysql也是一个pod,我们要求mysql这个pod如果死了,重启,他的ip地址和主机名是不能变的,因此我们把它放到statefulSet中. 

Kubernetes内部是一个扁平化的网络,相互之间可以通过localhost请求访问,所以,关联关系如下:

 

 SQUID需要被外网访问,因此,我们在SQUID上也可以创建一个Service-SQUID

 

 这样,我们就可以把这个架构完整的部署在k8s集群中了.

 

 

 

二. 网络通讯 

1.  

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

as

 

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


文章浏览阅读942次。kube-controller-manager 和 kubelet 是异步工作的,这意味着延迟可能包括任何的网络延迟、apiserver 的延迟、etcd 延迟,一个节点上的负载引起的延迟等等。当 Kubernetes 中 Node 节点出现状态异常的情况下,节点上的 Pod 会被重新调度到其他节点上去,但是有的时候我们会发现节点 Down 掉以后,Pod 并不会立即触发重新调度,这实际上就是和 Kubelet 的状态更新机制密切相关的,Kubernetes 提供了一些参数配置来触发重新调度的时间。_node-monitor-period
文章浏览阅读3.8k次。上篇文章详细介绍了弹性云混部的落地历程,弹性云是滴滴内部提供给网约车等核心服务的容器平台,其基于 k8s 实现了对海量 node 的管理和 pod 的调度。本文重点介绍弹性云的调度能力,分为以下部分:调度链路图:介绍当前弹性云调度体系链路,对架构体系有一个初步的认知k8s 调度能力的运用:整体介绍弹性云现在用到的 k8s 调度能力和对其的增强k8s 版本的升级:介绍到从 k8s 1.12 到 1...._滴滴机房 腾讯
文章浏览阅读897次。对于cpu来说,这种分配方式并不会有太大问题,因为cpu可以灵活调度,numa调度时我们只计算绑定了numa cpu的pod是可以接受的,但是对于内存来说,numa node上申请了的内存无法做到随时迁移,这就会导致调度器视角numa node的mem资源足够,但是等到pod真正使用时,由于没有绑定numa node的pod申请的内存,导致numa node的mem资源不足,造成swap中断或者远端内存申请,这会对绑定mem的pod来带来性能损耗。忽略了没有绑定numa node的pod资源。_kubectl numa
文章浏览阅读796次,点赞17次,收藏15次。只要在Service定义中设置了ClusterIp:None,就定义了一个HeadLess Service, 它与普通的Service关键区别在于它没有ClusterIp地址,如果解析HeadLess Service的DNS域名,则会返回该Service对应的全部Pod的EndPoint列表,这就意味着客户端是直接与后端的pod建立了TCP/IP链接进行通信的。一个Label是一个键值对。注解:属于资源对象的元数据,可以被理解为一种特殊的标签,不过更多的是与程序挂钩,通常用于实现资源对象属性的自定义扩展。
文章浏览阅读763次。但是此时如果配置成 NONE, 租户创建成功了,但是无法创建资源文件,也就是无法上传文件,可能 dolphinscheduler 团队就想着将文件上传到 hdfs,暂不支持本地。需要将 resource.storage.type 置为 NONE, 因为我之前用的 1.3.6 版本的时候,即使资源文件存在本地文件也需要配置成 hdfs。_[error] 2023-10-24 18:10:43.762 +0800 org.apache.dolphinscheduler.api.servic
文章浏览阅读2.7k次,点赞2次,收藏13次。公司使用的是交老的k8s版本(1.16),由于老版本的K8s对于现在很多新特性不支持,所以需要升级到新版本。目前2023年7月11日最新版本的k8s是v1.27.3。通过参考官方文档进行k8s部署工作。其中涉及到操作系统配置、防火墙配置、私有镜像仓库等。_k8s最新版本
文章浏览阅读1.8w次,点赞14次,收藏27次。能节省你在kubeadm init 时遇到问题的排错时间⌚️。整合了网上大佬
文章浏览阅读1.1k次,点赞2次,收藏7次。具体操作步骤可以参考之前的教程,建议是先安装一台,然后克隆虚拟机,这样速度快。注意:在克隆时记得修改Mac地址、IP地址、UUID和主机名。(最后别忘了保存下快照~)_部署k8s集群
文章浏览阅读863次,点赞23次,收藏16次。当部署完 Kubernetes,便拥有了一个完整的集群。一组工作机器,称为节点, 会运行容器化应用程序。每个集群至少有一个工作节点。工作节点会 托管Pod ,而 Pod 就是作为应用负载的组件。控制平面管理集群中的工作节点和Pod。说人话版本:集群:cluster,多个几点被组织到一起共同为系统提供服务过程称之为集群。本质上是将承载同一个软件服务节点组织到一起,称之为该软件(服务)的集群,当然集群中的节点身份地位是不一样的。k8s集群也是如此,他也是多个节点组成。
文章浏览阅读943次。Rancher是一个开源的企业级多集群Kubernetes管理平台,实现了Kubernetes集群在混合云+本地数据中心的集中部署与管理,以确保集群的安全性,加速企业数字化转型。Rancher 1.0版本在2016年就已发布,时至今日,Rancher已经成长为企业在生产环境中运行容器和Kubernetes的首要选择。_rancher管理k8s
文章浏览阅读742次,点赞2次,收藏3次。本篇来讲解如何在centos下安装部署高可用k8s集群。_kubeadm ha keepalived + nginx
文章浏览阅读1.9k次,点赞21次,收藏25次。那么这个空间设置成内存的2倍大小。点击IPv4设置--手动--添加--设置ip--设置DNS服务器,最后点击--“保存”;首先选中--“本地标准磁盘”,存储配置--自定义分区,点击--“完成”;在--主机名--设置主机名:(例如k8s-master01),点击--点击+,设置--挂载点/boot--期望容量,点击--添加挂载点;点击--+--挂载点swap--期望容量,点击--“添加挂载点”;默认选择--亚洲--上海,并调整日期和时间,点击--“完成”;设备类型--确认--LVM,卷组--选择“修改”;_euler 服务器搭建
文章浏览阅读1k次。在1.25版本的k8s集群中部署gpu-manage时,虽然显示gpu节点上gpu-manage的pod实例都是running状态,但是给pod申领。既可以用源码的Makefile自动编译打包成新的镜像,但是源码的。说明gpu-manager和容器运行时接口通信失败了。编译后的镜像在1.25版本的k8s中可以正常使用。,但是在k8s1.23版本之后,接口路径已经改为。资源时,却始终找不到有资源的节点。,另外有一些依赖需要国际上的支持。可以看到这里用的运行时接口是。查看节点的详情时,返回的。_launch gpu manager 报错 can't create container runtime manager: context dead
文章浏览阅读1k次,点赞18次,收藏16次。SelfLink:API的资源对象之一,表示资源对象在集群当中自身的一个连结,self-Link是一个唯一的标识号,可以用于标识k8s集群当中的每个资源的对象。容器里使用的配置,在provisioner当中定义好环境变量,传给容器,storageclass的名称,NFS服务器的地址,NFS的目录。NFS的provisionner的客户端以pod的方式运行在集群当中,监听k8s集群当中PV的请求,然后动态的创建于NFS相关的PV。命名为 nfs-client-provisioner-clusterrole。
文章浏览阅读6.3k次,点赞2次,收藏20次。k8s证书过期解决方案之替换证书_k8s证书过期如何更换
文章浏览阅读1k次。KMS,Key Management Service,即密钥管理服务,在K8S集群中,以驱动和插件的形式启用对Secret,Configmap进行加密。以保护敏感数据
文章浏览阅读888次。exporter对于云服务的监控还是很不完美,毕竟每家都有自己的护城河。自动发现多实例这样的借助consul 阿波罗这样的会简单一些。aws可以借助cloudwatch这样的导入模板到grafana中。还是希望能将类似腾讯云云监控中的这些指标采集到prometheus中,但是这过程应该还很遥远grafana出图 prometheus查询语法这些东西有时间的好好研究一下。报警有必要进行分级别,收敛配置一下!_command: - "-redis.password-file=/redis_passwd.json
文章浏览阅读1k次。可以在此处(https://cloud.google.com/kubernetes-engine/docs/how-to/kube-dns)和此处(https://www.digitalocean.com/community/tutorials/an-introduction-to-the-kubernetes-dns-service)找到更多的详细信息。-or-ipvs/)和此处(https://arthurchiao.art/blog/cracking-k8s-node-proxy/)。_k8s默认命名空间
文章浏览阅读4.9k次,点赞11次,收藏32次。如果运行runc命令时提示:runc: error while loading shared libraries: libseccomp.so.2: cannot open shared object file: No such file or directory,则表明runc没有找到libseccomp,需要检查libseccomp是否安装,本次安装默认就可以查询到。所有主机均需要操作。所有主机均需要操作。所有主机均需要操作。所有主机均需要操作。所有主机均需要操作。所有主机均需要操作。_kubernetes 1.28
文章浏览阅读3.6w次,点赞118次,收藏144次。Canal 提供了网络功能,使得 Kubernetes 集群中的 Pod 可以相互通信,并与集群外部的服务进行通信。它通过网络插件的方式,为每个 Pod 分配唯一的 IP 地址,并管理网络流量的路由和转发。此外,Canal 还支持网络策略,用于定义 Pod 之间的通信规则和安全策略。Canal 基于 Calico 和 Flannel 项目,结合了二者的优点。它使用 Calico 的数据平面,提供高性能的网络转发和安全特性,同时使用 Flannel 的控制平面,实现 IP 地址管理和网络策略的配置。_k8s canal