本章目录

  1. pod结构图
  2. pod语法及参数说明
  3. pod声明周期

一  pod结构图

  • 大部分情况下,Openshift中的Pod只是容器的载体,通过Deployment、DaemonSet、RC、Job、Cronjob等对象来完成一组Pod的调度与自动控制功能。
  • 一个pod内可以有一个或者一个以上的docker容器,这些容器都可以是主容器,各自提供各自的功能。也可以是一个主容器,剩下的均为辅助容器。

  通常情况下都是一个pod内启动一个容器,来提供特定的服务或者功能,当我们需要采集容器的日志的时候,可以在pod内再启动一个logstash或者

  filebeat来作为辅助容器去采集相关的日志

  • 同一个pod内的容器共享一个网络空间,pod初始化完成的时候会默认启动一个pause的容器,这个容器作为此pod的根容器,pause容器为其他业务容器

  提供了linux命名空间共享的基础,以及启动pid命名空间,开启init进程。同一个pod内的所有容器都可以共享同一个网络空间与存储卷空间,且不同的容

  器的pid空间,user空间等等是相互隔离的

二 pod的创建语法

  • 通过yaml文件来创建pod

  k8s几乎所有的资源对象都通过yaml文件来声明创建,且yaml文件有四大基本模块

  apiVersion: string     #声明api版本

  kind: string       #声明资源对象类型

  metadata:: {object}    #声明资源对象源数据

sepc: {object}       #声明资源对象属性

  我们拿最简单的玩游戏的例子跟pod创建的方式最下类比,比如说你要玩LOL

  1 玩LOL你要选择玩什么服呢?国服?韩服?美服?====》  apiVersion:版本

  2 登录到服务器后你准备玩什么类型的英雄呢?adc?刺客?战士?坦克? ====》kind:英雄类型

  3 选好英雄后,带什么皮肤(你根本买不起皮肤,手动滑稽)?带引燃?闪现?天赋如何选择?奥数彗星?不灭之握? ====》medata:英雄基本数据

  4 等队友的卡比电脑都加载完游戏后,你玩个快乐风男,出门一本杀人戒,什么鬼书,帽子,兰德里的折磨,一顿操作猛如虎,一看战绩0-5 ====》spec:英雄游戏中自定义装备数据

  好了,通过以上的例子,相信你对pod的创建过程有个大概的理解了,我们尝试创建一个yaml。既然已经知道了1+1=2,那么下面让我们做一下

  

 apiVersion: v1
kind: Pod
metadata:
creationTimestamp: "2019-04-22T13:11:33Z"
generateName: aanginx-7df558cb6c-
labels:
app: aanginx
pod-template-hash: 7df558cb6c
name: aanginx-7df558cb6c-7drlz
namespace: default
ownerReferences:
- apiVersion: apps/v1
blockOwnerDeletion: true
controller: true
kind: ReplicaSet
name: aanginx-7df558cb6c
uid: a497c177-6029-11e9-a923-20040ff3b938
resourceVersion: "747859"
selfLink: /api/v1/namespaces/default/pods/aanginx-7df558cb6c-7drlz
uid: 2689e090-6500-11e9-a923-20040ff3b938
spec:
containers:
- image: nginx
imagePullPolicy: Always
name: nginx
resources: {}
terminationMessagePath: /dev/termination-log
terminationMessagePolicy: File
volumeMounts:
- mountPath: /var/run/secrets/kubernetes.io/serviceaccount
name: default-token-b6r26
readOnly: true
dnsPolicy: ClusterFirst
enableServiceLinks: true
nodeName: node2.abas.com
priority: 0
restartPolicy: Always
schedulerName: default-scheduler
securityContext: {}
serviceAccount: default
serviceAccountName: default
terminationGracePeriodSeconds: 30
tolerations:
- effect: NoExecute
key: node.kubernetes.io/not-ready
operator: Exists
tolerationSeconds: 300
- effect: NoExecute
key: node.kubernetes.io/unreachable
operator: Exists
tolerationSeconds: 300
volumes:
- name: default-token-b6r26
secret:
defaultMode: 420
secretName: default-token-b6r26

  怎么样?pod的创建是不是很简单???

  刀放下,有话好好说,上面只是开个玩笑,在上面的pod中包含了所有的创建pod的选项,但是在实际中,我们并不需要那么多,下面我们开一个普通版的pod创建

  

