ETSI NFV-SOL CNF 更新,带管理驱动

本文档描述了在 Tacker v1 API 中使用管理驱动更新 CNF 的方法。

注意

这是 Tacker v1 API 的文档。有关 Tacker v2 API,请参阅 ETSI NFV-SOL CNF 更新,带管理驱动

概述

下图显示了 CNF 更新的概述。

  1. 请求更新 VNF

    用户通过请求 update VNF 作为修改 VNF 信息操作,请求 tacker-server 更新 CNF。

  2. 调用 Kubernetes API

    收到 tacker-client 的请求后,tacker-server 会将其重定向到 tacker-conductor。在 tacker-conductor 中,请求会根据 VNF 包中的 VNFD 内容再次重定向到匹配的管理驱动程序(在本例中为容器更新的管理驱动程序)。然后,管理驱动程序调用 Kubernetes API。

  3. 更新资源

    Kubernetes Master 根据 API 调用更新资源。

../_images/mgmt_driver_for_container_update.png

管理驱动程序介绍

管理驱动程序使用户能够在 VNF 生命周期管理操作之前和/或之后配置其 VNF。用户可以通过实现自己的管理驱动程序来自定义管理驱动程序的逻辑,这些自定义由 NFV-SOL001 v2.6.1 中的“接口”定义指定。

本用户指南中的管理驱动程序支持使用 modify_information_startmodify_information_end 操作更新 CNF。

用例

在本用户指南中,提供的示例 VNF 包将被实例化然后更新。示例管理驱动程序将在更新期间更新 Kubernetes 上的资源。更新 ConfigMap 和 Secret,并更新 Pod、Deployment、DaemonSet 和 ReplicaSet 中的镜像,其他资源将不会更改。

先决条件

应安装以下软件包

  • tacker

  • python-tackerclient

安装上述软件包后,还需要导入示例管理驱动程序文件。您可以参考 ETSI NFV-SOL CNF 更新,带管理驱动 中的 Set Tacker Configuration 以了解管理驱动程序文件的用法。

注意

您可以在以下路径中找到示例管理驱动程序文件。 samples/mgmt_driver/kubernetes/container_update/container_update_mgmt.py

您还可以参考 ETSI NFV-SOL CNF(容器化 VNF)部署,了解从“准备 Kubernetes VIM”到“实例化 VNF”的步骤。

如何实例化用于更新的 VNF

您可以使用以下示例 VNF 包来实例化要更新的 VNF。 在本文档中,TACKER_ROOT 是服务器上 tacker 仓库的根目录。

$ cd TACKER_ROOT/samples/tests/etc/samples/etsi/nfv/test_cnf_container_update_before

从示例目录复制官方定义文件。 NFV-SOL001 v2.6.1 规定了基于 TOSCA 规范的 VNFD 的结构和格式。

$ cp TACKER_ROOT/samples/vnf_packages/Definitions/etsi_nfv_sol001_common_types.yaml Definitions/
$ cp TACKER_ROOT/samples/vnf_packages/Definitions/etsi_nfv_sol001_vnfd_types.yaml Definitions/

CSAR 包应压缩为 ZIP 文件进行上传。以下命令是压缩 VNF 包的示例

注意

示例管理驱动程序文件还需要复制到 CSAR 包中。

$ mkdir Scripts
$ cp TACKER_ROOT/samples/mgmt_driver/kubernetes/container_update/container_update_mgmt.py Scripts/
$ zip deployment.zip -r Definitions/ Files/ TOSCA-Metadata/ Scripts/

使用 openstack vnf package create 创建 VNF 包后,当 Onboarding State 为 CREATED,Operational State 为 DISABLED,Usage State 为 NOT_IN_USE 时,表示创建成功。

$ openstack vnf package create
+-------------------+-------------------------------------------------------------------------------------------------+
| Field             | Value                                                                                           |
+-------------------+-------------------------------------------------------------------------------------------------+
| ID                | d2e2689f-0850-47b6-bfed-0d8f1612601a                                                            |
| Links             | {                                                                                               |
|                   |     "self": {                                                                                   |
|                   |         "href": "/vnfpkgm/v1/vnf_packages/d2e2689f-0850-47b6-bfed-0d8f1612601a"                 |
|                   |     },                                                                                          |
|                   |     "packageContent": {                                                                         |
|                   |         "href": "/vnfpkgm/v1/vnf_packages/d2e2689f-0850-47b6-bfed-0d8f1612601a/package_content" |
|                   |     }                                                                                           |
|                   | }                                                                                               |
| Onboarding State  | CREATED                                                                                         |
| Operational State | DISABLED                                                                                        |
| Usage State       | NOT_IN_USE                                                                                      |
| User Defined Data | {}                                                                                              |
+-------------------+-------------------------------------------------------------------------------------------------+

