App 的部分重新部署

清理

请参阅“入门指南”文档,了解如何安装和设置

  • microk8s

  • UCS Tools

    • 访问 NGC

    • 设置仓库

简介

在本教程中,我们将展示如何使用 helm upgrade 命令仅部分重新部署应用程序中更新的资源。

本教程中其他值得关注的点包括

  • 向微服务添加参数并从应用程序中设置它们

  • 使用 configs 目录

本教程是教程 在 Pod 副本之间共享存储 的延续。

更新微服务和应用程序

http-serverconfigs 目录中创建一个名为 config.json 的文件,内容如下

{
          "workingDir": "$params.workingDir"
}

添加到 configs 目录下的文件将自动添加为 configmap 并挂载到微服务容器中的 /opt/configs 目录。在这里,我们添加了一个字段 workingDir,设置为参数 workingDir$params 占位符将在应用程序构建期间自动替换为实际值。

将 HTTP 服务器微服务 http-server 的微服务清单更新为以下内容

type: msapplication
specVersion: 2.5.0
name: ucf.svc.http-server
chartName: http-server
description: http server
version: 0.0.4
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

清单文件有三处更改

  • 添加了两个名为 workingDirfileToCeate 的参数,以及一些注解(typedescriptionflags)。

  • 添加了一个新的环境变量 FILE_TO_CREATE,其值设置为 $params.fileToCreate 占位符。

  • 容器参数已更新为从 config.json 文件中读取 workingDir,更改到该目录,创建一个以微服务参数 fileToCreate 传递的名称命名的文件,并列出目录的内容。

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

specVersion: 2.5.0
version: 0.0.4
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: /usr/local
    fileToCreate: myfile.txt

connections:
    client/http: http-server/http

已在 http-server 上设置了参数 workingDirfileToCreate,并且 http-server 和应用程序的版本已更新。

构建微服务和应用程序并部署它们

请按照下面提到的步骤操作,但请记住更新 app.yaml 中 dependencies 部分下的 http-servercurl-client 的版本。

检查和调试微服务和应用程序

让我们验证应用程序是否已成功部署

$ microk8s kubectl get all
NAME                                                      READY   STATUS    RESTARTS   AGE
pod/curl-client-curl-client-deployment-569849964-shcc2    1/1     Running   0          17s
pod/http-server-http-server-deployment-5cfdc4bfc9-cmfbq   1/1     Running   0          17s

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   21s

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

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

我们可以检查 http-server 容器日志,以查看当前工作目录是否为 /usr/local,以及是否已创建名为 myfile.txt 的文件,如应用程序中所指定。

$ microk8s kubectl logs --tail -1 -l "app=http-server-http-server-deployment"
/usr/local
bin
cuda
cuda-11
cuda-11.4
cuda-11.6
etc
games
include
lib
man
mpi
myfile.txt
nvm
sbin
share
src
ucx

我们还可以获取日志以验证文件是否在挂载的卷中创建

$ 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="myfile.txt">myfile.txt</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="src/">src/</a></li>
<li><a href="ucx/">ucx@</a></li>
</ul>
<hr>
</body>
</html>

正如我们所见,客户端中显示了 myfile.txt/usr/local 目录中的一些其他文件,这意味着应用程序设置的两个参数值都已生效。

重新部署应用程序

让我们更新应用程序中 fileToCreate 的参数值

specVersion: 2.5.0
version: 0.0.4
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: /usr/local
    fileToCreate: someotherfile.txt

connections:
    client/http: http-server/http

使用以下命令重新构建应用程序

$ cd $HOME/ucf_tutorial/apps
$ ucf_app_builder_cli app build server-client-app/ -f

要仅重新部署应用程序的更新资源(部分重新部署),请使用 helm upgrade 命令

$ microk8s helm upgrade server-client server-client-app/server-client-app-0.0.4

让我们重新检查 kubernetes 资源和 pod

$ microk8s kubectl get all
NAME                                                      READY   STATUS        RESTARTS   AGE
pod/curl-client-curl-client-deployment-569849964-shcc2    1/1     Running       0          3m40s
pod/http-server-http-server-deployment-7df656c66f-mbl2z   1/1     Running       0          9s
pod/http-server-http-server-deployment-5cfdc4bfc9-cmfbq   1/1     Terminating   0          3m40s

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   3m44s

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

NAME                                                            DESIRED   CURRENT   READY   AGE
replicaset.apps/curl-client-curl-client-deployment-569849964    1         1         1       3m41s
replicaset.apps/http-server-http-server-deployment-7df656c66f   1         1         1       9s
replicaset.apps/http-server-http-server-deployment-5cfdc4bfc9   0         0         0       3m41s

可以看出,http-server 微服务的参数值更改导致其现有 pod 终止并启动具有更新值的新 pod,而其他未更改的资源(例如 curl-client 微服务 pod)不受影响。

我们可以检查 http-server 新 pod 的容器日志,以查看是否已创建名为 someotherfile.txt 的文件,如更新后的应用程序中所指定。

$ microk8s kubectl logs --tail -1 -l "app=http-server-http-server-deployment,microservice_version=0.0.4"
/usr/local
bin
cuda
cuda-11
cuda-11.4
cuda-11.6
etc
games
include
lib
man
mpi
nvm
sbin
share
someotherfile.txt
src
ucx

让我们检查 curl-client pod 的最新日志

$ 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   922  100   922    0     0   450k      0 --:--:-- --:--:-- --:--:--  450k
<!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>

正如我们所见,输出列出了更新的文件名 someotherfile.txt

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

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

$ microk8s helm3 uninstall server-client

注意

如果您要继续学习下一个教程 在配置更改时重启 Pod,请不要清理应用程序。

一些注意事项

  • 即使在应用程序中更新了微服务版本,而没有更改任何其他参数,部分重新部署也有效。只有版本发生更改的微服务的资源才应重新部署,其他资源不受影响。

  • 当添加/删除/替换为其他微服务时,它也有效。要尝试这一点

    • 构建和部署 文本聊天机器人

    • 等待文本聊天机器人应用程序完全运行并与之交互

    • 构建 语音聊天机器人

    • 使用 helm upgrade 命令部署语音聊天机器人应用程序

    • 未更改的微服务 Riva Speech SkillsBotMaker Dialog Manager 应保持不受影响,并且 pod 继续运行而不会中断。

    • BotMaker Text Web App 相关的资源应终止,而与 BotMaker Speech ControllerBotMaker Speech Web App 相关的资源应创建。

    • 等待语音聊天机器人应用程序完全运行并与之交互

  • 更改仅导致 configmap 内容更新的参数不会导致微服务 pod 重新启动。因此,即使 helm upgrade 命令成功,现有 pod 也可以继续运行并使用过时的配置文件。这将在下一个教程 在配置更改时重启 Pod 中解决。