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

本文档描述了在 Tacker v2 API 中使用管理驱动更新 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/update_with_mgmt_driver.svg

管理驱动程序介绍

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

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

用例

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

先决条件

应安装以下软件包

  • tacker

  • python-tackerclient

您需要将管理驱动程序文件放在 VNF 包的 Scripts 目录中。

注意

您可以在以下路径找到示例管理驱动程序文件:tacker/sol_refactored/mgmt_drivers/container_update_mgmt_v2.py

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

如何实例化用于更新的 VNF

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

$ cd TACKER_ROOT/samples/tests/functional/sol_kubernetes_v2/test_cnf_container_update_before
$ vi pkggen.py
...
vim_id = "your k8s vim's id" (modify this value to your own vim Id)
...
$ python3 pkggen.py
$ ll
...
drwxr-xr-x  5 stack stack  4096 Nov  5 23:46 contents/
-rw-r--r--  1 stack stack  1922 Nov  5 23:46 pkggen.py
-rw-rw-r--  1 stack stack 25823 Nov 20 04:30 test_cnf_container_update_before.zip
...

注意

此工具需要一些 Tacker 模块,因此需要在安装了 Tacker 的环境中运行它,例如使用 devstack 的 python 虚拟环境。如果已在 python 虚拟环境中安装了 Tacker,请在使用该工具之前激活它,如下所示。

$ source /opt/stack/data/venv/bin/activate
(venv) $ python3 pkggen.py

完成上述操作后,您将获得示例 VNF 包 test_cnf_container_update_before.zip

注意

如果存在与正在生成的 zip 文件同名的文件,该工具将失败。 再次运行该工具以生成 zip 文件时,请删除或重命名旧的 zip 文件。

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

$ openstack vnf package create
+-------------------+-------------------------------------------------------------------------------------------------+
| Field             | Value                                                                                           |
+-------------------+-------------------------------------------------------------------------------------------------+
| ID                | 67e8b34a-d303-4ec1-acb0-e6a3bf6aae12                                                            |
| Links             | {                                                                                               |
|                   |     "self": {                                                                                   |
|                   |         "href": "/vnfpkgm/v1/vnf_packages/67e8b34a-d303-4ec1-acb0-e6a3bf6aae12"                 |
|                   |     },                                                                                          |
|                   |     "packageContent": {                                                                         |
|                   |         "href": "/vnfpkgm/v1/vnf_packages/67e8b34a-d303-4ec1-acb0-e6a3bf6aae12/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 test_cnf_container_update_before.zip 67e8b34a-d303-4ec1-acb0-e6a3bf6aae12
Upload request for VNF package 67e8b34a-d303-4ec1-acb0-e6a3bf6aae12 has been accepted.

通过运行 openstack vnflcm create <VNFD ID> --os-tacker-api-version 2 创建 VNF 实例。

注意

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

以下是创建 VNF 的示例

$ openstack vnflcm create 97018ca2-bf29-4715-9e2b-6e432dd1f414
+-----------------------------+------------------------------------------------------------------------------------------------------------------+
| Field                       | Value                                                                                                            |
+-----------------------------+------------------------------------------------------------------------------------------------------------------+
| ID                          | dec67077-b67c-46ff-b5bf-3b8d34b4ed79                                                                             |
| Instantiation State         | NOT_INSTANTIATED                                                                                                 |
| Links                       | {                                                                                                                |
|                             |     "self": {                                                                                                    |
|                             |         "href": "http://127.0.0.1:9890/vnflcm/v2/vnf_instances/dec67077-b67c-46ff-b5bf-3b8d34b4ed79"             |
|                             |     },                                                                                                           |
|                             |     "instantiate": {                                                                                             |
|                             |         "href": "http://127.0.0.1:9890/vnflcm/v2/vnf_instances/dec67077-b67c-46ff-b5bf-3b8d34b4ed79/instantiate" |
|                             |     }                                                                                                            |
|                             | }                                                                                                                |
| VNF Configurable Properties |                                                                                                                  |
| VNF Instance Description    |                                                                                                                  |
| VNF Instance Name           |                                                                                                                  |
| VNF Product Name            | Sample VNF                                                                                                       |
| VNF Provider                | Company                                                                                                          |
| VNF Software Version        | 1.0                                                                                                              |
| VNFD ID                     | 97018ca2-bf29-4715-9e2b-6e432dd1f414                                                                             |
| VNFD Version                | 1.0                                                                                                              |
+-----------------------------+------------------------------------------------------------------------------------------------------------------+

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

$ cat ./instance_kubernetes.json
{
  "flavourId": "simple",
  "vimConnectionInfo": {
    "vim1": {
      "vimId": "b7e657dc-8f16-4c1c-8fa4-a7c298d6a827",
      "vimType": "ETSINFV.KUBERNETES.V_1"
    }
  },
  "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"
    ]
  }
}