运行以下命令将 CSAR zip 文件上传到 VNF 包:openstack vnf package upload --path <vnf 包路径> <vnf 包 ID>

以下是上传 VNF 包的示例

$ openstack vnf package upload --path deployment.zip d2e2689f-0850-47b6-bfed-0d8f1612601a
Upload request for VNF package d2e2689f-0850-47b6-bfed-0d8f1612601a has been accepted.

通过运行 openstack vnflcm create <VNFD ID> 创建 VNF 实例。

注意

可以通过 openstack vnf package show <vnf 包 ID> 命令找到 VNFD ID。

以下是创建 VNF 的示例

$ openstack vnflcm create b1bb0ce7-ebca-4fa7-95ed-4840d70a7774
+-----------------------------+------------------------------------------------------------------------------------------------------------------+
| Field                       | Value                                                                                                            |
+-----------------------------+------------------------------------------------------------------------------------------------------------------+
| ID                          | beaf9797-ccf5-41f7-a546-0ff675475e5a                                                                             |
| Instantiation State         | NOT_INSTANTIATED                                                                                                 |
| Links                       | {                                                                                                                |
|                             |     "self": {                                                                                                    |
|                             |         "href": "https://:9890/vnflcm/v1/vnf_instances/beaf9797-ccf5-41f7-a546-0ff675475e5a"             |
|                             |     },                                                                                                           |
|                             |     "instantiate": {                                                                                             |
|                             |         "href": "https://:9890/vnflcm/v1/vnf_instances/beaf9797-ccf5-41f7-a546-0ff675475e5a/instantiate" |
|                             |     }                                                                                                            |
|                             | }                                                                                                                |
| VNF Configurable Properties |                                                                                                                  |
| VNF Instance Description    |                                                                                                                  |
| VNF Instance Name           | vnf-beaf9797-ccf5-41f7-a546-0ff675475e5a                                                                         |
| VNF Package ID              | d2e2689f-0850-47b6-bfed-0d8f1612601a                                                                             |
| VNF Product Name            | Sample VNF                                                                                                       |
| VNF Provider                | Company                                                                                                          |
| VNF Software Version        | 1.0                                                                                                              |
| VNFD ID                     | b1bb0ce7-ebca-4fa7-95ed-4840d70a7774                                                                             |
| VNFD Version                | 1.0                                                                                                              |
+-----------------------------+------------------------------------------------------------------------------------------------------------------+

以下示例显示了部署 Kubernetes 资源的 yaml 文件。 您可以看到资源定义文件作为 additionalParams 中的 lcm-kubernetes-def-files 的值包含在内。

$ cat ./instance_kubernetes.json
{
  "flavourId": "simple",
  "additionalParams": {
    "lcm-kubernetes-def-files": [
      "Files/kubernetes/configmap_1.yaml",
      "Files/kubernetes/deployment.yaml",
      "Files/kubernetes/pod_env.yaml",
      "Files/kubernetes/pod_volume.yaml",
      "Files/kubernetes/replicaset.yaml",
      "Files/kubernetes/secret_1.yaml",
      "Files/kubernetes/configmap_3.yaml",
      "Files/kubernetes/pod_env_2.yaml",
      "Files/kubernetes/pod_volume_2.yaml",
      "Files/kubernetes/daemonset.yaml",
      "Files/kubernetes/deployment_2.yaml",
      "Files/kubernetes/secret_3.yaml"
    ],
    "namespace": "default"
  },
  "vimConnectionInfo": [
    {
      "id": "8a3adb69-0784-43c7-833e-aab0b6ab4470",
      "vimId": "fcb8fc03-5c57-4221-92d5-ebbdf86baf68",
      "vimType": "kubernetes"
    }
  ]
}

