Linux企业实战之容器(九)——Kubernetes(4)

1 控制器

  • Pod 的分类:

    • 自主式 Pod:Pod 退出后不会被创建
    • 控制器管理的 Pod:在控制器的生命周期里,始终要维持 Pod 的副本数目
  • 控制器类型:

    • Replication Controller和ReplicaSet
    • Deployment
    • DaemonSet
    • StatefulSet
    • Job
    • CronJob
    • HPA全称Horizontal Pod Autoscaler
  • Replication Controller和ReplicaSet

    • ReplicaSet 是下一代的 Replication Controller,官方推荐使用ReplicaSet。
    • ReplicaSet 和 Replication Controller 的唯一区别是选择器的支持,ReplicaSet 支持新的基于集合的选择器需求。
    • ReplicaSet 确保任何时间都有指定数量的 Pod 副本在运行。
    • 虽然 ReplicaSets 可以独立使用,但今天它主要被Deployments 用作协调 Pod 创建、删除和更新的机制。
  • Deployment

    • Deployment 为 Pod 和 ReplicaSet 提供了一个申明式的定义方法。

    • 典型的应用场景:

      • 用来创建Pod和ReplicaSet
      • 滚动更新和回滚
      • 扩容和缩容
      • 暂停与恢复
  • DaemonSet

    • DaemonSet 确保全部(或者某些)节点上运行一个 Pod 的副本。当有节点加入集群时, 也会为他们新增一个 Pod 。当有节点从集群移除时,这些 Pod 也会被回收。删除 DaemonSet 将会删除它创建的所有 Pod。

    • DaemonSet 的典型用法:

      • 在每个节点上运行集群存储 DaemonSet,例如 glusterd、ceph。
      • 在每个节点上运行日志收集 DaemonSet,例如 fluentd、logstash。
      • 在每个节点上运行监控 DaemonSet,例如 Prometheus Node Exporter、zabbix agent等
    • 一个简单的用法是在所有的节点上都启动一个 DaemonSet,将被作为每种类型的 daemon 使用。

    • 一个稍微复杂的用法是单独对每种 daemon 类型使用多个 DaemonSet,但具有不同的标志, 并且对不同硬件类型具有不同的内存、CPU 要求。

  • StatefulSet

    • StatefulSet 是用来管理有状态应用的工作负载 API 对象。实例之间有不对等关系,以及实例对外部数据有依赖关系的应用,称为“有状态应用”

    • StatefulSet 用来管理 Deployment 和扩展一组 Pod,并且能为这些 Pod 提供序号和唯一性保证。

    • StatefulSets 对于需要满足以下一个或多个需求的应用程序很有价值:

      • 稳定的、唯一的网络标识符。
      • 稳定的、持久的存储。
      • 有序的、优雅的部署和缩放。
      • 有序的、自动的滚动更新。
  • Job

    • 执行批处理任务,仅执行一次任务,保证任务的一个或多个Pod成功结束。
  • CronJob

    • Cron Job 创建基于时间调度的 Jobs。

    • 一个 CronJob 对象就像 crontab (cron table) 文件中的一行,它用 Cron 格式进行编写,并周期性地在给定的调度时间执行 Job。

  • HPA

    • 根据资源利用率自动调整service中Pod数量,实现Pod水平自动缩放。

2 控制器实验

(1)ReplicaSet

步骤一:编辑资源清单文件,创建pod

vim rs.yaml

apiVersion: apps/v1
kind: ReplicaSet
metadata:
    name: replicaset-example
spec:
  replicas: 2                            #两个副本
  selector:
    matchLabels:
      app: nginx						#标签
  template:
    metadata:
      labels:
        app: nginx 						#标签
    spec:
      containers:
      - name: nginx
        image: nginx

kubectl apply -f rs.yaml     			#创建pod

Linux企业实战之容器(九)——Kubernetes(4)_第1张图片
注意:我们之前创建的pod时,都是使用create来创建的,创建的都是自主式的pod(即一次性创建的,创建后不再做任何更改),但是在ReplicaSet中我们会涉及到更新、重建等操作,所以一般使用apply来创建。

kubectl get pod
kubectl get pod -o wide

Linux企业实战之容器(九)——Kubernetes(4)_第2张图片
在这里插入图片描述

步骤二:做拉伸

vim rs.yaml              #增加副本的个数

apiVersion: apps/v1
kind: ReplicaSet
metadata:
    name: replicaset-example
spec:
  replicas: 4
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx


kubectl apply -f rs.yaml 

Linux企业实战之容器(九)——Kubernetes(4)_第3张图片

kubectl get pod
kubectl get pod -o wide

Linux企业实战之容器(九)——Kubernetes(4)_第4张图片

步骤三:查看标签

kubectl get pod --show-labels 

Linux企业实战之容器(九)——Kubernetes(4)_第5张图片
步骤四:更改标签

