CKA 07_Kubernetes 工作负载与调度 控制器 ReplicaSet Deployment Jobs CronJob

news2024/11/26 12:50:22

文章目录

  • 1. Pod 的分类
  • 2. 控制器类型
  • 3. ReplicaSet
    • 3.1 工作原理
    • 3.2 何时使用 ReplicaSet
    • 3.3 创建 ReplicaSet
    • 3.4 修改 RS 管理 pod 的标签
    • 3.5 还原 RS 管理 pod 的标签
  • 4. Deployment
    • 4.1 准备工作
    • 4.2 用例
    • 4.3 创建 Deployment
    • 4.4 Deployment 进行 Pod 的版本更新
    • 4.5 Deployment 进行 Pod 版本回滚
    • 4.6 Deployment 可以调整的参数
  • 5. DaemonSet
    • 5.1 准备工作
    • 5.2 创建 DaemonSet
    • 5.3 DaemonSet 可以调整的参数
  • 6. Jobs
    • 6.1 准备工作
    • 6.2 创建 Jobs
    • 6.3 控制并行性
  • 7. CronJob
    • 7.1 准备工作
    • 7.2 Cron 时间表语法
    • 7.3 创建 CronJob
    • 7.4 CronJob 可以调整的参数

1. Pod 的分类

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

2. 控制器类型

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

3. ReplicaSet

官方文档:概念 | 工作负载 | 工作负载资源 | ReplicaSet

  • ReplicaSet 的目的是维护一组在任何时候都处于运行状态的 Pod 副本的稳定集合。 因此,它通常用来保证给定数量的、完全相同的 Pod 的可用性。

3.1 工作原理

  • ReplicaSet 是通过一组字段来定义的,包括一个用来识别可获得的 Pod 的集合的选择算符、一个用来标明应该维护的副本个数的数值、一个用来指定应该创建新 Pod 以满足副本个数条件时要使用的 Pod 模板等等。 每个 ReplicaSet 都通过根据需要创建和删除 Pod 以使得副本个数达到期望值, 进而实现其存在价值。当 ReplicaSet 需要创建新的 Pod 时,会使用所提供的 Pod 模板。

  • ReplicaSet 通过 Pod 上的 metadata.ownerReferences 字段连接到附属 Pod,该字段给出当前对象的属主资源。 ReplicaSet 所获得的 Pod 都在其 ownerReferences 字段中包含了属主 ReplicaSet 的标识信息。正是通过这一连接,ReplicaSet 知道它所维护的 Pod 集合的状态, 并据此计划其操作行为。

  • ReplicaSet 使用其选择算符来辨识要获得的 Pod 集合。如果某个 Pod 没有 OwnerReference 或者其 OwnerReference 不是一个 控制器,且其匹配到 某 ReplicaSet 的选择算符,则该 Pod 立即被此 ReplicaSet 获得。

  • Replication Controller和ReplicaSet
    ReplicaSet 是下一代的 Replication Controller,官方推荐使用ReplicaSet。

3.2 何时使用 ReplicaSet

  • ReplicaSet 确保任何时间都有指定数量的 Pod 副本在运行。 然而,Deployment 是一个更高级的概念,它管理 ReplicaSet,并向 Pod 提供声明式的更新以及许多其他有用的功能。 因此,我们建议使用 Deployment 而不是直接使用 ReplicaSet,除非 你需要自定义更新业务流程或根本不需要更新。
  • 虽然 ReplicaSets 可以独立使用,但今天它主要被Deployments 用作协调 Pod 创建、删除和更新的机制。
  • 这实际上意味着,你可能永远不需要操作 ReplicaSet 对象:而是使用 Deployment,并在 spec 部分定义你的应用。

3.3 创建 ReplicaSet

  1. 示例
[root@k8s-1 ~]# vim rs.yaml
apiVersion: apps/v1
kind: ReplicaSet
metadata:
  name: replicaset-example
spec:
  replicas: 3
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx
  • 生效后,查看当前被部署的 ReplicaSet ,并看到所创建的前端
[root@k8s-1 ~]# kubectl get rs
NAME                DESIRED   CURRENT   READY   AGE
replicaset-example   3         3         3       8m52s
  • 查看查看启动了的 Pods,总数为 3
[root@k8s-1 ~]# kubectl get pod --show-labels 
NAME                      READY   STATUS    RESTARTS   AGE     LABELS
eplicaset-example-gkpll   1/1     Running   0          2m18s   app=nginx
eplicaset-example-p85kh   1/1     Running   0          2m18s   app=nginx
eplicaset-example-xwt4r   1/1     Running   0          2m18s   app=nginx
  • 查看 Pods 的属主引用被设置为前端的 ReplicaSet。 要实现这点,可取回运行中的 Pods 之一的 YAML

  • 输出将类似这样,ReplicaSet 的信息被设置在 metadata 的 ownerReferences 字段中

  • pod 的名字由 RS- 随机数 组成,从下图的 ownerReference 可以查看到当前 pod 由 RS 创建

[root@k8s-1 ~]# kubectl get pod replicaset-example-gkpll -o yaml | less

在这里插入图片描述

  1. 修改示例,将副本数改成 6
[root@k8s-1 ~]# vim rs.yaml 
  replicas: 6
  • 生效后,查看启动了的 Pods,总数变为 6
[root@k8s-1 ~]# kubectl apply -f rs.yaml 
replicaset.apps/eplicaset-example configured
[root@k8s-1 ~]# kubectl get pod --show-labels 
NAME                      READY   STATUS    RESTARTS   AGE     LABELS
eplicaset-example-d75lr   1/1     Running   0          58s     app=nginx
eplicaset-example-gkpll   1/1     Running   0          6m50s   app=nginx
eplicaset-example-gnqv9   1/1     Running   0          58s     app=nginx
eplicaset-example-p85kh   1/1     Running   0          6m50s   app=nginx
eplicaset-example-xtddf   1/1     Running   0          58s     app=nginx
eplicaset-example-xwt4r   1/1     Running   0          6m50s   app=nginx
  • 查看当前被部署的 ReplicaSet
[root@k8s-1 ~]# kubectl get rs
NAME                DESIRED   CURRENT   READY   AGE
eplicaset-example   6         6         6       8m52s

3.4 修改 RS 管理 pod 的标签

  1. 修改第一个 pod 的标签,原本标签为 nginx,现在更改为 demo