执行上述命令后,通过运行以下命令实例化 VNF:openstack vnflcm instantiate <VNF 实例 ID> <json 文件>

$ openstack vnflcm instantiate beaf9797-ccf5-41f7-a546-0ff675475e5a instance_kubernetes.json
Instantiate request for VNF Instance beaf9797-ccf5-41f7-a546-0ff675475e5a has been accepted.

CNF 更新过程

先决条件 中所述,在执行更新之前必须实例化 VNF。

接下来,用户可以使用原始 vnf 包作为模板来创建新的 vnf 包,其中可以更改 ConfigMap、Secret、Pod、Deployment、DaemonSet 和 ReplicaSet 的 yaml 文件。

注意

  • 可以更改 ConfigMap 和 Secret 的 yaml 文件。 种类、命名空间和名称不能更改,但文件名和文件路径可以更改。

  • 也可以更改 Pod、Deployment、DaemonSet 和 ReplicaSet 的 yaml 文件,但只能更改镜像字段,不能更改其他字段。

  • 不允许更改其他 yaml 文件。

  • 如果在 Pod、Deployment、DaemonSet 和 ReplicaSet 的 yaml 文件中进行了图像以外的更改,则这些更改将不会生效。 但是,如果此时修复整个 VNF,则资源将在实例化期间基于新的 yaml,并且所有更改将生效。

然后,在创建并上传新的 vnf 包后,可以执行更新操作。 更新后,管理驱动程序将重新启动 pod 以更新并重新创建 deployment、DaemonSet 和 ReplicaSet 以进行更新。

注意

本文档提供了新的 vnf 包,samples/tests/etc/samples/etsi/nfv/test_cnf_container_update_after

CLI 命令的详细信息在 使用 v1 Tacker 进行 VNF 生命周期管理 中描述。

如何更新 CNF

执行更新 CLI 命令,并在更新前后检查资源的的状态。

