配置更改时重启 Pod

清理

请参阅入门文档以了解安装和设置信息

  • microk8s

  • UCS 工具

    • 访问 NGC

    • 设置仓库

简介

在本教程中,我们将首先演示先前教程 配置更改未导致 Pod 重启 中提到的问题,并展示如何添加对 configmap 的依赖,以便 configmap 中的任何更改都会导致 Pod 重启。

本教程是教程 应用程序的部分重新部署 的延续。

检查当前的微服务和资源

$ microk8s kubectl get all
NAME                                                      READY   STATUS    RESTARTS   AGE
pod/curl-client-curl-client-deployment-569849964-shcc2    1/1     Running   0          44m
pod/http-server-http-server-deployment-5cfdc4bfc9-24pkk   1/1     Running   0          2m16s

NAME                                             TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)    AGE
service/kubernetes                               ClusterIP   10.152.183.1     <none>        443/TCP    49d
service/http-server-http-server-deployment-svc   ClusterIP   10.152.183.245   <none>        8080/TCP   44m

NAME                                                 READY   UP-TO-DATE   AVAILABLE   AGE
deployment.apps/curl-client-curl-client-deployment   1/1     1            1           44m
deployment.apps/http-server-http-server-deployment   1/1     1            1           44m

NAME                                                            DESIRED   CURRENT   READY   AGE
replicaset.apps/curl-client-curl-client-deployment-569849964    1         1         1       44m
replicaset.apps/http-server-http-server-deployment-5cfdc4bfc9   1         1         1       44m

让我们也检查一下 configmap 的内容,其中添加了 workingDir 参数。

$ microk8s kubectl get cm -l "app.kubernetes.io/instance=server-client"
NAME                      DATA   AGE
http-server-workload-cm   0      49m
curl-client-workload-cm   0      49m
http-server-configs-cm    2      49m
http-server-scripts-cm    1      49m
curl-client-scripts-cm    1      49m
curl-client-configs-cm    1      49m

$ microk8s kubectl get cm http-server-configs-cm -o yaml
apiVersion: v1
data:
  config.json: |
    {
      "workingDir": "/usr/local"
    }
  config.yaml: |
    SampleConfig:
      sampleValue: 0
kind: ConfigMap
metadata:
  annotations:
    meta.helm.sh/release-name: server-client
    meta.helm.sh/release-namespace: default
  creationTimestamp: "2023-03-14T06:05:18Z"
  labels:
    app.kubernetes.io/instance: server-client
    app.kubernetes.io/managed-by: Helm
    app.kubernetes.io/name: http-server
    app.kubernetes.io/version: 0.0.4
    generated_with: helm_builder
    hb_version: 0.7.1
    helm.sh/chart: http-server-0.0.4
    msb_version: 2.5.0
  name: http-server-configs-cm
  namespace: default
  resourceVersion: "954500"
  uid: 8bdae84f-84b0-411b-a7aa-337cab82bdc2

正如我们所见,config.json 包含 /usr/local 的当前路径。

更新应用程序中的参数

app.yaml 文件更新为以下内容

specVersion: 2.5.0
version: 0.0.5
doc: README.md
name: server-client-app
description: Server Client Application

dependencies:
- ucf.svc.curl-client:0.0.2
- ucf.svc.http-server:0.0.4

components:
- name: client
  type: ucf.svc.curl-client
- name: http-server
  type: ucf.svc.http-server
  parameters:
    workingDir: /var
    fileToCreate: someotherfile.txt

connections:
    client/http: http-server/http

参数 workingDir 已被修改,应用程序版本已更新。

构建应用程序和部分重新部署

使用以下命令重建和重新部署应用程序

$ cd $HOME/ucf_tutorial/apps
$ ucf_app_builder_cli app build server-client-app/ -f
$ microk8s helm upgrade server-client server-client-app/server-client-app-0.0.5

检查微服务和应用程序

$ microk8s kubectl get all
NAME                                                      READY   STATUS    RESTARTS   AGE
pod/curl-client-curl-client-deployment-569849964-shcc2    1/1     Running   0          56m
pod/http-server-http-server-deployment-5cfdc4bfc9-24pkk   1/1     Running   0          15m

NAME                                             TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)    AGE
service/kubernetes                               ClusterIP   10.152.183.1     <none>        443/TCP    49d
service/http-server-http-server-deployment-svc   ClusterIP   10.152.183.245   <none>        8080/TCP   57m