在执行上述命令后,通过运行以下命令实例化 VNF:openstack vnflcm instantiate <VNF 实例 ID> <json 文件> --os-tacker-api-version 2

$ openstack vnflcm instantiate VNF_INSTANCE_ID instance_kubernetes.json --os-tacker-api-version 2
Instantiate request for VNF Instance dec67077-b67c-46ff-b5bf-3b8d34b4ed79 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/functional/sol_kubernetes_v2/test_cnf_container_update_after

CLI 命令的详细信息在 v2 Tacker 的 VNF 生命周期管理 中描述。

如何更新 CNF

执行更新 CLI 命令并检查更新前后资源的狀態。

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

  • ConfigMap

    $ kubectl get configmaps
    NAME               DATA   AGE
    cm-data            1      70s
    cm-data3           1      70s
    kube-root-ca.crt   1      14d
    
    $ 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      33m
    secret-data            Opaque                                2      2m53s
    secret-data3           Opaque                                2      2m53s
    
    $ 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-jgjq9                1/1     Running   0          6m38s   10.0.0.107   vagrant   <none>           <none>
    deployment2-vdu6-86579d6868-6mbsl   1/1     Running   0          6m38s   10.0.0.79    vagrant   <none>           <none>
    env-test                            1/1     Running   0          6m38s   10.0.0.108   vagrant   <none>           <none>
    env-test2                           1/1     Running   0          6m38s   10.0.0.97    vagrant   <none>           <none>
    vdu1-update-6fcf66b5dd-nngts        1/1     Running   0          6m38s   10.0.0.116   vagrant   <none>           <none>
    vdu2-update-2wvxj                   1/1     Running   0          6m38s   10.0.0.91    vagrant   <none>           <none>
    volume-test                         1/1     Running   0          6m38s   10.0.0.74    vagrant   <none>           <none>
    volume-test2                        1/1     Running   0          6m38s   10.0.0.98    vagrant   <none>           <none>
    
    $ kubectl describe pod volume-test
    Name:             volume-test
    Namespace:        default
    ...
    Containers:
      nginx:
        Container ID:   cri-o://f08eaee4d9fb0cdaaf9803fb97891ff61507239af1c6317464300bcc5d1f9f08
        Image:          nginx
        Image ID:       docker.io/library/nginx@sha256:86e53c4c16a6a276b204b0fd3a8143d86547c967dc8258b3d47c3a21bb68d3c6
    ...
    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://6255e5c8d0af561789919c5aa07ac90ea691b4d0a91b5f88b9c00592295e9c9b
        Image:          nginx
        Image ID:       docker.io/library/nginx@sha256:86e53c4c16a6a276b204b0fd3a8143d86547c967dc8258b3d47c3a21bb68d3c6
    ...
    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           20m   nginx        nginx    app=webserver
    vdu1-update        1/1     1            1           20m   nginx        nginx    app=webserver
    
    $ kubectl describe pod deployment2-vdu6-86579d6868-6mbsl
    Name:             deployment2-vdu6-86579d6868-6mbsl
    Namespace:        default
    ...
    Containers:
      nginx:
        Container ID:   cri-o://eece8b07f2b66760bdc57e7a3fbc073938d73b37e62401d394d058e4273cdd90
        Image:          nginx
        Image ID:       docker.io/library/nginx@sha256:86e53c4c16a6a276b204b0fd3a8143d86547c967dc8258b3d47c3a21bb68d3c6
    ...
        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
    ...
    
    $ kubectl describe pod vdu1-update-6fcf66b5dd-nngts
    Name:             vdu1-update-6fcf66b5dd-nngts
    Namespace:        default
    ...
    Containers:
      nginx:
        Container ID:   cri-o://55db77c8612cbddc6041431a9fd1c065cd5251253b07e86288107043e84d9dab
        Image:          nginx
        Image ID:       docker.io/library/nginx@sha256:86e53c4c16a6a276b204b0fd3a8143d86547c967dc8258b3d47c3a21bb68d3c6
    ...
        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
    ...
    
  • DaemonSet

    $ kubectl get daemonset -o wide
    NAME             DESIRED   CURRENT   READY   UP-TO-DATE   AVAILABLE   NODE SELECTOR   AGE   CONTAINERS   IMAGES   SELECTOR
    daemonset-vdu5   1         1         1       1            1           <none>          27m   nginx        nginx    app=nginx
    
    $ kubectl describe pod daemonset-vdu5-jgjq9
    Name:             daemonset-vdu5-jgjq9
    Namespace:        default
    ...
    Containers:
      nginx:
        Container ID:   cri-o://0d99ecf321d715aded2ec2834f2fecc57dbb7c6eb8e7f710f193df5a0844d846
        Image:          nginx
        Image ID:       docker.io/library/nginx@sha256:86e53c4c16a6a276b204b0fd3a8143d86547c967dc8258b3d47c3a21bb68d3c6
    ...
        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 -o wide
    NAME                          DESIRED   CURRENT   READY   AGE   CONTAINERS   IMAGES   SELECTOR
    deployment2-vdu6-86579d6868   1         1         1       32m   nginx        nginx    app=webserver,pod-template-hash=86579d6868
    vdu1-update-6fcf66b5dd        1         1         1       32m   nginx        nginx    app=webserver,pod-template-hash=6fcf66b5dd
    vdu2-update                   1         1         1       32m   nginx        nginx    app=webserver
    
    $ kubectl describe pod vdu2-update-2wvxj
    Name:             vdu2-update-2wvxj
    Namespace:        default
    ...
    Containers:
      nginx:
        Container ID:   cri-o://8e24081e5e325302f1e4403bf76756b90f848a9c712e53d99f547ba6265d7ed6
        Image:          nginx
        Image ID:       docker.io/library/nginx@sha256:86e53c4c16a6a276b204b0fd3a8143d86547c967dc8258b3d47c3a21bb68d3c6
    ...
    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 \
  --os-tacker-api-version 2

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