[root@k8s-1 ~]# kubectl label pod eplicaset-example-d75lr app=demo --overwrite
pod/eplicaset-example-d75lr labeled
  1. 修改完成后,查看启动的 Pods,发现总数变为 7
[root@k8s-1 ~]# kubectl get pod --show-labels 
NAME                      READY   STATUS    RESTARTS   AGE     LABELS
eplicaset-example-d75lr   1/1     Running   0          2m41s   app=demo
eplicaset-example-gkpll   1/1     Running   0          8m33s   app=nginx
eplicaset-example-gnqv9   1/1     Running   0          2m41s   app=nginx
eplicaset-example-j9rn9   1/1     Running   0          20s     app=nginx
eplicaset-example-p85kh   1/1     Running   0          8m33s   app=nginx
eplicaset-example-xtddf   1/1     Running   0          2m41s   app=nginx
eplicaset-example-xwt4r   1/1     Running   0          8m33s   app=nginx
  1. 部署的 RS 的状态,发现还是 6
[root@k8s-1 ~]# kubectl get rs
NAME                DESIRED   CURRENT   READY   AGE
eplicaset-example   6         6         6       8m52s
  1. 查看 RS 的状态
  • 改了其中一个 Pod 的标签,RS 就会发现少了一个 nginx 标签的Pod。
  • 这个改了标签的 Pod 脱离了 RS 的管控,RS 会再拉起一个新的 Pod,满足 6 个 Pod
[root@k8s-1 ~]# kubectl describe rs eplicaset-example
Events:
  Type    Reason            Age    From                   Message
  ----    ------            ----   ----                   -------
  Normal  SuccessfulCreate  9m55s  replicaset-controller  Created pod: eplicaset-example-gkpll
  Normal  SuccessfulCreate  9m55s  replicaset-controller  Created pod: eplicaset-example-xwt4r
  Normal  SuccessfulCreate  9m55s  replicaset-controller  Created pod: eplicaset-example-p85kh
  Normal  SuccessfulCreate  4m3s   replicaset-controller  Created pod: eplicaset-example-d75lr
  Normal  SuccessfulCreate  4m3s   replicaset-controller  Created pod: eplicaset-example-xtddf
  Normal  SuccessfulCreate  4m3s   replicaset-controller  Created pod: eplicaset-example-gnqv9
  Normal  SuccessfulCreate  102s   replicaset-controller  Created pod: eplicaset-example-j9rn9

3.5 还原 RS 管理 pod 的标签

  1. 改回之前的 nginx 标签
[root@k8s-1 ~]# kubectl label pod eplicaset-example-d75lr app=nginx --overwrite
pod/eplicaset-example-d75lr labeled
  1. 查看启动的 Pods,并查看对应标签,发现总数为 6
[root@k8s-1 ~]# kubectl get pod --show-labels 
NAME                      READY   STATUS    RESTARTS   AGE     LABELS
eplicaset-example-d75lr   1/1     Running   0          4m56s   app=nginx
eplicaset-example-gkpll   1/1     Running   0          10m     app=nginx
eplicaset-example-gnqv9   1/1     Running   0          4m56s   app=nginx
eplicaset-example-p85kh   1/1     Running   0          10m     app=nginx
eplicaset-example-xtddf   1/1     Running   0          4m56s   app=nginx
eplicaset-example-xwt4r   1/1     Running   0          10m     app=nginx
  1. RS 的状态
  • 当将标签还原后,RS就会发现集群中就有 7 个符合要求和标签 Pods,超出了要求的副本数。于是,RS 就会回收新创建的那个 Pod

4. Deployment

官方文档: 概念 | 工作负载 | 工作负载资源 | Deployment

4.1 准备工作

  • 一个 Deployment 为 Pod 和 ReplicaSet 提供声明式的更新能力。

  • 你负责描述 Deployment 中的 目标状态,而 Deployment 控制器(Controller) 以受控速率更改实际状态, 使其变为期望状态。你可以定义 Deployment 以创建新的 ReplicaSet,或删除现有 Deployment, 并通过新的 Deployment 收养其资源。

4.2 用例

以下是 Deployments 的典型用例:

  • 创建 Deployment 以将 ReplicaSet 上线。 ReplicaSet 在后台创建 Pods。 检查 ReplicaSet 的上线状态,查看其是否成功。
  • 通过更新 Deployment 的 PodTemplateSpec,声明 Pod 的新状态 。 新的 ReplicaSet 会被创建,Deployment 以受控速率将 Pod 从旧 ReplicaSet 迁移到新 ReplicaSet。 每个新的 ReplicaSet 都会更新 Deployment 的修订版本。
  • 如果 Deployment 的当前状态不稳定,回滚到较早的 Deployment 版本。 每次回滚都会更新 Deployment 的修订版本。
  • 扩大 Deployment 规模以承担更多负载。
  • 暂停 Deployment 以应用对 PodTemplateSpec 所作的多项修改, 然后恢复其执行以启动新的上线版本。
  • 使用 Deployment 状态 来判定上线过程是否出现停滞。
  • 清理较旧的不再需要的 ReplicaSet 。

4.3 创建 Deployment

  1. 下面是一个 Deployment 示例。其中创建了一个 ReplicaSet,负责启动三个 nginx Pods
  • 创建名为 nginx-deployment(由 .metadata.name 字段标明)的 Deployment。

  • 该 Deployment 创建三个(由 replicas 字段标明)Pod 副本。

  • selector 字段定义 Deployment 如何查找要管理的 Pods。 在这里,你选择在 Pod 模板中定义的标签(app: nginx)。 不过,更复杂的选择规则是也可能的,只要 Pod 模板本身满足所给规则即可。

  • template 字段包含以下子字段:

    • Pod 被使用 .metadata.labels 字段打上 app: nginx 标签。
    • Pod 模板规约(即 .template.spec 字段)指示 Pods 运行一个 nginx 容器
    • 创建一个容器并使用 .spec.template.spec.containers[0].name 字段将其命名为 nginx。
[root@k8s-1 ~]# vim deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: deployment-example
spec:
  replicas: 3
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx
  1. 生效创建 Deployment
