k8s-05-Pod控制器

掌握各种控制器的特点以及使用定义方式
在这里插入图片描述
每个Pod都有一个特殊的被称为“根容器”的Pause容器。除了Pause容器,每个Pod还包含一个或多个紧密相关的用户业务容器
在这里插入图片描述

  • Pod里的多个业务容器共享Pause容器的IP,共享Pause容器挂接的Volume
  • Kubernetes要求底层网络支持集群内任意两个Pod之间的TCP/IP的直接通讯(采用虚拟二层网络技术来实现),一个Pod里的容器与另外主机上的Pod容器能够直接通信。
    Pod 的分类
    ( 1 )普通 Pod 【控制器管理】
    普通 Pod 一旦被创建,就会被放入到 etcd 中存储,随后会被 Kubernetes Master 调度到某
    个具体的 Node 上并进行绑定,随后该 Pod 对应的 Node 上的 kubelet 进程实例化成一组相
    关的 Docker 容器并启动起来。在默认情 况下,当 Pod 里某个容器停止时,Kubernetes 会
    自动检测到这个问题并且重新启动这个 Pod 里某所有容器, 如果 Pod 所在的 Node 宕机,
    则会将这个 Node 上的所有 Pod 重新调度到其它节点上。
    ( 2 )静态 Pod 【自主式,不能被控制器管理】
    静态 Pod 是由 kubelet 进行管理的仅存在于特定 Node 上的 Pod,它们不能通过 API Server
    进行管理,无法与 ReplicationController、Deployment 或 DaemonSet 进行关联,并且
    kubelet 也无法对它们进行健康检查。

Service 和Pod如何关联 (通过标签关联)
为了建立Service 和Pod间的关联关系,Kubernetes 首先给每个Pod填上了一个标签Label,
Service 要作用于所有包含对应 Label的Pod上。这样就巧妙的解决了Service和Pod关联问题

~~RC
Replication Controller 用来确保容器应用的副本数始终保持在用户定义的副本数,即如果有容器的异常退出,会自动创建新的pod来代替,如果异常多出来的容器也会自动回收(新版本建议使用Replica Set)~~

【在Kubernetes1.2时,它就升级成另一个新的概念—Replica Set,官方解释为"下一代的RC"】

RS
它与RC当前存在的唯一区别是:Replica Sets支持基于集合的Label selector(Set-based selector基于集合的标签选择器),而RC只支持基于等式的Label Selector(equality-based selector基于等式),这使得Replica Set的功能更强 【matchExpressions 是一个pod的选择器条件的list 】

selector:
  matchLabels:
    tier: frontend
  matchExpressions:
    - {
    
    key: tier, operator: In, values: [frontend]}

Deployment
(Kubernetes1.2引入的新概念,引入的目的是为了更好的解决Pod的编排问题)不负责pod创建, 为Pod和ReplicaSet提供了一个声明式定义(declarative)方法,用来替代以前的RC来方便的管理应用 (Deployment 创建RS ,RS创建pod ;升级时 在创建一个RS1 ,RS1创建pod1 替换pod ,老的不删除,只是停用,随时回滚)
典型的应用场景:

  1. 定义Deployment来创建Pod和ReplicaSet
  2. 滚动升级和回滚应用
  3. 扩容和缩容
  4. 暂停和继续Deploymen

StatefulSet
是为了解决有状态服务的问题(ReplicaSet和Deployment 为无状态服务)例如MySQL集群(不太稳定)、MongoDB集群(比较稳定)、kafa集群、ZooKeeper集群等。【Kubernetes在1.4版本引入了PetSet这个新资源对象,在1.5更名为"StatefulSet"】

应用场景:

  • 稳定的持久化存储,pod重新调度后还是能访问到相同的持久化数据,基于PVC实现
  • 稳定的网络标志,pod重新调度后podname和hostname不变,基于Headless Service(即没有Cluster
    IP的Service)来实现
  • 有序部署,有序扩展,pod的部署是有顺序的(即从0到N,在一下个pod运行前,之前所有pod必须是running和ready状态), 基于
    init containers来实现
  • 有序收缩,有序删除 (从 N到0)

Job和CronJob
job负责批处理任务,即仅执行一次的任务,他保证批处理任务的一个或多个pod成功结束
cron job管理基于时间的job (版本》=1.8)
应用场景:

  • 数据库备份、发送邮件

DaemonSet
确保全部(或者一些)node上运行一个pod的副本,当有node加入集群时,也会为他们新增一个pod。当有node从集群中移除时,这些pod也会被回收,删除时将会删除它创建的所有pod
典型用法:

  • 运行集群存储daemon,例如在每个node上运行glusterd,ceph
  • 在每个node上运行日志搜集daemon,例如fluentd,logstash
  • 在每个node上运行监控daemon,例如Promethues,Node Exporter

HPA(控制控制器,自动扩缩容)
Horizontal Pod Autoscaling 仅适用于ReplicaSet和Deployment【在V1版本中支持Pod的CPU利用率扩容】,目前HPA可以从两个地方获取数据

  • Heapster: 仅支持CPU使用率
  • 自定义监控