apiVersion: v1           #指定api的版本号
kind: Pod         #指定资源对象类型
metadata:             #指定元数据,元数据信息通过apiserver写入到etcd集群中
labels:             #资源打上标签
app: aanginx         #标签是key-vaule形式,app代表key,aanginx是标签值
name: aanginx         #对此pod进行命名
namespace: default      #指定pod所属的命名空间。命名空间后面还会详细介绍
spec:               #对pod资源内部的对象开始声明
containers:          #对容器对象声明
- image: nginx         #指定容器的镜像是什么
imagePullPolicy: Always #镜像拉取策略,可选值有三个,always,never,ifnotpresent
name: nginx         #定义容器叫什么名字
ports:            #指定容器对外暴露端口,注意!!!此选项只是告诉使用k8s的人这个容器会暴露什么端口,但是他不会去做真正暴露的操作,他只做声明用
- containerPort: 80
restartPolicy: Always    #容器对象的重启策略

  上面就是一个简易版的pod的yaml文件,我们可以通过他来创建pod,下面让我们在k8s中创建他并获取到他的状态

  kubectl  create -f    aanginx.yaml

  kubectl  get pod

  

  简单的pod创建好了,接下来让我们看看第一个特别长的那些yaml中的各种选项都是什么意思(长图警告)

  

  

  

  

  

  

  

  (以上图片来自kubernetes 权威指南,推荐大家购买这本书,我已经买过了)

  相信根据以上内容,你现在可以根据自己的需求写一个yaml文件了

三 pod的生命周期

  如同docker容器具有生命周期一样,pod也是具有生命周期的,下面让我看一下pod从创建到结束都经历哪些过程,先看一张图

  

  一个pod启动启动的时候会做多个初始化init的操作(上面的三个init只是示例),直到容器启动完成,容器运行过程中会有俩种类型的探针检测容器的状态,主容器刚运行的时候,会有一个post start的过程,比如容器启动的时候创建一个文件夹。容器结束前还有一个pre stop的过程,用来做一些容器

  结束前的操作,比如说容器结束前发警报给zabbix接口。

  • livenessProbe探针:用于判断容器是否存活
  • readinessProbe探针:用于判断容器是否启动完成

  容器运行的时候有下面几种状态

  • pending:apiserver已经创建了pid,但是pod内还有一个或者多个容器的镜像还没有创建
  • running:容器处于运行状态,这也是生产过程中长伺服容器正常的状态。
  • succeeded:pod内的所有容器都已经成功运行起来然后退出,且不会重启
  • failed:pod内的所有容器都已经退出,但是至少有一个为退出失败的状态
  • unknown:由于某种原因无法获取pod的状态,通常都是网络原因导致的

四  小结

  pod是k8s最重要的基础,学习k8s一定要好好了解pod的各种知识,我所总结的东西不够全面,可能会有错误还有疏漏,希望大家能够及时指正批评。

  下一篇中会有pod的进阶部分,有兴趣的同学请移步至k8s-no.3-pod进阶。

  另外,墙裂推荐k8s的权威指南,吴治辉老师等人出版的那本,真的是权威中的权威,推荐购买

  

