欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

kubernetes09(kubernetes的pod控制器)

程序员文章站 2024-03-11 10:49:37
...

kubernetes09(kubernetes的pod控制器)

一.引子

上一篇笔者对kubernetes的资源对象进行了分类,说白了,kubernetes的pod控制器也是一组对象。pod控制器的类型有很多,他们的功能和使用让笔者娓娓道来。

二.pod控制器简介

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

三.pod控制器种类

(一).ReplicationController(RC):

1.ReplicationController 工作原理

在用户定义范围内,如果pod增多,则ReplicationController会终止额外的pod,如果减少,RC会创建新的pod,始终保持在定义范围。例如,RC会在Pod维护(例如内核升级)后在节点上重新创建新Pod。

2.使用RC创建POD

vim rc.yaml
apiVersion: v1
kind: ReplicationController
metadata:
  name: nginx
spec:
  replicas: 3
  selector:
    app: nginx
  template:
    metadata:
      name: nginx
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx
        ports:
        - containerPort: 80
[[email protected] ~]# kubectl create -f rc.yaml 
replicationcontroller/nginx created

(二).ReplicaSet(RS):

ReplicaSet(RS)是Replication Controller(RC)的升级版本。ReplicaSet 和 Replication Controller之间的唯一区别是对选择器的支持。ReplicaSet支持labels user guide中描述的set-based选择器要求(多标签集合控制), 而Replication Controller仅支持equality-based的选择器要求。代用户创建指定数量的pod副本数量,确保pod副本数量符合预期状态,并且支持滚动式自动扩容和缩容功能。
ReplicaSet主要三个组件组成:
  (1)用户期望的pod副本数量
  (2)标签选择器,判断哪个pod归自己管理
  (3)当现存的pod数量不足,会根据pod资源模板进行新建
帮助用户管理无状态的pod资源,精确反应用户定义的目标数量,但是RelicaSet不是直接使用的控制器,而是使用Deployment。

(三).Deployment:

1.Deployment的概念

工作在ReplicaSet之上,用于管理无状态应用,目前来说最好的控制器。支持滚动更新和回滚功能,还提供声明式配置。Deployment为Pod和Replica Set(升级版的 Replication Controller)提供声明式更新。你只需要在 Deployment 中描述您想要的目标状态是什么,Deployment controller 就会帮您将 Pod 和ReplicaSet 的实际状态改变到您的目标状态。您可以定义一个全新的 Deployment 来创建 ReplicaSet 或者删除已有的 Deployment 并创建一个新的来替换。这就是声明式的含义。

2.Deployment的用例

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

3.Deployment的状态管理(创建,更新,扩容…)
(1).deployment的创建(使用yaml文件)

[[email protected] ~]# kubectl create -f dep.yaml 
deployment.apps/nginx-deployment created
[[email protected] ~]# kubectl get deployments
NAME               READY   UP-TO-DATE   AVAILABLE   AGE
nginx-deployment   3/3     3            3           98m
[[email protected] ~]# kubectl get rs
NAME                          DESIRED   CURRENT   READY   AGE
nginx-deployment-5754944d6c   3         3         3       98m
[[email protected] ~]# kubectl get pods --show-labels
NAME                                READY   STATUS    RESTARTS   AGE    LABELS
nginx-deployment-5754944d6c-5fxlw   1/1     Running   0          101m   app=nginx,pod-template-hash=5754944d6c
nginx-deployment-5754944d6c-bmmx8   1/1     Running   0          101m   app=nginx,pod-template-hash=5754944d6c
nginx-deployment-5754944d6c-bmzzd   1/1     Running   0          101m   app=nginx,pod-template-hash=5754944d6c

(2).更新deployment(命令,yaml文件,edit)

[[email protected] ~]# kubectl set image deployment/nginx-deployment nginx=nginx:1.9.1
deployment.extensions/nginx-deployment image updated
[[email protected] ~]#  kubectl edit deployment/nginx-deployment
      containers:
      - image: nginx:1.9.1
        imagePullPolicy: IfNotPresent
[[email protected] ~]# kubectl rollout status deployment/nginx-deployment
deployment "nginx-deployment" successfully rolled out

(3).回滚到上一个版本(其实有点像更新,最好还是保留yaml文件进行管理)

