官网(https://yaml.org/)
YAML 语言创建于 2001 年,比 XML 晚了三年。YAML虽然在名字上模仿了XML,但实质上与XML完全不同,更适合人类阅读,计算机解析起来也很容易。
JSON是YAML的子集,YAML支持整数、浮点数、布尔、字符串、数组和对象等数据类型。
也就是说,任何合法的JSON文档也都是YAML文档,如果你了解JSON,那么学习YAML会容易很多。
但和JSON比起来,YAML的语法更简单,形式也更清晰紧凑,主要有如下规则:
YAML数组(列表)
ProgrammingLanguages:
- Python
- Java
- JavaScript
对应json是这样的:
{
"ProgrammingLanguages": [
"Python",
"Java",
"JavaScript"
]
}
YAML对象(字典)
CloudResources:
virtualMachines: 5
storageAccounts: 2
对应json是这样:
{
"CloudResources": {
"virtualMachines": 5,
"storageAccounts": 2
}
}
复杂的例子,组合数组和对象
DataCenter:
primary:
- database: active
- cache: active
secondary:
- webserver: active
- load-balancer: inactive
- storage-drivers: [s3, ceph, glusterfs]
对应json为:
{
"DataCenter": {
"primary": [
{
"database": "active"
},
{
"cache": "active"
}
],
"secondary": [
{
"webserver": "active"
},
{
"load-balancer": "inactive"
},
{
"storage-drivers": ["s3", "ceph", "glusterfs"]
}
]
}
}
在K8s里,YAML用来声明API对象的,那么API对象都有哪些?可以这样查看资源对象:
kubectl api-resources
Pod为K8s里最小、最简单的资源对象。
运行一个pod
kubectl run pod-demo --image=busybox
从已知Pod导出YAML文件:
kubectl get pod pod-demo -o yaml > pod-demo.yaml
Pod YAML示例:
四个核心部分:apiVersion、Kind、metadata、spec
vi ngx-pod.yaml
apiVersion: v1
kind: Pod
metadata:
name: ngx-pod
namespace: tang #命名空间要提前创建好
labels: ## labels字段非常关键,它可以添加任意数量的Key-Value,目的是为了让pod的信息更加详细
env: dev
spec: ##用来定义该pod更多的资源信息,比如containers, volume, storage
containers: ##定义容器属性
- image: nginx:1.23.2
imagePullPolicy: IfNotPresent ##镜像拉取策略,三种:Always/Never/IfNotPresent,一般默认是IfNotPresent,也就是说只有本地不存在才会远程拉取镜像,可以减少网络消耗。
name: ngx
env: ##定义变量,类似于Dockerfile里面的ENV指令
- name: os
value: "Rocky Linux"
ports:
- containerPort: 80
创建命名空间namespace:
kubectl create namespace tang
使用YAML创建pod:
kubectl apply -f testpod.yaml
查看这个pod:
kubectl get pod -n tang
删除pod:
kubectl delete -f testpod.yaml
Pod生命周期包括以下几个阶段:
除了这些基本的生命周期阶段之外,还有一些更详细的容器状态,用于描述容器在Pod生命周期中的不同阶段:
1. 用户通过kubectl或其他API客户端提交Pod对象给API server。
2. API server尝试将Pod对象的相关信息存入etcd中,写入操作完成后API server会返回确认信息至客户端。
3. API server开始反映etcd中的状态变化。
4. 所有的Kubernetes组件均使用watch机制来跟踪检查API server上的相关变化。
5. Kube-scheduler通过其watcher观察到API server创建了新的Pod对象但尚未绑定至任何节点。
6. Kube-scheduler为Pod对象挑选一个工作节点并将结果更新至API server。
7. 调度结果由API server更新至etcd,而且API server也开始反映此Pod对象的调度结果。
8. Pod 被调度的目标工作节点上的kubelet尝试在当前节点上调用Containerd启动容器,并将容器的结果状态返回至API server。
9. API server将Pod 状态信息存入etcd。
10. 在etcd确认写操作完成后,API server将确认信息发送至相关的kubelet。
1. 请求删除Pod。
2. API server将Pod标记为Terminating状态。
3. (与第 2 步同时进行)kubelet在监控到Pod对象转为Terminating状态的同时启动Pod关闭过程。
4. (与第 2 步同时进行)Service将Endpoint摘除。
5. 如果当前Pod对象定义了preStop hook,则在其标记为Terminating后会以同步的方式执行,宽限期开始计时。
6. Pod中的容器进程收到TERM信号。
7. 宽限期结束后,若进程仍在运行,会收到SIGKILL信号。
8. kubelet请求API server将此Pod对象的宽限期设置为0,从而完成删除操作。
1)Resource Quota
资源配额Resource Quotas(简称quota)是对namespace进行资源配额,限制资源使用的一种策略。
K8S是一个多用户架构,当多用户或者团队共享一个K8S系统时,SA使用quota防止用户(基于namespace的)的资源抢占,定义好资源分配策略。
Quota应用在Namespace上,默认情况下,没有Resource Quota的,需要另外创建Quota,并且每个Namespace最多只能有一个Quota对象。
可限定资源类型:
计算资源:limits.cpu、requests.cpu、limits.memory、requests.memory
存储资源,包括存储资源的总量以及指定storage class的总量
requests.storage:存储资源总量,如500Gi
persistentvolumeclaims:pvc的个数
对象数,即可创建的对象的个数
pods, replicationcontrollers, configmaps, secrets,persistentvolumeclaims,services, services.loadbalancers,services.nodeports
注意:
Quota依赖于资源管理器,可以使用资源对象limits或者在创建资源对象时为pod设置资源限制(resources),如果不设置,资源对象无法创建。
当该namespace中的任意个额度达到预设Quota时,将无法创建资源对象。
Resource Quota示例:
cat > quota.yaml <
生效
kubectl apply -f quota.yaml
查看
kubectl get quota -n aming
测试:
为了显示限额效果,修改quota.yaml,将pod限制数改为5,其它先删除掉
命令行创建deployment,指定Pod副本为7
kubectl create deployment testdp --image=nginx:1.23.2 -n aming --replicas=7
查看deployment和pod
kubectl get deploy,po -n aming
2)Pod的limits和requests
Resource Quota是针对namespace下面所有的Pod的限制,而Pod自身也有限制。
示例:
cat > quota-pod.yaml <