kubectl label pod replicaset-example-nfwzl app=myapp --overwrite    #修改pod的标签
kubectl get pod --show-labels                                       #查看pod的标签

Linux企业实战之容器(九)——Kubernetes(4)_第6张图片

kubectl label pod replicaset-example-4lf7z app=myapp --overwrite 
kubectl get pod --show-labels
kubectl label pod replicaset-example-4lf7z app=nginx --overwrite
kubectl get pod --show-labels

Linux企业实战之容器(九)——Kubernetes(4)_第7张图片

(2)Deployment

步骤一:编辑资源清单文件,创建pod

vim deployment.yaml

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
  labels:
    app: nginx
spec:
  replicas: 2
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: reg.westos.org:5000/myapp:v1
        ports:
        - containerPort: 80
   
 kubectl apply -f deployment.yaml

Linux企业实战之容器(九)——Kubernetes(4)_第8张图片
步骤二:查看创建的pod

kubectl get pod
kubectl get pod -o wide

Linux企业实战之容器(九)——Kubernetes(4)_第9张图片

kubectl get rs
kubectl get deployments.apps
kubectl get all

Linux企业实战之容器(九)——Kubernetes(4)_第10张图片
步骤三:做拉伸

vim deployment.yaml         #增加副本数

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
  labels:
    app: nginx
spec:
  replicas: 4
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: reg.westos.org:5000/myapp:v1
        ports:
        - containerPort: 80

kubectl apply -f deployment.yaml

Linux企业实战之容器(九)——Kubernetes(4)_第11张图片

kubectl get pod
kubectl get pod -o wide

Linux企业实战之容器(九)——Kubernetes(4)_第12张图片
步骤四:做滚动更新

vim deployment.yaml

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
  labels:
    app: nginx
spec:
  replicas: 4
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: reg.westos.org:5000/myapp:v2
        ports:
        - containerPort: 80

kubectl  apply -f deployment.yaml

Linux企业实战之容器(九)——Kubernetes(4)_第13张图片

kubectl get pod -w      #查看pod的创建和结束过程
kubectl get pod

Linux企业实战之容器(九)——Kubernetes(4)_第14张图片

kubectl get rs

Linux企业实战之容器(九)——Kubernetes(4)_第15张图片
步骤五:做回滚
在这里插入图片描述
Linux企业实战之容器(九)——Kubernetes(4)_第16张图片
Linux企业实战之容器(九)——Kubernetes(4)_第17张图片

(3)DaemonSet

步骤一:编辑资源清单文件,创建pod

vim daemonset.yaml

apiVersion: apps/v1
kind: DaemonSet
metadata:
  name: daemonset-example
  labels:
    k8s-app: zabbix-agent
spec:
  selector:
    matchLabels:
      name: zabbix-agent
  template:
    metadata:
      labels:
        name: zabbix-agent
    spec:
      containers:
      - name: zabbix-agent
        image: reg.westos.org:5000/zabbix-agent

kubectl  apply -f daemonset.yaml 

Linux企业实战之容器(九)——Kubernetes(4)_第18张图片

步骤二:查看创建的pod

kubectl get pod
kubectl get pod -o wide

Linux企业实战之容器(九)——Kubernetes(4)_第19张图片

步骤三:删除其中一个pod,集群会自动重建一个pod

kubectl get pod
kubectl delete pod daemonset-example-smmb2 
kubectl get pod

Linux企业实战之容器(九)——Kubernetes(4)_第20张图片

(4)job

  • 编辑资源清单,创建pod
vim job.yaml
apiVersion: batch/v1
kind: Job
metadata:
  name: pi
spec:
  template:
    spec:
      containers:
      - name: pi
        image: reg.westos.org:5000/perl
        command: ["perl",  "-Mbignum=bpi", "-wle", "print bpi(2000)"]
      restartPolicy: Never
  backoffLimit: 4

kubectl apply -f job.yaml

Linux企业实战之容器(九)——Kubernetes(4)_第21张图片

  • 查看创建的pod
kubectl get pod
kubectl get pod -o wide

Linux企业实战之容器(九)——Kubernetes(4)_第22张图片

  • 查看其输出结果

Linux企业实战之容器(九)——Kubernetes(4)_第23张图片

(5)cronjob

  • 编辑资源清单,创建pod
cat cronjob.yaml

apiVersion: batch/v1beta1
kind: CronJob
metadata:
  name: cronjob-example
spec:
  schedule: "* * * * *"
  jobTemplate:
    spec:
      template:
        spec:
          containers:
          - name: cronjob
            image: reg.westos.org:5000/busybox
            args:
            - /bin/sh
            - -c
            - date; echo Hello from k8s cluster
          restartPolicy: OnFailure

kubectl apply -f cronjob.yaml

Linux企业实战之容器(九)——Kubernetes(4)_第24张图片

  • 查看创建的pod

Linux企业实战之容器(九)——Kubernetes(4)_第25张图片

你可能感兴趣的:(Linux企业实战之容器(九)——Kubernetes(4))