k8s-No.2-pod学习
本章目录
- pod结构图
- pod语法及参数说明
- 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的权威指南,吴治辉老师等人出版的那本,真的是权威中的权威,推荐购买
最新文章
- IIS监控指标
- STM32 (战舰)
- How Old Are You?
- c++ primer plus 习题答案(8)
- aMule代码分析(2)——CFileDataIO类和CFile类
- 项目管理Project
- canvas学习总结六:绘制矩形
- appium----【已解决】【Mac】安装sudo npm install -g appium-doctor总是提示“Error: EACCES: permission denied........”
- Basic 001 Bob
- eclipse中的项目为什么无法添加到tomcat中?
- Nginx 负载均衡4种模式
- java面向对象编程(四)--类变量、类方法
- 牛客小白月赛7 CSL的校园卡
- [数学] 将长为L的木棒随机折成3段,则3段构成三角形的概率
- 中国程序化购买广告解析:RTB/DSP/Ad Exchange/SSP/DMP,思维导图
- 注册google账号 解决国内手机注册失败的问题
- 安装oracle 11g时,报启动服务出现错误,找不到OracleMTSRecoveryService的解决方法
- JavaScript事件冒泡与捕获
- Spring Cloud OAuth2(二) 扩展登陆方式:账户密码登陆、 手机验证码登陆、 二维码扫码登陆
- js缓动函数
热门文章
- ASP .NET Core HTTP Error 502.5 – Process Failure
- vue-地址插件 v-region
- Java_变量类型
- Android Studio打开项目,停在gradle的解决方案
- Java基础try-with-resource语法源码分析
- 切换Allegro PCB Editor
- Allegro PCB Design GXL (legacy) 将brd文件另存为低版本文件
- 学习笔记: 异常状态管理,托管堆垃圾回收,CLR寄宿
- gitLib操作笔录《一》:创建分支,切换分支,提交分支到远程,以及基本代码clone与更新提交到远程操作指令
- H5测试与PC端测试不同的点