新手学习FFmpeg - 如何编写Kubernetes资源文件
Kubernetes API的使用方式
Kubernetes API属于声明式API编程, 它和常用的命令式编程有一些区别。 通俗的说,命令式编程是第一人称,我要做什么,我要怎么做。 操作系统最喜欢这种编程范式了, 操作系统几乎不用"思考", 只要一对一的将代码翻译成指令就可以了。 而声明式编程则类似于"第二人称", 也就是你要做什么。 有点"产品经理"和"开发“之间的关系, "产品经理"只负责提需求,而"开发"怎么实现他不并关心。
用户相对Kubernetes就是"产品经理"的角色, 用户只需要给Kubernetes提需求就可以了,比如说你(Kubernetes)给我(用户)创建一个运行Mysql服务的Demployment,这个Deployment运行的Pod镜像是xxxx,运行参数是xxxxx,挂载的数据卷是xxxxx。。。。。 等等。 开发(Kubernetes)接受到这个需求后,看看需求是否合理(验证Deployment里面的参数是否正确),然后就开始创建了。 等待创建成功后,就告诉"产品经理"(用户)Deployment创建成功。
在创建过程中,用户并没有(也不需要)关心服务是如何创建的。 这种操作方式就是声明式API。
对于Kubernetes来说,声明式API最大的难点就在于如何提一个正确的需求了。 所以下面来看看如何给Kubernetes提需求。
API的载体 -- Yaml
用户可以通过kubectl
与Kubernetes交互,使用kubectl
会通过读取指定的资源定义文件来要求kubernetes创建各种资源,这里的资源文件指的就是"需求文档",在里面规定了各种资源的"大小","规格"。 为了用户可以方便理解里面的内容(实际使用过程中,感觉使用yaml其实并不方便。尤其是当数据层次多的时候,经常出现空白符不匹配导致解析失败的问题),资源文件使用了yaml
格式(yaml
对用户友好,kubectl
提交需求时,会将yaml转换成json格式,所以Kubernetes其实最终读取的是json格式的需求文档).
我经常在编辑完之后,通过 https://codebeautify.org/yaml-validator 来验证格式是否正确。
编辑Yaml过程中,有如下几个注意事项:
- 通过空格控制缩进,不支持Tab
- 如果参数是以空格开始,则需要单引号将其包含起来, 如果参数中包括单引号,则需要进行转义操作
- 冒号后一定要有空格
- 使用一个短横+一个空格表示列表,同样的缩进层级表示属于同一个列表
- 空值使用null或者~表示。
API文档总览
Kubernetes的API文档在 https://kubernetes.io/docs/reference/ 点击版本号,就可以看到相对应的API文档说明。
Kubernetes API大致分为以下几类(个人起的名称,未必准确):
- 计算类
- 负载类
- 配置类
- 管理类
计算类对应是Workload
,主要是Pod,Job,Deployment,ReplicaSet之类涉及到CPU计算的各种资源。 负载类指的是LB类资源,配置类指的是ConfigMap
之类涉及到外部资源的数据资源, 而管理类指的是对集群的管理,例如创建命名空间,节点隔离等
对Kubernetes的资源操作,绝大多数就是对上面四类资源的操作。
一个标准的Kubernetes 资源文件,其结构大致是下面的样子:
apiVersion:
kind:
metadata:
spec:
status:
apiVersion
表示API版本,服务端会通过读取这个版本号,来进行内容验证。 这个版本号可以通过API文档获取,例如要编写一个Deployment资源,首先查看API文档(https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.17/#daemonset-v1-apps)如下:
版本号由Group/Version
这样的格式组成,因此Deployment的apiVersion
就是apps/v1
。 需要注意下面一行小字: "Other API versions of this object exist: v1beta2 v1beta1 v1beta1",因此apps/v1beta2
, apps/v1beta1
这样的版本号也是合法的。 具体使用哪个版本号,最终要取决于集群支持哪个版本号。
kind
表示操作的是什么资源, 向上面要操作Deployment,kind就是Deployment。 如果要创建Pod,则Kind就是Pod。
metadata
则是此资源的一些元数据, 如何设置后面会聊到
spec
是具体如何创建这个资源,同样放到后面再聊
status
是此资源状态数据,用户不需要设置,即便设置,集群也会过滤掉
总结一下:
用户通过apiversion
+kind
告之集群,准备按照哪个API版本所规定的协议创建何种资源。 集群确认支持指定版本和资源后,就会读取后面的资源详细参数。 但需要注意,未必所有资源都有这几项,例如Configmap
就没有Spec,但却增加了data. 后面会聊到如何通过API文档来组织资源文件
创建资源
来看metadata
。每种资源有不同的metadata
规范, 大部分场景中可以通用的,也就是说虽然资源不同,但metadata格式相同,只是里面的参数不同。 当需要查看具体metadata
时,直接点击metadata
下面的ObjectMeta
,如下图:
会跳到ObjectMeata
定义页面中:
这里仍然假设需要创建一个Deployment,apiVersion
和kind
此时都已经确定了(如果仍然不明白,建议再看一下上面一节)。 然后开始写metedata
. 通过ObjectMeta
可以看到里面有很多属性,例如annotations
表示一些注释信息,类型是obejct
,通过后面的链接: https://kubernetes.io/docs/concepts/overview/working-with-objects/annotations/ 可以得知是一个key=value
格式的map。 如果要添加注释信息,可以按照如下方式编写:
apiVersion: apps/v1beta2
kind: Deployment
metadata:
annotations:
deployment.kubernetes.io/revision: "1"
在创建任何资源时,name和namesapce都是需要指定的(namespace如果不指定,默认是default,但指定namespace是一个好习惯)。查看name和namespace的定义:
都是字符串格式,因此在上面基础之上在添加name和namespace:
apiVersion: apps/v1beta2
kind: Deployment
metadata:
annotations:
deployment.kubernetes.io/revision: "1"
name: envoy-01
namespace: tio
在某些场景中(其实是大多数场景),需要通过label来筛选对应的workload,所以有必要给我的Deployment添加特定的Label, 查看一下Label的定义:
查看后面的链接 (https://kubernetes.io/docs/concepts/overview/working-with-objects/labels/) 可以看出也是一个key=value
格式的map,和annotations
一样,所以添加label如下:
apiVersion: apps/v1beta2
kind: Deployment
metadata:
annotations:
deployment.kubernetes.io/revision: "1"
labels:
k8s-app: envoy-01
name: envoy-01
namespace: tio
metadata
的定义就先看到这里,下面来看spec
应该如何定义。
同样,直接点击deployment
spec下面的类型定义,
每个资源的spec都不同,下面是DeploymentSpec的定义:
每个属性都有解释,这里就不逐一翻译了, 我们假设这个Deployment预期两个Pod,因此replicas=2,通过selector来匹配ReplicaSet,设定strategy为滚动更新。 在上面资源文件的基础之上,我们继续定义spec,如下:
apiVersion: apps/v1beta2
kind: Deployment
metadata:
annotations:
deployment.kubernetes.io/revision: "1"
labels:
k8s-app: envoy-01
name: envoy-01
namespace: tio
spec:
replicas: 1
selector:
matchLabels:
k8s-app: envoy-01
strategy:
rollingUpdate:
maxSurge: 25%
maxUnavailable: 25%
type: RollingUpdate
selector
可以参考(https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.17/#labelselector-v1-meta)规定的规范, strategy
可以参看(https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.17/#deploymentstrategy-v1-apps)。
这些定义完成后,就剩下Template
了,这个用来定义应该如何来创建Pod(或者说表示用户想要一个什么样的Pod)。
点击下面的Pod数据定义:
可以看到Pod Template有两个属性:
因此资源文件大致应该是如下的样子:
apiVersion: apps/v1beta2
kind: Deployment
metadata:
annotations:
deployment.kubernetes.io/revision: "1"
labels:
k8s-app: envoy-01
name: envoy-01
namespace: tio
spec:
replicas: 1
selector:
matchLabels:
k8s-app: envoy-01
strategy:
rollingUpdate:
maxSurge: 25%
maxUnavailable: 25%
type: RollingUpdate
template:
metadata:
spec:
metadata
和spec
. 其中metadata
和上面我们所设置的metadata
一样,这里就不赘述了。spec
通过下面的定义可以得知是podspec
。
点击podspec
后可以看到和经常设置的docker container参数有一些类似了:
我们继续在上面资源文件基础上补充podspec
的内容
apiVersion: apps/v1beta2
kind: Deployment
metadata:
annotations:
deployment.kubernetes.io/revision: "1"
labels:
k8s-app: envoy-01
name: envoy-01
namespace: tio
spec:
replicas: 1
selector:
matchLabels:
k8s-app: envoy-01
strategy:
rollingUpdate:
maxSurge: 25%
maxUnavailable: 25%
type: RollingUpdate
template:
metadata:
labels:
k8s-app: envoy-01
spec:
containers:
- args:
- -c
- /etc/envoy/envoy.yaml
- --service-node
- sn1
- --service-cluster
- sc1
command:
- envoy
image: envoyproxy/envoy
imagePullPolicy: IfNotPresent
name: envoy
resources:
limits:
cpu: 500m
memory: 512Mi
requests:
cpu: 250m
memory: 256Mi
securityContext:
privileged: false
procMount: Default
terminationMessagePath: /dev/termination-log
terminationMessagePolicy: File
volumeMounts:
- mountPath: /etc/envoy
name: conf
至此,一个最简单的Deployment
资源文件就写好了。 剩下的就是通过kubectl
提交这个需求给Kubernetes集群,然后就可以等待Kubernetes慢慢创建资源了。
新手学习FFmpeg - 如何编写Kubernetes资源文件的更多相关文章
- Android 开发学习进程0.17 Android资源文件selector textview显示两种不同字体
selector 是安卓资源文件的一种,它可以使按钮等实现不同状态下的不同UI,不用在代码中实现,而使用方式有两种,一种在color文件下 创建.xml可以使按钮等字体在不同状态下的变化,其二是在dr ...
- 新手学习FFmpeg - 调用API编写实现多次淡入淡出效果的滤镜
前面几篇文章聊了聊FFmpeg的基础知识,我也是接触FFmpeg不久,除了时间处理之外,很多高深(滤镜)操作都没接触到.在学习时间处理的时候,都是通过在ffmpeg目前提供的avfilter基础上面修 ...
- 新手学习FFmpeg - 通过API完成filter-complex功能
本篇尝试通过API实现Filter Graph功能. 源码请参看 https://andy-zhangtao.github.io/ffmpeg-examples/ FFmpeg提供了很多实用且强大的滤 ...
- 新手学习FFmpeg - 调用API完成视频的读取和输出
在写了几个avfilter之后,原本以为对ffmpeg应该算是入门了. 结果今天想对一个视频文件进行转码操作,才发现基本的视频读取,输出都搞不定. 痛定思痛,仔细研究了一下ffmpeg提供的examp ...
- 新手学习FFmpeg - 调用API完成录屏
调用FFMPEG Device API完成Mac录屏功能. 调用FFMPEG提供的API来完成录屏功能,大致的思路是: 打开输入设备. 打开输出设备. 从输入设备读取视频流,然后经过解码->编码 ...
- 新手学习FFmpeg - 调用API完成录屏并进行H.264编码
Screen Record H.264 目前在网络传输视频/音频流都一般会采用H.264进行编码,所以尝试调用FFMPEG API完成Mac录屏功能,同时编码为H.264格式. 在上一篇文章中,通过调 ...
- 新手学习FFmpeg - 调用API完成两个视频的任意合并
本次尝试在视频A中的任意位置插入视频B. 在上一篇中,我们通过调整PTS可以实现视频的加减速.这只是对同一个视频的调转,本次我们尝试对多个视频进行合并处理. Concat如何运行 ffmpeg提供了一 ...
- 新手学习FFmpeg - 调用API计算关键帧渲染时间点
通过简单的计算来,线上I帧在视频中出现的时间点. 完整代码请参考 https://andy-zhangtao.github.io/ffmpeg-examples/ 名词解释 首先需要明确以下名词概念: ...
- 新手学习FFmpeg - 调用API调整视频局部速率
通过修改setpts代码实现调整视频部分的播放速率. 完整代码可参考: https://andy-zhangtao.github.io/ffmpeg-examples/ 在前面提到了PTS/DTS/T ...
随机推荐
- 小白学 Python(24):Excel 基础操作(下)
人生苦短,我选Python 前文传送门 小白学 Python(1):开篇 小白学 Python(2):基础数据类型(上) 小白学 Python(3):基础数据类型(下) 小白学 Python(4):变 ...
- (二)初识NumPy库(数组的操作和运算)
本章主要介绍的是ndarray数组的操作和运算! 一. ndarray数组的操作: 操作是指对数组的索引和切片.索引是指获取数组中特定位置元素的过程:切片是指获取数组中元素子集的过程. 1.一维数组的 ...
- 【前端知识体系-JS相关】JS-Web-API总结
2.1 DOM操作 2.1.1 DOM的本质是什么? <!-- DOM树:二叉树 --> /* <?xml version="1.0" encoding=&quo ...
- 力扣(LeetCode)二进制间距 个人题解
输入:6 输出:1 解释: 6 的二进制是 0b110 . 示例 4: 输入:8 输出:0 解释: 8 的二进制是 0b1000 . 在 8 的二进制表示中没有连续的 1,所以返回 0 . 提示: 1 ...
- Vue2.x与bootsrap-table动态添加元素和绑定事件无效
一.问题: 最近在使用vue与bootstrap-table结合生成表格时,按以前的经验----每列数据可用formatter:function(value,row,index){}进行一些其 ...
- static declaration follows non-static declaration
前段时间工作中要为android编译跨平台的第三方库,遇到了arc4random有关函数的“static declaration follows non-static declaration”问题,那 ...
- 使用lib-flexible.js适配移动端UI设计750px设计图
最近在和设计沟通关于设计图尺寸大小和前端实际页面尺寸大小不一致的情况,我们的UI设计是使用的iPone6的,(iphone6: 375px*667px 实际像素:750px*1334px)如果 ...
- DDD实战与进阶 - 值对象
目录 DDD实战与进阶 - 值对象 概述 何为值对象 怎么运用值对象 来看一个例子 值对象的持久化 总结 DDD实战与进阶 - 值对象 概述 作为领域驱动设计战术模式中最为核心的一个部分-值对象.一直 ...
- 关于HashMap容量的初始化,还有这么多学问。
在<HashMap中傻傻分不清楚的那些概念>文章中,我们介绍了HashMap中和容量相关的几个概念,简单介绍了一下HashMap的扩容机制. 文中我们提到,默认情况下HashMap的容量是 ...
- 前端API层架构,也许你做得还不够
上午好,今天为大家分享下个人对于前端API层架构的一点经验和看法.架构设计是一条永远走不完的路,没有最好,只有更好.这个道理适用于软件设计的各个场景,前端API层的设计也不例外,如果您觉得在调用接口时 ...