YAML是Kubernetes的标准工作语言

YAML介绍

Kubernetes使用了YAML语言一个非常关键的特性,叫作"声明式",对应的有另外一个词: "命令式"

先简单描述声明式和命令式之间的区别: 如Docker和Dokcerfile就属于"命令式",大多数编程语言属于命令式,特点是交互性强,注重顺序和过程,必须告诉计算机每步该做什么。所有的步骤都列清楚,这样程序才能一步步走下去。对应的,声明式不关心具体过程,更注重结果,只要告诉它一个目标状态,就会自己想办法完成任务,较为智能化。我们希望Kubernetes能够自动化,其内部的众多组件和插件能够自动监控和管理应用,这个时候用命令式操控它就不合适了,应该使用声明式,因此使用专门的YAML语言。

YAML是JSON的超集,支持整数、浮点数、布尔、字符串、数组和对象等数据类型,也就是说,任何JSON文档都是YAML文档

官网: https://yaml.org/

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 applykubectl 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)的更多相关文章

  1. 微服务 + Docker + Kubernetes 入门实践 目录

    微服务 + Docker + Kubernetes 入门实践: 微服务概念 微服务的一些基本概念 环境准备 Ubuntu & Docker 本文主要讲解在 Ubuntu 上安装和配置 Dock ...

  2. kubernetes入门实践

    k8s中文文档 k8s概念比较多,有什么概念的疑惑的推荐看k8s中文文档. me的环境 操作系统:centos7 docker:1.12.6 环境跟me的不一致?不要慌,基本大部分操作都是行的通的. ...

  3. 云原生入门 第五章:kubernetes学习实践

    1. 简介 在本章中,我们将学习不同的Kubernetes对象,它们的用途以及如何与它们交互. 在设置集群或使用现有集群之后,我们可以开始部署一些工作负载.Kubernetes中最小的计算单元不是一个 ...

  4. 第一章 Kubernetes入门

    第一章 Kubernetes入门 kubernetes是基于容器技术的分布式架构领先方案,是一个完备的分布式系统支撑平台. kubernetes带来的好处:1)全面拥抱微服务:2)统可以随时随地整体“ ...

  5. Kubernetes入门(四)——如何在Kubernetes中部署一个可对外服务的Tensorflow机器学习模型

    机器学习模型常用Docker部署,而如何对Docker部署的模型进行管理呢?工业界的解决方案是使用Kubernetes来管理.编排容器.Kubernetes的理论知识不是本文讨论的重点,这里不再赘述, ...

  6. 分布式学习系列【dubbo入门实践】

    分布式学习系列[dubbo入门实践] dubbo架构 组成部分:provider,consumer,registry,monitor: provider,consumer注册,订阅类似于消息队列的注册 ...

  7. sass、less和stylus的安装使用和入门实践

    刚 开始的时候,说实话,我很反感使用css预处理器这种新玩意的,因为其中涉及到了编程的东西,私以为很复杂,而且考虑到项目不是一天能够完成的,也很少是 一个人完成的,对于这种团队的项目开发,前端实践用c ...

  8. Django入门实践(三)

    Django入门实践(三) Django简单应用 前面简单示例说明了views和Template的工作过程,但是Django最核心的是App,涉及到App则会和Model(数据库)打交道.下面举的例子 ...

  9. Django入门实践(二)

    Django入门实践(二) Django模板简单实例 上篇中将html写在了views中,这种混合方式(指Template和views混在一起)不适合大型开发,而且代码不易管理和维护,下面就用Djan ...

  10. Django入门实践(一)

    Django入门实践(一) Django编程思路+入门 认识Django有一个多月了,我觉得学习Django应该先理清它的编程思路.它是典型的MVC框架(在Django里也称MTV),我觉得Djang ...

随机推荐

  1. jmeter&badboy安装

    一.jmeter下载地址: 1. http://jmeter.apache.org/download_jmeter.cgi   \  https://www.apache.org/dist/jmete ...

  2. STL练习-看病要排队

    题目http://acm.hdu.edu.cn/showproblem.php?pid=1873   看病要排队这个是地球人都知道的常识. 不过经过细心的0068的观察,他发现了医院里排队还是有讲究的 ...

  3. 关于TIdTCPClient的几种方法

    关于TIdTCPClient的几种方法 收藏  其实Indy比较简单,但是可以提供的方法太多了.我找了很久,才搞明白. 比方说这个读取缓冲区的数据,就有很多种方法.相对于TTcpClient的几种方法 ...

  4. IM系统功能简版图(v0.1)持续更新

  5. ABP vNext微服务架构详细教程——项目部署

    1. 基础配置 在之前的文章中,我们已经配置了Kubernetes集群并安装了管理工具Kubesphere,文章地址为:https://mp.weixin.qq.com/s/MgpdMv5A-fYxN ...

  6. 前端复习之JavaScript(ECMAScript5)

    啦啦啦啦啦啦啦啦绿绿绿绿绿绿 1 1.JavaScript: 2 前段三大语言:HTML CSS js 3 HTML:专门编写网页内容的语言 4 CSS:专门编写网页样式的语言 5 js:专门编写网页 ...

  7. Pytorch中tensor的打印精度

    1. 设置打印精 Pytorch中tensor打印的数据长度需要使用torch.set_printoptions(precision=xx)进行设置,否则打印的长度会很短,给人一种精度不够的错觉: & ...

  8. stm32 USART

    stm32 USART 1 USART基础知识 三种模式:轮询模式.中断模式.DMA模式 轮询模式属于阻塞模式 中断模式和DMA模式属于非阻塞模式 发送数据 接收数据 1.1 Polling mode ...

  9. 转帖:巧用Stream优化老代码,太清爽了!

    Java8的新特性主要是Lambda表达式和流,当流和Lambda表达式结合起来一起使用时,因为流申明式处理数据集合的特点,可以让代码变得简洁易读 放大招,流如何简化代码 如果有一个需求,需要对数据库 ...

  10. 错误:为仓库 'appstream' 下载元数据失败 : Cannot prepare internal mirrorlist: No URLs in mirrorlist

    sudo sed -i -e "s|mirrorlist=|#mirrorlist=|g" /etc/yum.repos.d/CentOS-* sudo sed -i -e &qu ...