三分钟游览
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.
您现在可以卷曲greeting
endpoint,如以下示例所示(及其输出):
$ 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 的未来版本中提供更灵活的升级策略。
您现在可以卷曲greeting
endpoint 和about
endpoint,如以下示例所示(及其输出):
$ 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 ║
╚═══════╧════════════════════════════╧════════╧════════════╧═══════════════╧════════════════╝
您现在可以卷曲greeting
endpoint 并查看每个端点的输出,如下所示:
$ 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.io
deployment 属性,以便在部署此应用程序的不同版本时,它们具有相同的 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.
这DEPLOYED status 表示 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
您现在可以卷曲greeting
endpoint 和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
属性是两次健康检查之间的睡眠时间。
当前的升级策略非常简单:如果新应用程序正常,则删除旧应用程序。 没有滚动升级选项,部署所有新应用,检查运行状况,然后删除以前的版本。 计划在未来的版本中提供更灵活的升级策略。
您现在可以卷曲greeting
endpoint 和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 ║
╚═══════╧════════════════════════════╧════════╧════════════╧═══════════════╧════════════════╝
这curl
commands 显示以下输出:
$ 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 minikube
command 选项,因为该 shell 选项的默认值是default
.
您可以在default
name 时,但最佳做法是指定目标平台名称。
您可以使用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.
请注意,DEPLOYED
status 表示 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
您现在可以卷曲greeting
endpoint 和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 项目来编排更新过程。
您现在可以卷曲greeting
endpoint 和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
和DELETED
release 为每个发布名称。
在以下示例中,只有一个条目:
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-properties
command 选项,该选项将把当前版本属性传递到要制作的下一个版本。
您可以使用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.1
version 并将清单的内存更新为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-core
test 目录
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!