NAME                                                 READY   UP-TO-DATE   AVAILABLE   AGE
deployment.apps/curl-client-curl-client-deployment   1/1     1            1           56m
deployment.apps/http-server-http-server-deployment   1/1     1            1           56m

NAME                                                            DESIRED   CURRENT   READY   AGE
replicaset.apps/curl-client-curl-client-deployment-569849964    1         1         1       56m
replicaset.apps/http-server-http-server-deployment-5cfdc4bfc9   1         1         1       56m
replicaset.apps/http-server-http-server-deployment-7df656c66f   0         0         0       53m

我们还可以获取 curl-client 容器的日志

$ microk8s kubectl logs --tail -1 -l "app=curl-client-curl-client-deployment"
...
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100   936  100   936    0     0   457k      0 --:--:-- --:--:-- --:--:--  457k
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>Directory listing for /</title>
</head>
<body>
<h1>Directory listing for /</h1>
<hr>
<ul>
<li><a href="bin/">bin/</a></li>
<li><a href="cuda/">cuda@</a></li>
<li><a href="cuda-11/">cuda-11@</a></li>
<li><a href="cuda-11.4/">cuda-11.4/</a></li>
<li><a href="cuda-11.6/">cuda-11.6/</a></li>
<li><a href="etc/">etc/</a></li>
<li><a href="games/">games/</a></li>
<li><a href="include/">include/</a></li>
<li><a href="lib/">lib/</a></li>
<li><a href="man/">man@</a></li>
<li><a href="mpi/">mpi@</a></li>
<li><a href="nvm/">nvm/</a></li>
<li><a href="sbin/">sbin/</a></li>
<li><a href="share/">share/</a></li>
<li><a href="someotherfile.txt">someotherfile.txt</a></li>
<li><a href="src/">src/</a></li>
<li><a href="ucx/">ucx@</a></li>
</ul>
<hr>
</body>
</html>

让我们也获取 http-server configmap 的内容

$ microk8s kubectl get cm http-server-configs-cm -o yaml
apiVersion: v1
data:
  config.json: |
    {
      "workingDir": "/var"
    }
  config.yaml: |
    SampleConfig:
      sampleValue: 0
kind: ConfigMap
metadata:
  annotations:
    meta.helm.sh/release-name: server-client
    meta.helm.sh/release-namespace: default
  creationTimestamp: "2023-03-14T06:05:18Z"
  labels:
    app.kubernetes.io/instance: server-client
    app.kubernetes.io/managed-by: Helm
    app.kubernetes.io/name: http-server
    app.kubernetes.io/version: 0.0.4
    generated_with: helm_builder
    hb_version: 0.7.1
    helm.sh/chart: http-server-0.0.4
    msb_version: 2.5.0
  name: http-server-configs-cm
  namespace: default
  resourceVersion: "963732"
  uid: 8bdae84f-84b0-411b-a7aa-337cab82bdc2

我们可以看到,即使 config 反映了更新后的路径 /varhttp-server 的现有 Pod 仍然继续运行并返回旧路径 /usr/local 的目录内容。

添加对 configmap 的依赖

让我们更新 http-server 的清单

type: msapplication
specVersion: 2.5.0
name: ucf.svc.http-server
chartName: http-server
description: http server
version: 0.0.5
tags: []
keywords: []
publish: false
ingress-endpoints:
  - name: http
    description: REST API endpoint
    protocol: TCP
    scheme: http
    mandatory: False
    data-flow: in-out

params:
  workingDir: "/localvol"
  #> type: string
  #> description: Working directory for listing contents
  #> flags: mandatory
  fileToCreate: somefile.txt
  #> type: string
  #> description: Name of the file to create in the working directory
  #> flags: mandatory
