K8S的资源控制器
控制器
1.pod类型的资源,删除pod后,不会重建
2.替用户监视并保证相应的节点上始终有用户所期望的副本数量的pod在运行
3.如果所运行的pod副本数超过了用户期望的,那么控制器就会删掉,直到和用户期望的一致
4.如果所运行的pod副本数低于用户期望的,那么控制器就会创建,直到和用户期望的一致
控制器的类型
ReplicaSet:RS控制器
按用户期望的副本创建pod,并始终保持相应数量副本
Deployment:Deployment控制器
Deployment通过控制RS来保证POD始终保持相应的数量副本
支持滚动更新,回滚,回滚默认保留10个版本
提供声明式配置,支持动态修改
管理无状态应用最理想的控制器
node节点可能会运行0个或多个POD
DaemonSet:DS控制器
一个节点只运行一个,必须是始终运行的状态
StatefullSet:有状态应用控制器
ReplicaSet控制器
ReplicaSet:RS控制器
按用户期望的副本创建pod,并始终保持相应数量副本
https://kubernetes.io/zh/docs/concepts/workloads/controllers/replicaset
---
apiVersion: v1
kind: Namespace
metadata:
name: zls-ns
---
apiVersion: apps/v1 # rs控制器的接口
kind: ReplicaSet # rs控制器类型
metadata: # 元数据
name: nginx-rs # 控制器名字
namespace: zls-ns # 创建在哪个名称空间
spec: # POD相关
replicas: 10 # 副本数量
selector: # 标签选择器
matchLabels: # 匹配标签
app: nginx # pod标签
template: # POD相关
metadata: # POD元数据
name: nginx-pod # POD标签
labels: # 打标签
app: nginx # 标签名
spec: # 容器相关
containers: # 容器信息
- name: nginx-container # 容器名
image: nginx:alpine # 容器镜像
imagePullPolicy: IfNotPresent # 容器镜像拉取规则
## nginx POD资源清单
apiVersion: v1
kind: Pod
metadata:
name: web
spec:
containers:
- image: nginx:alpine
imagePullPolicy: IfNotPresent
name: nginx
### nginx的 RS资源清单
apiVersion: apps/v1
kind: ReplicaSet
metadata:
name: nginx-rs
spec:
replicas: 10
selector:
matchLabels:
app: nginx
template:
metadata:
name: nginx-pod
labels:
app: nginx
spec:
containers:
- name: nginx-container
image: nginx:alpine
imagePullPolicy: IfNotPresent
查看启动容器的详细信息
## RS的扩缩容
# 1.修改资源清单
replicas: 5
[root@master-1 k8s]# kubectl apply -f rs-nginx.yaml
# 2.动态修改资源清单,保存后,自动应用
[root@master kubernetes]# kubectl edit rs nginx-rs
replicaset.apps/nginx-rs edited
# 3.命令扩缩容
[root@master kubernetes]# kubectl scale replicaset nginx-rs --replicas=4
replicaset.apps/nginx-rs scaled
[root@master kubernetes]# kubectl get pod
NAME READY STATUS RESTARTS AGE
nginx-rs-29lxm 1/1 Running 0 8m25s
nginx-rs-49vkn 1/1 Running 0 8m25s
nginx-rs-5xf94 1/1 Running 0 4s
nginx-rs-95xxb 1/1 Running 0 8m25s
Deployment控制器
Deployment:Deployment控制器
Deployment通过控制RS来保证POD始终保持相应的数量副本
支持滚动更新,回滚,回滚默认保留10个版本
提供声明式配置,支持动态修改
管理无状态应用最理想的控制器
node节点可能会运行0个或多个POD
Deployment和RS的关系
虽然我们创建的是Deployment类型资源,但实际上控制副本还是由RS来控制的,
Deployment只是替我们去创建RS控制器,然后再由RS去控制POD副本.
Deployment控制器还有一个比较重要的功能就是滚动更新和版本回滚,而这个功能就是以来RS控制器。
资源清单
[root@master kubernetes]# cat dp-nginx.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-dp
spec:
replicas: 5
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx-container
image: nginx:alpine
imagePullPolicy: IfNotPresent
一些详细信息
## 查看dp控制器
[root@master kubernetes]# kubectl get deployments.apps nginx-dp
NAME READY UP-TO-DATE AVAILABLE AGE
nginx-dp 5/5 5 5 32m
## 查看dp控制器的详细信息
[root@master kubernetes]# kubectl describe deployments.apps nginx-dp
Name: nginx-dp
名称: nginx-dp
Namespace: default
命名空间: default
CreationTimestamp: Mon, 23 Sep 2024 15:48:55 +0800
创建时间戳: 2024年9月23日星期一 15:48:55 +0800
Labels: <none>
标签: <无>
Annotations: deployment.kubernetes.io/revision: 1
注解: deployment.kubernetes.io/revision: 1
Selector: app=nginx
选择器: app=nginx
Replicas: 5 desired | 5 updated | 5 total | 5 available | 0 unavailable
副本: 期望数量5 | 更新数量5 | 总数5 | 可用数量5 | 不可用数量0
StrategyType: RollingUpdate
策略类型: 滚动更新 (RollingUpdate)
MinReadySeconds: 0
最小就绪秒数: 0
RollingUpdateStrategy: 25% max unavailable, 25% max surge
滚动更新策略: 最大25%不可用, 最大25%突增
Pod Template:
Labels: app=nginx
Pod 模板:
标签: app=nginx
Containers:
nginx-container:
容器:
nginx-container:
Image: nginx:alpine
镜像: nginx:alpine
Port: <none>
端口: <无>
Host Port: <none>
主机端口: <无>
Environment: <none>
环境变量: <无>
Mounts: <none>
挂载: <无>
Volumes: <none>
卷: <无>
Conditions:
状态条件:
Type Status Reason
类型 状态 原因
---- ------ ------
Available True MinimumReplicasAvailable
可用 True 最小副本数可用
Progressing True NewReplicaSetAvailable
进行中 True 新副本集可用
OldReplicaSets: <none>
旧副本集: <无>
NewReplicaSet: nginx-dp-59586cc59f (5/5 replicas created)
新副本集: nginx-dp-59586cc59f (5/5 副本已创建)
Events:
事件:
Type Reason Age From Message
类型 原因 时长 来源 消息
---- ------ ---- ---- -------
Normal ScalingReplicaSet 33m deployment-controller Scaled up replica set nginx-dp-59586cc59f to 5
正常 扩展副本集 33分钟 deployment-controller 扩展副本集 nginx-dp-59586cc59f 到 5
利用deployment 滚动更新,回滚
## 更新镜像版本
[root@master-1 k8s]# kubectl set image -f nginx.yaml nginx-container=nginx:1.16.0
## 更新镜像版本时,并记录
[root@master-1 k8s]# kubectl set image deployment nginx-dp nginx-container=nginx:1.18.0 --record
## 回滚到上一个版本
[root@master-1 k8s]# kubectl rollout undo deployment nginx-dp
## 查看所有历史版本
[root@master-1 k8s]# kubectl rollout history deployment nginx-dp
## 查看历史版本的详细信息
[root@master-1 k8s]# kubectl rollout history deployment nginx-dp --revision=7
## 回滚到指定版本
[root@master-1 k8s]# kubectl rollout undo deployment nginx-dp --to-revision=4
-------
#### 删除deployment后 所有数据都删除
[root@master kubernetes]# kubectl delete -f dp-nginx.yaml
deployment.apps "nginx-dp" deleted
[root@master kubernetes]# kubectl get rs
No resources found in default namespace.
Kubernetes 集群中的 nginx-dp Deployment 正在执行滚动更新操作。这些 Pod 状态说明旧的 Pod 正在终止 (Terminating),而新的 Pod 逐步进入 Pending 状态,随后转入 ContainerCreating 和 Running 状态。这是滚动更新过程中常见的现象。
状态说明:
- Pending:Pod 已被调度,但还没有开始拉取镜像或者创建容器。
- ContainerCreating:Pod 的容器正在创建中,通常包括拉取镜像和配置网络等操作。
- Running:Pod 已成功启动,并且正在运行。
- Terminating:Pod 正在被删除,这是旧的 Pod 被移除的过程
deployment扩缩容器
[root@master-1 k8s]# kubectl scale deployment nginx-dp --replicas=2
DaemonSet控制器
#### 每个node节点上只起一个pod
简单来说就是每个节点部署一个POD副本
常见的应用场景:
监控容器
日志收集容器
[root@master kubernetes]# cat ds-nginx.yaml
apiVersion: apps/v1
kind: DaemonSet
metadata:
name: nginx-ds
spec:
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx-container
image: nginx:alpine
imagePullPolicy: IfNotPresent