一、Pod控制器及其功用

Pod控制器是用于实现管理pod的中间层,确保pod资源符合预期的状态,pod的资源出现故障时,会尝试 进行重启,当根据重启策略无效,则会重新新建pod的资源。

pod控制器有多种类型:

ReplicaSet: 代用户创建指定数量的pod副本数量,确保pod副本数量符合预期状态,并且支持滚动式自动扩容和缩容功能。
ReplicaSet主要三个组件组成:
  (1)用户期望的pod副本数量
  (2)标签选择器,判断哪个pod归自己管理
  (3)当现存的pod数量不足,会根据pod资源模板进行新建
帮助用户管理无状态的pod资源,精确反应用户定义的目标数量,但是RelicaSet不是直接使用的控制器,而是使用Deployment。

Deployment:工作在ReplicaSet之上,用于管理无状态应用,目前来说最好的控制器。支持滚动更新和回滚功能,还提供声明式配置。

DaemonSet:用于确保集群中的每一个节点只运行特定的pod副本,通常用于实现系统级后台任务。比如ELK服务
特性:服务是无状态的
服务必须是守护进程

Job:只要完成就立即退出,不需要重启或重建。

Cronjob:周期性任务控制,不需要持续后台运行,

StatefulSet:管理有状态应用

二、ReplicaSet控制器

ReplicationController用来确保容器应用的副本数始终保持在用户定义的副本数,即如果有容器异常退出,会自动创建新的Pod来替代;而如果异常多出来的容器也会自动回收。

在新版本的Kubernetes中建议使用ReplicaSet来取代ReplicationController。ReplicaSet跟ReplicationController没有本质的不同,只是名字不一样,并且ReplicaSet支持集合式的selector。

虽然ReplicaSet可以独立使用,但一般还是建议使用 Deployment 来自动管理ReplicaSet,这样就无需担心跟其他机制的不兼容问题(比如ReplicaSet不支持rolling-update但Deployment支持)。

ReplicaSet示例:

(1)命令行查看ReplicaSet清单定义规则
[root@k8s-master ~]# kubectl explain rs [root@k8s-master ~]# kubectl explain rs.spec [root@k8s-master ~]# kubectl explain rs.spec.template
(2)新建ReplicaSet示例 [root@k8s
-master ~]# vim rs-demo.yaml apiVersion: apps/v1  #api版本定义 kind: ReplicaSet  #定义资源类型为ReplicaSet metadata:  #元数据定义 name: myapp namespace: default spec:  #ReplicaSet的规格定义 replicas: 2  #定义副本数量为2个 selector:    #标签选择器,定义匹配pod的标签 matchLabels: app: myapp release: canary template:  #pod的模板定义 metadata:  #pod的元数据定义 name: myapp-pod   #自定义pod的名称  labels:   #定义pod的标签,需要和上面定义的标签一致,也可以多出其他标签 app: myapp release: canary environment: qa spec:  #pod的规格定义 containers:  #容器定义 - name: myapp-container  #容器名称 image: ikubernetes/myapp:v1  #容器镜像 ports:  #暴露端口 - name: http containerPort: 80
(3)创建ReplicaSet定义的pod [root@k8s
-master ~]# kubectl create -f rs-demo.yaml [root@k8s-master ~]# kubectl get pods  #获取pod信息 [root@k8s-master ~]# kubectl describe pods myapp-***  #查看pod详细信息

(4)修改pod的副本数量 [root@k8s-master ~]# kubectl edit rs myapp replicas: 5 [root@k8s-master ~]# kubectl get rs -o wide
(5)修改pod的镜像版本
[root@k8s
-master ~]# kubectl edit rs myapp
image: ikubernetes/myapp:v2  
[root@k8s-master ~]# kubectl delete pods myapp-***   #修改了pod镜像版本,pod需要重建才能达到最新版本
[root@k8s-master ~]# kubectl create -f rs-demo.yaml

 三、Deployment控制器

Deployment为Pod和Replica Set(下一代Replication Controller)提供声明式更新。

只需要在 Deployment 中描述想要的目标状态是什么,Deployment controller 就会帮您将 Pod 和ReplicaSet 的实际状态改变到您的目标状态。也可以定义一个全新的 Deployment 来创建 ReplicaSet 或者删除已有的 Deployment 并创建一个新的来替换。

Kubernetes学习之路(十二)之Pod控制器--ReplicaSet、Deployment

典型的用例如下:

  • (1)使用Deployment来创建ReplicaSet。ReplicaSet在后台创建pod。检查启动状态,看它是成功还是失败。
  • (2)然后,通过更新Deployment的PodTemplateSpec字段来声明Pod的新状态。这会创建一个新的ReplicaSet,Deployment会按照控制的速率将pod从旧的ReplicaSet移动到新的ReplicaSet中。
  • (3)如果当前状态不稳定,回滚到之前的Deployment revision。每次回滚都会更新Deployment的revision。
  • (4)扩容Deployment以满足更高的负载。
  • (5)暂停Deployment来应用PodTemplateSpec的多个修复,然后恢复上线。
  • (6)根据Deployment 的状态判断上线是否hang住了。
  • (7)清除旧的不必要的 ReplicaSet。

1、解析Deployment Spec

首先看一个官方的nginx-deployment.yaml的例子: 

apiVersion: v1
kind: Deployment
metadata:
  name: nginx-deployment
spec:
  replicas: 3
  selector:
    matchLabels:
        app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:1.7.9
        ports:
        - containerPort: 80

 在所有的 Kubernetes 配置中,Deployment 也需要apiVersionkindmetadata这些配置项。如下:

[root@k8s-master ~]# kubectl explain deployment
KIND:     Deployment
VERSION:  extensions/v1beta1

DESCRIPTION:
     DEPRECATED - This group version of Deployment is deprecated by
     apps/v1beta2/Deployment. See the release notes for more information.
     Deployment enables declarative updates for Pods and ReplicaSets.

FIELDS:
   apiVersion    <string>
     APIVersion defines the versioned schema of this representation of an
     object. Servers should convert recognized schemas to the latest internal
     value, and may reject unrecognized values. More info:
     https://git.k8s.io/community/contributors/devel/api-conventions.md#resources

   kind    <string>
     Kind is a string value representing the REST resource this object
     represents. Servers may infer this from the endpoint the client submits
     requests to. Cannot be updated. In CamelCase. More info:
     https://git.k8s.io/community/contributors/devel/api-conventions.md#types-kinds

   metadata    <Object>
     Standard object metadata.

   spec    <Object>
     Specification of the desired behavior of the Deployment.

   status    <Object>
     Most recently observed status of the Deployment.
View Code

相关文章:

  • 2021-06-11
  • 2021-10-18
  • 2022-12-23
  • 2021-08-29
  • 2021-12-12
  • 2021-06-28
猜你喜欢
  • 2022-12-23
  • 2021-11-30
  • 2022-12-23
  • 2021-07-30
  • 2022-02-11
  • 2022-12-23
  • 2021-05-19
相关资源
相似解决方案