[root@k8s-1 ~]# kubectl apply -f deployment.yaml 
deployment.apps/deployment-example created
  1. 运行 kubectl get all 检查 Deployment 是否已创建。 输出类似于
  • 在检查集群中的 Deployment 时,所显示的字段有:

    • NAME 列出了集群中 Deployment 的名称。
    • READY 显示应用程序的可用的“副本”数。显示的模式是“就绪个数/期望个数”。
    • UP-TO-DATE 显示为了达到期望状态已经更新的副本数。
    • AVAILABLE 显示应用可供用户使用的副本数。
    • AGE 显示应用程序运行的时间。
  • 请注意期望副本数是根据 .spec.replicas 字段设置 3。

[root@k8s-1 ~]# kubectl get all
NAME                                      READY   STATUS    RESTARTS   AGE
pod/deployment-example-6799fc88d8-6xgtr   1/1     Running   0          38s
pod/deployment-example-6799fc88d8-7bmbr   1/1     Running   0          38s
pod/deployment-example-6799fc88d8-bcn8x   1/1     Running   0          38s

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

NAME                                 READY   UP-TO-DATE   AVAILABLE   AGE
deployment.apps/deployment-example   3/3     3            3           38s

NAME                                            DESIRED   CURRENT   READY   AGE
replicaset.apps/deployment-example-6799fc88d8   3         3         3       38s
  • 会发现最下方,创建了deployment 后有一个 RS,
    RS 的名字就是 deployment+rs版本,RS 控制业务版本,
    RS 控制副本数

4.4 Deployment 进行 Pod 的版本更新

  1. 修改 yaml 清单中 nginx 的版本
[root@k8s-1 ~]# vim deployment.yaml 

在这里插入图片描述

  1. 生效
[root@k8s-1 ~]# kubectl apply -f deployment.yaml 
deployment.apps/deployment-example configured
  1. 查看 Deployment 上线状态
  • 通过以下命令,查看到是滚动更新
[root@k8s-1 ~]# kubectl describe deployments.apps deployment-example 
Pod Template:
  Labels:  app=nginx
  Containers:
   nginx:
    Image:        nginx:1.21.1
    Port:         <none>
    Host Port:    <none>
    Environment:  <none>
    Mounts:       <none>
  Volumes:        <none>
Conditions:
  Type           Status  Reason
  ----           ------  ------
  Available      True    MinimumReplicasAvailable
  Progressing    True    NewReplicaSetAvailable
OldReplicaSets:  <none>
NewReplicaSet:   deployment-example-54f48578cf (3/3 replicas created)
Events:
  Type    Reason             Age    From                   Message
  ----    ------             ----   ----                   -------
  Normal  ScalingReplicaSet  10m    deployment-controller  Scaled up replica set deployment-example-6799fc88d8 to 3
  Normal  ScalingReplicaSet  4m42s  deployment-controller  Scaled up replica set deployment-example-54f48578cf to 1
  Normal  ScalingReplicaSet  2m16s  deployment-controller  Scaled down replica set deployment-example-6799fc88d8 to 2
  Normal  ScalingReplicaSet  2m16s  deployment-controller  Scaled up replica set deployment-example-54f48578cf to 2
  Normal  ScalingReplicaSet  2m5s   deployment-controller  Scaled down replica set deployment-example-6799fc88d8 to 1
  Normal  ScalingReplicaSet  2m5s   deployment-controller  Scaled up replica set deployment-example-54f48578cf to 3
  Normal  ScalingReplicaSet  40s    deployment-controller  Scaled down replica set deployment-example-6799fc88d8 to 0

在这里插入图片描述

  1. 通过 kubectl get all 命令查看到最初的 RS 还存在,只是为 0 了,它将一直被保留下来作为之后的回滚使用
[root@k8s-1 ~]# kubectl get all
NAME                                      READY   STATUS    RESTARTS   AGE
pod/deployment-example-54f48578cf-hrntl   1/1     Running   0          3m1s
pod/deployment-example-54f48578cf-nx46r   1/1     Running   0          5m27s
pod/deployment-example-54f48578cf-z8d7b   1/1     Running   0          2m50s

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

NAME                                 READY   UP-TO-DATE   AVAILABLE   AGE
deployment.apps/deployment-example   3/3     3            3           10m

NAME                                            DESIRED   CURRENT   READY   AGE
replicaset.apps/deployment-example-54f48578cf   3         3         3       5m27s
replicaset.apps/deployment-example-6799fc88d8   0         0         0       10m

4.5 Deployment 进行 Pod 版本回滚

  1. 将 YAML 清单中的 nginx 版本改为 latest
[root@k8s-1 ~]# vim deployment.yaml 

在这里插入图片描述

  1. 生效
[root@k8s-1 ~]# kubectl apply -f deployment.yaml 
deployment.apps/deployment-example configured
  1. 通过 kubectl get all 命令发现,RS 回到最初的版本了,Pod 中 nginx 容器的版本也回到了 latest
[root@k8s-1 ~]# kubectl get all
NAME                                      READY   STATUS    RESTARTS   AGE
pod/deployment-example-6799fc88d8-2vkw6   1/1     Running   0          42s
pod/deployment-example-6799fc88d8-dbxkc   1/1     Running   0          48s
pod/deployment-example-6799fc88d8-jq6zg   1/1     Running   0          34s

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

NAME                                 READY   UP-TO-DATE   AVAILABLE   AGE
deployment.apps/deployment-example   3/3     3            3           14m

NAME                                            DESIRED   CURRENT   READY   AGE
replicaset.apps/deployment-example-54f48578cf   0         0         0       8m59s
replicaset.apps/deployment-example-6799fc88d8   3         3         3       14m
  1. 查看 Pod 的状态
[root@k8s-1 ~]# kubectl get pod deployment-example-6799fc88d8-2vkw6 -o yaml | less
apiVersion: v1
kind: Pod
metadata:
  creationTimestamp: "2022-05-09T06:10:39Z"
  generateName: deployment-example-6799fc88d8-
  labels:
    app: nginx
    pod-template-hash: 6799fc88d8
  name: deployment-example-6799fc88d8-2vkw6
  namespace: default
  ownerReferences:
  - apiVersion: apps/v1
    blockOwnerDeletion: true
    controller: true
    kind: ReplicaSet
    name: deployment-example-6799fc88d8
    uid: d9f42478-56f1-4f4c-8eb4-8541befa6d40
  resourceVersion: "12095"
  uid: 747ef794-427b-41c4-88f7-47d307a1400f
spec:
  containers:
  - image: nginx
    imagePullPolicy: Always
    name: nginx
  1. 查看 RS 的状态