这是为了确认在更新 CNF 后 Kubernetes 中部署的资源是否已更新。 以下是整个过程的示例。 更新前的资源信息

  • ConfigMap

    $ kubectl get configmaps
    NAME               DATA   AGE
    cm-data            1      10m
    cm-data3           1      10m
    kube-root-ca.crt   1      26d
    $
    $ kubectl describe configmaps cm-data
    Name:         cm-data
    Namespace:    default
    Labels:       <none>
    Annotations:  <none>
    
    Data
    ====
    cmKey1.txt:
    ----
    configmap data
    foo
    bar
    
    BinaryData
    ====
    
    Events:  <none>
    $
    $ kubectl describe configmaps cm-data3
    Name:         cm-data3
    Namespace:    default
    Labels:       <none>
    Annotations:  <none>
    
    Data
    ====
    cmKey1.txt:
    ----
    configmap data
    foo
    bar
    
    BinaryData
    ====
    
    Events:  <none>
    
  • Secret

    $ kubectl get secrets
    NAME                   TYPE                                  DATA   AGE
    default-token-k8svim   kubernetes.io/service-account-token   3      18h
    secret-data            Opaque                                2      12m
    secret-data3           Opaque                                2      12m
    $
    $ kubectl describe secrets secret-data
    Name:         secret-data
    Namespace:    default
    Labels:       <none>
    Annotations:  <none>
    
    Type:  Opaque
    
    Data
    ====
    password:     15 bytes
    secKey1.txt:  15 bytes
    $
    $ kubectl describe secrets secret-data3
    Name:         secret-data3
    Namespace:    default
    Labels:       <none>
    Annotations:  <none>
    
    Type:  Opaque
    
    Data
    ====
    password:     15 bytes
    secKey1.txt:  15 bytes
    
  • Pod

    $ kubectl get pod -o wide
    NAME                                READY   STATUS    RESTARTS   AGE   IP           NODE      NOMINATED NODE   READINESS GATES
    daemonset-vdu5-r6vvl                1/1     Running   0          13m   10.0.0.89    vagrant   <none>           <none>
    deployment2-vdu6-86579d6868-dh57h   1/1     Running   0          13m   10.0.0.112   vagrant   <none>           <none>
    env-test                            1/1     Running   0          13m   10.0.0.118   vagrant   <none>           <none>
    env-test2                           1/1     Running   0          13m   10.0.0.104   vagrant   <none>           <none>
    vdu1-update-6fcf66b5dd-khdbw        1/1     Running   0          13m   10.0.0.90    vagrant   <none>           <none>
    vdu2-update-cqlpw                   1/1     Running   0          13m   10.0.0.102   vagrant   <none>           <none>
    volume-test                         1/1     Running   0          13m   10.0.0.107   vagrant   <none>           <none>
    volume-test2                        1/1     Running   0          13m   10.0.0.109   vagrant   <none>           <none>
    $
    $ kubectl describe pod volume-test
    Name:             volume-test
    Namespace:        default
    ...
    Containers:
      nginx:
        Container ID:   cri-o://dd4972166ad302d20ff105df964546603bbba60c21a08ce45a13b4e5e37c8400
        Image:          nginx
        Image ID:       docker.io/library/nginx@sha256:161ef4b1bf7effb350a2a9625cb2b59f69d54ec6059a8a155a1438d0439c593c
    ...
    Volumes:
      cm-volume:
        Type:      ConfigMap (a volume populated by a ConfigMap)
        Name:      cm-data
        Optional:  false
      sec-volume:
        Type:        Secret (a volume populated by a Secret)
        SecretName:  secret-data
        Optional:    false
    ...
    $
    $ kubectl describe pod volume-test2
    Name:             volume-test2
    Namespace:        default
    ...
    Containers:
      nginx:
        Container ID:   cri-o://1227dda5ddca12b95d9c47883eb9eae5f7d0cedfe0db4d5f5247d5002c2c7636
        Image:          nginx
        Image ID:       docker.io/library/nginx@sha256:161ef4b1bf7effb350a2a9625cb2b59f69d54ec6059a8a155a1438d0439c593c
    ...
    Volumes:
      cm-volume:
        Type:      ConfigMap (a volume populated by a ConfigMap)
        Name:      cm-data3
        Optional:  false
      sec-volume:
        Type:        Secret (a volume populated by a Secret)
        SecretName:  secret-data3
        Optional:    false
    ...
    
  • 部署

    $ kubectl get deployments.apps -o wide
    NAME               READY   UP-TO-DATE   AVAILABLE   AGE   CONTAINERS   IMAGES   SELECTOR
    deployment2-vdu6   1/1     1            1           15m   nginx        nginx    app=webserver
    vdu1-update        1/1     1            1           15m   nginx        nginx    app=webserver
    $
    $ kubectl describe pod vdu1-update-6fcf66b5dd-khdbw
    Name:             vdu1-update-6fcf66b5dd-khdbw
    Namespace:        default
    ...
    Containers:
      nginx:
        Container ID:   cri-o://dbe3738cf68cfd223b484dcca6e9355bed59f4e074366a2fb08da9d41772efa0
        Image:          nginx
        Image ID:       docker.io/library/nginx@sha256:161ef4b1bf7effb350a2a9625cb2b59f69d54ec6059a8a155a1438d0439c593c
      ...
      Environment Variables from:
        cm-data      ConfigMap with prefix 'CM_'  Optional: false
        secret-data  Secret with prefix 'SEC_'    Optional: false
      Environment:
        CMENV:   <set to the key 'cmKey1.txt' of config map 'cm-data'>  Optional: false
        SECENV:  <set to the key 'password' in secret 'secret-data'>    Optional: false
    ...
    $
    $ kubectl describe pod deployment2-vdu6-86579d6868-dh57h
    Name:             deployment2-vdu6-86579d6868-dh57h
    Namespace:        default
    ...
    Containers:
      nginx:
        Container ID:   cri-o://2a18bd975ba189e93a6dbafd353b1fe5d17612cf685a51dc4669eaa5b104170d
        Image:          nginx
        Image ID:       docker.io/library/nginx@sha256:161ef4b1bf7effb350a2a9625cb2b59f69d54ec6059a8a155a1438d0439c593c
        ...
        Environment Variables from:
          cm-data3      ConfigMap with prefix 'CM_'  Optional: false
          secret-data3  Secret with prefix 'SEC_'    Optional: false
        Environment:
          CMENV:   <set to the key 'cmKey1.txt' of config map 'cm-data3'>  Optional: false
          SECENV:  <set to the key 'password' in secret 'secret-data3'>    Optional: false
    ...
    
  • DaemonSet

    $ kubectl get daemonset.apps -o wide
    NAME             DESIRED   CURRENT   READY   UP-TO-DATE   AVAILABLE   NODE SELECTOR   AGE   CONTAINERS   IMAGES   SELECTOR
    daemonset-vdu5   1         1         1       1            1           <none>          16m   nginx        nginx    app=nginx
    $
    $ kubectl describe pod daemonset-vdu5-r6vvl
    Name:             daemonset-vdu5-r6vvl
    Namespace:        default
    ...
    Containers:
      nginx:
        Container ID:   cri-o://a6f53b97124212db820f951bae869fa38d5ad97f3f02eab2fe196d1e4d8af2e2
        Image:          nginx
        Image ID:       docker.io/library/nginx@sha256:161ef4b1bf7effb350a2a9625cb2b59f69d54ec6059a8a155a1438d0439c593c
        ...
        Environment Variables from:
          cm-data      ConfigMap with prefix 'CM_'  Optional: false
          secret-data  Secret with prefix 'SEC_'    Optional: false
        Environment:
          CMENV:   <set to the key 'cmKey1.txt' of config map 'cm-data'>  Optional: false
          SECENV:  <set to the key 'password' in secret 'secret-data'>    Optional: false
    ...
    
  • ReplicaSet

    $ kubectl get replicaset.apps -o wide
    NAME                          DESIRED   CURRENT   READY   AGE   CONTAINERS   IMAGES   SELECTOR
    deployment2-vdu6-86579d6868   1         1         1       17m   nginx        nginx    app=webserver,pod-template-hash=86579d6868
    vdu1-update-6fcf66b5dd        1         1         1       17m   nginx        nginx    app=webserver,pod-template-hash=6fcf66b5dd
    vdu2-update                   1         1         1       17m   nginx        nginx    app=webserver
    $
    $ kubectl describe pod vdu2-update-cqlpw
    Name:             vdu2-update-cqlpw
    Namespace:        default
    ...
    Containers:
      nginx:
        Container ID:   cri-o://59a9920844d78f75e5facad7284b95f43684059fe5da3708518be5d75643deef
        Image:          nginx
        Image ID:       docker.io/library/nginx@sha256:161ef4b1bf7effb350a2a9625cb2b59f69d54ec6059a8a155a1438d0439c593c
    ...
    Volumes:
      cm-volume:
        Type:      ConfigMap (a volume populated by a ConfigMap)
        Name:      cm-data
        Optional:  false
      sec-volume:
        Type:        Secret (a volume populated by a Secret)
        SecretName:  secret-data
        Optional:    false
    ...
    