k8s-No.2-pod学习的更多相关文章

  1. .NET Core on K8S快速入门课程学习笔记

    课程链接:http://video.jessetalk.cn/course/explore 良心课程,大家一起来学习哈! 目录 01-介绍K8s是什么 02-为什么要学习k8s 03-如何学习k8s ...

  2. .NET Core on K8S快速入门课程--学习笔记

    课程链接:http://video.jessetalk.cn/course/explore 良心课程,大家一起来学习哈! 目录 01-介绍K8s是什么 02-为什么要学习k8s 03-如何学习k8s ...

  3. k8s 中的 Pod 细节了解

    k8s中Pod的理解 基本概念 k8s 为什么使用 Pod 作为最小的管理单元 如何使用 Pod 1.自主式 Pod 2.控制器管理的 Pod 静态 Pod Pod的生命周期 Pod 如何直接暴露服务 ...

  4. K8s之实践Pod深入理解

      K8s之实践Pod深入理解 1.同一pod下的nginx+php+mysql nginx+php+mysql.yaml文件 --- apiVersion: v1 kind: Secret meta ...

  5. 如何为k8s中的pod配置QoS等级?

    1.概述 本文介绍如何为pod分配特定的QoS等级. 我们知道,在k8s的环境中,通过使用QoS等级来做决定,在资源紧张的时候,将哪些的pod进行驱逐,或者说如何对pod进行调度. OK,话不多说,让 ...

  6. 案例分享 生产环境逐步迁移至k8s集群 - pod注册到consul

    #案例分享 生产环境逐步迁移至k8s集群 - pod注册到consul #项目背景 多套业务系统, 所有节点注册到consul集群,方便统一管理 使用consul的dns功能, 所有节点hostnam ...

  7. k8s网络之calico学习

    一.知识准备 1.calico主要通过ipip协议与bgp协议来实现通信.前者通过ipip隧道作为通信基础,后者则是纯三层的路由交换 2.bgp协议主要由两种方式:BGP Speaker 全互联模式( ...

  8. k8s如何管理Pod(rc、rs、deployment)

    是豆荚,可以把容器想像成豆荚里的豆子,把一个或多个关系紧密的豆子包在一起就是豆荚(一个Pod).在k8s中我们不会直接操作容器,而是把容器包装成Pod再进行管理(关于Pod,大家可以参考第十期的分享“ ...

  9. K8S调度之pod亲和性

    目录 Pod Affinity Pod亲和性调度 pod互斥性调度 Pod Affinity 通过<K8S调度之节点亲和性>,我们知道怎么在调度的时候让pod灵活的选择node,但有些时候 ...

  10. k8s几种pod的控制器

    replicationcontroller 选择器 模版 副本数   如果更改选择器,则会创建新的pod 如果更改pod的标签,那么也会创建新的pod进行替换,但是老的pod不会被删除 如果更改模版, ...

随机推荐

  1. HTML5商城开发五 实现返回页面顶部

    本文内容主要是网上参考收集,介绍四种简单的返回页面顶部代码,可以使用简单的HTML锚标记,也可使用Javascript Scroll函数动态返回等等. 一.使用锚标记返回页面顶部 使用HTML锚标记最 ...

  2. org.hibernate.boot.MappingNotFoundException: Mapping (RESOURCE) not found :

    可能原因: hibernate映射文件hibernate.cfg.xml中mapping中resource写错了文件名或者路径

  3. ansible 使用记录

    copy: ansible server -m copy -a 'src=/etc/ansible/port/iptables dest=/etc/sysconfig/iptables owner=r ...

  4. 022_word中如何正确的使用正则表达式进行搜索

    一.word中正则表达式详解 https://www3.ntu.edu.sg/home/ehchua/programming/howto/PowerUser_MSOffice.html 实战举例: ( ...

  5. GIt -- Window下配置 git

    全局配置  git config --global user.name "账户名"  git config --global use r.email '账户邮箱' 生成ssh,命令 ...

  6. 【原创】大叔问题定位分享(17)spark查orc格式数据偶尔报错NullPointerException

    spark查orc格式的数据有时会报这个错 Caused by: java.lang.NullPointerException at org.apache.hadoop.hive.ql.io.orc. ...

  7. KNN与K-Means的区别

    KNN(K-Nearest Neighbor)介绍 Wikipedia上的 KNN词条 中有一个比较经典的图如下: KNN的算法过程是是这样的: 从上图中我们可以看到,图中的数据集是良好的数据,即都打 ...

  8. SQL反模式学习笔记11 限定列的有效值

    目标:限定列的有效值,将一列的有效字段值约束在一个固定的集合中.类似于数据字典. 反模式:在列定义上指定可选值 1. 对某一列定义一个检查约束项,这个约束不允许往列中插入或者更新任何会导致约束失败的值 ...

  9. Linux系统中yum 命令讲解

    (一)yum介绍 Yum(全称为 Yellow dogUpdater, Modified)是一个在Fedora和RedHat以及CentOS中的Shell前端软件包管理器.基于RPM包管理,能够从指定 ...

  10. C#订阅与发布标准实现

    大概看了下C#官方提供的IObservable接口以及IObserver接口来实现发布和订阅,写的很标准,很有代表性,做下笔记,以后要是项目需要用到发布订阅再基于自己的需求改: public clas ...