三分钟游览
8. 本地机器
启动服务器和 shell,就像在三秒游中一样。
现在,您可以安装并更新 Hello World 应用程序。
首先运行package install命令,如以下示例所示(及其输出):
skipper:>package install --release-name helloworldlocal --package-name helloworld --package-version 1.0.0 --properties spec.applicationProperties.server.port=8099
Released helloworldlocal. Now at version v1.
您现在可以卷曲greetingendpoint,如以下示例所示(及其输出):
$ curl http://localhost:8099/greeting
Hello World!
$ curl http://localhost:8099/about
Hello World v1.0.0.RELEASE
我们使用 YAML 文件来更新版本。
此应用程序包含一个 Spring Boot@ConfigurationProperty叫helloworld.greeting,因此我们将其与标准 Spring Boot 属性一起设置:endpoints.sensitive=false.
我们还将内存提升到 2G,使引导执行器端点不敏感,并将端口设置为 8100。
这helloworld-upgrade-local.yml文件包含以下代码:
spec:
applicationProperties:
server.port: 8100
endpoints.sensitive: false
helloworld.greeting: yo
deploymentProperties:
spring.cloud.deployer.memory: 2048m
以下示例显示了release upgrade命令,其输出:
skipper:>release upgrade --release-name helloworldlocal --package-name helloworld --package-version 1.0.1 --file /home/mpollack/helloworld-upgrade-local.yml
helloworldlocal has been upgraded. Now at version v2.
这--package-version 1.0.1命令行选项也用于升级到较新版本的软件包。
当前的升级策略很简单:如果新应用程序正常,则删除旧应用程序。 没有滚动升级选项。部署并检查所有新应用的运行状况。然后删除所有以前的版本。 计划在 Skipper 的未来版本中提供更灵活的升级策略。
您现在可以卷曲greetingendpoint 和aboutendpoint,如以下示例所示(及其输出):
$ curl http://localhost:8100/greeting
yo
$ curl http://localhost:8100/about
Hello World v1.0.1.RELEASE
您还可以在浏览器中查看端点。
这list命令显示当前DEPLOYED和DELETED每个发布名称的发布。
在本例中,只有一个条目,正如您在release list命令,如下所示:
skipper:>release list
╔═══════════════╤═══════╤═════════════╤════════╤══════════╤═════════╤═════════╤════════════════════════════════════════════════════╗
║ Name │Version│Last updated │ Status │ Package │ Package │Platform │ Platform Status ║
║ │ │ │ │ Name │ Version │ Name │ ║
╠═══════════════╪═══════╪═════════════╪════════╪══════════╪═════════╪═════════╪════════════════════════════════════════════════════╣
║helloworldlocal│2 │Fri Oct 27 │DEPLOYED│helloworld│1.0.1 │default │[helloworldlocal.helloworld-v2], State = ║
║ │ │16:39:03 IST │ │ │ │ │[helloworldlocal.helloworld-v2-0=deployed] ║
║ │ │2017 │ │ │ │ │ ║
╚═══════════════╧═══════╧═════════════╧════════╧══════════╧═════════╧═════════╧════════════════════════════════════════════════════╝
您可以使用history命令,如以下示例所示(及其输出):
skipper:>release history --release-name helloworldlocal
╔═══════╤════════════════════════════╤════════╤════════════╤═══════════════╤════════════════╗
║Version│ Last updated │ Status │Package Name│Package Version│ Description ║
╠═══════╪════════════════════════════╪════════╪════════════╪═══════════════╪════════════════╣
║2 │Fri Oct 27 16:39:03 IST 2017│DEPLOYED│helloworld │1.0.1 │Upgrade complete║
║1 │Fri Oct 27 16:37:59 IST 2017│DELETED │helloworld │1.0.0 │Delete complete ║
╚═══════╧════════════════════════════╧════════╧════════════╧═══════════════╧════════════════╝
要查看更改内容,您可以使用manifest get命令,如以下示例所示(及其输出):
skipper:>manifest get --release-name helloworldlocal --release-version 2
---
# Source: helloworld.yml
apiVersion: skipper.spring.io/v1
kind: SpringCloudDeployerApplication
metadata:
name: helloworld
type: demo
spec:
resource: maven://org.springframework.cloud.samples:spring-cloud-skipper-samples-helloworld:1.0.1.RELEASE
applicationProperties:
server.port: 8100
endpoints.sensitive: false
helloworld.greeting: yo
deploymentProperties:
spring.cloud.deployer.memory: 2048m
spring.cloud.deployer.count: 1
以下示例显示了manifest get命令及其版本 1 的输出:
skipper:>manifest get --release-name helloworldlocal --release-version 1
---
# Source: helloworld.yml
apiVersion: skipper.spring.io/v1
kind: SpringCloudDeployerApplication
metadata:
name: helloworld
type: demo
spec:
resource: maven://org.springframework.cloud.samples:spring-cloud-skipper-samples-helloworld:1.0.0.RELEASE
applicationProperties:
server.port: 8099
deploymentProperties:
(一个manifest diff命令将在未来的版本中推出。
现在我们可以使用rollback命令来部署旧版本的应用程序。
由于我们拥有该版本的清单,因此我们拥有重新部署早期版本所需的一切,如以下示例所示(及其输出):
skipper:>release rollback --release-name helloworldlocal --release-version 1
helloworldlocal has been rolled back. Now at version v3.
历史记录现在显示新的v3版本,即使它在应用程序行为方面与v1版本。 |
这release history命令显示已部署的所有版本,如以下示例所示(及其输出):
skipper:>release history --release-name helloworldlocal
╔═══════╤════════════════════════════╤════════╤════════════╤═══════════════╤════════════════╗
║Version│ Last updated │ Status │Package Name│Package Version│ Description ║
╠═══════╪════════════════════════════╪════════╪════════════╪═══════════════╪════════════════╣
║3 │Fri Oct 27 16:42:47 IST 2017│DEPLOYED│helloworld │1.0.0 │Upgrade complete║
║2 │Fri Oct 27 16:39:03 IST 2017│DELETED │helloworld │1.0.1 │Delete complete ║
║1 │Fri Oct 27 16:37:59 IST 2017│DELETED │helloworld │1.0.0 │Delete complete ║
╚═══════╧════════════════════════════╧════════╧════════════╧═══════════════╧════════════════╝
您现在可以卷曲greetingendpoint 并查看每个端点的输出,如下所示:
$ curl http://localhost:8099/greeting
Hello World!
$ curl http://localhost:8099/about
Hello World v1.0.0.RELEASE
9. 云代工
首先,按照在 Cloud Foundry 上安装一节中的说明将 Skipper Server 部署到 Cloud Foundry。
当您启动 Skipper shell 时,默认情况下,它会尝试在同一台(本地)机器上查找 Skipper 服务器。
要指定在 Cloud Foundry 上运行的 Skipper 服务器,请提供serverUrl启动 shell 时或使用config命令。
以下示例提供了serverUrl:
java -jar spring-cloud-skipper-shell-2.11.5.jar --spring.cloud.skipper.client.serverUri=https://mlp-skipper.cfapps.io/api
以下示例使用config:
skipper:>skipper config --uri https://mlp-skipper.cfapps.io/api
Successfully targeted https://mlp-skipper.cfapps.io/api
这repo list命令显示experimental和local存储库,因为它们是默认配置的。
这local存储库是您可以上传新包的地方。
这experimental存储库有一些“Hello World”应用程序可以帮助您入门。
以下示例显示了repo list命令和我们示例的输出:
skipper:>repo list
╔════════════╤═══════════════════════════════════════════════════════════╤═════╤═════╗
║ Name │ URL │Local│Order║
╠════════════╪═══════════════════════════════════════════════════════════╪═════╪═════╣
║experimental│https://skipper-repository.cfapps.io/repository/experimental│false│0 ║
║local │https://d4d6d1b6-c7e5-4226-69ec-01d4:7577 │true │1 ║
╚════════════╧═══════════════════════════════════════════════════════════╧═════╧═════╝
上面的示例假设experimental存储库已添加到服务器配置中。更多关于
可以使用存储库,请从存储库中找到。 |
以下示例显示了package search命令和我们示例的输出:
skipper:>package search
╔═════════════════╤═══════╤════════════════════════════════════════════════════════════════════════════════╗
║ Name │Version│ Description ║
╠═════════════════╪═══════╪════════════════════════════════════════════════════════════════════════════════╣
║helloworld │1.0.1 │The app has two endpoints, /about and /greeting in Portuguese. Maven resource. ║
║helloworld │1.0.0 │The app has two endpoints, /about and /greeting in English. Maven resource. ║
║helloworld-docker│1.0.1 │The app has two endpoints, /about and /greeting in Portuguese. Docker resource.║
║helloworld-docker│1.0.0 │The app has two endpoints, /about and /greeting in English. Docker resource. ║
╚═════════════════╧═══════╧════════════════════════════════════════════════════════════════════════════════╝
命令platform list显示了配置服务器的平台,如以下示例所示(及其输出):
╔════╤════════════╤═════════════════════════════════════════════════════════════════════════╗
║Name│ Type │ Description ║
╠════╪════════════╪═════════════════════════════════════════════════════════════════════════╣
║pws │cloudfoundry│org = [scdf-ci], space = [space-mark], url = [https://api.run.pivotal.io]║
╚════╧════════════╧═════════════════════════════════════════════════════════════════════════╝
在前面的示例中,只有一个 Cloud Foundry 平台。
现在我们可以安装 Hello World 应用程序(特别是基于 maven 的工件)。
以下示例显示了package install命令(及其输出),我们用来安装Hello World应用:
skipper:>package install --release-name helloworldpcf --package-name helloworld --package-version 1.0.0 --platform-name pws --properties spec.deploymentProperties.spring.cloud.deployer.cloudfoundry.route=helloworldpcf.cfapps.io
Released helloworldpcf. Now at version v1.
这spring.cloud.deployer.cloudfoundry.route=helloworldpcf.cfapps.iodeployment 属性,以便在部署此应用程序的不同版本时,它们具有相同的 HTTP 路由。
因为该 shell 选项的默认值是default`he `--platform-name pws,我们使用了命令选项。
安装 Skipper 时,您可以在名称下注册一个平台default,但最佳做法是指定目标平台名称。
您可以使用release status命令,如以下示例所示(及其输出):
skipper:>release status --release-name helloworldpcf
╔═══════════════╤════════════════════════════════════════════════╗
║Last Deployed │Thu Jan 18 13:18:44 EST 2018 ║
║Status │DEPLOYED ║
║Platform Status│The applications are being deployed. ║
║ │[helloworldpcf-helloworld-v1], State = [partial]║
╚═══════════════╧════════════════════════════════════════════════╝
最终,平台状态显示:All applications have been successfully deployed.
这DEPLOYEDstatus 表示 Skipper 已告知平台进行部署。
Skipper 不跟踪“部署”或“删除”的中间状态。
平台状态提供更细粒度的状态信息。 |
这cf apps命令现在具有此已部署应用程序的新列表,如以下示例所示(及其输出):
$ cf apps
Getting apps in org scdf-ci / space space-mark as [email protected]...
OK
name requested state instances memory disk urls
helloworldpcf-helloworld-v1 started 1/1 1G 1G helloworldpcf.cfapps.io
您现在可以卷曲greetingendpoint 和about端点,如以下示例所示:
$ curl https://helloworldpcf.cfapps.io/greeting
Hello World!
$ curl https://helloworldpcf.cfapps.io/about
Hello World v1.0.0.RELEASE
应用程序的名称基于<release-name>-<package-name>-v<incrementing-counter>公约。
另请注意,我们为此应用程序指定了与应用程序名称不同的路由。
部署属性spring.cloud.deployer.cloudfoundry.route设置为在部署此应用程序的不同版本时不会更改的内容 - 在本例中,helloworldpcf.cfapps.io.
该软件包提供了一种模板化应用程序版本、应用程序属性和部署属性的方法,这些属性用于将应用程序部署到 Cloud Foundry。
这manifest get命令显示传递给 Spring Cloud Deployer 库的最终 YAML 文件,如以下示例所示(及其输出):
skipper:>manifest get --release-name helloworldpcf
---
# Source: helloworld.yml
apiVersion: skipper.spring.io/v1
kind: SpringCloudDeployerApplication
metadata:
name: helloworld
type: demo
spec:
resource: maven://org.springframework.cloud.samples:spring-cloud-skipper-samples-helloworld:1.0.0.RELEASE
applicationProperties:
deploymentProperties:
spring.cloud.deployer.cloudfoundry.route: helloworldpcf.cfapps.io
清单格式的灵感来自 Kubernetes 资源文件格式。 通过查看清单,您可以看到在最终推送到 Cloud Foundry 之前使用了哪些 Maven 工件以及设置了哪些属性。 Skipper 的未来版本将使用元数据值来支持基于这些值搜索版本。
由于为--properties参数,您还可以在安装或升级时指定 YAML 文件的位置。
在下一个示例中,我们使用一个名为helloworld-upgrade.yml,以更新版本。
此应用程序包含一个 Spring Boot@ConfigurationProperty叫helloworld.greeting,因此我们将其与标准 Spring Boot 属性一起设置:endpoints.sensitive=false.
我们还将内存从默认的 2G 提高到 1G。
的内容helloworld-upgrade.yml文件如下:
spec:
applicationProperties:
endpoints.sensitive: false
helloworld.greeting: yo
deploymentProperties:
spring.cloud.deployer.cloudfoundry.route: helloworldpcf.cfapps.io
spring.cloud.deployer.memory: 2048m
现在,您可以运行release upgrade命令,如以下示例所示(及其输出):
skipper:>release upgrade --release-name helloworldpcf --package-name helloworld --package-version 1.0.0 --file /home/mpollack/helloworld-upgrade.yml
helloworldpcf has been upgraded. Now at version v2.
前面的示例启动hello world应用程序的另一个实例,Skipper确定何时可以停止上一个实例的实例。如果未指定--package-version,它会选择最新版本的helloworld包。 您无需指定--platform-name,因为它始终是部署当前应用程序的位置。
以下示例显示了cf apps命令及其输出:
$ cf apps
Getting apps in org scdf-ci / space space-mark as [email protected]...
OK
name requested state instances memory disk urls
helloworldpcf-helloworld-v1 started 1/1 1G 1G helloworldpcf.cfapps.io
helloworldpcf-helloworld-v2 stopped 0/1 2G 1G helloworldpcf.cfapps.io
以下示例显示了cf routes命令及其输出:
$ cf routes
Getting routes for org scdf-ci / space space-mark as [email protected] ...
space host domain port path type apps service
space-mark helloworldpcf cfapps.io helloworldpcf-helloworld-v1,helloworldpcf-helloworld-v2
此时,Skipper 正在检查新应用程序的运行状况。
默认运行状况检查应用程序的 HTTP 端口是否打开。
Skipper 中有一个自定义功能,会影响运行状况检查的执行方式。
这spring.cloud.skipper.server.strategies.healthcheck.timeoutInMillis属性是升级过程等待正常应用的最长时间。
默认值为 5 分钟。
如果 Skipper 在该时间内不正常,则部署失败。
这spring.cloud.skipper.server.strategies.healthcheck.sleepInMillis属性是两次健康检查之间的睡眠时间。
当前的升级策略非常简单:如果新应用程序正常,则删除旧应用程序。 没有滚动升级选项,部署所有新应用,检查运行状况,然后删除以前的版本。 计划在未来的版本中提供更灵活的升级策略。
您现在可以卷曲greetingendpoint 和about端点,如以下示例所示:
$ curl https://helloworldpcf.cfapps.io/greeting
yo
$ curl https://helloworldpcf.cfapps.io/about
Hello World v1.0.0.RELEASE
这release list命令显示当前DEPLOYED和DELETED每个发布名称的发布。
在示例应用程序的以下示例中,只有一个条目,如以下示例所示:
╔═════════════╤═══════╤══════════════════╤════════╤═══════════╤═══════════╤══════════╤════════════════════════════════════════╗
║ Name │Version│ Last updated │ Status │ Package │ Package │ Platform │ Platform Status ║
║ │ │ │ │ Name │ Version │ Name │ ║
╠═════════════╪═══════╪══════════════════╪════════╪═══════════╪═══════════╪══════════╪════════════════════════════════════════╣
║helloworldpcf│2 │Thu Jan 18 │DEPLOYED│helloworld │1.0.0 │pws │[helloworldpcf-helloworld-v2], State = ║
║ │ │13:26:50 EST 2018 │ │ │ │ │[helloworldpcf-helloworld-v2-0=deployed]║
╚═════════════╧═══════╧══════════════════╧════════╧═══════════╧═══════════╧══════════╧════════════════════════════════════════╝
您可以使用release history命令,如以下示例所示(及其输出):
skipper:>release history --release-name helloworldpcf
╔═══════╤════════════════════════════╤════════╤════════════╤═══════════════╤════════════════╗
║Version│ Last updated │ Status │Package Name│Package Version│ Description ║
╠═══════╪════════════════════════════╪════════╪════════════╪═══════════════╪════════════════╣
║2 │Thu Jan 18 13:26:50 EST 2018│DEPLOYED│helloworld │1.0.0 │Upgrade complete║
║1 │Thu Jan 18 13:18:44 EST 2018│DELETED │helloworld │1.0.0 │Delete complete ║
╚═══════╧════════════════════════════╧════════╧════════════╧═══════════════╧════════════════╝
更典型的升级过程不是更改应用程序属性,而是更改应用程序的版本,因为代码已更改。
在下面的示例中,我们现在升级版本以使用新的 Maven 工件 1.0.1 版,该工件也对应于 1.0.1 版的helloworld船长套餐。
在这种情况下,除了路由之外,我们不会添加任何其他属性。
以下示例显示了release upgrade命令(及其更新)来部署版本 1.0.1:
skipper:>release upgrade --release-name helloworldpcf --package-name helloworld --package-version 1.0.1 --properties spec.deploymentProperties.spring.cloud.deployer.cloudfoundry.route=helloworldpcf.cfapps.io
helloworldpcf has been upgraded. Now at version v3.
请注意,当前版本的属性值,例如使用 2G 或问候语是yo不会结转。
未来的版本将引入--reuse-properties命令,该命令将当前版本属性传递到下一个要制作的版本。
您可以使用status命令,如以下示例所示(及其输出):
skipper:>release status --release-name helloworldpcf
╔═══════════════╤════════════════════════════════════════════════╗
║Last Deployed │Thu Jan 18 13:49:42 EST 2018 ║
║Status │UNKNOWN ║
║Platform Status│The applications are being deployed. ║
║ │[helloworldpcf-helloworld-v3], State = [partial]║
╚═══════════════╧════════════════════════════════════════════════╝
现在一个curl命令显示以下输出:
curl https://helloworldpcf.cfapps.io/greeting
Olá Mundo!
$ curl https://helloworldpcf.cfapps.io/about
Hello World v1.0.1.RELEASE
我们的发布历史现在如下:
skipper:>release history --release-name helloworldpcf
╔═══════╤════════════════════════════╤════════╤════════════╤═══════════════╤════════════════╗
║Version│ Last updated │ Status │Package Name│Package Version│ Description ║
╠═══════╪════════════════════════════╪════════╪════════════╪═══════════════╪════════════════╣
║3 │Thu Jan 18 13:49:42 EST 2018│DEPLOYED│helloworld │1.0.1 │Upgrade complete║
║2 │Thu Jan 18 13:26:50 EST 2018│DELETED │helloworld │1.0.0 │Delete complete ║
║1 │Thu Jan 18 13:18:44 EST 2018│DELETED │helloworld │1.0.0 │Delete complete ║
╚═══════╧════════════════════════════╧════════╧════════════╧═══════════════╧════════════════╝
接下来,我们使用rollback命令来部署旧版本的应用程序。
由于我们拥有该版本的清单,因此我们拥有重新部署早期版本所需的一切。
以下示例显示了release rollback命令及其输出:
skipper:>release rollback --release-name helloworldpcf --release-version 2
helloworldpcf has been rolled back. Now at version v4.
历史记录现在显示新的v4版本,即使它在应用程序行为方面与v2版本,如下所示:
skipper:>release history --release-name helloworldpcf
╔═══════╤════════════════════════════╤════════╤════════════╤═══════════════╤════════════════╗
║Version│ Last updated │ Status │Package Name│Package Version│ Description ║
╠═══════╪════════════════════════════╪════════╪════════════╪═══════════════╪════════════════╣
║4 │Thu Jan 18 13:51:43 EST 2018│DEPLOYED│helloworld │1.0.0 │Upgrade complete║
║3 │Thu Jan 18 13:49:42 EST 2018│DELETED │helloworld │1.0.1 │Delete complete ║
║2 │Thu Jan 18 13:26:50 EST 2018│DELETED │helloworld │1.0.0 │Delete complete ║
║1 │Thu Jan 18 13:18:44 EST 2018│DELETED │helloworld │1.0.0 │Delete complete ║
╚═══════╧════════════════════════════╧════════╧════════════╧═══════════════╧════════════════╝
这curlcommands 显示以下输出:
$ curl https://helloworldpcf.cfapps.io/greeting
yo
$ curl https://helloworldpcf.cfapps.io/about
Hello World v1.0.0.RELEASE
10. 库贝内特斯
在这个例子中,我们在本地机器上运行 Skipper 服务器并部署到 minikube,它也在本地机器上运行。
| 1.02 中的升级方法无法正确处理版本之间的 HTTP 流量路由,因此以下表示可能并不完全准确。 |
Spring Cloud Deployer for Kubernetes 为应用程序(或可选的部署)创建服务、复制控制器和 Pod。 对于通过消息传递中间件进行通信的应用来说,这不是问题,将在将来的版本中得到解决。
使用--spring.config.additional-location=skipper.yml选择。YAML 内容如下:
spring:
cloud:
skipper:
server:
platform:
kubernetes:
accounts:
minikube:
namespace: default
这repo list命令显示experimental和local存储库,因为它们默认配置如下:
skipper:>repo list
╔════════════╤═══════════════════════════════════════════════════════════╤═════╤═════╗
║ Name │ URL │Local│Order║
╠════════════╪═══════════════════════════════════════════════════════════╪═════╪═════╣
║experimental│https://skipper-repository.cfapps.io/repository/experimental│false│0 ║
║local │https://d4d6d1b6-c7e5-4226-69ec-01d4:7577 │true │1 ║
╚════════════╧═══════════════════════════════════════════════════════════╧═════╧═════╝
这package search命令显示名称、版本和描述,如下所示:
skipper:>package search
╔═════════════════╤═══════╤════════════════════════════════════════════════════════════════════════════════╗
║ Name │Version│ Description ║
╠═════════════════╪═══════╪════════════════════════════════════════════════════════════════════════════════╣
║helloworld │1.0.1 │The app has two endpoints, /about and /greeting in Portuguese. Maven resource. ║
║helloworld │1.0.0 │The app has two endpoints, /about and /greeting in English. Maven resource. ║
║helloworld-docker│1.0.1 │The app has two endpoints, /about and /greeting in Portuguese. Docker resource.║
║helloworld-docker│1.0.0 │The app has two endpoints, /about and /greeting in English. Docker resource. ║
╚═════════════════╧═══════╧════════════════════════════════════════════════════════════════════════════════╝
这platform list命令显示服务器配置了哪些平台——在本例中,是一个 Kubernetes 命名空间。
skipper:>platform list
╔════════╤══════════╤══════════════════════════════════════════════════════════════════════════════════════╗
║ Name │ Type │ Description ║
╠════════╪══════════╪══════════════════════════════════════════════════════════════════════════════════════╣
║minikube│kubernetes│master url = [https://192.168.99.100:8443/], namespace = [default], api version = [v1]║
╚════════╧══════════╧══════════════════════════════════════════════════════════════════════════════════════╝
现在我们可以安装 Hello World 应用程序(特别是基于 Docker 的工件),如下所示:
skipper:>package install --release-name helloworldk8s --package-name helloworld-docker --package-version 1.0.0 --platform-name minikube --properties spec.deploymentProperties.spring.cloud.deployer.kubernetes.createNodePort=32123
Released helloworldk8s. Now at version v1.
我们使用--platform-name minikubecommand 选项,因为该 shell 选项的默认值是default.
您可以在defaultname 时,但最佳做法是指定目标平台名称。
您可以使用release status命令,如下所示:
skipper:>release status --release-name helloworldk8s
╔═══════════════╤══════════════════════════════════════════════════════════════════════════════════════════════════╗
║Last Deployed │Wed Oct 25 17:34:24 EDT 2017 ║
║Status │DEPLOYED ║
║Platform Status│The applications are being deployed. ║
║ │[helloworldk8s-helloworld-docker-v1], State = [helloworldk8s-helloworld-docker-v1-cch68=deploying]║
╚═══════════════╧══════════════════════════════════════════════════════════════════════════════════════════════════╝
最终,平台状态显示:All applications have been successfully deployed.
请注意,DEPLOYEDstatus 表示 Skipper 已告知平台进行部署。
Skipper 不跟踪中间状态(“部署”或“删除”)。
一个kubectl pods命令现在显示此已部署应用程序的新列表,如下所示:
$ kubectl get pods
NAME READY STATUS RESTARTS AGE
helloworldk8s-helloworld-docker-v1-g8j39 0/1 Running 0 37s
$ kubectl get service
NAME CLUSTER-IP EXTERNAL-IP PORT(S) AGE
helloworldk8s-helloworld-docker-v1 10.0.0.202 <nodes> 8080:32123/TCP 41s
kubernetes 10.0.0.1 <none> 443/TCP 57m
要在 minikube 上获取此应用程序的 URL,请使用minikube service命令,如下所示:
$ minikube service --url helloworldk8s-helloworld-docker-v1
https://192.168.99.100:32123
您现在可以卷曲greetingendpoint 和about端点,如以下示例所示:
$ curl https://192.168.99.100:32123/greeting
Hello World!
$ curl https://192.168.99.100:32123/about
Hello World v1.0.0.RELEASE
应用程序的名称基于以下约定:<release-name>-<package-name>-v<incrementing-counter>.
未来的版本将更改此约定以正确处理路由。
该包提供了一种模板化应用程序版本、应用程序属性和部署属性的方法,这些属性用于将应用程序部署到 Kubernetes。
这manifest get命令显示最终的 YAML 文件,该文件被传递给 Spring Cloud Deployer 库,如以下示例所示(及其输出):
skipper:>manifest get --release-name helloworldk8s
---
# Source: template.yml
apiVersion: skipper.spring.io/v1
kind: SpringCloudDeployerApplication
metadata:
name: helloworld-docker
spec:
resource: docker:springcloud/spring-cloud-skipper-samples-helloworld:1.0.0.RELEASE
applicationProperties:
deploymentProperties:
spring.cloud.deployer.kubernetes.createNodePort: 32123
的格式灵感来自 Kubernetes 资源文件格式。 通过查看清单,您可以看到在最终推送到 Kubernetes 之前使用了哪些 Docker 镜像以及设置了哪些属性。 Skipper 的未来版本将使用元数据值来支持基于这些值搜索版本。
由于为--properties参数,您还可以在安装或升级时指定 YAML 文件的位置。我们在更新版本时使用 YAML 文件。此应用程序包含一个 Spring Boot@ConfigurationProperty叫helloworld.greeting,因此我们将其与标准 Spring Boot 属性一起设置:endpoints.sensitive=false. 我们还将内存从默认的 1G 降低到 768m。以下列表显示了所有设置:
spec:
applicationProperties:
endpoints.sensitive: false
helloworld.greeting: yo
deploymentProperties:
spring.cloud.deployer.kubernetes.createNodePort: 32124
spring.cloud.deployer.memory: 768m
以下示例显示了release upgrade命令及其输出:
skipper:>release upgrade --release-name helloworldk8s --package-name helloworld-docker --package-version 1.0.0 --file /home/mpollack/helloworld-upgrade-k8s.yml
helloworldk8s has been upgraded. Now at version v2.
上述命令启动 hello world 应用程序的另一个实例。
如果您未指定--package-version,它会选择最新版本的helloworld-docker包。 您无需指定--platform-name因为它始终是部署当前应用程序的位置。
以下示例显示了kubectl get all命令及其输出:
$ kubectl get all
NAME READY STATUS RESTARTS AGE
po/helloworldk8s-helloworld-docker-v1-g8j39 1/1 Running 0 2m
po/helloworldk8s-helloworld-docker-v2-jz85l 0/1 Running 0 50s
NAME DESIRED CURRENT READY AGE
rc/helloworldk8s-helloworld-docker-v1 1 1 1 2m
rc/helloworldk8s-helloworld-docker-v2 1 1 0 50s
NAME CLUSTER-IP EXTERNAL-IP PORT(S) AGE
svc/helloworldk8s-helloworld-docker-v1 10.0.0.202 <nodes> 8080:32123/TCP 2m
svc/helloworldk8s-helloworld-docker-v2 10.0.0.154 <nodes> 8080:32124/TCP 51s
svc/kubernetes 10.0.0.1 <none> 443/TCP 59m
此时,Skipper 正在查看启动应用程序的运行状况终结点是否正常。
这spring.cloud.skipper.server.strategies.healthcheck.timeoutInMillis属性设置升级过程等待正常应用的最长时间。
默认值为 5 分钟。
如果 Skipper 在该时间内不正常,则部署失败。
这spring.cloud.skipper.server.strategies.healthcheck.sleepInMillis属性设置运行状况检查之间的睡眠时间。
当前的升级策略很简单:如果新应用程序正常,则删除旧应用程序。 没有滚动升级选项。部署并检查所有新应用的运行状况。然后删除所有以前的版本。 未来的版本将具有更灵活的升级策略,以及引入 Spring Cloud State Machine 项目来编排更新过程。
您现在可以卷曲greetingendpoint 和about端点,如下所示:
$ curl https://192.168.99.100:32124/greeting
yo
$ curl https://192.168.99.100:32124/about
Hello World v1.0.0.RELEASE
这release list命令显示当前DEPLOYED和DELETEDrelease 为每个发布名称。
在以下示例中,只有一个条目:
skipper:>release list
╔═════════════╤═══════╤════════════════════════════╤════════╤═════════════════╤═══════════════╤═════════════╤═══════════════╗
║ Name │Version│ Last updated │ Status │ Package Name │Package Version│Platform Name│Platform Status║
╠═════════════╪═══════╪════════════════════════════╪════════╪═════════════════╪═══════════════╪═════════════╪═══════════════╣
║helloworldk8s│2 │Wed Oct 25 17:36:16 EDT 2017│DEPLOYED│helloworld-docker│1.0.0 │minikube │ ║
╚═════════════╧═══════╧════════════════════════════╧════════╧═════════════════╧═══════════════╧═════════════╧═══════════════╝
您可以使用history命令,如下所示:
skipper:>release history --release-name helloworldk8s ╔═══════╤════════════════════════════╤════════╤═════════════════╤═══════════════╤════════════════╗ ║Version│ Last updated │ Status │ Package Name │Package Version│ Description ║ ╠═══════╪════════════════════════════╪════════╪═════════════════╪═══════════════╪════════════════╣ ║2 │Wed Oct 25 17:36:16 EDT 2017│DEPLOYED│helloworld-docker│1.0.0 │Upgrade complete║ ║1 │Wed Oct 25 17:34:24 EDT 2017│DELETED │helloworld-docker│1.0.0 │Delete complete ║ ╚═══════╧════════════════════════════╧════════╧═════════════════╧═══════════════╧════════════════╝
更典型的升级过程不是更改应用程序属性,而是更改应用程序的版本,因为代码已更改。
我们现在可以升级该版本以使用新的 Docker 工件 1.0.1 版,该工件也对应于 1.0.1 版的helloworld船长套餐。
在下面的示例中,我们不会添加除NodePort:
skipper:>release upgrade --release-name helloworldk8s --package-name helloworld-docker --package-version 1.0.1 --properties spec.deploymentProperties.spring.cloud.deployer.kubernetes.createNodePort=32125
Released helloworldk8s. Now at version v3.
请注意,当前版本的属性值,例如使用 2G RAM 或问候语是yo,不结转。
未来的版本将引入--reuse-propertiescommand 选项,该选项将把当前版本属性传递到要制作的下一个版本。
您可以使用status命令,如以下示例所示(及其输出):
skipper:>release status --release-name helloworldk8s
╔═══════════════╤══════════════════════════════════════════════════════════════════════════════════════════════════╗
║Last Deployed │Wed Oct 25 17:41:33 EDT 2017 ║
║Status │DEPLOYED ║
║Platform Status│All applications have been successfully deployed. ║
║ │[helloworldk8s-helloworld-docker-v3], State = [helloworldk8s-helloworld-docker-v3-sb59j=deployed] ║
╚═══════════════╧══════════════════════════════════════════════════════════════════════════════════════════════════╝
一个curl命令显示以下输出:
$ curl https://192.168.99.100:32125/greeting
Olá Mundo!
$ curl https://192.168.99.100:32125/about
Hello World v1.0.1.RELEASE
以下示例显示了release history命令及其输出:
skipper:>release history --release-name helloworldk8s
╔═══════╤════════════════════════════╤════════╤═════════════════╤═══════════════╤════════════════╗
║Version│ Last updated │ Status │ Package Name │Package Version│ Description ║
╠═══════╪════════════════════════════╪════════╪═════════════════╪═══════════════╪════════════════╣
║3 │Wed Oct 25 17:41:33 EDT 2017│DEPLOYED│helloworld-docker│1.0.1 │Upgrade complete║
║2 │Wed Oct 25 17:36:16 EDT 2017│DELETED │helloworld-docker│1.0.0 │Delete complete ║
║1 │Wed Oct 25 17:34:24 EDT 2017│DELETED │helloworld-docker│1.0.0 │Delete complete ║
╚═══════╧════════════════════════════╧════════╧═════════════════╧═══════════════╧════════════════╝
接下来,我们使用rollback命令来部署旧版本的应用程序。
由于我们拥有该版本的清单,因此我们拥有重新部署早期版本所需的一切。
以下示例显示了 rollback 命令及其输出:
skipper:>release rollback --release-name helloworldk8s --release-version 2
helloworldk8s has been rolled back. Now at version v4.
历史记录现在显示新的v4版本,即使它与v2版本,如以下示例所示:
skipper:>release history --release-name helloworldk8s
╔═══════╤════════════════════════════╤════════╤═════════════════╤═══════════════╤════════════════╗
║Version│ Last updated │ Status │ Package Name │Package Version│ Description ║
╠═══════╪════════════════════════════╪════════╪═════════════════╪═══════════════╪════════════════╣
║4 │Wed Oct 25 17:44:25 EDT 2017│DEPLOYED│helloworld-docker│1.0.0 │Upgrade complete║
║3 │Wed Oct 25 17:41:33 EDT 2017│DELETED │helloworld-docker│1.0.1 │Delete complete ║
║2 │Wed Oct 25 17:36:16 EDT 2017│DELETED │helloworld-docker│1.0.0 │Delete complete ║
║1 │Wed Oct 25 17:34:24 EDT 2017│DELETED │helloworld-docker│1.0.0 │Delete complete ║
╚═══════╧════════════════════════════╧════════╧═════════════════╧═══════════════╧════════════════╝
这curl命令现在显示以下内容:
$ curl https://192.168.99.100:32124/greeting
yo
$ curl https://192.168.99.100:32124/about
Hello World v1.0.0.RELEASE
11. 基于 CF 清单的部署
以下示例涵盖了管理基于 CF 清单的包的方案。
skipper:>platform list
╔═══════╤════════════╤══════════════════════════════════════════════════════════════════════════╗
║ Name │ Type │ Description ║
╠═══════╪════════════╪══════════════════════════════════════════════════════════════════════════╣
║cf-dev │cloudfoundry│org = [scdf-ci], space = [space-ilaya], url = [https://api.run.pivotal.io]║
╚═══════╧════════════╧══════════════════════════════════════════════════════════════════════════╝
上传测试目录下可用的日志应用程序包spring-cloud-skipper-server-core.
skipper:>package upload --repo-name local --path spring-cloud-skipper-server-core/src/test/resources/repositories/binaries/test/log/logcf-1.0.0.zip
Package uploaded successfully:[logcf:1.0.0]
skipper:>package upload --repo-name local --path spring-cloud-skipper-server-core/src/test/resources/repositories/binaries/test/log/logcf-1.0.1.zip
Package uploaded successfully:[logcf:1.0.1]
skipper:>package search
╔═════════════════╤═══════╤════════════════════════════════════════════════════════════════════════════════╗
║ Name │Version│ Description ║
╠═════════════════╪═══════╪════════════════════════════════════════════════════════════════════════════════╣
║helloworld │1.0.0 │The app has two endpoints, /about and /greeting in English. Maven resource. ║
║helloworld │1.0.1 │The app has two endpoints, /about and /greeting in Portuguese. Maven resource. ║
║helloworld-docker│1.0.0 │The app has two endpoints, /about and /greeting in English. Docker resource. ║
║helloworld-docker│1.0.1 │The app has two endpoints, /about and /greeting in Portuguese. Docker resource.║
║logcf │1.0.0 │The log sink uses the application logger to output the data for inspection. ║
║logcf │1.0.1 │The log sink uses the application logger to output the data for inspection. ║
╚═════════════════╧═══════╧════════════════════════════════════════════════════════════════════════════════╝
安装logcf与版本一起打包1.0.0
skipper:>package install logcf --release-name a1 --platform-name cf-dev --package-version 1.0.0
Released a1. Now at version v1.
skipper:>release list
╔════╤═══════╤════════════════════════════╤════════╤════════════╤═══════════════╤═════════════╤═══════════════════════════════════╗
║Name│Version│ Last updated │ Status │Package Name│Package Version│Platform Name│ Platform Status ║
╠════╪═══════╪════════════════════════════╪════════╪════════════╪═══════════════╪═════════════╪═══════════════════════════════════╣
║a1 │1 │Thu Aug 09 12:29:02 IST 2018│DEPLOYED│logcf │1.0.0 │cf-dev │[a1-v1], State = [a1-v1-0=deployed]║
╚════╧═══════╧════════════════════════════╧════════╧════════════╧═══════════════╧═════════════╧═══════════════════════════════════╝
skipper:>release history a1
╔═══════╤════════════════════════════╤════════╤════════════╤═══════════════╤════════════════╗
║Version│ Last updated │ Status │Package Name│Package Version│ Description ║
╠═══════╪════════════════════════════╪════════╪════════════╪═══════════════╪════════════════╣
║1 │Thu Aug 09 12:29:02 IST 2018│DEPLOYED│logcf │1.0.0 │Install complete║
╚═══════╧════════════════════════════╧════════╧════════════╧═══════════════╧════════════════╝
skipper:>manifest get a1
"apiVersion": "skipper.spring.io/v1"
"kind": "CloudFoundryApplication"
"spec":
"resource": "maven://org.springframework.cloud.stream.app:log-sink-rabbit"
"version": "1.3.0.RELEASE"
"manifest":
"memory": "1024"
"disk-quota": "2048"
"instances": "1"
"services":
- "rabbit"
"timeout": "180"
$ cf apps
Getting apps in org scdf-ci / space space-ilaya as [email protected]...
OK
name requested state instances memory disk urls
a1-v1 started 1/1 1G 2G a1-v1.cfapps.io
升级logcf与版本一起打包1.0.1
skipper:>release upgrade --package-name logcf --package-version 1.0.1 --release-name a1
a1 has been upgraded. Now at version v2.
skipper:>release list
╔════╤═══════╤════════════════════════════╤════════╤════════════╤═══════════════╤═════════════╤═══════════════════════════════════╗
║Name│Version│ Last updated │ Status │Package Name│Package Version│Platform Name│ Platform Status ║
╠════╪═══════╪════════════════════════════╪════════╪════════════╪═══════════════╪═════════════╪═══════════════════════════════════╣
║a1 │2 │Thu Aug 09 12:33:44 IST 2018│DEPLOYED│logcf │1.0.1 │cf-dev │[a1-v2], State = [a1-v2-0=deployed]║
╚════╧═══════╧════════════════════════════╧════════╧════════════╧═══════════════╧═════════════╧═══════════════════════════════════╝
skipper:>release history a1
╔═══════╤════════════════════════════╤════════╤════════════╤═══════════════╤════════════════╗
║Version│ Last updated │ Status │Package Name│Package Version│ Description ║
╠═══════╪════════════════════════════╪════════╪════════════╪═══════════════╪════════════════╣
║2 │Thu Aug 09 12:33:44 IST 2018│DEPLOYED│logcf │1.0.1 │Upgrade complete║
║1 │Thu Aug 09 12:29:02 IST 2018│DELETED │logcf │1.0.0 │Delete complete ║
╚═══════╧════════════════════════════╧════════╧════════════╧═══════════════╧════════════════╝
skipper:>manifest get a1
"apiVersion": "skipper.spring.io/v1"
"kind": "CloudFoundryApplication"
"spec":
"resource": "maven://org.springframework.cloud.stream.app:log-sink-rabbit"
"version": "1.3.1.RELEASE"
"manifest":
"memory": "1024"
"disk-quota": "2048"
"instances": "1"
"services":
- "rabbit"
"timeout": "180"
$ cf apps
Getting apps in org scdf-ci / space space-ilaya as [email protected]...
OK
name requested state instances memory disk urls
a1-v2 started 1/1 1G 2G a1-v2.cfapps.io
回滚logcf与版本一起打包1.0.1
skipper:>release rollback a1
a1 has been rolled back. Now at version v3.
skipper:>release list
╔════╤═══════╤════════════════════════════╤════════╤════════════╤═══════════════╤═════════════╤═══════════════╗
║Name│Version│ Last updated │ Status │Package Name│Package Version│Platform Name│Platform Status║
╠════╪═══════╪════════════════════════════╪════════╪════════════╪═══════════════╪═════════════╪═══════════════╣
║a1 │3 │Thu Aug 09 12:39:17 IST 2018│DEPLOYED│logcf │1.0.0 │cf-dev │ ║
╚════╧═══════╧════════════════════════════╧════════╧════════════╧═══════════════╧═════════════╧═══════════════╝
skipper:>release history a1
╔═══════╤════════════════════════════╤════════╤════════════╤═══════════════╤═════════════════╗
║Version│ Last updated │ Status │Package Name│Package Version│ Description ║
╠═══════╪════════════════════════════╪════════╪════════════╪═══════════════╪═════════════════╣
║3 │Thu Aug 09 12:39:17 IST 2018│DEPLOYED│logcf │1.0.0 │Rollback complete║
║2 │Thu Aug 09 12:33:44 IST 2018│DELETED │logcf │1.0.1 │Delete complete ║
║1 │Thu Aug 09 12:29:02 IST 2018│DELETED │logcf │1.0.0 │Delete complete ║
╚═══════╧════════════════════════════╧════════╧════════════╧═══════════════╧═════════════════╝
skipper:>manifest get a1
"apiVersion": "skipper.spring.io/v1"
"kind": "CloudFoundryApplication"
"spec":
"resource": "maven://org.springframework.cloud.stream.app:log-sink-rabbit"
"version": "1.3.0.RELEASE"
"manifest":
"memory": "1024"
"disk-quota": "2048"
"instances": "1"
"services":
- "rabbit"
"timeout": "180"
$ cf apps
Getting apps in org scdf-ci / space space-ilaya as [email protected]...
OK
name requested state instances memory disk urls
a1-v3 started 1/1 1G 2G a1-v3.cfapps.io
升级logcf打包成最新的1.0.1version 并将清单的内存更新为2G.
skipper:>release upgrade --package-name logcf --release-name a1 --properties "spec.manifest.memory=2G"
a1 has been upgraded. Now at version v4.
skipper:>release list
╔════╤═══════╤════════════════════════════╤════════╤════════════╤═══════════════╤═════════════╤═══════════════════════════════════╗
║Name│Version│ Last updated │ Status │Package Name│Package Version│Platform Name│ Platform Status ║
╠════╪═══════╪════════════════════════════╪════════╪════════════╪═══════════════╪═════════════╪═══════════════════════════════════╣
║a1 │4 │Thu Aug 09 12:49:49 IST 2018│DEPLOYED│logcf │1.0.1 │cf-dev │[a1-v4], State = [a1-v4-0=deployed]║
╚════╧═══════╧════════════════════════════╧════════╧════════════╧═══════════════╧═════════════╧═══════════════════════════════════╝
skipper:>release history a1
╔═══════╤════════════════════════════╤════════╤════════════╤═══════════════╤════════════════╗
║Version│ Last updated │ Status │Package Name│Package Version│ Description ║
╠═══════╪════════════════════════════╪════════╪════════════╪═══════════════╪════════════════╣
║4 │Thu Aug 09 12:49:49 IST 2018│DEPLOYED│logcf │1.0.1 │Upgrade complete║
║3 │Thu Aug 09 12:39:17 IST 2018│DELETED │logcf │1.0.0 │Delete complete ║
║2 │Thu Aug 09 12:33:44 IST 2018│DELETED │logcf │1.0.1 │Delete complete ║
║1 │Thu Aug 09 12:29:02 IST 2018│DELETED │logcf │1.0.0 │Delete complete ║
╚═══════╧════════════════════════════╧════════╧════════════╧═══════════════╧════════════════╝
skipper:>manifest get a1
"apiVersion": "skipper.spring.io/v1"
"kind": "CloudFoundryApplication"
"spec":
"resource": "maven://org.springframework.cloud.stream.app:log-sink-rabbit"
"version": "1.3.1.RELEASE"
"manifest":
"memory": "2G"
"disk-quota": "2048"
"instances": "1"
"services":
- "rabbit"
"timeout": "180"
$ cf apps
Getting apps in org scdf-ci / space space-ilaya as [email protected]...
OK
name requested state instances memory disk urls
a1-v4 started 1/1 2G 2G a1-v4.cfapps.io
删除发布
skipper:>release delete a1
a1 has been deleted.
以下示例显示了 Skipper 如何帮助管理可以使用清单部署到 CF 中的任何应用程序 在这种情况下,我们有几个 python 包来打印问候语。
从spring-cloud-skipper-server-coretest 目录
skipper:>package upload --path spring-cloud-skipper-server-core/src/test/resources/repositories/binaries/test/python/python-printer-1.0.0.zip
Package uploaded successfully:[python-printer:1.0.0]
skipper:>package upload --path spring-cloud-skipper-server-core/src/test/resources/repositories/binaries/test/python/python-printer-1.0.1.zip
Package uploaded successfully:[python-printer:1.0.1]
安装 python 包
skipper:>package install --package-name python-printer --package-version 1.0.0 --release-name printer --platform-name cf-dev
Released printer. Now at version v1.
skipper:>manifest get printer
"apiVersion": "skipper.spring.io/v1"
"kind": "CloudFoundryApplication"
"spec":
"resource": "https://github.com/ilayaperumalg/sandbox/raw/master/python/1.0.0/hello.py-1.0.0.zip"
"version": "1.0.0"
"manifest":
"memory": "1024"
"disk-quota": "1024"
"instances": "1"
"health-check-type": "process"
"buildpack": "python_buildpack"
"timeout": "180"
"command": "python hello.py"
$ cf apps
Getting apps in org scdf-ci / space space-ilaya as [email protected]...
OK
name requested state instances memory disk urls
printer-v1 started 1/1 1G 1G printer-v1.cfapps.io
$ cf logs printer-v1
Retrieving logs for app printer-v1 in org scdf-ci / space space-ilaya as [email protected]...
2018-08-09T13:33:36.55+0530 [APP/PROC/WEB/0] OUT Hello!
2018-08-09T13:33:41.55+0530 [APP/PROC/WEB/0] OUT Hello!
使用1.0.1
skipper:>release upgrade printer --package-name python-printer --package-version 1.0.1
printer has been upgraded. Now at version v2.
skipper:>manifest get printer
"apiVersion": "skipper.spring.io/v1"
"kind": "CloudFoundryApplication"
"spec":
"resource": "https://github.com/ilayaperumalg/sandbox/raw/master/python/1.0.1/hello.py-1.0.1.zip"
"version": "1.0.1"
"manifest":
"memory": "1024"
"disk-quota": "1024"
"instances": "1"
"health-check-type": "process"
"buildpack": "python_buildpack"
"timeout": "180"
"command": "python vanakkam.py"
$ cf apps
Getting apps in org scdf-ci / space space-ilaya as [email protected]...
OK
name requested state instances memory disk urls
printer-v2 started 1/1 1G 1G printer-v2.cfapps.io
$ cf logs printer-v2
Retrieving logs for app printer-v2 in org scdf-ci / space space-ilaya as [email protected]...
2018-08-09T13:36:13.39+0530 [APP/PROC/WEB/0] OUT Vanakkam!
2018-08-09T13:36:18.40+0530 [APP/PROC/WEB/0] OUT Vanakkam!