草庐IT

【云原生 • Kubernetes】kubernetes 核心技术 - Pod

敬 之 2023-11-26 原文


目录


1. Pod 概述

Pod 是 kubernetes 最为重要的一个概念,每一个 Pod 都有一个特殊的被称为“根容器”的 Pause 容器。Pause 容器对应的镜像属于 kubernetes 平台的一部分,除 Pause 容器,每一个 Pod 还包含一个或者多个相关的用户业务容器(usr contaiter)。


Pod - 应用:每个 Pod 都是应用的一个实例,都有着自己的专属 IP。
Pod - 容器:一个 Pod 可以有多个容器,各个容器之间共享网络和存储资源,每个 Pod 中有一个专门的 Pause 来保存所有容器的状态,通过管理 Pause 容器,从而达到管理 Pod 中所有容器的效果。
Pod - 节点:同一个 Pod 中的容器会被调度到相同的 node 节点,不同节点间 Pod 的通信基于虚拟二层网络技术来实现。

2. Pod 的定义

在一个 yaml 文件中,Pod 是这样定义的(完整):

apiVersion: v1                //版本
kind: pod                     //类型,此处为Pod类型
metadata:                     //元数据
  name: string                //元数据,是pod的名称
  namespace: string           //元数据,pod的命名空间,如果不填写默认是default
  labels:                     //元数据,pod的标签列表,可写多个label
    - name: string            //元数据,标签的名称
  annotations:                //元数据,自定义注解列表
    - name: string            //元数据,自定义注解名称
spec:                         //pod中容器的详细定义
  containers:                 //pod中容器的列表
  - name: string              //容器的名称
    image: string             //容器中的镜像
    imagePullPolicy: Always | Never | IfNotPresent   //获取镜像的策略: 默认为Always(拉取镜像库镜像,即每次都尝试重新下载镜像)、Never(仅使用本地镜像)、IfNotPresent(本地有镜像就不拉取镜像库镜像,如果没有就拉取镜像库镜像)
	command: [string]         //容器的启动命令列表(不配置则使用镜像内部的命令)
	args: [string]            //启动命令参数列表
	workingDir: string        //容器的工作目录
	volumeMounts:             //挂载到容器内部的存储卷配置
	- name: string            //引用pod定义的共享存储卷的名称,需使用volumes[]部分定义的共享存储卷名称
	  mountPath: string       //存储卷在容器内部Mount的绝对路径
	  readOnly: boolean       //是否为只读模式,默认为读写模式
	ports:                    //容器需要暴露的端口号列表
	- name: string            //端口的名称
	  containerPort: int      //容器要暴露的端口
	  hostPort: int           //容器所在主机监听的端口(容器暴露端口映射到宿主机的端口,设置host port时同一台宿主机将不能启动该容器的第二份版本)
	  protocol: string        //端口协议,支持TCP和UDP,默认值为TCP
	env:                      //容器运行前设置的环境变量列表
	- name: string            //环境变量的名称
	  value: string           //环境变量的值
	resources:                //资源限制和资源请求设置
	  limits:                 //资源限制,容器的最大可用资源数量
	    cpu: string           //CPU限制,单位为core数
		memory: string        //内存限制,单位可以为MiB、GiB等
      requests:               //资源请求设置
	    cpu: string           //CPU请求,单位为core数,容器启动的初始可用数量
		memory: string        //内存请求,单位可以为MiB、GiB等,容器启动的初始可用数量
    livenessProbe:            //pod内各容器健康检查的设置
	  exec:                   //对pod内各容器健康检查的设置,exec方式
	    command: [string]     //exec方式需要指定的命令或者脚本
	  httpGet:                //对pod内各容器健康检查的设置,使用httpGet方式,需指定path、port
	    path: string          //指定的路径
		port: number          //指定的端口
		host: string          //指定的主机
		scheme: string
		httpHeaders:           
		- name: string
		  value: string
      tcpSocket:              //对pod内各容器健康检查的设置,tcpSocket方式
		port: number         
	  initialDelaySeconds: 0  //容器启动完成后首次探测的时间,单位为s
	  timeoutSeconds: 0       //对容器健康检查的探测等待响应的超时时间设置,单位为s,默认值为1s。若超过该超时时间设置,则将认为该容器不健康,会重启该容器
	  periodSeconds: 0        //对容器健康检查的定期探测时间设置,单位为s,默认10s探测一次
	  successThreshold: 0
	  failureThreshold: 0
    securityContest:
	  privileged: false
  restartPolicy: Always | Never | OnFailure  //重启策略,默认为always
  nodeSelector: object        //节点选择,表示将该Pod调度到包含这些label的node上,以key:value的方式指定
  imagePullSecrets:           //pull镜像时使用的secret名称,以name:secretkey格式指定
  - name: string
  hostNetwork: false          //是否使用主机网络模式,弃用docker网桥,默认为否
  volumes:                    //在该pod上定义的共享存储卷列表
  - name: string              //共享存储卷的名称,在一个pod中每个存储卷定义一个名称
    emptyDir: {}              //类型为emptyDir的存储卷,表示与pod同生命周期的一个临时目录,其值为一个空对象:emptyDir: {}
	hostPath:                 //类型为hostPath的存储卷,表示pod容器挂载的宿主机目录,通过volumes[].hostPath.path指定
	  path: string            //pod容器挂载的宿主机目录
	secret:                   //类型为secret的存储卷,表示挂载集群预定义的secret对象到容器内部
	  secretName: string
	  items:
	  - key: string
	    path: string
	configMap:                //类型为configMap的存储卷,表示挂载集群预定义的configMap对象到容器内部
	  name: string
	  items: 
	  - key: string
	    path: string