#查看更新历史版本
[[email protected] ~]# kubectl rollout history deployment/nginx-deployment
deployment.extensions/nginx-deployment 
REVISION  CHANGE-CAUSE
#回滚到上一个版本
[[email protected] ~]# kubectl rollout undo deployment/nginx-deployment
deployment.extensions/nginx-deployment rolled back
#指定回滚版本
[[email protected] ~]# kubectl rollout undo deployment/nginx-deployment --to-revision=2
deployment.extensions/nginx-deployment rolled back

(4).deployment的扩容

[[email protected] ~]# kubectl scale deployment nginx-deployment --replicas 5
deployment.extensions/nginx-deployment scaled
[[email protected] ~]# kubectl get pods
NAME                                READY   STATUS    RESTARTS   AGE
nginx-deployment-7448597cd5-6q8lr   1/1     Running   0          2m3s
nginx-deployment-7448597cd5-8pmp6   1/1     Running   0          12s
nginx-deployment-7448597cd5-hpcp5   1/1     Running   0          118s
nginx-deployment-7448597cd5-k76wj   1/1     Running   0          2m5s
nginx-deployment-7448597cd5-wvzn9   1/1     Running   0          12s

(5).暂停和恢复Deployment

kubectl rollout pause deployment/nginx-deployment
#Deployment 暂停前的初始状态将继续它的功能,而不会对 Deployment 的更新产生任何影响,只要 Deployment是暂停的。

Deployment 在生命周期中有多种状态。在创建一个新的 ReplicaSet 的时候它可以是 progressing 状态, complete 状态,或者 fail to progress 状态。

(四).DaemonSet:

DaemonSet* 确保全部(或者一些)Node 上运行一个 Pod 的副本。当有 Node 加入集群时,也会为他们新增一个 Pod 。当有 Node 从集群移除时,这些 Pod 也会被回收。删除 DaemonSet 将会删除它创建的所有 Pod**
特性:服务是无状态的
服务必须是守护进程
使用 DaemonSet 的一些典型用法:

  • 运行集群存储 daemon,例如在每个 Node 上运行 glusterd、ceph
  • 在每个 Node 上运行日志收集 daemon,例如fluentd、logstash
  • 在每个 Node 上运行监控 daemon,例如 Prometheus Node Exporter(https://github.com/prometheus/node_exporter)、collectd、Datadog 代理、New Relic 代理,或 Ganglia gmond
apiVersion: apps/v1
kind: DaemonSet
metadata:
  name: deamonset-example 
  labels:
    app: daemonset 
spec:
  selector:
    matchLabels: 
      name: deamonset-example 
  template:
    metadata: 
      labels:
        name: deamonset-example 
    spec:
      containers: 
        - name: daemonset-example 
          image: wangyanglinux/myapp:v1

(五).Job:

Job 负责批处理任务,即仅执行一次的任务,它保证批处理任务的一个或多个 Pod 成功结束,只要完成就立即退出,不需要重启或重建。

(六).Cronjob:

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

典型的用法如下所示:

  • 在给定的时间点调度 Job 运行
  • 创建周期性运行的 Job,例如:数据库备份、发送邮件
apiVersion: batch/v1beta1 
kind: CronJob 
metadata:
  name: hello 
spec: 
  schedule: "*/1 * * * *" 
  jobTemplate: 
    spec:
      template: 
        spec:
          containers:
            - name: hello
              image: busybox 
              args: 
                - /bin/sh
                - -c 
                - date; echo Hello from the Kubernetes cluster 
          restartPolicy: OnFailure

(七).StatefulSet:

管理有状态应用

StatefulSet 作为 Controller 为 Pod 提供唯一的标识。它可以保证部署和 scale 的顺序。
StatefulSet是为了解决有状态服务的问题(对应Deployments和ReplicaSets是为无状态服务而设计),其应用场景包括:**

  • 稳定的持久化存储,即Pod重新调度后还是能访问到相同的持久化数据,基于PVC来实现
  • 稳定的网络标志,即Pod重新调度后其PodName和HostName不变,基于Headless Service(即没有Cluster IP的Service)来实现
  • 有序部署,有序扩展,即Pod是有顺序的,在部署或者扩展的时候要依据定义的顺序依次依次进行(即从0到N-1,在下一个Pod运行之前所有之前的Pod必须都是Running和Ready状态),基于init containers来实现
  • 有序收缩,有序删除(即从N-1到0)

小结:其实无论是有状态还是无状态的pod控制器,本质上都是对pod进行管理。控制器和pod都可以在yaml被定义及进行管理。