5.Kubernetes核心资源:Controller控制器
[toc]
Controller控制器的概述
Controller控制器作用
- pod类型的资源,删除pod后,不会重建
- 替用户监视并保证相应的节点上始终有用户所期望的副本数量的pod在运行
- 如果所运行的pod副本数超过了用户期望的,那么控制器就会删掉,直到和用户期望的一致
- 如果所运行的pod副本数低于用户期望的,那么控制器就会创建,直到和用户期望的一致
Controller控制器类型
- 不常用
- RC:Replication Controller
- 控制Pod起多个副本
- StatefulSet
- 有状态的应用,为Pod提供唯一标识,它可以保证部署和scale的顺序
- RC:Replication Controller
- 重点且常用
- RS:ReplicaSet
- 控制Pod起多个副本,服务挂了自动启动,始终保持相应数量副本
- Deployment:
- Deployment通过控制RS来保证POD始终保持相应的数量副本 // deployment不能直接控制POD,而是控制RS控制器
- 支持滚动更新,回滚,回滚默认保留10个版本 // 支持版本更新
- 提供声明式配置,支持动态修改 // 支持动态修改
- 管理无状态应用最理想的控制器
- node节点可能会运行0个或多个POD
- daemonset
- 保证每个node节点,有且只有一个POD启动
- 每台只起一个客户端软件
- RS:ReplicaSet
RS控制器
在资源清单配置RS控制器的方法
正确写法解析
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49# 编辑资源清单
vim nginx-rs.yaml
apiVersion: apps/v1
kind: ReplicaSet
# RS控制器的metadata
metadata:
# RS控制器的名字
name: rs
spec:
# 副本数量
replicas: 5
selector:
# 指定要控制的pod标签
matchLabels:
name: hcl
########### POD ############
template:
# POD的metadata
metadata:
# POD名字
name: nginx-pod
# POD标签名
labels:
name: hcl
spec:
containers:
- name: nginx-container
image: nginx:alpine
imagePullPolicy: IfNotPresent
apiVersion: apps/v1
kind: ReplicaSet
metadata:
name: nginx-rs
spec:
replicas: 5
selector:
matchLabels:
name: hcl
template:
metadata:
name: nginx-pod
labels:
name: hcl
spec:
containers:
- name: nginx-container
image: nginx:alpine
imagePullPolicy: IfNotPresent总结
- RS控制器的接口版本不是”v1”,而是”apps/v1”
- RS控制器spec中,selector(标签选择器,必须要写)
- POD必须使用labels打标签
- RS控制器的template要包住原来的POD资源内容
查看启动的pod信息
1 | # 查看pod信息 |
动态扩缩容
1 | # 通过edit直接修改rs资源清单 |
Deployment控制器
Deployment控制器 与 RS控制器的关系
虽然我们创建的是Deployment类型资源,但实际上控制副本还是由RS来控制的,Deployment只是替我们去创建RS控制器,然后再由RS去控制POD副本.
Deployment控制器还有一个比较重要的功能就是滚动更新和版本回滚,而这个功能就是以来RS控制器。
Deployment控制器资源清单
1 | # 正确写法示例 |
查看启动的资源信息
1 | # 查看资源 |
动态修改deployment资源
修改资源清单更新资源
指定资源清单进行编辑
1
kubectl edit -f nginx-dp.yaml
命令行更新资源
根据资源清单更新镜像
1
2kubectl set image -f nginx-dp.yaml nginx-container=nginx:1.21.3
deployment.apps/nginx-dp image updated不指定资源清单更新镜像
1
2kubectl set image deployment nginx-dp nginx-container=nginx:1.21.4
deployment.apps/nginx-dp image updated
deployment控制器版本回滚
回滚到上一个版本
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23# 查看当前dp镜像版本
kubectl describe deployments.apps nginx-dp
Containers:
nginx-container:
Image: nginx:1.21.4
# 查看rs当前记录的各个版本(最多十个)
kubectl get rs -o wide
NAME DESIRED CURRENT READY AGE CONTAINERS IMAGES SELECTOR
nginx-dp-54ffb76795 5 5 5 4m25s nginx-container nginx:1.21.4 name=hcl,pod-template-hash=54ffb76795
nginx-dp-748cdc54f4 0 0 0 8m42s nginx-container nginx:1.21.3 name=hcl,pod-template-hash=748cdc54f4
nginx-dp-8545cf5fb 0 0 0 23m nginx-container nginx:alpine name=hcl,pod-template-hash=8545cf5fb
# 回滚
kubectl rollout undo deployment nginx-dp
deployment.apps/nginx-dp rolled back
# 查看是否退回上一个版本
kubectl get rs -o wide
NAME DESIRED CURRENT READY AGE CONTAINERS IMAGES SELECTOR
nginx-dp-54ffb76795 0 0 0 7m4s nginx-container nginx:1.21.4 name=hcl,pod-template-hash=54ffb76795
nginx-dp-748cdc54f4 5 5 5 11m nginx-container nginx:1.21.3 name=hcl,pod-template-hash=748cdc54f4
nginx-dp-8545cf5fb 0 0 0 25m nginx-container nginx:alpine name=hcl,pod-template-hash=8545cf5fbdeployment回滚到指定版本
查看版本
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22# 查看dp所有的历史版本
kubectl rollout history deployment nginx-dp
deployment.apps/nginx-dp
REVISION CHANGE-CAUSE
1 <none>
3 <none>
4 <none>
# 查看指定revision版本
kubectl rollout history deployment nginx-dp --revision=5
deployment.apps/nginx-dp with revision #5
Pod Template:
Labels: name=hcl
pod-template-hash=54ffb76795
Containers:
nginx-container:
Image: nginx:1.21.4
Port: <none>
Host Port: <none>
Environment: <none>
Mounts: <none>
Volumes: <none>回滚
1
2
3# 回滚到指定版本
kubectl rollout undo deployment nginx-dp --to-revision=3
deployment.apps/nginx-dp rolled back记录版本更改信息
1
2
3
4
5
6
7
8
9
10
11
12
13# apply时加上--record
kubectl apply -f nginx-dp.yaml --record
# 修改镜像版本时,加上--record
kubectl set image deployment nginx-dp nginx-container=nginx:1.21.5 --record
## 查看dp所有的历史版本
deployment.apps/nginx-dp
REVISION CHANGE-CAUSE
1 <none>
4 <none>
5 <none>
6 kubectl apply --filename=nginx-dp.yaml --record=true
7 kubectl set image deployment nginx-dp nginx-container=nginx:1.21.5 --record=true
deployment扩缩容
1 | # 修改启动pod数量 |
DaemonSet控制器
结构图示
概述
- 简单来说就是每个节点部署一个POD副本
- 常见的应用场景:
- 监控容器
- 日志收集容器
DaemonSet控制器资源清单
1 | # 正确语法示例 |
HPA自动扩缩容
HPA工作原理
HAP通过收集来的监控指标分析所有Pod的负载情况,并且根据我们设定好的标准来自动扩容收缩RC、 Deployment、RS 或 StatefulSet 中的 Pod 数量
- 需要一个 Metric Server 收集所有POD负载情况
- 必须使用除了DaemonSet以外的控制器
Metrics Server介绍
在HAP早期版本使用的是一个叫Heapster组件来提供CPU和内存指标的,在后期的版本k8s转向了使用Metrcis Server组件来提供Pod的CPU和内存指标,Metrcis Server通过Metrics API将数据暴露出来,然后我们就可以使用k8s的API来获取相应的数据。
部署Metric Server
1 | # 下载yaml文件 |
生成一个php-apache镜像
1 | # 准备php代码 |
创建HPA资源
1 | # 准备资源清单 |
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 奥利奥の麦旋风!