3. Pod 的基本用法

在 Kubernetes 中运行容器的要求为:容器的主程序是需要一直在前台运行的,而不是后台。应用需要改造成前台运行的方式。

如果我们创建的 Docker 镜像启动命令是后台执行程序,那么 kubelet 创建包含这个容器的 Pod 之后运行完该命令,即认为 Pod 已经结束,将会立刻销毁该 Pod。如果为该 Pod 定义了 RC,创建和销毁就会进入一个无线循环的状态。

  • 创建 Pod
kubectl create -f xxx.yaml
  • 查看 Pod
kubectl get pod/po pod名称
kubectl get pod/po pod名称 -o wide
kubectl describe pod/po pod名称
  • 删除 Pod
kubectl delete -f pod pod名称.yaml
kubectl delete pod --all

Pod 可以由一个或者多个容器组合而成,如下:

  • 由一个容器组成的 Pod
#一个容器组成的Pod
apiVersion: v1
kind: pod
metadata:
  name: mytomcat
  labels:
	name: mytomcat
spec:
  containers:
 - name: mytomcat
    image: tomcat
    ports:
    - containerPort: 8080
  • 由两个紧密耦合的容器组成的 Pod
#两个紧密耦合的容器组成的Pod
apiVersion: v1
kind: pod
metadata:
  name: mytomcat
  labels:
	name: tomcat-redis
spec:
  containers:
 - name: tomcat
    image: tomcat
    ports:
    - containerPort: 8080
 - name: redis
    image: redis
    ports:
    - containerPort: 6379

4. Pod 分类

Pod 分为普通Pod静态Pod 两类。

普通 Pod 一旦被创建,就会放入 etcd 中存储,随后会被 k8s Master 调度到某个具体的node上并进行绑定,随后该 Pod 所对应的 Node 上的 kubelet 进程实例化成一组相关的 Docker 容器并启动。在默认情况下,当 Pod 里某个容器停止时,K8s 会自动检测到这个问题并且重新启动这个 Pod 里的所有容器,如果 Pod 所在的 node 宕机,则会将这个 node 上的所有 Pod 重新调度到其它节点。

静态 Pod 是由 kubelet 进行管理的仅存在于特定 node 上的 Pod,它们不能通过 API Server 进行管理,无法与 ReplicationController、Deployment 或 DaemonSet 进行关联,并且 kubelet 也无法对它们进行健康检查。

5. Pod 生命周期和重启策略

· Pod 的几个状态(生命周期)

Pod 生命周期包含PendingRunningCompeletedFailedUnknown五个状态。

状态说明
PendingAPI Server 已经创建了该 Pod,但 Pod 中的一个或多个容器的镜像还没有创建,包括镜像下载过程
RunningPod 内所有容器已创建,且至少一个容器处于运行、正在启动或正在重启状态
CompeletedPod 内所有容器均成功执行退出,且不会再重启
FailedPod 内所有容器均已退出,但至少—个容器退出失败
Unknown由于某种原因无法获取 Pod 状态,例如网络通信不畅等

· Pod 重启策略

Pod 重启策略有AlwaysOnFailureNever,Always 为默认值。

项目Value
Always当容器失效时,由 kubelet 自动重启该容器
OnFailure当容器终止运行且退出码不为 0 时,由 kubelet 自动重启该容器
Never不论容器运行状态如何,kubelet 都不会重启该容器

