k8s--pod管理-控制器

文章目录

  • 一、pod分类
  • 二、控制器类型
    • 2.1replicaset
    • 2.2deployment
      • 版本迭代
      • 回滚
      • 滚动更新策略
      • 暂停与恢复
    • 2.3daemonset
    • 2.4job
    • 2.5cronjob


一、pod分类

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

官方文档:https://v1-25.docs.kubernetes.io/zh-cn/docs/concepts/workloads/controllers/
k8s--pod管理-控制器_第1张图片

二、控制器类型

- 控制器类型
-   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.1replicaset

[root@k8s2 pod]# vim rs-example.yml
apiVersion: apps/v1
kind: ReplicaSet
metadata:
  name: replicaset-example
spec:
  replicas: 1
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx

[root@k8s2 pod]# kubectl apply -f rs-example.yml

[root@k8s2 pod]# kubectl get pod --show-labels     ##显示所有标签
NAME                       READY   STATUS    RESTARTS   AGE   LABELS
replicaset-example-q2sq9   1/1     Running   0          14s   app=nginx
replicaset-example-th24v   1/1     Running   0          14s   app=nginx
replicaset-example-w7zpw   1/1     Running   0          14s   app=nginx

k8s--pod管理-控制器_第2张图片

replicaset是通过标签匹配pod
[root@k8s2 pod]# kubectl label pod replicaset-example-q2sq9 app=myapp --overwrite
[root@k8s2 pod]# kubectl get pod --show-labels         ##显示所有标签
NAME                       READY   STATUS    RESTARTS   AGE     LABELS
replicaset-example-276ph   1/1     Running   0              8m52s   app=myapp
replicaset-example-ffdbs   1/1     Running   0              5s      app=nginx
replicaset-example-hnzmb   1/1     Running   0              8m52s   app=nginx
replicaset-example-x9dxr   1/1     Running   0              8m52s   app=nginx

[root@k8s2 pod]# kubectl label pod replicaset-example-q2sq9 app=nginx --overwrite    ##重新覆盖
[root@k8s2 pod]# kubectl get pod --show-labels
NAME                       READY   STATUS    RESTARTS   AGE     LABELS
replicaset-example-276ph   1/1     Running   0              9m38s   app=nginx
replicaset-example-hnzmb   1/1     Running   0              9m38s   app=nginx
replicaset-example-x9dxr   1/1     Running   0              9m38s   app=nginx


replicaset自动控制副本数量,pod可以自愈
[root@k8s2 pod]# kubectl delete pod replicaset-example-276ph
[root@k8s2 pod]# kubectl get pod --show-labels
NAME                       READY   STATUS    RESTARTS   AGE     LABELS
replicaset-example-hnzmb   1/1     Running   0              10m     app=nginx
replicaset-example-jmjqp   1/1     Running   0              7s      app=nginx        ##重新生成一个ip
replicaset-example-x9dxr   1/1     Running   0              10m     app=nginx



回收资源
[root@k8s2 pod]# kubectl delete -f rs-example.yml

2.2deployment

deployment -> rs控制器 -> pod

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

[root@k8s2 pod]# kubectl apply -f deployment-example.yaml

k8s--pod管理-控制器_第3张图片

k8s--pod管理-控制器_第4张图片
注:不用收回

版本迭代

[root@k8s2 pod]# vim deployment-example.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: deployment-example
spec:
  replicas: 3
  selector:
    matchLabels:
      app: myapp
  template:
    metadata:
      labels:
        app: myapp
    spec:
      containers:
      - name: myapp
        image: myapp:v2              ##v1改为v2

[root@k8s2 pod]# kubectl apply -f deployment-example.yaml

k8s--pod管理-控制器_第5张图片

k8s--pod管理-控制器_第6张图片

replicaset就是deployment的一个版本

回滚

[root@k8s2 pod]# vim deployment-example.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: deployment-example
spec:
  replicas: 3
  selector:
    matchLabels:
      app: myapp
  template:
    metadata:
      labels:
        app: myapp
    spec:
      containers:
      - name: myapp
        image: myapp:v1        ##改动处

[root@k8s2 pod]# kubectl apply -f deployment-example.yaml

