目录

1. pod分类

2. 控制器类型

2.1 deployment控制器

2.1.1 拉伸

​2.1.2 版本更新

2.2 DaemonSet控制器

2.3 Job

2.4 CronJob


1. pod分类

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

2. 控制器类型

- 控制器类型
-   Replication Controller和ReplicaSet(RS一般不会单独用,一般都是和deployment一起使用)
	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 -> ReplicaSet -> 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 deployment控制器

[root@server2 pod]# vim deploy.yml
[root@server2 pod]# cat deploy.yml 
apiVersion: apps/v1
kind: Deployment
metadata:
  name: myapp-deployment
  labels:
    app: myapp
spec:
  replicas: 3
  selector:
    matchLabels:
      app: myapp
  template:
    metadata:
      labels:
        app: myapp
    spec:
      containers:
      - name: myapp
        image: myapp:v1

[root@server2 ~]# kubectl apply -f deploy.yml    ##创建
deployment.apps/deployment created
[root@server2 ~]# kubectl get pod    ##查看pod
NAME                          READY   STATUS    RESTARTS   AGE
demo                          1/1     Running   1          7h49m
deployment-6456d7c676-mfrxb   1/1     Running   0          12s
deployment-6456d7c676-xlxw5   1/1     Running   0          12s
deployment-6456d7c676-xn2dp   1/1     Running   0          12s
## deployment -> rs控制器  -> pod

[root@server2 ~]# kubectl get pod
[root@server2 ~]# kubectl get pod --show-labels   ##显示所有标签
[root@server2 ~]# kubectl label nodes server3 app=nginx--overwrite   ##重新覆盖
pod/myapp-deployment-678fcbc488-d42zm labeled
[root@server2 pod]# kubectl get pod --show-labels 
NAME                                READY   STATUS    RESTARTS   AGE     LABELS
myapp-deployment-678fcbc488-7zmhq   1/1     Running   0          2s      app=myapp,pod-template-hash=678fcbc488
myapp-deployment-678fcbc488-d42zm   1/1     Running   0          5m17s   app=nginx,pod-template-hash=678fcbc488
myapp-deployment-678fcbc488-t2ppb   1/1     Running   0          5m17s   app=myapp,pod-template-hash=678fcbc488
myapp-deployment-678fcbc488-ztj99   1/1     Running   0          5m17s   app=myapp,pod-template-hash=678fcbc488

2.1.1 拉伸

2.1.2 版本更新

2.2 DaemonSet控制器

[root@server2 ~]# vim daemonset.yml
[root@server2 ~]# cat daemonset.yml 
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: zabbix-agent
[root@server2 ~]# kubectl apply -f daemonset.yml   ##执行之后会在每一个节点上都运行一个zabbix
[root@server2 ~]# kubectl get pod
[root@server2 ~]# kubectl get pod -o wide   ##发现server3和server4上都运行有zabbix
NAME                      READY   STATUS    RESTARTS   AGE     IP            NODE      NOMINATED NODE   READINESS GATES
daemonset-example-69mgd   1/1     Running   0          2m31s   10.244.1.9    server3   <none>           <none>
daemonset-example-btstx   1/1     Running   0          2m31s   10.244.2.21   server4   <none>           <none>
demo                      1/1     Running   1          9h      10.244.1.3    server3   <none> 


##环境清理
[root@server2 ~]# kubectl delete -f daemonset.yml 

2.3 Job

[root@server2 ~]# vim job.yml
[root@server2 ~]# cat job.yml 
apiVersion: batch/v1
kind: Job
metadata:
  name: pi
spec:
  template:
    spec:
      containers:
      - name: pi
        image: perl              ##server1上拉取上传到仓库
        command: ["perl",  "-Mbignum=bpi", "-wle", "print bpi(2000)"]   ##显示pi后面2000位小数
      restartPolicy: Never    ##不会重启
  backoffLimit: 4             ##出错次数限制为4次

[root@server2 ~]# kubectl create -f job.yml 
job.batch/pi created
[root@server2 ~]# kubectl get pod
NAME       READY   STATUS              RESTARTS   AGE
demo       1/1     Running             1          9h
pi-hjkcl   0/1     ContainerCreating   0          9s
[root@server2 ~]# kubectl describe pod pi-hjkcl

[root@server2 ~]# kubectl logs pi-hjkcl    ##查看生成的日志信息

##清理环境
[root@server2 ~]# kubectl delete -f job.yml 

2.4 CronJob

[root@server2 ~]# vim cronjob.yml
[root@server2 ~]# cat cronjob.yml 
apiVersion: batch/v1beta1
kind: CronJob
metadata:
  name: hello
spec:
  schedule: "*/1 * * * *"
  jobTemplate:
    spec:
      template:
        spec:
          containers:
          - name: hello
            image: busyboxplus
            imagePullPolicy: IfNotPresent
            args:
            - /bin/sh
            - -c
            - date; echo Hello from the Kubernetes cluster
          restartPolicy: OnFailure
          
[root@server2 ~]# kubectl create -f cronjob.yml   
cronjob.batch/hello created
[root@server2 ~]# kubectl get all
NAME       READY   STATUS    RESTARTS   AGE
pod/demo   1/1     Running   1          9h

NAME                 TYPE        CLUSTER-IP   EXTERNAL-IP   PORT(S)   AGE
service/kubernetes   ClusterIP   10.96.0.1    <none>        443/TCP   2d5h

NAME                  SCHEDULE      SUSPEND   ACTIVE   LAST SCHEDULE   AGE
cronjob.batch/hello   */1 * * * *   False     0        <none>          10s

##间隔1分钟后
[root@server2 ~]# kubectl get pod   ##发生了调度
NAME                     READY   STATUS      RESTARTS   AGE
demo                     1/1     Running     1          9h
hello-1613912160-z66tx   0/1     Completed   0          3s
[root@server2 ~]# kubectl get all   ##发生了调度
NAME                         READY   STATUS      RESTARTS   AGE
pod/demo                     1/1     Running     1          9h
pod/hello-1613912160-z66tx   0/1     Completed   0          5s

NAME                 TYPE        CLUSTER-IP   EXTERNAL-IP   PORT(S)   AGE
service/kubernetes   ClusterIP   10.96.0.1    <none>        443/TCP   2d5h

NAME                         COMPLETIONS   DURATION   AGE
job.batch/hello-1613912160   1/1           1s         5s

NAME                  SCHEDULE      SUSPEND   ACTIVE   LAST SCHEDULE   AGE
cronjob.batch/hello   */1 * * * *   False     1        14s             68s

[root@server2 ~]# kubectl get cronjob
NAME    SCHEDULE      SUSPEND   ACTIVE   LAST SCHEDULE   AGE
hello   */1 * * * *   False     0        42s             5m36s


[root@server2 ~]# kubectl logs hello-1613912160-z66tx
Sun Feb 21 12:56:10 UTC 2021
Hello from the Kubernetes cluster

[root@server2 ~]# kubectl delete cronjob hello   ##可以通过单条命令删除,时间任务名称要看对
[root@server2 ~]# kubectl delete -f cronjob.yml  ##也可以通过文件删除

Logo

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

更多推荐