[root@k8s-1 ~]# kubectl get rs deployment-example-6799fc88d8 -o yaml | less
apiVersion: apps/v1
kind: ReplicaSet
metadata:
  annotations:
    deployment.kubernetes.io/desired-replicas: "3"
    deployment.kubernetes.io/max-replicas: "4"
    deployment.kubernetes.io/revision: "3"
    deployment.kubernetes.io/revision-history: "1"
  creationTimestamp: "2022-05-09T05:57:04Z"
  generation: 7
  labels:
    app: nginx
    pod-template-hash: 6799fc88d8
  name: deployment-example-6799fc88d8
  namespace: default
  ownerReferences:
  - apiVersion: apps/v1
    blockOwnerDeletion: true
    controller: true
    kind: Deployment
    name: deployment-example
    uid: 47d61e3f-3b59-4205-bd2a-08cff99fd529
  resourceVersion: "12139"
  uid: d9f42478-56f1-4f4c-8eb4-8541befa6d40
spec:
  replicas: 3
  selector:
    matchLabels:
  1. 通过上述 2 个命令查看到 Pod是由 RS 创建的,而 RS 是由 Deployment 创建的
  • deployment 只负责管理不同版本的 RS, RS 管理 Pod 副本数

  • 每个 RS 对应一个 deployment template 版本,同一个 replicaset 下的 Pod 版本相同

  • 当进行版本更新时,deployment 生效后,当前 RS 会先回收现有的 Pod,再进行更新,创建新的 Pod

4.6 Deployment 可以调整的参数

  1. 对 Deployment 执行 edit 操作并调整滚动更新策略
  • 更新一个删一个
[root@k8s-1 ~]# kubectl edit deployments.apps deployment-example 
  replicas: 3								//
    rollingUpdate:
      maxSurge: 0
      maxUnavailable: 1
  • 写完退出即生效

  • 拉伸副本数为 6

[root@k8s-1 ~]# kubectl scale deployment deployment-example --replicas=6
deployment.apps/deployment-example scaled
  • 查看状态
[root@k8s-1 ~]# kubectl get all
NAME                                      READY   STATUS    RESTARTS   AGE
pod/deployment-example-6799fc88d8-2vkw6   1/1     Running   0          9m57s
pod/deployment-example-6799fc88d8-79z4m   1/1     Running   0          2m9s
pod/deployment-example-6799fc88d8-bvxfz   1/1     Running   0          2m9s
pod/deployment-example-6799fc88d8-dbxkc   1/1     Running   0          10m
pod/deployment-example-6799fc88d8-jq6zg   1/1     Running   0          9m49s
pod/deployment-example-6799fc88d8-pp4wl   1/1     Running   0          2m9s

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

NAME                                 READY   UP-TO-DATE   AVAILABLE   AGE
deployment.apps/deployment-example   6/6     6            6           23m

NAME                                            DESIRED   CURRENT   READY   AGE
replicaset.apps/deployment-example-54f48578cf   0         0         0       18m
replicaset.apps/deployment-example-6799fc88d8   6         6         6       23m
  1. 对 Deployment 执行 edit 操作
  • 副本数改为 6 ,
  • nginx的版本改为 latest,
  • 镜像策略为 “有则拉取本地的,没有则拉取外网”,
  • 最少等待 5 秒就绪
[root@k8s-1 ~]# kubectl edit deployments.apps deployment-example 
spec:
  minReadySeconds: 5
  progressDeadlineSeconds: 600
  replicas: 6

在这里插入图片描述

  • 通过 kubectl get pod 查看到,pod 是每更新一个删除一个,且 5s 的速度
[root@k8s-1 ~]# kubectl get pod
NAME                                  READY   STATUS    RESTARTS   AGE
deployment-example-7cf7d6dbc8-2hqhr   1/1     Running   0          3s
deployment-example-7cf7d6dbc8-grj42   1/1     Running   0          68s
deployment-example-7cf7d6dbc8-mx965   1/1     Running   0          54s
deployment-example-7cf7d6dbc8-nxr8z   1/1     Running   0          43s
deployment-example-7cf7d6dbc8-pp56h   1/1     Running   0          17s
deployment-example-7cf7d6dbc8-sd8qz   1/1     Running   0          32s
[root@k8s-1 ~]# kubectl rollout history deployment 
deployment.apps/deployment-example 
REVISION  CHANGE-CAUSE
2         <none>
3         <none>
4         <none>
  1. 对 Deployment 执行 edit 操作并将滚动更新策略改为 一次更新 2 个,将 nginx 的版本改为 1.21.1
  • 先修改滚动更新策略
[root@k8s-1 ~]# kubectl edit deployments.apps deployment-example 
    rollingUpdate:
      maxSurge: 0
      maxUnavailable: 2

在这里插入图片描述

  • 关闭之后即生效,再次执行 edit 操作并修改 nginx 的版本
[root@k8s-1 ~]# kubectl edit deployments.apps deployment-example 
    spec:
      containers:
      - image: nginx:1.21.1
        imagePullPolicy: IfNotPresent
        name: nginx

在这里插入图片描述

  • kubectl get pod 查看状态
[root@k8s-1 ~]# kubectl get pod
NAME                                  READY   STATUS              RESTARTS   AGE
deployment-example-585c7c497-cbstf    0/1     ContainerCreating   0          1s
deployment-example-585c7c497-cnwzr    1/1     Running             0          15s
deployment-example-585c7c497-gqb4q    0/1     ContainerCreating   0          1s
deployment-example-585c7c497-h8d4r    1/1     Running             0          24s
deployment-example-585c7c497-lj4n5    1/1     Running             0          13s
deployment-example-585c7c497-tx55h    1/1     Running             0          24s
deployment-example-7cf7d6dbc8-2hqhr   1/1     Terminating         0          6m5s
deployment-example-7cf7d6dbc8-grj42   1/1     Terminating         0          7m10s
[root@k8s-1 ~]# kubectl get pod
NAME                                 READY   STATUS    RESTARTS   AGE
deployment-example-585c7c497-cbstf   1/1     Running   0          11s
deployment-example-585c7c497-cnwzr   1/1     Running   0          25s
deployment-example-585c7c497-gqb4q   1/1     Running   0          11s
deployment-example-585c7c497-h8d4r   1/1     Running   0          34s
deployment-example-585c7c497-lj4n5   1/1     Running   0          23s
deployment-example-585c7c497-tx55h   1/1     Running   0          34s
  1. 暂停更新
  • 更新的时候,把它暂停
  • 查看当前 RS 状态
