一、pod控制器概要

  Pod控制器是什么呢?简单的来说Pod控制器就是用来管理pod的。大量部署过docker的同学,有一点会感同身受,难针对、难管理而,今天我们学习的核心组件pod就可以解决这个问题。官方点来说Pod控制器是用于实现管理pod的中间层,确保pod资源符合预期的状态,pod的资源出现故障时,会尝试 进行重启,当根据重启策略无效,则会重新新建pod的资源。那么pod控制器包含哪些呢?如下|:

  • ReplicationController:1.2以前的老版本管理工具,后续会被Replicaset取代,这里我们就了解一下,有这样一个东西即可。
  • Replicaset:用作pod 创建、删除和更新,ReplicaSet能确保运行指定数量的pod ,通过label selector来确定pod数量是否满足用户指定的副本数量。(管理副本)
  • Deployment:将 Pod 和ReplicaSet 的实际状态改变到用户的目标状态。支持扩容、回滚、更新等功能;管理无状态应用最好的控制器;守护进程类(作用于replicaset上,支持回滚等操作)
  • Daemonset:确保每个节点上运行一个Pod副本。无状态服务;守护进程类
  • Job: 执行一次性运行任务。不需要持续运行
  • Cronjob: 周期性运行任务。不需要持续运行
  • StatefulSet: 管理有状态应用,每一个应用都被单独管理。管理比较麻烦

二、Replicaset

   replicaset用作pod 创建、删除和更新,ReplicaSet能确保运行指定数量的pod ,通过label selector来确定pod数量是否满足用户指定的副本数量。(管理副本)

那么它是如何定义的呢?请参考下文yaml文件。

apiVersion: apps/v1
kind: ReplicaSet
metadata:
    name: rsdemo
    namespace: default
spec:
    replicas: 2
    selector:
        matchLabels:
            app: rsdemo
            release: can
    template:
        metadata:
            name: rsdemo1
            labels:
                app: rsdemo
                release: can
        spec:
            containers:
            - name: resdemocontainers
              image: ikubernetes/myapp:v1
              imagePullPolicy: IfNotPresent
              ports:
              - name: http
                containerPort: 80

三、Deployment(重点)

  Pod 和ReplicaSet 的实际状态改变到用户的目标状态。支持扩容、回滚、更新等功能;管理无状态应用最好的控制器;守护进程类(作用于replicaset上,支持回滚等操作),定义的yaml文件如下:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: deploymentdemo
  namespace: default
spec:
  replicas: 2
  selector:
    matchLabels:
      app: myapp
      release: canary
  template:
    metadata:
      labels:
        app: myapp
        release: canary
        version: v1
    spec:
      containers:
      - name: myapp
        image: ikubernetes/myapp:v1
        imagePullPolicy: IfNotPresent
        ports:
        - name: http
          containerPort: 80

版本更新和回滚

 

版本更新修策略改:(少用)

如果您要选择更新策略,如您希望更新时  不停止原容器,可以修改maxUnavailable参数为0,具体如何使用可在master节点上执如下命令,查看解释:

kubectl explain deployment.spec.strategy.rollingUpdate

查看回滚版本:

kubectl rollout history deploy  myapp-deploy

回滚到上一个版本:

kubectl rollout undo deployment/nginx-test

kubectl rollout undo deployment myapp

也可以使用 --revision参数指定某个历史版本:

kubectl rollout undo deployment/nginx-test --to-revision=2

kubectl rollout undo deployment myapp --to-revision=1

当您回滚到第一个版本时,再选择回滚一个版本 就会回滚到最后一个修改的版本。

资源更新

  当您需要修改镜像时,最简单的方式是选择修改yaml文件,然后apply -f 重新加载文件,deployment会自动读取滚动升级。但如果您要通过脚本等方式来实现修改deployment,修改配置文件就不是明智的选择了,我们可以使用patch命令:

kubectl patch

语法

$ patch (-f FILENAME | TYPE NAME) -p PATCH

示例

使用patch更新Node节点。

kubectl patch node k8s-node-1 -p '{"spec":{"unschedulable":true}}'

更新容器的镜像

kubectl patch pod valid-pod -p '{"spec":{"containers":[{"name":"kubernetes-serve-hostname","image":"new image"}]}}'
更新deployment
kubectl patch deployment myapp-deploy -p '{"spec":{"strategy":{"rollingUpdate":{"maxSurge":1, "maxUnavailable":0}}}}'

当然,如果只是修改容器的话 ,我们可以使用更简单的命令 set image

kubectl set image

更新现有的资源对象的容器镜像。

可使用资源对象包括(不区分大小写):

pod (po)、replicationcontroller (rc)、deployment (deploy)、daemonset (ds)、job、replicaset (rs)

语法

$ image (-f FILENAME | TYPE NAME) CONTAINER_NAME_1=CONTAINER_IMAGE_1 ... CONTAINER_NAME_N=CONTAINER_IMAGE_N

示例

将deployment中的nginx容器镜像设置为“nginx:1.9.1”。

kubectl set image deployment/nginx busybox=busybox nginx=nginx:1.9.1

所有deployment和rc的nginx容器镜像更新为“nginx:1.9.1”

kubectl set image deployments,rc nginx=nginx:1.9.1 --all

将daemonset abc的所有容器镜像更新为“nginx:1.9.1”

kubectl set image daemonset abc *=nginx:1.9.1

从本地文件中更新nginx容器镜像

kubectl set image -f path/to/file.yaml nginx=nginx:1.9.1 --local -o yaml

四、Daemonset

本部分参考:https://www.cnblogs.com/breezey/p/6582519.html

在有种场景下,我们需要在所有的kubernetes节点上都运行同一个应用的一个副本,比如在后续我们会说如何收集kubernetes中的pod日志,在收集日志的时候,需要在每个k8s node节点上运行一个收集日志的进程 ,如fluentd。我们知道在通常情况下,kubernetes基于它内部的调度算法来自动分配pod运行在哪个节点上,没有办法保证在每个node上运行一个fluentd pod。这个时候,daemonsets的调度方式就派上了用场。简单来说,daemonsets就是让一个应用在所有的k8s集群节点上都运行一个副本。

我们直接看下面的示例,在所有节点上都启动一个busybox:

apiVersion: extensions/v1beta1
kind: DaemonSet
metadata:
  name: busybox
spec:
  template:
    metadata:
      labels:
        app: busybox
    spec:
      containers:
      - name: busybox
        image: myhub.mingyuanyun.com/library/busybox
        command:
        - sleep
        - "3600"

我们通过kubectl get daemonset可以看到启动了6个busybox的pod,因为我们有6个kubernetes节点。而事实上,我们并没有指定复制的个数,这就是daemonsets的作用:

NAME      DESIRED   CURRENT   READY     NODE-SELECTOR   AGE
busybox   6         6         6         <none>          1m

您还可以参考:https://www.cnblogs.com/xzkzzz/p/9553321.html (启动一个redis配置一下filebeat)

 

此部分 后续还会更新,

Logo

K8S/Kubernetes社区为您提供最前沿的新闻资讯和知识内容

更多推荐