命令选择:

申明式编程 (Deployment)  apply(优)	create
命令式	(rs)	 	      create(优)    apply

查看版本 (部署时注意版本)

-- 所有版本
kubectl api-versions
-- 不同服务的版本 
-- v1
# kubectl explain ReplicationController.apiVersion
-- apps/v1
# kubectl explain ReplicaSet.apiVersion
-- apps/v1
# kubectl explain Deployment.apiVersion
-- apps/v1
# kubectl explain DaemonSet.apiVersion
-- apps/v1
# kubectl explain StatefulSet.apiVersion
-- batch/v1
# kubectl explain Job.apiVersion
-- batch/v1beta1
# kubectl explain Job.apiVersion

如出现这个错误信息:no matches for kind “ReplicaSet” in version “extensions/v1beta1” 说明使用的api版本不对,请使用上述命令获取api版本

RC例子演示

#vim rc-demo.yaml
apiVersion: v1
kind: ReplicationController
metadata:
  name: rc-demo
  labels:
     app: rc
spec:
  replicas: 3  
  selector:
    app: rc
  template:
    metadata:
      labels: 
        app: rc
    spec:
      containers:
        - name: nginx-demo
          image: nginx
          ports:
          - containerPort: 80
运行
kubectl create -f rc-demo.yaml
查看rc数量 (DESIRED 设置的 ;CURRENT 已经创建的 ;READY  准备好的)
[root@k8s ~]# kubectl get rc
NAME      DESIRED   CURRENT   READY   AGE
rc-demo   3         3         2       25s
查看pod  (rc的名字-随机数)【-o wide  查看详情】
[root@k8s ~]# kubectl get  pod -o wide 

NAME            READY   STATUS    RESTARTS   AGE
rc-demo-65kjt   1/1     Running   0          2m32s
rc-demo-ctm6b   1/1     Running   0          2m32s
rc-demo-mlh45   1/1     Running   0          2m32s

查看rc创建详情
[root@k8s ~]# kubectl describe rc rc-demo

Name:         rc-demo
Namespace:    default
Selector:     app=rc
Labels:       app=rc
Annotations:  <none>
Replicas:     3 current / 3 desired
Pods Status:  3 Running / 0 Waiting / 0 Succeeded / 0 Failed
Pod Template:
  Labels:  app=rc
  Containers:
   nginx-demo:
    Image:        nginx
    Port:         80/TCP
    Host Port:    0/TCP
    Environment:  <none>
    Mounts:       <none>
  Volumes:        <none>
Events:
副本扩容、缩容 (设置pod个数)
kubectl scale rc rc-demo --replicas=4

上述命令是在运行中执行,也可修改文件重新部署

注意:
删除RC并不会影响通过该RC已创建号的Pod。为了删除所有Pod,可以设置replicas的值为0,然后更新该RC。另外,kubectl提供了stop和delete命令来一次性删除RC和RC控制的全部Pod

  # 删除rc,但是pod不会收到影响
  kubectl delete rc  rc-demo
  # 会删除rc,也会删除rc下的所有pod
  kubectl delete -f rc-demo.yaml

RS例子演示

#vim rs-demo.yaml
apiVersion: apps/v1
kind: ReplicaSet
metadata:
  name: rs-demo
  labels:
     app: rs
spec:
  replicas: 3  
  selector: 
    matchLabels:
      app: rs
  template:
    metadata:
      labels: 
        app: rs
    spec:
      containers:
        - name: nginx-demo
          image: nginx
          ports:
          - containerPort: 80

运行

kubectl create -f rs-demo.yaml

查看rs数量 (DESIRED 设置的 ;CURRENT 已经创建的 ;READY 准备好的)

 kubectl get rs

查看pod (rs的名字-随机数)【-o wide 查看详情】

kubectl get  pod -o wide 

副本扩容、缩容 (设置pod个数)

kubectl scale rs rs-demo --replicas=2

删除

  删除rc,但是pod不会收到影响
  kubectl delete rs  rs-demo
  会删除rc,也会删除rc下的所有pod
  kubectl delete -f rs-demo.yaml

RS+Deployment例子演示

在这里插入图片描述

# vim rs-deployment.yaml

apiVersion: apps/v1
kind: Deployment
metadata:
  name: rs-deployment
spec:
  replicas: 2
  selector:
    matchLabels:
      app: rs-deployment
  template:
    metadata:
      labels:
        app: rs-deployment
    spec:
      containers:
      - name: nginx-demo
        image: nginx
        imagePullPolicy: IfNotPresent
        ports:
        - containerPort: 80

运行 【–record可以记录命令,方便查看每次的变化】

kubectl apply -f rs-deployment.yaml --record

查看 【rs 有deployment前缀 pod有rs前缀】