[root@k8s-1 ~]# kubectl rollout history deployment 
deployment.apps/deployment-example 
REVISION  CHANGE-CAUSE
2         <none>
3         <none>
4         <none>
5         <none>
[root@k8s-1 ~]# kubectl get rs
NAME                            DESIRED   CURRENT   READY   AGE
deployment-example-54f48578cf   0         0         0       36m
deployment-example-585c7c497    6         6         6       79s
deployment-example-6799fc88d8   0         0         0       42m
deployment-example-7cf7d6dbc8   0         0         0       8m4s
  • 暂停更新
[root@k8s-1 ~]# kubectl rollout pause deployment deployment-example 
deployment.apps/deployment-example paused
  • 对 Deployment 执行 edit 操作并将 nginx 的版本改为 latest
  • 关闭即生效,发现没有自动完成更新,因为已经使用 pause 暂停了 Departments 更新
[root@k8s-1 ~]# kubectl edit deployments.apps deployment-example 

在这里插入图片描述

[root@k8s-1 ~]# kubectl get rs
NAME                            DESIRED   CURRENT   READY   AGE
deployment-example-54f48578cf   0         0         0       42m
deployment-example-585c7c497    6         6         6       7m29s
deployment-example-6799fc88d8   0         0         0       48m
deployment-example-7cf7d6dbc8   0         0         0       14m
[root@k8s-1 ~]# kubectl get pod
NAME                                 READY   STATUS    RESTARTS   AGE
deployment-example-585c7c497-cbstf   1/1     Running   0          7m13s
deployment-example-585c7c497-cnwzr   1/1     Running   0          7m27s
deployment-example-585c7c497-gqb4q   1/1     Running   0          7m13s
deployment-example-585c7c497-h8d4r   1/1     Running   0          7m36s
deployment-example-585c7c497-lj4n5   1/1     Running   0          7m25s
deployment-example-585c7c497-tx55h   1/1     Running   0          7m36s
  • 在暂停更新的过程中,可以更改它的副本数
[root@k8s-1 ~]# kubectl scale deployment deployment-example --replicas=3
deployment.apps/deployment-example scaled
[root@k8s-1 ~]# kubectl get pod
NAME                                 READY   STATUS    RESTARTS   AGE
deployment-example-585c7c497-gqb4q   1/1     Running   0          7m50s
deployment-example-585c7c497-h8d4r   1/1     Running   0          8m13s
deployment-example-585c7c497-tx55h   1/1     Running   0          8m13s
  • 恢复 Deployment 更新,发现在 5s 后 Pod 两个两个的完成更新
[root@k8s-1 ~]# kubectl rollout resume deployment deployment-example 
deployment.apps/deployment-example resumed
[root@k8s-1 ~]# kubectl get pod
NAME                                 READY   STATUS              RESTARTS   AGE
deployment-example-585c7c497-gqb4q   1/1     Terminating         0          8m37s
deployment-example-585c7c497-h8d4r   1/1     Running             0          9m
deployment-example-bb957bbb5-498db   0/1     ContainerCreating   0          2s
deployment-example-bb957bbb5-5wfvq   0/1     ContainerCreating   0          2s
[root@k8s-1 ~]# kubectl get pod
NAME                                 READY   STATUS    RESTARTS   AGE
deployment-example-bb957bbb5-498db   1/1     Running   0          25s
deployment-example-bb957bbb5-5wfvq   1/1     Running   0          25s
deployment-example-bb957bbb5-mszrg   1/1     Running   0          15s

5. DaemonSet

官方文档:概念 | 工作负载 | 工作负载资源 | DaemonSet

5.1 准备工作

  • 最常见的情况:DaemonSet 使得每个node上都有一个flannel网络组件

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

  • DaemonSet 的一些典型用法:

    在每个节点上运行集群守护进程
    在每个节点上运行日志收集守护进程
    在每个节点上运行监控守护进程

  • 一种简单的用法是为每种类型的守护进程在所有的节点上都启动一个 DaemonSet。 一个稍微复杂的用法是为同一种守护进程部署多个 DaemonSet;每个具有不同的标志, 并且对不同硬件类型具有不同的内存、CPU 要求。

5.2 创建 DaemonSet

  1. 示例
[root@k8s-1 ~]# 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: zabbix/zabbix-agent
  1. 生效
[root@k8s-1 ~]# kubectl apply -f daemonset.yaml 
daemonset.apps/daemonset-example created
  1. kubectl get pod 后,发现只有 2 个DaemonSet
  • DaemonSet 中不需要指定副本数, deployment 默认 Pod 副本数为 1
  • 因为当前有 2 个 node,所以,DaemonSet 创建了 2 个 pod
  • 有几个 node,起几个 pod
  • 通过下列信息可知,每个 node 上都有一个 Pod
[root@k8s-1 ~]# kubectl get pod -o wide
NAME                      READY   STATUS    RESTARTS   AGE    IP            NODE    NOMINATED NODE   READINESS GATES
daemonset-example-7vm9l   1/1     Running   0          2m1s   10.244.2.23   k8s-3   <none>           <none>
daemonset-example-hzmft   1/1     Running   0          2m1s   10.244.1.21   k8s-2   <none>           <none>
  1. 查看 DaemonSet 更新策略
[root@k8s-1 ~]# kubectl describe daemonsets.apps 
Name:           daemonset-example
Selector:       name=zabbix-agent
Node-Selector:  <none>
Labels:         k8s-app=zabbix-agent
Annotations:    deprecated.daemonset.template.generation: 1
Desired Number of Nodes Scheduled: 2
Current Number of Nodes Scheduled: 2
Number of Nodes Scheduled with Up-to-date Pods: 2
Number of Nodes Scheduled with Available Pods: 2
Number of Nodes Misscheduled: 0
Pods Status:  2 Running / 0 Waiting / 0 Succeeded / 0 Failed
Pod Template:
  Labels:  name=zabbix-agent
  Containers:
   zabbix-agent:
    Image:        zabbix/zabbix-agent
    Port:         <none>
    Host Port:    <none>
    Environment:  <none>
    Mounts:       <none>
  Volumes:        <none>