---
spec:
  - name: http-server-deployment
    type: ucf.k8s.app.deployment
    parameters:
      apptype: stateless

  - name: http-server-container
    type: ucf.k8s.container
    parameters:
      image:
        repository: nvcr.io/nvidia/pytorch
        tag: 22.04-py3
      command: [sh, -c]
      args: [
            "WORKING_DIR=$(cat /opt/configs/config.json | jq -r '.workingDir') && cd $WORKING_DIR && echo $PWD && touch $(FILE_TO_CREATE) && ls && python -m http.server 8080
            "]
      env:
      - name: POD_NAME
        valueFrom:
          fieldRef:
            fieldPath: metadata.name
      - name: FILE_TO_CREATE
        value: $params.fileToCreate
      ports:
        - containerPort: 8080
          name: http
      volumeMounts:
        - name: localvol
          mountPath: /localvol

  - name: svc
    type: ucf.k8s.service
    parameters:
      ports:
      - port: 8080
        protocol: TCP
        name: http

  - name: localvol
    type: ucf.k8s.volume
    parameters:
      persistentVolumeClaim:
        claimName: local-path-pvc

  - name: cm-dependencies
    type: ucf.appspec.restartPodOnConfigChanges
    parameters:
      # Add dependency on all configmaps detected in the microservice
      addAll: true

      # Add dependency on default configmaps for scripts, configs and workload configs
      # addDefault: true

      # Add dependency on individual configmaps using the configmap names
      # configMaps:
      # - http-server-configs-cm

清单中有两个更改

  • 已添加类型为 ucf.appspec.restartPodOnConfigChanges 的新组件 cm-dependencies,并将 addAll 设置为 true

  • 微服务版本已更新

app.yaml 文件更新为以下内容,仅 dependencies 中的 http-server 版本已更新

specVersion: 2.5.0
version: 0.0.5
doc: README.md
name: server-client-app
description: Server Client Application

dependencies:
- ucf.svc.curl-client:0.0.2
- ucf.svc.http-server:0.0.5

components:
- name: client
  type: ucf.svc.curl-client
- name: http-server
  type: ucf.svc.http-server
  parameters:
    workingDir: /var
    fileToCreate: someotherfile.txt

connections:
    client/http: http-server/http

重建和重新部署微服务和应用程序

使用以下命令重建和重新部署微服务和应用程序

$ cd $HOME/ucf_tutorial/services
$ ucf_ms_builder_cli service build -d http-server/ -f
$ cd $HOME/ucf_tutorial/apps
$ ucf_app_builder_cli app build server-client-app/ -f
$ microk8s helm upgrade server-client server-client-app/server-client-app-0.0.5

检查重新部署的应用程序

$ microk8s kubectl get all
NAME                                                      READY   STATUS        RESTARTS   AGE
pod/curl-client-curl-client-deployment-569849964-shcc2    1/1     Running       0          78m
pod/http-server-http-server-deployment-d5764c767-vx6rp    1/1     Running       0          17s
pod/http-server-http-server-deployment-5cfdc4bfc9-24pkk   1/1     Terminating   0          37m

NAME                                             TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)    AGE
service/kubernetes                               ClusterIP   10.152.183.1     <none>        443/TCP    49d
service/http-server-http-server-deployment-svc   ClusterIP   10.152.183.245   <none>        8080/TCP   78m

NAME                                                 READY   UP-TO-DATE   AVAILABLE   AGE
deployment.apps/curl-client-curl-client-deployment   1/1     1            1           78m
deployment.apps/http-server-http-server-deployment   1/1     1            1           78m

NAME                                                            DESIRED   CURRENT   READY   AGE
replicaset.apps/curl-client-curl-client-deployment-569849964    1         1         1       78m
replicaset.apps/http-server-http-server-deployment-7df656c66f   0         0         0       75m
replicaset.apps/http-server-http-server-deployment-d5764c767    1         1         1       17s

正如我们所见,现有的 http-server Pod 已被终止,并启动了新的 Pod。检查 curl-client Pod 和新的 http-server Pod 的日志证实了新路径 /var 已生效

$ microk8s kubectl logs --tail -1 -l "app=http-server-http-server-deployment,microservice_version=0.0.5"
/var
backups
cache
lib
local
lock
log
mail
opt
run
someotherfile.txt
spool
tmp

$ microk8s kubectl logs --tail -1 -l "app=curl-client-curl-client-deployment"
...
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100   743  100   743    0     0   362k      0 --:--:-- --:--:-- --:--:--  362k
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>Directory listing for /</title>
</head>
<body>
<h1>Directory listing for /</h1>
<hr>
<ul>
<li><a href="backups/">backups/</a></li>
<li><a href="cache/">cache/</a></li>
<li><a href="lib/">lib/</a></li>
<li><a href="local/">local/</a></li>
<li><a href="lock/">lock@</a></li>
<li><a href="log/">log/</a></li>
<li><a href="mail/">mail/</a></li>
<li><a href="opt/">opt/</a></li>
<li><a href="run/">run@</a></li>
<li><a href="someotherfile.txt">someotherfile.txt</a></li>
<li><a href="spool/">spool/</a></li>
<li><a href="tmp/">tmp/</a></li>
</ul>
<hr>
</body>
</html>

更新配置参数并重建和重新部署应用程序

