Kubernetes入门实践(YAML)

2023-07-29,,

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)的相关教程结束。

《Kubernetes入门实践(YAML).doc》

下载本文的Word格式文档,以方便收藏与打印。