Events:
  Type    Reason            Age   From                  Message
  ----    ------            ----  ----                  -------
  Normal  SuccessfulCreate  3m1s  daemonset-controller  Created pod: daemonset-example-hzmft
  Normal  SuccessfulCreate  3m1s  daemonset-controller  Created pod: daemonset-example-7vm9l

5.3 DaemonSet 可以调整的参数

  1. 对 DaemonSet 执行 edit 操作,并修改滚动更新策略
  • OnDelete 类型(手动删除 pod 后,再进行更新)
[root@k8s-1 ~]# kubectl edit daemonsets.apps 
  updateStrategy:
    rollingUpdate:
      maxSurge: 0
      maxUnavailable: 1
    type: OnDelete

在这里插入图片描述

  1. 关闭即生效,再对 DaemonSet 执行 edit 操作并将镜像修改为 zabbix-agent2
  • 关闭即生效,但是发现没有更新
[root@k8s-1 ~]# kubectl edit daemonsets.apps daemonset-example 
    spec:
      containers:
      - image: zabbix/zabbix-agent2
        imagePullPolicy: Always
        name: zabbix-agent

在这里插入图片描述

  1. 删除一个 Pod 后,再次查看状态,发现更新成功
[root@k8s-1 ~]# kubectl delete pod daemonset-example-7vm9l
[root@k8s-1 ~]# kubectl delete pod daemonset-example-hzmft 
[root@k8s-1 ~]# kubectl get pod -o wide
NAME                      READY   STATUS    RESTARTS   AGE   IP            NODE    NOMINATED NODE   READINESS GATES
daemonset-example-4ttgm   1/1     Running   0          80s   10.244.2.24   k8s-3   <none>           <none>
daemonset-example-fdm52   1/1     Running   0          31s   10.244.1.22   k8s-2   <none>           <none>

6. Jobs

官方文档:概念 | 工作负载 | 工作负载资源 | Jobs

6.1 准备工作

  • Job 会创建一个或者多个 Pods,并将继续重试 Pods 的执行,直到指定数量的 Pods 成功终止。 随着 Pods 成功结束,Job 跟踪记录成功完成的 Pods 个数。 当数量达到指定的成功个数阈值时,任务(即 Job)结束。 删除 Job 的操作会清除所创建的全部 Pods。 挂起 Job 的操作会删除 Job 的所有活跃 Pod,直到 Job 被再次恢复执行。

  • 一种简单的使用场景下,你会创建一个 Job 对象以便以一种可靠的方式运行某 Pod 直到完成。 当第一个 Pod 失败或者被删除(比如因为节点硬件失效或者重启)时,Job 对象会启动一个新的 Pod。

  • 你也可以使用 Job 以并行的方式运行多个 Pod。

6.2 创建 Jobs

  1. 下面是一个 Job 配置示例。它负责计算 π 到小数点后 2000 位,并将结果打印出来。 此计算大约需要 10 秒钟完成。
[root@k8s-1 ~]# vim job.yaml
apiVersion: batch/v1
kind: Job
metadata:
  name: pi
spec:
  template:
    spec:
      containers:
      - name: pi
        image: perl
        command: ["perl", "-Mbignum=bpi", "-wle", "print bpi(2000)"]
      restartPolicy: Never
  backoffLimit: 4
  1. 生效后,查看状态
[root@k8s-1 ~]# kubectl get pod
NAME          READY   STATUS      RESTARTS   AGE
pi--1-g58wh   0/1     Completed   0          8m55s
[root@k8s-1 ~]# kubectl logs pi--1-g58wh

在这里插入图片描述

  1. 查看 Job 的部署信息,资源类型是 Job
[root@k8s-1 ~]# kubectl get pod pi--1-g58wh -o yaml 
  ownerReferences:
  - apiVersion: batch/v1
    blockOwnerDeletion: true
    controller: true
    kind: Job
    name: pi
    uid: 851f4445-e554-44f5-979e-adfeae39e403

6.3 控制并行性

  • 并行性请求(.spec.parallelism)可以设置为任何非负整数。 如果未设置,则默认为 1。 如果设置为 0,则 Job 相当于启动之后便被暂停,直到此值被增加。

  • 实际并行性(在任意时刻运行状态的 Pods 个数)可能比并行性请求略大或略小, 原因如下:

    • 对于 确定完成计数 Job,实际上并行执行的 Pods 个数不会超出剩余的完成数。 如果 .spec.parallelism 值较高,会被忽略。
    • 对于 工作队列 Job,有任何 Job 成功结束之后,不会有新的 Pod 启动。 不过,剩下的 Pods 允许执行完毕。
    • 如果 Job 控制器 没有来得及作出响应,或者
    • 如果 Job 控制器因为任何原因(例如,缺少 ResourceQuota 或者没有权限)无法创建 Pods。 Pods 个数可能比请求的数目小。
    • Job 控制器可能会因为之前同一 Job 中 Pod 失效次数过多而压制新 Pod 的创建。
    • 当 Pod 处于体面终止进程中,需要一定时间才能停止。
  1. 设置任务执行数
  • 6 个 pod,每次 2 个并行
[root@k8s-1 ~]# vim job.yaml 
apiVersion: batch/v1
kind: Job
metadata:
  name: pi
spec:
  completions: 6
  parallelism: 2
  template:
    spec:
      containers:
      - name: pi
        image: perl
        command: ["perl", "-Mbignum=bpi", "-wle", "print bpi(2000)"]
      restartPolicy: Never
  backoffLimit: 4
  1. 生效后,查看状态
  • 每次都是 2 个 Pod 并行执行
[root@k8s-1 ~]# kubectl get pod
NAME          READY   STATUS              RESTARTS   AGE
pi--1-4zc4w   0/1     ContainerCreating   0          10s
pi--1-nsjqf   0/1     ContainerCreating   0          10s
[root@k8s-1 ~]# kubectl get pod
NAME          READY   STATUS      RESTARTS   AGE
pi--1-4zc4w   0/1     Completed   0          7m24s
pi--1-57cqr   0/1     Completed   0          6m57s
pi--1-9b5fw   0/1     Completed   0          6m32s
pi--1-nsjqf   0/1     Completed   0          7m24s
pi--1-ntn6l   0/1     Completed   0          7m8s
pi--1-z2d75   0/1     Completed   0          6m46s
  1. 检查 Job 的状态