6. Pod 资源配置

每个 Pod 都可以对其能使用的服务器上的计算资源设置限额,Kubernetes 中可以设置限额的计算资源有 CPUMemory 两种,CPU 的资源单位为 CPU 数量,是一个绝对值而非相对值。Memory 配额也是一个绝对值,它的单位是内存字节数。

Kubernetes中,一个计算资源进行配额限定需要设定以下两个参数:

  • Requests,该资源最小申请数量,系统必须满足要求
  • Limits,该资源最大允许使用的量,不能突破,当容器试图使用超过这个量的资源时,可能会被 Kubernetes “杀死”并重启

如下举例:mysql 容器申请最少 0.25 个 CPU 以及 64MiB 内存,在运行过程中能使用的资源配额为 0.5 个 CPU 及 128MiB 内存。

sepc
  containers :
  - name: db
  	image: mysql
  	resources:
	  requests:
		memory: "64Mi"
		cpu: "250m"
	  limits:
		memory: "128Mi"
		cpu: "500m"

有关【云原生 • Kubernetes】kubernetes 核心技术 - Pod的更多相关文章

  1. Unity 热更新技术 | (三) Lua语言基本介绍及下载安装 - 2

    ?博客主页:https://xiaoy.blog.csdn.net?本文由呆呆敲代码的小Y原创,首发于CSDN??学习专栏推荐:Unity系统学习专栏?游戏制作专栏推荐:游戏制作?Unity实战100例专栏推荐:Unity实战100例教程?欢迎点赞?收藏⭐留言?如有错误敬请指正!?未来很长,值得我们全力奔赴更美好的生活✨------------------❤️分割线❤️-------------------------

  2. MIMO-OFDM无线通信技术及MATLAB实现(1)无线信道:传播和衰落 - 2

     MIMO技术的优缺点优点通过下面三个增益来总体概括:阵列增益。阵列增益是指由于接收机通过对接收信号的相干合并而活得的平均SNR的提高。在发射机不知道信道信息的情况下,MIMO系统可以获得的阵列增益与接收天线数成正比复用增益。在采用空间复用方案的MIMO系统中,可以获得复用增益,即信道容量成倍增加。信道容量的增加与min(Nt,Nr)成正比分集增益。在采用空间分集方案的MIMO系统中,可以获得分集增益,即可靠性性能的改善。分集增益用独立衰落支路数来描述,即分集指数。在使用了空时编码的MIMO系统中,由于接收天线或发射天线之间的间距较远,可认为它们各自的大尺度衰落是相互独立的,因此分布式MIMO

  3. ruby-on-rails - 用于门户的 Ruby 技术 - 2

    我刚刚看到whitehouse.gov正在使用drupal作为CMS和门户技术。drupal的优点之一似乎是很容易添加插件,而且编程最少,即重新发明轮子最少。这实际上正是Ruby-on-Rails的DRY理念。所以:drupal的缺点是什么?Rails或其他基于Ruby的技术有哪些不符合whitehouse.org(或其他CMS门户)门户技术的资格? 最佳答案 Whatarethedrawbacksofdrupal?对于Ruby和Rails,这确实是一个相当主观的问题。Drupal是一个可靠的内容管理选项,非常适合面向社区的站点。它

  4. iNFTnews | 周杰伦18年前未发布的作品Demo,藏在了区块链技术里 - 2

    当音乐碰上区块链技术,会擦出怎样的火花?或许周杰伦已经给了我们答案。8月29日下午,B站独家首发周杰伦限定珍藏Demo独家访谈VCR,周杰伦在VCR里分享了《晴天》《青花瓷》《搁浅》《爱在西元前》四首经典歌曲Demo背后的创作故事,并首次公布18年前未发布的神秘作品《纽约地铁》的Demo。在VCR中,方文山和杰威尔音乐提及到“多亏了区块链技术,现在我们可以将这些Demos,变成独一无二具有收藏价值的艺术品,这些Demos可以在薄盒(国内数藏平台)上听到。”如何将音乐与区块链技术相结合,薄盒方面称:“薄盒作为区块链技术服务方,打破传统对于区块链技术只能作为数字收藏的理解。聚焦于区块链技术赋能,在

  5. 【云原生】SpringCloud-Spring Boot Starter使用测试 - 2

    目录SpringBootStarter是什么?以前传统的做法使用SpringBootStarter之后starter的理念:starter的实现: 创建SpringBootStarter步骤在idea新建一个starter项目、直接执行下一步即可生成项目。 在xml中加入如下配置文件:创建proterties类来保存配置信息创建业务类:创建AutoConfiguration测试如下:SpringBootStarter是什么? SpringBootStarter是在SpringBoot组件中被提出来的一种概念、简化了很多烦琐的配置、通过引入各种SpringBootStarter包可以快速搭建出一

  6. ruby - 如何让 ruby​​-prof 忽略 Ruby 核心/标准库/gem 方法? - 2

    我是Ruby分析的新手,看起来像ruby-prof是一个受欢迎的选择。我刚刚安装了gem并调用了我的程序:ruby-prof./my-prog.rb但是,输出非常冗长,因为包含所有Ruby核心和标准库方法以及其他gem的分析数据。例如,前三行是:8.790.0110.0100.0000.0013343*String#%7.280.0780.0090.0000.0692068*Array#each4.930.0380.0060.0000.0321098*Array#map这对我来说不是什么有用的信息,因为我已经知道我的程序经常处理字符串和数组,并且大概已经对这些类进行了优化。我只关心我代

  7. ruby - 使用哪种群发消息技术? - 2

    我感到有点困惑——大约24小时以来,我一直在考虑在我的项目中使用哪种组播技术。基本上,我需要的是:创建组(通过一些后端进程)任意客户端广播消息(1:N,N:N)(可能)直接消息(1:1)(重要)使用我自己的后端(例如,通过某种HTTPAPI)对客户端进行身份验证/授权能够通过后端进程(或服务器插件)踢出特定的客户端这是我要的:Ruby或Haxe中的后端相关流程JS+Haxe(Flash9)中的前端—在浏览器中,因此理想情况下通过80/443进行通信,但不一定。因此,这项技术必须能够在HaxeforFlash中轻松访问,最好是Ruby。我一直在考虑:RabbitMQ(或OpenAMQ)、

  8. [面试直通版]操作系统核心之进程、线程与协程(下) - 2

    点击->操作系统复习的文章集目录操作系统线程线程是什么进程与线程的关系用户态/内核态操作系统资源管理内核态用户态内核态/用户态切换程序运行类型分析计算密集型IO密集型结合进程,线程来理解程序运行类型分析协程基础上下文切换协程协程为什么叫协作式线程?协程的优缺点操作系统线程典型问题:简述进程和线程的区别以下内容带您一步步了解线程是什么比进程更小的独立运行的基本单位-线程(Threads)线程的提出主要是为了提高系统内程序并发执行的程度,从而进一步提升系统的吞吐量,充分发挥多核CPU的优越性而设计的引入进程是为了操作系统更加方便地管理程序,使得多个程序能并发管理和执行而线程则是为了减少程序在并发执

  9. 企业大数据发展面临问题之存算分离技术思考 - 2

    文章目录概述背景为何要存算分离优势**应用场景**存算分离产品技术流派华为JuiceFSHashDataXSKY概述背景Hadoop一出生就是奔存算一体设计,当时设计思想就是存储不动而计算(code也即是代码程序)动,负责调度Yarn会把计算任务尽量发到要处理数据所在的实例上,这也是与传统集中式存储最大的不同。为何当时Hadoop设计存算一体的耦合?要知道2006年服务器带宽只有100Mb/s~1Gb/s,但是HDD也即是磁盘吞吐量有50MB/s,这样带宽远远不够传输数据,网络瓶颈尤为明显,无奈之举只好把计算任务发到数据所在的位置。众观历史常言道天下分久必合合久必分,随着云计算技术的发展,数据

  10. 设计一个亿级高并发系统架构 - 12306火车票核心场景DDD领域建模 - 2

    “架设一个亿级高并发系统,是多数程序员、架构师的工作目标。许多的技术从业人员甚至有时会降薪去寻找这样的机会。但并不是所有人都有机会主导,甚至参与这样一个系统。今天我们用12306火车票购票这样一个业务场景来做DDD领域建模。”开篇要实现软件设计、软件开发在一个统一的思想、统一的节奏下进行,就应该有一个轻量级的框架对开发过程与代码编写做一定的约束。虽然DDD是一个软件开发的方法,而不是具体的技术或框架,但拥有一个轻量级的框架仍然是必要的,为了开发一个支持DDD的框架,首先需要理解DDD的基本概念和核心的组件。一.什么是领域驱动设计(DDD)首先要知道DDD是一种开发理念,核心是维护一个反应领域概

随机推荐