可以通过以下 CLI 命令执行更新 CNF。

$ openstack vnflcm update VNF_INSTANCE_ID --I sample_param_file.json

本文档中 sample_param_file.json 的内容如下

{
  "vnfdId": "b1bb0ce7-ebca-4fa7-95ed-4840d70a8883",
  "vnfInstanceName": "update_vnf_after",
  "metadata": {
    "configmap_secret_paths": [
      "Files/kubernetes/configmap_2.yaml",
      "Files/kubernetes/secret_2.yaml"
    ]
  }
}

注意

  • 如果要更新 ConfigMap 和 Secret,不仅需要更新它们的 yaml,还需要在请求输入参数的 metadata 字段中指定更新的 yaml 文件路径。

  • metadata 中指定的 configmap_secret_paths 不存储在 VnfInstance DB 中。

以下是更新 CNF 的示例

$ openstack vnflcm update beaf9797-ccf5-41f7-a546-0ff675475e5a --I sample_param_file.json
Update vnf:beaf9797-ccf5-41f7-a546-0ff675475e5a

更新后的资源信息

  • ConfigMap

    $ kubectl describe configmaps cm-data
    Name:         cm-data
    Namespace:    default
    Labels:       <none>
    Annotations:  <none>
    
    Data
    ====
    cmKey1.txt:
    ----
    configmap2 data2
    foo2
    bar2
    
    BinaryData
    ====
    
    Events:  <none>
    $
    $ kubectl describe configmaps cm-data3
    Name:         cm-data3
    Namespace:    default
    Labels:       <none>
    Annotations:  <none>
    
    Data
    ====
    cmKey1.txt:
    ----
    configmap data
    foo
    bar
    
    BinaryData
    ====
    
    Events:  <none>
    
  • Secret

    $ kubectl describe secrets secret-data
    Name:         secret-data
    Namespace:    default
    Labels:       <none>
    Annotations:  <none>
    
    Type:  Opaque
    
    Data
    ====
    password:     16 bytes
    secKey1.txt:  18 bytes
    $
    $ kubectl describe secrets secret-data3
    Name:         secret-data3
    Namespace:    default
    Labels:       <none>
    Annotations:  <none>
    
    Type:  Opaque
    
    Data
    ====
    password:     15 bytes
    secKey1.txt:  15 bytes
    
  • Pod

    $ kubectl get pod -o wide
    NAME                                READY   STATUS    RESTARTS       AGE    IP           NODE      NOMINATED NODE   READINESS GATES
    daemonset-vdu5-6nrgg                1/1     Running   0              7m3s   10.0.0.92    vagrant   <none>           <none>
    deployment2-vdu6-86579d6868-dh57h   1/1     Running   0              27m    10.0.0.112   vagrant   <none>           <none>
    env-test                            1/1     Running   1 (7m6s ago)   27m    10.0.0.118   vagrant   <none>           <none>
    env-test2                           1/1     Running   0              27m    10.0.0.104   vagrant   <none>           <none>
    vdu1-update-5d87858fc6-hxqlt        1/1     Running   0              7m6s   10.0.0.103   vagrant   <none>           <none>
    vdu2-update-z4t48                   1/1     Running   0              7m6s   10.0.0.122   vagrant   <none>           <none>
    volume-test                         1/1     Running   1 (7m6s ago)   27m    10.0.0.107   vagrant   <none>           <none>
    volume-test2                        1/1     Running   0              27m    10.0.0.109   vagrant   <none>           <none>
    $
    $ kubectl describe pod volume-test
    Name:             volume-test
    Namespace:        default
    ...
    Containers:
      nginx:
        Container ID:   cri-o://832b9df0c03b01a16710ea7b19be5dbff5dcf81fbccb080824795e0c3dd4e5ae
        Image:          cirros
        Image ID:       docker.io/library/cirros@sha256:6b2d9f5341bce2b1fb29669ff46744a145079ccc6a674849de3a4946ec3d8ffb
    ...
    Volumes:
      cm-volume:
        Type:      ConfigMap (a volume populated by a ConfigMap)
        Name:      cm-data
        Optional:  false
      sec-volume:
        Type:        Secret (a volume populated by a Secret)
        SecretName:  secret-data
        Optional:    false
    ...
    $
    $ kubectl describe pod volume-test2
    Name:             volume-test2
    Namespace:        default
    ...
    Containers:
      nginx:
        Container ID:   cri-o://1227dda5ddca12b95d9c47883eb9eae5f7d0cedfe0db4d5f5247d5002c2c7636
        Image:          nginx
        Image ID:       docker.io/library/nginx@sha256:161ef4b1bf7effb350a2a9625cb2b59f69d54ec6059a8a155a1438d0439c593c
    ...
    Volumes:
      cm-volume:
        Type:      ConfigMap (a volume populated by a ConfigMap)
        Name:      cm-data3
        Optional:  false
      sec-volume:
        Type:        Secret (a volume populated by a Secret)
        SecretName:  secret-data3
        Optional:    false
    ...
    
  • 部署

    $ kubectl get deployments.apps -o wide
    NAME               READY   UP-TO-DATE   AVAILABLE   AGE   CONTAINERS   IMAGES   SELECTOR
    deployment2-vdu6   1/1     1            1           33m   nginx        nginx    app=webserver
    vdu1-update        1/1     1            1           33m   nginx        cirros   app=webserver
    $
    $ kubectl describe pod vdu1-update-5d87858fc6-hxqlt
    Name:             vdu1-update-5d87858fc6-hxqlt
    Namespace:        default
    ...
    Containers:
      nginx:
        Container ID:   cri-o://4a7b4a264f76b775c2740ed0a6debf77a02c097f15b2ae10fa999718d42afd8d
        Image:          cirros
        Image ID:       docker.io/library/cirros@sha256:6b2d9f5341bce2b1fb29669ff46744a145079ccc6a674849de3a4946ec3d8ffb
        ...
        Environment Variables from:
          cm-data      ConfigMap with prefix 'CM_'  Optional: false
          secret-data  Secret with prefix 'SEC_'    Optional: false
        Environment:
          CMENV:   <set to the key 'cmKey1.txt' of config map 'cm-data'>  Optional: false
          SECENV:  <set to the key 'password' in secret 'secret-data'>    Optional: false
    ...
    $
    $ kubectl describe pod deployment2-vdu6-86579d6868-dh57h
    Name:             deployment2-vdu6-86579d6868-dh57h
    Namespace:        default
    ...
    Containers:
      nginx:
        Container ID:   cri-o://2a18bd975ba189e93a6dbafd353b1fe5d17612cf685a51dc4669eaa5b104170d
        Image:          nginx
        Image ID:       docker.io/library/nginx@sha256:161ef4b1bf7effb350a2a9625cb2b59f69d54ec6059a8a155a1438d0439c593c
        ...
        Environment Variables from:
          cm-data3      ConfigMap with prefix 'CM_'  Optional: false
          secret-data3  Secret with prefix 'SEC_'    Optional: false
        Environment:
          CMENV:   <set to the key 'cmKey1.txt' of config map 'cm-data3'>  Optional: false
          SECENV:  <set to the key 'password' in secret 'secret-data3'>    Optional: false
    ...
    
  • DaemonSet

    $ kubectl get daemonset.apps -o wide
    NAME             DESIRED   CURRENT   READY   UP-TO-DATE   AVAILABLE   NODE SELECTOR   AGE   CONTAINERS   IMAGES   SELECTOR
    daemonset-vdu5   1         1         1       1            1           <none>          35m   nginx        cirros   app=nginx
    $
    $ kubectl describe pod daemonset-vdu5-6nrgg
    Name:             daemonset-vdu5-6nrgg
    Namespace:        default
    ...
    Containers:
      nginx:
        Container ID:   cri-o://7f18db12324ed751f28201bb0957aff513c93ed6b49d80d896dbac919bff5f30
        Image:          cirros
        Image ID:       docker.io/library/cirros@sha256:6b2d9f5341bce2b1fb29669ff46744a145079ccc6a674849de3a4946ec3d8ffb
        ...
        Environment Variables from:
          cm-data      ConfigMap with prefix 'CM_'  Optional: false
          secret-data  Secret with prefix 'SEC_'    Optional: false
        Environment:
          CMENV:   <set to the key 'cmKey1.txt' of config map 'cm-data'>  Optional: false
          SECENV:  <set to the key 'password' in secret 'secret-data'>    Optional: false
    ...
    
  • ReplicaSet

    $ kubectl get replicaset.apps -o wide
    NAME                          DESIRED   CURRENT   READY   AGE   CONTAINERS   IMAGES                SELECTOR
    deployment2-vdu6-86579d6868   1         1         1       38m   nginx        nginx                 app=webserver,pod-template-hash=86579d6868
    vdu1-update-5d87858fc6        1         1         1       18m   nginx        cirros                app=webserver,pod-template-hash=5d87858fc6
    vdu1-update-6fcf66b5dd        0         0         0       38m   nginx        nginx                 app=webserver,pod-template-hash=6fcf66b5dd
    vdu2-update                   1         1         1       38m   nginx        nginx                 app=webserver
    $
    $ kubectl describe pod vdu2-update-z4t48
    Name:             vdu2-update-z4t48
    Namespace:        default
    ...
    Containers:
      nginx:
        Container ID:   cri-o://4909dcdf39e101535a603ff5263298f3e52c5993d3822f3a0750860d889f6ebc
        Image:          nginx
        Image ID:       docker.io/library/nginx@sha256:161ef4b1bf7effb350a2a9625cb2b59f69d54ec6059a8a155a1438d0439c593c
    ...
    Volumes:
      cm-volume:
        Type:      ConfigMap (a volume populated by a ConfigMap)
        Name:      cm-data
        Optional:  false
      sec-volume:
        Type:        Secret (a volume populated by a Secret)
        SecretName:  secret-data
        Optional:    false
    ...
    

可以看到,只有 ConfigMap/Secret 或镜像已更新的 Pod 会重新启动。 对于 ConfigMap/Secret 或镜像已更新的 Deployments、DaemonSets 和 ReplicaSets,它们的 pod 将被删除并重新创建。