[root@k8s-1 ~]# kubectl describe jobs.batch 
Name:             pi
Namespace:        default
Selector:         controller-uid=dfb106e0-2f8d-4799-8805-95666c97bfa8
Labels:           controller-uid=dfb106e0-2f8d-4799-8805-95666c97bfa8
                  job-name=pi
Annotations:      <none>
Parallelism:      2
Completions:      6
Completion Mode:  NonIndexed
Start Time:       Mon, 09 May 2022 15:23:29 +0800
Completed At:     Mon, 09 May 2022 15:27:49 +0800
Duration:         4m20s
Pods Statuses:    0 Running / 6 Succeeded / 0 Failed
Pod Template:
  Labels:  controller-uid=dfb106e0-2f8d-4799-8805-95666c97bfa8
           job-name=pi
  Containers:
   pi:
    Image:      perl
    Port:       <none>
    Host Port:  <none>
    Command:
      perl
      -Mbignum=bpi
      -wle
      print bpi(2000)
    Environment:  <none>
    Mounts:       <none>
  Volumes:        <none>
Events:
  Type    Reason            Age    From            Message
  ----    ------            ----   ----            -------
  Normal  SuccessfulCreate  7m54s  job-controller  Created pod: pi--1-4zc4w
  Normal  SuccessfulCreate  7m54s  job-controller  Created pod: pi--1-nsjqf
  Normal  SuccessfulCreate  7m38s  job-controller  Created pod: pi--1-ntn6l
  Normal  SuccessfulCreate  7m27s  job-controller  Created pod: pi--1-57cqr
  Normal  SuccessfulCreate  7m16s  job-controller  Created pod: pi--1-z2d75
  Normal  SuccessfulCreate  7m2s   job-controller  Created pod: pi--1-9b5fw
  Normal  Completed         3m34s  job-controller  Job completed

7. CronJob

官方文档:概念 | 工作负载 | 工作负载资源 | CronJob

7.1 准备工作

  • CronJob 创建基于时隔重复调度的 Jobs。

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

  • CronJob 用于执行周期性的动作,例如备份、报告生成等。 这些任务中的每一个都应该配置为周期性重复的(例如:每天/每周/每月一次); 你可以定义任务开始执行的时间间隔。

7.2 Cron 时间表语法

在这里插入图片描述在这里插入图片描述

  • 例如,下面这行指出必须在每个星期五的午夜以及每个月 13 号的午夜开始任务:
0 0 13 * 5

7.3 创建 CronJob

  1. CronJob 用于执行周期性的动作
  • 例如备份、报告生成等。 这些任务中的每一个都应该配置为周期性重复的(例如:每天/每周/每月一次); 你可以定义任务开始执行的时间间隔。
[root@k8s-1 ~]# vim cronjob.yaml
apiVersion: batch/v1
kind: CronJob
metadata:
  name: cronjob-example
spec:
  schedule: "* * * * *"
  jobTemplate:
    spec:
      template:
        spec:
          containers:
          - name: cronjob
            image: busybox
            args:
            - /bin/sh
            - -c
            - date; echo Hello from k8s cluster
          restartPolicy: OnFailure
  1. 生效后,查看状态
[root@k8s-1 ~]# kubectl get cronjobs.batch 
NAME              SCHEDULE    SUSPEND   ACTIVE   LAST SCHEDULE   AGE
cronjob-example   * * * * *   False     0        <none>          18s
[root@k8s-1 ~]# kubectl get jobs.batch 
NAME                       COMPLETIONS   DURATION   AGE
cronjob-example-27534699   1/1           26s        41s
[root@k8s-1 ~]# kubectl get pod
NAME                                READY   STATUS      RESTARTS   AGE
cronjob-example-27534699--1-2h84n   0/1     Completed   0          42s

7.4 CronJob 可以调整的参数

  1. 对 CronJob 执行 edit 操作,查看可以调整的参数(没有做修改)
[root@k8s-1 ~]# kubectl edit cronjobs.batch 
Edit cancelled, no changes made.

在这里插入图片描述在这里插入图片描述

  1. 查看pod,发现已经有 3 个,因为 CronJob 会保留 3 个 history
[root@k8s-1 ~]# kubectl get pod
NAME                                READY   STATUS      RESTARTS   AGE
cronjob-example-27534701--1-cgfm9   0/1     Completed   0          2m24s
cronjob-example-27534702--1-f7mtx   0/1     Completed   0          84s
cronjob-example-27534703--1-98jr4   0/1     Completed   0          24s
[root@k8s-1 ~]# kubectl get jobs.batch 
NAME                       COMPLETIONS   DURATION   AGE
cronjob-example-27534701   1/1           9s         2m45s
cronjob-example-27534702   1/1           26s        105s
cronjob-example-27534703   1/1           7s         45s

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/629652.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

STM32单片机(四)第二节:OLED显示屏

❤️ 专栏简介&#xff1a;本专栏记录了从零学习单片机的过程&#xff0c;其中包括51单片机和STM32单片机两部分&#xff1b;建议先学习51单片机&#xff0c;其是STM32等高级单片机的基础&#xff1b;这样再学习STM32时才能融会贯通。 ☀️ 专栏适用人群 &#xff1a;适用于想要…

java下载sun包下的源码

为什么要重下sun包&#xff1f; sun包下的类&#xff0c;都是.class文件。例如&#xff1a;sun.net.www.protocol.http.HttpURLConnection的源码&#xff0c;竟然是.class。原因是JDK自带的src.zip里面&#xff0c;压根没有放对应的源码文件。 如何下载sun包源码&#xff1f; …

chatgpt赋能python:Python编程与SEO:如何用Python写出最优化自己的姓名?

Python编程与SEO&#xff1a;如何用Python写出最优化自己的姓名&#xff1f; 作为一名有10年Python编程经验的工程师&#xff0c;我深知Python编程在SEO优化方面所起的重要作用。Python语言简洁、灵活以及强大的功能&#xff0c;可以使我们更好地优化自己的网页排名。 在本篇…

Unreal5 实现武器切换功能

首先回忆一下之前在制作武器时&#xff0c;如何实现从后背拿武器的。我们创建了一个切换事件&#xff0c;判断当前是否持有武器&#xff0c;然后根据是否持有武器&#xff0c;去修改动画蓝图的变量&#xff0c;来触发从后面拿枪或者是否把枪放了回去。 然后在播放切枪动画时&am…

【MySql】数据库的增删改查

