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控制器

image-20240923151136592

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
查看启动容器的详细信息

image-20240923153801030

image-20240923153601258

## 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

image-20240923154009459

image-20240923154405122




Deployment控制器

Deployment:Deployment控制器
	Deployment通过控制RS来保证POD始终保持相应的数量副本
	支持滚动更新,回滚,回滚默认保留10个版本
	提供声明式配置,支持动态修改
	管理无状态应用最理想的控制器
	node节点可能会运行0个或多个POD
Deployment和RS的关系
虽然我们创建的是Deployment类型资源,但实际上控制副本还是由RS来控制的,
Deployment只是替我们去创建RS控制器,然后再由RS去控制POD副本.
Deployment控制器还有一个比较重要的功能就是滚动更新和版本回滚,而这个功能就是以来RS控制器。

image-20240923154612729

image-20240923150608177

资源清单
[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.

image-20240923163929942

Kubernetes 集群中的 nginx-dp Deployment 正在执行滚动更新操作。这些 Pod 状态说明旧的 Pod 正在终止 (Terminating),而新的 Pod 逐步进入 Pending 状态,随后转入 ContainerCreating 和 Running 状态。这是滚动更新过程中常见的现象。

状态说明:

  1. Pending:Pod 已被调度,但还没有开始拉取镜像或者创建容器。
  2. ContainerCreating:Pod 的容器正在创建中,通常包括拉取镜像和配置网络等操作。
  3. Running:Pod 已成功启动,并且正在运行。
  4. Terminating:Pod 正在被删除,这是旧的 Pod 被移除的过程

image-20240923164820101

deployment扩缩容器
[root@master-1 k8s]# kubectl scale deployment nginx-dp --replicas=2



DaemonSet控制器

#### 每个node节点上只起一个pod
简单来说就是每个节点部署一个POD副本
常见的应用场景:
监控容器
日志收集容器

image-20240923165028697

[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

image-20240923165533209