App 的部分重新部署
清理
请参阅“入门指南”文档,了解如何安装和设置
microk8s
UCS Tools
访问 NGC
设置仓库
简介
在本教程中,我们将展示如何使用 helm upgrade
命令仅部分重新部署应用程序中更新的资源。
本教程中其他值得关注的点包括
向微服务添加参数并从应用程序中设置它们
使用
configs
目录
本教程是教程 在 Pod 副本之间共享存储 的延续。
更新微服务和应用程序
在 http-server
的 configs
目录中创建一个名为 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
清单文件有三处更改
添加了两个名为
workingDir
和fileToCeate
的参数,以及一些注解(type
、description
、flags
)。添加了一个新的环境变量
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
上设置了参数 workingDir
和 fileToCreate
,并且 http-server
和应用程序的版本已更新。
构建微服务和应用程序并部署它们
请按照下面提到的步骤操作,但请记住更新 app.yaml 中 dependencies
部分下的 http-server
和 curl-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,请不要清理应用程序。
一些注意事项
即使在应用程序中更新了微服务版本,而没有更改任何其他参数,部分重新部署也有效。只有版本发生更改的微服务的资源才应重新部署,其他资源不受影响。
当添加/删除/替换为其他微服务时,它也有效。要尝试这一点
更改仅导致 configmap 内容更新的参数不会导致微服务 pod 重新启动。因此,即使
helm upgrade
命令成功,现有 pod 也可以继续运行并使用过时的配置文件。这将在下一个教程 在配置更改时重启 Pod 中解决。