app.yaml 文件更新为以下内容,仅 workingDir 参数已更新为 /tmp

specVersion: 2.5.0
version: 0.0.5
doc: README.md
name: server-client-app
description: Server Client Application

dependencies:
- ucf.svc.curl-client:0.0.2
- ucf.svc.http-server:0.0.5

components:
- name: client
  type: ucf.svc.curl-client
- name: http-server
  type: ucf.svc.http-server
  parameters:
    workingDir: /tmp
    fileToCreate: someotherfile.txt

connections:
    client/http: http-server/http

重建和重新部署应用程序

使用以下命令重建和重新部署微服务和应用程序

$ cd $HOME/ucf_tutorial/apps
$ ucf_app_builder_cli app build server-client-app/ -f
$ microk8s helm upgrade server-client server-client-app/server-client-app-0.0.5

检查重新部署的应用程序

$ microk8s kubectl get all
NAME                                                     READY   STATUS        RESTARTS   AGE
pod/curl-client-curl-client-deployment-569849964-shcc2   1/1     Running       0          93m
pod/http-server-http-server-deployment-c88597df9-wr89f   1/1     Running       0          21s
pod/http-server-http-server-deployment-d5764c767-vx6rp   1/1     Terminating   0          15m

NAME                                             TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)    AGE
service/kubernetes                               ClusterIP   10.152.183.1     <none>        443/TCP    49d
service/http-server-http-server-deployment-svc   ClusterIP   10.152.183.245   <none>        8080/TCP   93m

NAME                                                 READY   UP-TO-DATE   AVAILABLE   AGE
deployment.apps/curl-client-curl-client-deployment   1/1     1            1           93m
deployment.apps/http-server-http-server-deployment   1/1     1            1           93m

NAME                                                            DESIRED   CURRENT   READY   AGE
replicaset.apps/curl-client-curl-client-deployment-569849964    1         1         1       93m
replicaset.apps/http-server-http-server-deployment-7df656c66f   0         0         0       90m
replicaset.apps/http-server-http-server-deployment-5cfdc4bfc9   0         0         0       93m
replicaset.apps/http-server-http-server-deployment-c88597df9    1         1         1       21s
replicaset.apps/http-server-http-server-deployment-d5764c767    0         0         0       15m

正如我们所见,现有的 http-server Pod 已被终止,并启动了新的 Pod。检查 curl-client Pod 和新的 http-server Pod 的日志证实了新路径 /tmp 已生效

$ microk8s kubectl logs http-server-http-server-deployment-c88597df9-wr89f
/tmp
core-js-banners
someotherfile.txt
v8-compile-cache-0
yarn--1650154850728-0.1942747438338328
yarn--1650154852391-0.6050681633516224
yarn--1650154853881-0.6683114706726603
yarn--1650154920633-0.4394541481795069
yarn--1650154922130-0.5297801175307726

$ microk8s kubectl logs --tail -1 -l "app=curl-client-curl-client-deployment"
...
% Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                Dload  Upload   Total   Spent    Left  Speed
100   989  100   989    0     0   482k      0 --:--:-- --:--:-- --:--:--  482k
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>Directory listing for /</title>
</head>
<body>
<h1>Directory listing for /</h1>
<hr>
<ul>
<li><a href="core-js-banners">core-js-banners</a></li>
<li><a href="someotherfile.txt">someotherfile.txt</a></li>
<li><a href="v8-compile-cache-0/">v8-compile-cache-0/</a></li>
<li><a href="yarn--1650154850728-0.1942747438338328/">yarn--1650154850728-0.1942747438338328/</a></li>
<li><a href="yarn--1650154852391-0.6050681633516224/">yarn--1650154852391-0.6050681633516224/</a></li>
<li><a href="yarn--1650154853881-0.6683114706726603/">yarn--1650154853881-0.6683114706726603/</a></li>
<li><a href="yarn--1650154920633-0.4394541481795069/">yarn--1650154920633-0.4394541481795069/</a></li>
<li><a href="yarn--1650154922130-0.5297801175307726/">yarn--1650154922130-0.5297801175307726/</a></li>
</ul>
<hr>
</body>
</html>

这证实了 configmap 内容的更改在微服务清单中 ucf.appspec.restartPodOnConfigChanges 组件的帮助下导致 Pod 重启。

停止和清理微服务和应用程序

最后,要停止和清理应用程序,我们可以运行

$ microk8s helm3 uninstall server-client

一些注意事项

  • 只有作为微服务 Helm Chart 一部分的 configmap 才能添加为依赖项。