{
  "vnfdId": "58bcc1c6-1400-46ec-b7fb-e508bf7e00e9",
  "vnfInstanceName": "modify_vnf_after",
  "metadata": {
    "configmap_secret_paths": [
      "Files/kubernetes/configmap_2.yaml",
      "Files/kubernetes/secret_2.yaml"
    ]
  }
}

注意

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

以下是更新 CNF 的示例

$ openstack vnflcm update dec67077-b67c-46ff-b5bf-3b8d34b4ed79 --I sample_param_file.json
  Update vnf:dec67077-b67c-46ff-b5bf-3b8d34b4ed79

更新后的资源信息

  • 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 secret secret-data3
    Name:         secret-data3
    Namespace:    default
    Labels:       <none>
    Annotations:  <none>
    
    Type:  Opaque
    
    Data
    ====
    secKey1.txt:  15 bytes
    password:     15 bytes
    
  • Pod

    $ kubectl get pod -o wide
    NAME                                READY   STATUS    RESTARTS        AGE     IP           NODE      NOMINATED NODE   READINESS GATES
    daemonset-vdu5-whd4s                1/1     Running   0               9m49s   10.0.0.76    vagrant   <none>           <none>
    deployment2-vdu6-86579d6868-6mbsl   1/1     Running   0               104m    10.0.0.79    vagrant   <none>           <none>
    env-test                            1/1     Running   1 (9m52s ago)   104m    10.0.0.108   vagrant   <none>           <none>
    env-test2                           1/1     Running   0               104m    10.0.0.97    vagrant   <none>           <none>
    vdu1-update-5d87858fc6-tfgts        1/1     Running   0               9m52s   10.0.0.71    vagrant   <none>           <none>
    vdu2-update-tk7qp                   1/1     Running   0               9m52s   10.0.0.91    vagrant   <none>           <none>
    volume-test                         1/1     Running   1 (9m52s ago)   104m    10.0.0.74    vagrant   <none>           <none>
    volume-test2                        1/1     Running   0               104m    10.0.0.98    vagrant   <none>           <none>
    
    $ kubectl describe pod env-test
    Name:             env-test
    Namespace:        default
    ...
    Containers:
      nginx:
        Container ID:   cri-o://143924c0a3869402db7e07950cf66c6360a4298a8b575e9ea3c35cf77d48854d
        Image:          tomcat
        Image ID:       docker.io/library/tomcat@sha256:857b168692495ee6ff0d6ee89b5b479555c74401bc3c219c88644b9181f03dd5
    ...
        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 env-test2
    Name:             env-test2
    Namespace:        default
    ...
    Containers:
      nginx:
        Container ID:   cri-o://1ebf1f8fccfd821f55a0918657735758173ea83037edd84bf651e660afd16f82
        Image:          nginx
        Image ID:       docker.io/library/nginx@sha256:86e53c4c16a6a276b204b0fd3a8143d86547c967dc8258b3d47c3a21bb68d3c6
    ...
        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
    ...
    
    $ kubectl describe pod volume-test
    Name:             volume-test
    Namespace:        default
    ...
    Containers:
      nginx:
        Container ID:   cri-o://e46b41347ddc29dbd7afee3dda324a1ac26383ab1f805635dd64895328bbe5a1
        Image:          cirros
        Image ID:       docker.io/library/cirros@sha256:a40a2b0a21536db691c8e7e055dbb92c81ad15392048abbde32fc5698e07f831
    ...
    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://6255e5c8d0af561789919c5aa07ac90ea691b4d0a91b5f88b9c00592295e9c9b
        Image:          nginx
        Image ID:       docker.io/library/nginx@sha256:86e53c4c16a6a276b204b0fd3a8143d86547c967dc8258b3d47c3a21bb68d3c6
    ...
    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 -o wide
    NAME               READY   UP-TO-DATE   AVAILABLE   AGE    CONTAINERS   IMAGES   SELECTOR
    deployment2-vdu6   1/1     1            1           114m   nginx        nginx    app=webserver
    vdu1-update        1/1     1            1           114m   nginx        cirros   app=webserver
    
    $ kubectl describe pod deployment2-vdu6-86579d6868-6mbsl
    Name:             deployment2-vdu6-86579d6868-6mbsl
    Namespace:        default
    ...
    Containers:
      nginx:
        Container ID:   cri-o://eece8b07f2b66760bdc57e7a3fbc073938d73b37e62401d394d058e4273cdd90
        Image:          nginx
        Image ID:       docker.io/library/nginx@sha256:86e53c4c16a6a276b204b0fd3a8143d86547c967dc8258b3d47c3a21bb68d3c6
    ...
        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   Optional: false
    ...
    
    $ kubectl describe pod vdu1-update-5d87858fc6-tfgts
    Name:             vdu1-update-5d87858fc6-tfgts
    Namespace:        default
    ...
    Containers:
      nginx:
        Container ID:   cri-o://12e4ada36be199c46971f4e41c4afc82d7cedd77c5120a8a0b751a43a884a307
        Image:          cirros
        Image ID:       docker.io/library/cirros@sha256:a40a2b0a21536db691c8e7e055dbb92c81ad15392048abbde32fc5698e07f831
    ...
        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
    ...
    
  • DaemonSet

    $ kubectl get daemonset -o wide
    NAME             DESIRED   CURRENT   READY   UP-TO-DATE   AVAILABLE   NODE SELECTOR   AGE    CONTAINERS   IMAGES   SELECTOR
    daemonset-vdu5   1         1         1       1            1           <none>          126m   nginx        cirros   app=nginx
    
    $ kubectl describe pod daemonset-vdu5-whd4s
    Name:             daemonset-vdu5-whd4s
    Namespace:        default
    ...
    Containers:
      nginx:
        Container ID:   cri-o://f291342b342ad106410b99212f4e934730dbdf94cc2d2daf767efd7cb7305d68
        Image:          cirros
        Image ID:       docker.io/library/cirros@sha256:a40a2b0a21536db691c8e7e055dbb92c81ad15392048abbde32fc5698e07f831
    ...
        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       131m   nginx        nginx                 app=webserver,pod-template-hash=86579d6868
    vdu1-update-5d87858fc6        1         1         1       37m    nginx        cirros                app=webserver,pod-template-hash=5d87858fc6
    vdu1-update-6fcf66b5dd        0         0         0       131m   nginx        nginx                 app=webserver,pod-template-hash=6fcf66b5dd
    vdu2-update                   1         1         1       131m   nginx        nginx                 app=webserver
    
    $ kubectl describe pod vdu2-update-tk7qp
    Name:             vdu2-update-tk7qp
    Namespace:        default
    ...
    Containers:
      nginx:
        Container ID:   cri-o://05f13a7b7d171e2d68bcbceefbce0537b851bd0f0f7de60fba0d9500349d6f4d
        Image:          nginx
        Image ID:       docker.io/library/nginx@sha256:86e53c4c16a6a276b204b0fd3a8143d86547c967dc8258b3d47c3a21bb68d3c6
    ...
    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 或镜像已更新的 Deployment、DaemonSet 和 ReplicaSet,它们的 pod 将被删除并重新创建。