一、标签和选择器
1、标签
- 命令行操作
# 查看标签
kubectl get [资源类型] [资源名] --show-labels
# 修改标签
kubectl label [资源类型] [资源名] [标签名]=[标签值] --overwrite
# 创建标签
kubectl label [资源类型] [资源名] [标签名]=[标签值]
- Yalm文件操作
2、选择器
- 命令行操作
# 【单条件】选择查看指定标签 type1=app1
kubectl get [资源类型] -l [标签名1]=[标签值1]
# 【多条件】选择查看指定标签 type1=app1 且 type2=app2
kubectl get [资源类型] -l [标签名1]=[标签值1],[标签名2]=[标签值2]
kubectl get [资源类型] -l '[标签名1]=[标签值1],[标签名2] in (标签值2,标签值3,标签值4)'
- Yalm文件操作
二、Deployment (Deploy)
1、创建
通过deployment创建后,查看其yaml文件配置,拷贝有用配置,创建新的yaml文件进行编辑,在创建
# 命令创建资源deploy-nginx
kubectl create deploy [deploy名] --image=nginx
# 查看其对应的yaml文件
kubectl get deploy [deploy名] -o yaml
# 复制可用配置信息,粘贴到新的new—deploy.yaml文件中
vim ./new-deploy.yaml
# 更改完配置后,在运行生成新的容器
kubectl create/apply -f new-deploy.yaml
2、滚动更新
# 编辑deployment资源
kubectl edit deploy [deploy名]
# 更改pod模板的版本号(由‘1.7.9’改为‘1.9.1’)
# 方法一:更改yaml文件配置后,保存并退出
containers:
- image: nginx:1.9.1 #更改此处
# 方法二:通过命令更改
kubectl set image deployment/[deploy名] nginx=nginx:1.9.1 --record '更新原因'
# 查看滚动是否完成
kubectl rollout status deploy [deploy名]
# 查看详细更新记录,细看最后‘Events’详细滚动更新信息
kubectl describe deploy [deploy名]
3、回滚
# 查看之前更新的版本
kebectl rollout history deployment/[deploy名]
# 查看Deployment的历史记录以确定要回滚到的版本信息(只是查看,不执行回滚):
kubectl rollout history deployment/[deploy名] --revision=[回滚版本号]
# 回滚到指定版本
kubectl rollout undo deployment/[deploy名] --to-revision=[回滚版本号]
# 回滚到上一个版本
kebectl rollout undo deployment/[deploy名]
# 手动编辑指定版本,保存后更新
kubectl edit deployment <deployment-name>
注意:只所有可以回滚,是因为ymal文件设置了 spec.revisonHistoryLimit
的值默认为10,不为0。
如果为0,则无法回滚。
4、扩容缩容
# 将副本扩容/缩容到指定个数(6个)
kubectl scale --replicas=6 deploy [deploy名]
5、暂定/恢复
通过编辑edit
资源,每次都会生成一个新版本的re
。因此如果可能编辑多次,可以暂定更新
# 暂停更新rs版本
kubectl rollout pause deploy [deploy名]
# 编辑完后,恢复更新rs版本
kubectl rollout resume deploy [deploy名]
三、StatefunSet (STS)
# 创建Linux的一个工具镜像容器,工具用完进行操作,永远不要重启,运行完后自动删除
kubectl run -it --image busybox:1.28.4 dns-test --restart=Nerver --rm /bin/bash
1、创建
通过yaml文件创建,文件内容写法
注意:开头的两个 ---
之间,表示一个文档的开始。它用于将YAML文件分割成多个文档块。每个文档块可以包含一组相关的数据或配置。
2、扩容缩容
# 将副本扩容/缩容到指定个数(6个)
kubectl scale --replicas=6 sts [sts名]
3、镜像更新
目前不支持直接更新image,需要patch来间接实现
# 更新镜像
kubectl patch sts [sts名] --type='json' -p='[{"op":"replace","path":"/spec/template/spec/containers/0/image","value":"nginx:1.9.1"}]'
- RollingUpdate
【 灰度发布/金丝雀发布】
目标:将项目上线后产生的影响,降到最低。
方案:利用滚动更新中的partition
属性,可以实现简易的灰度发布的效果。
例如:我们有5个 pod,如果当前partition
设置为 3
,那么此时滚动更新时,只会更新那些序号>=3
的 pod。
利用该机制,我们可以通过控制 partition
的值,来决定只更新其中一部分 pod,确认没有问题后,再逐渐增大更新的pod 数量,最终实现全部 pod 更新。
- OnDelete
当设置为OnDelete
后,再更改yaml文档配置后,pod不会立刻更新。只有当删除某一个pod后,该pod才会立刻生成并产生更新。
4、删除
删除时,需删除两部分内容:StatefulSet 和 Headless Service
(1)删除StatefulSet
# 级联删除,删除时,会将pod一起删除
kubectl delete sts [sts名]
# 非级联删除,删除时,不删除pod
kubectl delete sts [sts名] --cascade=false
(2)删除Headless Service
# 直接删除
kubectl delete service [service名]
5、删除pvc
StatefulSet删除后,PVC还会保留,数据不再便用的话,也符要删除。
kubectl delete pvc [pvc名]
四、DaemonSet (DS)
为每一个匹配的 Node节点,都部署一个守护进程。
DaemonSet 会忽略 Node的unschedulable 状态,有两种方式来指走 Pod, 只运行在指定的 Node 节点上:
-
nodeSelector:只调度到匹配指定label的 Node 上
-
nodeAffinity:功能更丰富的 Node 选择器,比如支持集合操作
-
podAffinity:调度到满足条件的 Pod 所在的 Node 上
五、HPA自动扩/缩容
Pod 自动扩容:可以根据CPU 使用率、内存使用率或自定义指标(metrics),自动对 Pod 进行扩/缩容pod的数量。
通常用于 Deployment,不适用于无法扩/缩容的对象,如DaemonSet
控制管理器每隔30s(可以通过-horizontal-pod-autoscaler-sync-period修改)查询metrics的资源使用情况。
支持三种metrics类型
- 预定义metrics(bPod的CPU)以利用率的方式计算
- 自定义的Pod metrics,以始值(raw value)的方式计算
- 自定义的object metrics支持两种metrics查询方式:Heapster和自定义的REST API
- 支持多metrics
(1)通过服务配置,设定指标
配置resources.requests.cpu
或resources.requests.memory
配置cpu,内存的指标。
# 1.创建一个 HPA
# cpu占用超过20%,进行扩容,最少pod数量为 2,最多pod数量为 5
kubectl autoscale deploy <deploy名> --cpu-percent=20 --min=2 --max=5
# 2. 测试:找到对应服务的 service,编写循环测试脚本提升内存与cpu 负载
while true; do wget -q -o- http://<ip:port>> /dev/null ; done
# 3. 获取 HPA 信息比例
kubectl get hpa
(2)自定义指标
- 控制管理器开启
-horizontal-pod-autoscaler-use-rest-clients
- 控制管理器的-apiserver指向API Server Aggregator
- 在APIServer Aggregator中注册自定义的metrics APl