k8s--pod管理-控制器_第7张图片
k8s--pod管理-控制器_第8张图片

滚动更新策略

[root@k8s2 pod]# vim deployment-example.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: deployment-example
spec:
  minReadySeconds: 5				
  strategy:
    rollingUpdate:
      maxSurge: 1
      maxUnavailable: 0
  replicas: 3
  selector:
    matchLabels:
      app: myapp
  template:
    metadata:
      labels:
        app: myapp
    spec:
      containers:
      - name: myapp
        image: myapp:v1

[root@k8s2 pod]# kubectl apply -f deployment-example.yaml

k8s--pod管理-控制器_第9张图片

k8s--pod管理-控制器_第10张图片

暂停与恢复

暂停,避免触发不必要的线上更新

[root@k8s2 pod]# kubectl rollout pause deployment deployment-example

[root@k8s2 pod]# vim deployment-example.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: deployment-example
spec:
  minReadySeconds: 5                  ##改动处
  strategy:                                    ##改动处
    rollingUpdate:                         ##改动处
      maxSurge: 1                              ##改动处
      maxUnavailable: 0                      ##改动处
  replicas: 6				                   ##改动处
  selector: 
    matchLabels:
      app: myapp
  template:
    metadata:
      labels:
        app: myapp
    spec:
      containers:
      - name: myapp
        image: nginx                     ##以下均有改动
        resources:
          limits:
            cpu: 0.5
            memory: 200Mi
          requests:
            cpu: 0.5
            memory: 200Mi

[root@k8s2 pod]# kubectl apply -f deployment-example.yaml

k8s--pod管理-控制器_第11张图片

调整副本数,不受影响
k8s--pod管理-控制器_第12张图片

但是更新镜像和修改资源并没有触发更新

[root@k8s2 pod]# kubectl rollout history deployment deployment-example
deployment.apps/deployment-example
REVISION  CHANGE-CAUSE
4         
5         


恢复后开始触发更新
[root@k8s2 pod]# kubectl rollout resume deployment deployment-example

[root@k8s2 pod]# kubectl rollout history  deployment deployment-example
deployment.apps/deployment-example
REVISION  CHANGE-CAUSE
4         
5         
6         

k8s--pod管理-控制器_第13张图片

回收
[root@k8s2 pod]# kubectl delete -f deployment-example.yaml

2.3daemonset

执行之后会在每一个节点上都运行一个

[root@k8s2 pod]# cat daemonset-example.yml
apiVersion: apps/v1
kind: DaemonSet
metadata:
  name: daemonset-example
spec:
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      tolerations:
      - effect: NoSchedule
        operator: Exists
      containers:
      - name: nginx
        image: nginx

[root@k8s2 pod]# kubectl apply -f daemonset-example.yml

k8s--pod管理-控制器_第14张图片

k8s--pod管理-控制器_第15张图片

回收
[root@k8s2 pod]# kubectl delete -f daemonset-example.yml

2.4job

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

[root@k8s2 pod]# kubectl apply -f job.yml
[root@k8s2 ~]# kubectl logs pi-hjkcl                    ##查看生成的日志信息

k8s--pod管理-控制器_第16张图片

k8s--pod管理-控制器_第17张图片

回收
[root@k8s2 pod]# kubectl delete -f job.yml

2.5cronjob

[root@k8s2 pod]# vim cronjob.yml
apiVersion: batch/v1
kind: CronJob
metadata:
  name: hello
spec:
  schedule: "* * * * *"
  jobTemplate:
    spec:
      template:
        spec:
          containers:
          - name: hello
            image: busybox
            imagePullPolicy: IfNotPresent
            command:
            - /bin/sh
            - -c
            - date; echo Hello from the Kubernetes cluster
          restartPolicy: OnFailure

[root@k8s2 pod]# kubectl apply -f cronjob.yml

k8s--pod管理-控制器_第18张图片

k8s--pod管理-控制器_第19张图片

回收
[root@k8s2 pod]# kubectl delete -f cronjob.yml

[root@server2 ~]# kubectl delete cronjob hello ##也可以通过单条命令删除,时间任务名称要看正确即可


你可能感兴趣的:(k8s,kubernetes,docker,容器)