[root@k8s ~]# kubectl get deployment
NAME            READY   UP-TO-DATE   AVAILABLE   AGE
rs-deployment   2/2     2            2           88s
[root@k8s ~]# kubectl get rs
NAME                       DESIRED   CURRENT   READY   AGE
rs-deployment-68946dcd46   2         2         2       93s
[root@k8s ~]# kubectl get pods
NAME                             READY   STATUS    RESTARTS   AGE
 rs-deployment-68946dcd46-jd22w   1/1     Running   0          116s
rs-deployment-68946dcd46-kmvzx   1/1     Running   0          116s
扩容
kubectl scale deployment rs-deployment --replicas 5

如果集群支持HPA,还可以设置动态扩容
kubectl autoscale deployment rs-deployment --min=7 --max=20 --cpu-percent=80

更新containers镜像 (也可修改配置文件)
#kubectl set image deployment/rs-deployment nginx-demo=nginx:1.9.1
#deployment "rs-deployment" image updated
or
#kubectl edit deployment/rs-deployment
#deployment "rs-deployment" edited

回滚 【--to-version=? 回滚到指定版本,没指定回到上一版本】
kubectl rollout undo deployment/rs-deployment

查看回滚状态
kubectl rollout status deployment/rs-deployment

查看历史
kubectl get rs
kubectl rollout history deployment/rs-deployment

查看某一版本的详细信息
kubectl rollout history deployment/rs-deployment --revision=3

删除
  kubectl delete deployment rs-deployment
  kubectl delete -f rs-deployment.yaml

可以通过设置.spec.revisonHistoryLimit来指定deployment最多保留多少历史版本,默认保留所有,设置为0则不允许回退

DaemonSet例子演示

# vim ds-demo.yaml

apiVersion: apps/v1
kind: DaemonSet
metadata:
  name: nginx-ds
  labels:
    app: nginx
spec:
  selector:
    matchLabels:
      name: nginx-ds
  template:
    metadata:
      labels:
        name: nginx-ds
    spec:
        containers:
        - name: nginx-ds
          image: nginx
          ports:
          - name: http
            containerPort: 80
运行
kubectl apply -f ds-demo.yaml

查看
[root@k8s ~]# kubectl get ds
NAME       DESIRED   CURRENT   READY   UP-TO-DATE   AVAILABLE   NODE SELECTOR   AGE
nginx-ds   2         2         2       2            2           <none>          44s
       

daemonSet是根据我们节点的数量进行创建(每个节点都有)
# kubectl get pod -o wide

删除
  kubectl delete ds nginx-ds
  kubectl delete -f ds-demo.yaml

StatefulSet例子演示

Job例子演示

# vim job-demo.yaml

apiVersion: batch/v1
kind: Job
metadata:
  name: job-demo
spec:
  template:
    metadata:
      name: job-demo
    spec:
      restartPolicy: Never
      containers:
      - name: counter
        image: busybox
        command:
        - "bin/sh"
        - "-c"
        - "for i in 9 8 7 6 5 4 3 2 1;do echo $i;done"
运行
kubectl create -f job-demo.yaml
               //待完善
查看
kubectl get job
#job任务执行完毕后状态就变更为Completed(完成状态),不会像其他pod属于running状态
[root@k8s ~]# kubectl get pod
NAME             READY   STATUS      RESTARTS   AGE
job-demo-kzskp   0/1     Completed   0          66s
#查看详细信息
kubectl describe job job-demo
#查看pod日志
kubectl logs job-demo-kzskp

删除
  kubectl delete job job-demo
kubectl delete -f job-demo.yaml

注意:Job Pod类型中的RestartPolicy (pod重启策略)仅支持Never和OnFailure两种,不支持Always,Job就相当于来执行一批处理任务,执行完就结束,如果支持Always(一直重启,直到pod健康)就会陷入死循环

CronJob例子演示

#vim cronjob-demo.yaml

apiVersion: batch/v1beta1
kind: CronJob
metadata:
  name: cronjob-demo
spec:
  successfulJobsHistoryLimit: 5
  failedJobsHistoryLimit: 10
  schedule: "*/1 * * * *"
  jobTemplate:
    spec:
      template:
        metadata:
          name: cronjob-demo
        spec:
          restartPolicy: Never
          containers:
          - name: counter
            image: busybox
            command:
            - "bin/sh"
            - "-c"
            - "for i in 9 8 7 6 5 4 3 2 1 ;do echo $i;done"

运行
kubectl create -f cronjob-demo.yaml

查看
kubectl get cronjob
#job任务执行完毕后状态就变更为Completed(完成状态),不会像其他pod属于running状态
[root@k8s ~]# kubectl get pod

#每1分钟执行一次job,执行完毕job后状态会进行保留。通过get jobs和get pod都可以看到
kubectl get jobs
kubectl get pods

删除
kubectl delete cronjob cronjob-demo
kubectl delete -f cronjob-demo.yaml

注意:我们需要给cronjob设置一个历史记录限制,否则jobs会一直增加(1.14版本默认只保留3个),在spec下面添加如下2条内容,自定义历史记录限制

successfulJobsHistoryLimit: 5   #成功保留次数
failedJobsHistoryLimit: 10      #失败保留次数

猜你喜欢

转载自blog.csdn.net/wenwang3000/article/details/113334566