本篇的主要目的&#xff1a;对于数据库如何去增加删除查询修改 文章目录 创建数据库create查看数据库show删除数据库drop修改数据库alter 创建数据库create 主要细节在于选项问题&#xff0c;编码选项 CREATE DATABASE [IF NOT EXISTS] db_name [create_specification [, cre…

让chatGPT使用Tensor flow Keras组装Bert,GPT,Transformer

让chatGPT使用Tensor flow Keras组装Bert,GPT,Transformer implement Transformer Model by Tensor flow Kerasimplement Bert model by Tensor flow Kerasimplement GPT model by Tensor flow Keras 本文主要展示Transfomer, Bert, GPT的神经网络结构之间的关系和差异。网络上…

空间权重矩阵总结

前言 建立空间计量模型的前提&#xff0c;一般要引入空间权重矩阵 W W W来表达 n n n个位置的空间区域邻近关系。 但空间权重矩阵的构造一直是备受争议的&#xff0c;理论是不存在最优的空间矩阵&#xff0c;那么在实证分析中&#xff0c;通常用一个词总结试一试。下文总结了目…

chatgpt赋能python:Python怎么全加井号

Python怎么全加井号 在SEO优化中&#xff0c;适当的标记和排版对文章排名起到重要作用。在这篇文章中&#xff0c;我们将介绍如何使用井号&#xff08;#&#xff09;在Python中全加井号&#xff0c;以帮助优化文章搜索引擎排名。 什么是井号&#xff1f; 在Python中&#xf…

chatgpt赋能python:Python怎么再添一格的SEO

Python怎么再添一格的SEO Python作为一门高效、多用途、自由、易于学习的编程语言&#xff0c;已经被广泛地应用在各个领域&#xff0c;包括Web开发、数据分析、机器学习、人工智能等。在这篇文章中&#xff0c;我们将探讨如何使用Python来提高网站的SEO排名。 1. 了解SEO 在…

chatgpt赋能python:Python怎么写表格:介绍与结论

Python怎么写表格&#xff1a;介绍与结论 在数据分析或者开发领域&#xff0c;表格是非常常见的数据展示形式。Python作为一门流行的编程语言&#xff0c;在表格的处理上也有很好的支持。今天我们来介绍一下Python怎么写表格。 1. Pandas库的使用 Pandas是Python中非常流行的…

chatgpt赋能python:Python怎么入侵手机

Python怎么入侵手机 现在移动设备已经成为人们生活中必不可少的一部分&#xff0c;因此&#xff0c;攻击者越来越多地将目光转向移动设备。 进入移动设备的主要方式之一是通过应用程序漏洞进行攻击。而Python编程语言的出现可以让攻击者更容易地发掘和利用这些漏洞&#xff0c…

chatgpt赋能python:Python创建SEO文章的指南

#Python创建SEO文章的指南 在当今数字化世界中&#xff0c;SEO&#xff08;搜索引擎优化&#xff09;对于拥有一个成功的在线业务至关重要。SEO文章不仅可以帮助提高网站的排名&#xff0c;还可以吸引更多的访问者并提高转化率。在本文中&#xff0c;我们将介绍如何使用Python…

基于统计检验的空间计量经济模型选择方法

前言 当前空间计量模型的实证研究中&#xff0c;国内的文献均是基于LM检验的空间自相关和空间误差模型进行选择与分析&#xff0c;但是LM检验确实存在局限性。故此&#xff0c;需要对空间计量模型选择进行一个阐述。下列出现在空间计量模型选择方法。 原理方法基于统计检验方…

chatgpt赋能python:Python怎么做选择题?

Python怎么做选择题&#xff1f; 作为一种最广泛使用的编程语言之一&#xff0c;Python被广泛应用于数据科学、机器学习、人工智能、Web开发等领域&#xff0c;而我们今天要聚焦的是Python如何实现选择题的功能。 选择题是什么&#xff1f; 选择题是一种常见的考试题型&…

ICMP协议详解

目录 1.ICMP协议简介 2.ICMP报文格式 2.1 ICMP报文以太网数据帧格式 2.2 ICMP首部格式 2.3 ICMP报文类型列表 3.ICMP故障排查工具 3.1 ping工具 3.2 traceroute工具 4.常见ICMP报文 4.1 ICMP请求和应答 4.2 ICMP差错报告报文 4.3 目标主机不可达 5.ICMP校验和计算 …

ROS学习——通信机制(话题通信④—自定义msg)

052话题通信_自定义msg_实现_Chapter2-ROS通信机制_哔哩哔哩_bilibili 2.1.4 话题通信自定义msg Autolabor-ROS机器人入门课程《ROS理论与实践》零基础教程 一、自定义msg实现 需求:创建自定义消息&#xff0c;该消息包含人的信息:姓名、身高、年龄等。 1.定义msg文件 &am…

python基础语法学习--字面量

1、字面量的定义 在代码中&#xff0c;被写下来的固定的值。 2、常见值类型 数字&#xff1a;Number&#xff0c;包含整数int、浮点数float、复数complex、布尔bool四类。 整数int&#xff1a;如10、-10等 浮点数float&#xff1a;如13.14、-13.14等 复数complex&#xff1a;如…

Cracking C++(6): 准确打印浮点数

文章目录 1. 目的2. 准确打印浮点数&#xff1a; 使用 fmt 库3. 准确算出被表示的值3.1 直观感受IEEE-754: float-toy3.2 获取浮点数二进制表示3.3 float 类型3.4 double 类型3.5 fp16 类型3.6 验证 4. 结论和讨论5. References 1. 目的 给 float 或 double 类型的变量赋值后&…

chatgpt赋能python:Python教程:如何倒序输出字典?

Python教程&#xff1a;如何倒序输出字典&#xff1f; Python是一种强大的编程语言&#xff0c;广泛用于各种类型的应用程序开发。在开发应用程序时&#xff0c;访问和操作数据是至关重要的一步&#xff0c;而字典是Python中最有用的数据结构之一。字典允许开发人员使用键值对…

Linux安装myql8.0操作步骤

1. 创建software目录&#xff0c;目录可以自定义 mkdir /usr/local/softwar 2. 进入目录software&#xff0c;获取安装包文件 wget https://downloads.mysql.com/archives/get/p/23/file/mysql-8.0.32-linux-glibc2.12-x86_64.tar.xz 3. 解压文件 tar -vxf mysql-8.0.32-…