Kubernetes入门实践(YAML)
YAML是Kubernetes的标准工作语言
YAML介绍
Kubernetes使用了YAML语言一个非常关键的特性,叫作"声明式",对应的有另外一个词: "命令式"
先简单描述声明式和命令式之间的区别: 如Docker和Dokcerfile就属于"命令式",大多数编程语言属于命令式,特点是交互性强,注重顺序和过程,必须告诉计算机每步该做什么。所有的步骤都列清楚,这样程序才能一步步走下去。对应的,声明式不关心具体过程,更注重结果,只要告诉它一个目标状态,就会自己想办法完成任务,较为智能化。我们希望Kubernetes能够自动化,其内部的众多组件和插件能够自动监控和管理应用,这个时候用命令式操控它就不合适了,应该使用声明式,因此使用专门的YAML语言。
YAML是JSON的超集,支持整数、浮点数、布尔、字符串、数组和对象等数据类型,也就是说,任何JSON文档都是YAML文档
YAML简单实例:
数组
# YAML数组(列表)
OS:
- linux
- macOS
- Windows
这段YAML对应的JSON如下:
{
"OS": ["linux","macOS","Windows"]
}
对比之下,YAML的形式更为简单,没有闭合花括号、方括号的麻烦,每个元素后面无需逗号
字典
# YAML对象(字典)
Kubernetes:
master:1
worker:3
等价的JSON:
{
"Kubernetes": {
"master": 1,
"worker": 3
}
}
YAML中的Key无需双引号
利用这两个对象,可以描述任意的Kubernetes资源对象:
Kubernetes:
master:
- apiserver: running
- etcd: running
node:
- kubelet: running
- kube-proxy: down
- container-runtime: [docker,containerd,cri-o]
Kubernetes下有两个数组master和node,maste中是两对键值:apiserver:running和etcd:running,而node同理
API对象
使用kubectl api-resources来查看当前Kubernetes版本支持的所有对象:
$ minikube kubectl -- api-resources
NAME SHORTNAMES APIVERSION NAMESPACED KIND
bindings v1 true Binding
componentstatuses cs v1 false ComponentStatus
configmaps cm v1 true ConfigMap
endpoints ep v1 true Endpoints
events ev v1 true Event
...
NAME一列是对象的名字,比如ConfigMap、Pod、Service等等,第二列SHORTNAME是该资源的简写
API对象全面描述了集群的节点、应用、配置、服务、帐号等信息,apiserver会将它们存储在数据库etcd里,然后kubelet、scheduler、controller-manager等组件通过apiserver来操作,就在API对象这个抽象层次实现了对整个集群的管理
可以编辑YAML,让Kubernetes自己去拉取镜像:
apiVersion: v1
kind: Pod
metadata:
name: ngx-pod
labels:
env: demo
owner: test
spec:
containers:
- image: nginx:alpine
name: ngx
ports:
- containerPort: 80
kind指明了这是一个Pod,image要使用nginx:alpine镜像创建一个容器,containerPort指明开放80端口
apiVersion、kind、metadata算是API对象的基本信息,apiVersion表示操作这种资源的API版本号,kind表示资源对象类型,metadata表示资源的元信息
name和labels是元信息,name为Pod命名,labels为Pod的标签信息,便于查找,分别是env和owner
kubectl将基于这些基本信息生成HTTP请求发送给apiserver,spec表示对对象的期望状态,其中有一个containers数组,其中每个元素都是一个对象,指定了名字、镜像、端口等信息
上述的YAML文档完整地描述了一个类型是Pod的API对象,使用kubectl apply和kubectl delete再加上参数-f就可以用这个文件创建和删除对象
创建:
$ minikube kubectl -- apply -f ngx-pod.yml
pod/ngx-pod created
删除:
$ minikube kubectl -- delete -f ngx-pod.yml
pod "ngx-pod" deleted
加上--v=9就可以看到HTTP请求的详细信息:
$ minikube kubectl -- apply -f ngx-pod.yml --v=9
I0723 21:22:29.488559 14027 loader.go:372] Config loaded from file: /home/hwx/.kube/config
I0723 21:22:29.488939 14027 cert_rotation.go:137] Starting client certificate rotation controller
I0723 21:22:29.489379 14027 round_trippers.go:466] curl -v -XGET -H "Accept: application/com.github.proto-openapi.spec.v2@v1.0+protobuf" -H "User-Agent: kubectl/v1.23.3 (linux/amd64) kubernetes/816c97a" 'https://192.168.59.100:8443/openapi/v2?timeout=32s'
I0723 21:22:29.493235 14027 round_trippers.go:510] HTTP Trace: Dial to tcp:127.0.0.1:7890 succeed
I0723 21:22:29.498071 14027 round_trippers.go:570] HTTP Statistics: DNSLookup 0 ms Dial 0 ms TLSHandshake 3 ms ServerProcessing 0 ms Duration 8 ms
I0723 21:22:29.498087 14027 round_trippers.go:577] Response Headers:
I0723 21:22:29.498092 14027 round_trippers.go:580] Audit-Id: b9d283c2-26c6-4c7b-953a-91edcc96c164
I0723 21:22:29.498098 14027 round_trippers.go:580] Content-Type: application/octet-stream
I0723 21:22:29.498102 14027 round_trippers.go:580] Last-Modified: Sat, 23 Jul 2022 10:25:52 GMT
编写技巧
使用kubectl api-resources命令查看资源对象相应的API版本和类型
使用kubectl explain相当于是Kubernetes自带的API文档,会给出对象字段的详细说明
$ minikube kubectl -- explain pod
KIND: Pod
VERSION: v1
DESCRIPTION:
Pod is a collection of containers that can run on a host. This resource is
created by clients and scheduled onto hosts.
FIELDS:
apiVersion <string>
APIVersion defines the versioned schema of this representation of an
object. Servers should convert recognized schemas to the latest internal
value, and may reject unrecognized values. More info:
https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources
....
$ minikube kubectl -- explain pod.metadata
KIND: Pod
VERSION: v1
RESOURCE: metadata <Object>
DESCRIPTION:
Standard object's metadata. More info:
https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata
ObjectMeta is metadata that all persisted resources must have, which
includes all objects users must create.
......
生成样板:
$ minikube kubectl -- run ngx --image=nginx:alpine --dry-run=client -o yaml
apiVersion: v1
kind: Pod
metadata:
creationTimestamp: null
labels:
run: ngx
name: ngx
spec:
containers:
- image: nginx:alpine
name: ngx
resources: {}
dnsPolicy: ClusterFirst
restartPolicy: Always
status: {}
加上两个特殊参数--dry-run=client和-o yaml,前者是空运行,后者是生成YAML格式,这两者结合不会有实际的创建动作,只生成YAML文件
Kubernetes入门实践(YAML)的更多相关文章
- 微服务 + Docker + Kubernetes 入门实践 目录
微服务 + Docker + Kubernetes 入门实践: 微服务概念 微服务的一些基本概念 环境准备 Ubuntu & Docker 本文主要讲解在 Ubuntu 上安装和配置 Dock ...
- kubernetes入门实践
k8s中文文档 k8s概念比较多,有什么概念的疑惑的推荐看k8s中文文档. me的环境 操作系统:centos7 docker:1.12.6 环境跟me的不一致?不要慌,基本大部分操作都是行的通的. ...
- 云原生入门 第五章:kubernetes学习实践
1. 简介 在本章中,我们将学习不同的Kubernetes对象,它们的用途以及如何与它们交互. 在设置集群或使用现有集群之后,我们可以开始部署一些工作负载.Kubernetes中最小的计算单元不是一个 ...
- 第一章 Kubernetes入门
第一章 Kubernetes入门 kubernetes是基于容器技术的分布式架构领先方案,是一个完备的分布式系统支撑平台. kubernetes带来的好处:1)全面拥抱微服务:2)统可以随时随地整体“ ...
- Kubernetes入门(四)——如何在Kubernetes中部署一个可对外服务的Tensorflow机器学习模型
机器学习模型常用Docker部署,而如何对Docker部署的模型进行管理呢?工业界的解决方案是使用Kubernetes来管理.编排容器.Kubernetes的理论知识不是本文讨论的重点,这里不再赘述, ...
- 分布式学习系列【dubbo入门实践】
分布式学习系列[dubbo入门实践] dubbo架构 组成部分:provider,consumer,registry,monitor: provider,consumer注册,订阅类似于消息队列的注册 ...
- sass、less和stylus的安装使用和入门实践
刚 开始的时候,说实话,我很反感使用css预处理器这种新玩意的,因为其中涉及到了编程的东西,私以为很复杂,而且考虑到项目不是一天能够完成的,也很少是 一个人完成的,对于这种团队的项目开发,前端实践用c ...
- Django入门实践(三)
Django入门实践(三) Django简单应用 前面简单示例说明了views和Template的工作过程,但是Django最核心的是App,涉及到App则会和Model(数据库)打交道.下面举的例子 ...
- Django入门实践(二)
Django入门实践(二) Django模板简单实例 上篇中将html写在了views中,这种混合方式(指Template和views混在一起)不适合大型开发,而且代码不易管理和维护,下面就用Djan ...
- Django入门实践(一)
Django入门实践(一) Django编程思路+入门 认识Django有一个多月了,我觉得学习Django应该先理清它的编程思路.它是典型的MVC框架(在Django里也称MTV),我觉得Djang ...
随机推荐
- Linux(2)
虚拟机关键配置名词解释 远程链接工具 linux准则 远程链接工具快捷键 系统相关命令 文件相关命令 linux目录结构 虚拟机关键配置名词解释 # 虚拟网络编辑器说明 桥接模式 # 可以访问互联网 ...
- 【Unity】拖动图片生成对应Image
写在前面 拼UI时会用到多个Image,一般操作是:①新建一个Image,②拖入Image用到的图片,③SetNativeSize,④关闭不必要的raycastTarget .为了能尽快拼完UI,我写 ...
- RabbitMQ博文收藏
RabbitMQ基本概念 消息队列之 RabbitMQ
- Javascript 事件派发 dispatcher
基本使用 基础事件 let event = new Event("click") //新建click事件 node.addEventListener("click&quo ...
- rang()函数
# range(start,stop,step)a = range(10)print(a)print(list(a)) # 从0开始,默认步长为1.b = range(2,10) # 从2 开始,到s ...
- JavaScript数组常用的方法总结
数组常用方法 concat() 方法 concat() 方法用于连接两个或多个数组. 该方法不会改变现有的数组,而仅仅会返回被连接数组的一个副本. var arr = new Array(3) arr ...
- UIPath踩坑记一开发环境检查
第一步:设置--设计--关闭新项目使用新式体验 第二步:Uipath与浏览器的通信护展是否已安装,如果没有安装需要点击安装 第三步:浏览器中安装的扩展是否已经打开
- C++ read 读取字节数与设置不一样
当需要读取二进制文件时,C++可以采用ofstream流,并设置模式为ios::binary,就可以通过read函数进行按照字节读取了. 需要注意的是: 如果模式未进行设置,默认将以文本方式读取,此时 ...
- Undelivered Mail Returned to Sender
电子邮件是使用电子邮件地址application@sample.com从Application发送的. 出于业务原因我们无法在此应用程序中更新/删除无效的外部电子邮件地址,因此响应出站电子邮件会生成许 ...
- windows下 mstsc 远程Ubuntu 图形界面2
采用 xrdp-0.9.2 + xorgxrdp-0.2.0 + xfce ,可完美实现远程,且: 1.支持中断后重新连接上一次连接. 2.支持clipbord跨平台复制. 3.xfce桌面,双机打开 ...