安装
16. 在本地平台上安装
16.1. 本地平台配置
以下示例 YAML 文件配置了两个名为localDev
和localDevDebug
:
spring:
cloud:
skipper:
server:
platform:
local:
accounts:
localDev:
shutdownTimeout: 60
javaOpts: "-Dtest=foo"
localDevDebug:
javaOpts: "-Xdebug"
账户名称后面的键值对是javaCmd
,workingDirectoriesRoot
,deleteFilesOnExit
,envVarsToInherit
,shutdownTimeout
,javaOpts
和useSpringApplicationJson
.
有关更多信息,请参阅 LocalDeployerProperties 的 JavaDocs。
17. 在 Cloud Foundry 上安装
本部分包含一个示例 YAML 文件,该文件配置两个名为cf-dev
和cf-qa
.
如果您使用 Spring Cloud Config Server 来管理 Skipper 的配置属性,这在 Cloud Foundry 上很有用。
17.1. Cloud Foundry 配置
您可以修改以下示例 YML 代码段以满足您的需要:
spring:
cloud:
skipper:
server:
platform:
cloudfoundry:
accounts:
cf-dev:
connection:
url: https://api.run.pivotal.io
org: myOrg
space: mySpace
domain: cfapps.io
username: [email protected]
password: drowssap
skipSslValidation: false
deployment:
memory: 2048m
disk: 2048m
services: rabbit
deleteRoutes: false
cf-qa:
connection:
url: https://api.run.pivotal.io
org: myOrgQA
space: mySpaceQA
domain: cfapps.io
username: [email protected]
password: drowssap
skipSslValidation: true
deployment:
memory: 1024m
disk: 1024m
services: rabbitQA
deleteRoutes: false
这deleteRoutes deployment 设置为false 因此,应用程序的 “v2” 与 “v1” 具有相同的路由。
否则,取消部署 “v1” 将删除路由。 |
您还可以在本地运行 Skipper 服务器并部署到 Cloud Foundry。
在这种情况下,在skipper.yml
文件并使用--spring.config.additional-location=skipper.yml
选择。
如果您使用cf push
要部署 Skipper,则更适合使用 Cloud Foundry 清单。
您可以修改以下示例manifest.yml以满足您的需要:
applications:
- name: mlp-skipper
host: mlp-skipper
memory: 1G
disk_quota: 1G
timeout: 180
instances: 1
buildpack: java_buildpack
path: spring-cloud-skipper-server.jar
env:
SPRING_APPLICATION_NAME: mlp-skipper
JBP_CONFIG_SPRING_AUTO_RECONFIGURATION: '{enabled: false}'
SPRING_CLOUD_SKIPPER_SERVER_PLATFORM_CLOUDFOUNDRY_ACCOUNTS[pws]_CONNECTION_URL: https://api.run.pivotal.io
SPRING_CLOUD_SKIPPER_SERVER_PLATFORM_CLOUDFOUNDRY_ACCOUNTS[pws]_CONNECTION_ORG: myOrgQA
SPRING_CLOUD_SKIPPER_SERVER_PLATFORM_CLOUDFOUNDRY_ACCOUNTS[pws]_CONNECTION_SPACE: mySpaceQA
SPRING_CLOUD_SKIPPER_SERVER_PLATFORM_CLOUDFOUNDRY_ACCOUNTS[pws]_CONNECTION_DOMAIN: cfapps.io
SPRING_CLOUD_SKIPPER_SERVER_PLATFORM_CLOUDFOUNDRY_ACCOUNTS[pws]_CONNECTION_USERNAME: [email protected]
SPRING_CLOUD_SKIPPER_SERVER_PLATFORM_CLOUDFOUNDRY_ACCOUNTS[pws]_CONNECTION_PASSWORD: drowssap
SPRING_CLOUD_SKIPPER_SERVER_PLATFORM_CLOUDFOUNDRY_ACCOUNTS[pws]_CONNECTION_SKIPSSLVALIDATION: false
SPRING_CLOUD_SKIPPER_SERVER_PLATFORM_CLOUDFOUNDRY_ACCOUNTS[pws]_DEPLOYMENT_DELETEROUTES: false
SPRING_CLOUD_SKIPPER_SERVER_PLATFORM_CLOUDFOUNDRY_ACCOUNTS[pws]_DEPLOYMENT_SERVICES: rabbitmq
services:
- mysqlboost
在前面的清单中,我们将应用程序绑定到mysqlboost 服务。
如果未指定服务,则服务器将使用嵌入式数据库。 |
从 Skipper 2.0 开始,您必须禁用 Spring 自动重新配置并将配置文件设置为cloud . |
您必须设置SPRING_CLOUD_SKIPPER_SERVER_PLATFORM_CLOUDFOUNDRY_ACCOUNTS[pws]_DEPLOYMENT_DELETEROUTES: false 因此,应用程序的 “v2” 与 “v1” 具有相同的路由。
否则,取消部署 “v1” 将删除路由。 |
您必须设置SPRING_CLOUD_SKIPPER_SERVER_PLATFORM_CLOUDFOUNDRY_ACCOUNTS[pws]_DEPLOYMENT_SERVICES 将指定服务绑定到每个已部署应用程序的属性。 |
您可以在 CloudFoundryDeploymentProperties 中找到有关可配置的部署属性的信息。
在本地计算机上启动 Skipper shell 时,它会尝试连接到默认位置的 Serverlocalhost:7577/api
.
使用 shell 的--spring.cloud.skipper.client.serverUri
Command line 选项指定服务器的位置。
您也可以使用config
交互式 shell 命令设置服务器位置,如下所示:
server-unknown:>skipper config --uri https://mlp-skipper.cfapps.io/api
Successfully targeted https://mlp-skipper.cfapps.io/api
skipper:>
17.2. 数据库连接池
从 Skipper 2.0 开始,Spring Cloud 连接器库不再用于创建 DataSource。 现在使用库 java-cfenv,它允许您设置 Spring Boot 属性以配置连接池。
17.3. 最大磁盘配额
默认情况下,Cloud Foundry 中的每个应用程序都以 1G 磁盘配额开始,这可以调整为默认的最大值 2G 的。通过使用 Pivotal Cloud Foundry (PCF) Ops Manager GUI,默认最大值也可以覆盖高达 10G。
此配置与 Spring Cloud Skipper 相关,因为每个部署都由应用程序组成 (通常是 Spring Boot uber-jar 的),并且这些应用程序是从远程 maven 存储库解析的。解决后, 应用程序构件将下载到本地 Maven 存储库以进行缓存和重用。在后台发生此事后, 默认磁盘配额 (1G) 可能会迅速填满,尤其是当我们试验 由独特的应用程序组成。为了克服这个磁盘限制并依赖于 根据您的扩展要求,您可能希望将默认最大值从 2G 更改为 10G。让我们回顾一下 更改默认最大磁盘配额分配的步骤。
在 PCF 的 Ops Manager 中,选择“Pivotal Elastic Runtime”磁贴,然后导航到“Application Developer Controls”选项卡。 将“每个应用程序的最大磁盘配额 (MB)”设置从 2048 (2G) 更改为 10240 (10G)。保存磁盘配额更新,然后单击 “Apply Changes” 完成配置覆盖。
17.4. 管理磁盘使用
即使将 Skipper 配置为使用 10G 空间,也有可能耗尽本地磁盘上的可用空间。
为了防止这种情况,jar
从外部来源下载的工件,即注册为http
或maven
资源,无论部署请求是否成功,只要部署应用程序就会自动删除。
此行为最适合容器运行时稳定性比部署期间产生的 I/O 延迟更关键的生产环境。
在开发环境中,部署会更频繁地进行。此外,jar
artifact(或打火机metadata
jar) 包含描述应用程序配置属性的元数据
它由与应用程序配置相关的各种作使用,在预生产活动期间更频繁地执行。
为了在预生产环境中提供更多的磁盘使用量,从而提供更灵敏的交互式开发人员体验,您可以设置 CloudFoundry deployer 属性autoDeleteMavenArtifacts
自false
.
如果使用默认的port
health check 类型,则必须显式监控服务器上的磁盘空间,以避免空间不足。
如果使用http
Health Check 类型(请参阅下一个示例),如果磁盘空间不足,则重新启动服务器。
这是由于 Spring Boot 的磁盘空间健康指示器。
您可以使用具有management.health.diskspace
前缀。
对于版本 1.7,我们正在调查服务器使用卷服务来存储.jar
artifacts,然后再将它们推送到 Cloud Foundry。
以下示例显示了如何部署http
Health Check 类型添加到名为/management/health
:
---
...
health-check-type: http
health-check-http-endpoint: /management/health
18. 在 Kubernetes 上安装
一个名为springcloud/spring-cloud-skipper-server
可用于 dockerhub 中的 Skipper 服务器。
您可以使用此映像在 Kubernetes 中运行 Skipper 服务器。
18.1. Kubernetes 配置
以下示例 YAML 文件配置了两个名为k8s-dev
和k8sqa
在 Kubernetes 集群上。
spring:
cloud:
skipper:
server:
platform:
kubernetes:
accounts:
k8s-dev:
namespace: devNamespace
cpu: 4
k8s-qa:
namespace: qaNamespace
memory: 1024m
这些账户对应于不同的命名空间。 我们正在研究如何支持连接到不同的 Kubernetes 集群。
您可以在 KubernetesDeployerProperties 中找到有关可配置的部署属性的更多信息
19. 数据库配置
关系数据库用于存储流定义和部署信息。 Spring Cloud Skipper 提供适用于 MariaDB、MySQL、Oracle、PostgreSQL、Db2、SQL Server 和 H2 的架构。架构是在服务器启动时自动创建的。
无需额外配置即可使用适用于 MariaDB、MySQL(通过 MariaDB 驱动程序)、PostgreSQL、SQL Server 的 JDBC 驱动程序。要使用任何其他数据库,您需要将相应的 JDBC 驱动程序 jar 放在服务器的 Classpath 上,如此处所述。 |
要配置数据库,必须设置以下属性:
-
spring.datasource.url
-
spring.datasource.username
-
spring.datasource.password
-
spring.datasource.driver-class-name
这username
和password
无论数据库如何,都是相同的。但是,url
和driver-class-name
每个数据库的不同情况如下。
数据库 | spring.datasource.url | spring.datasource.driver-class-name | 包括驱动程序 |
---|---|---|---|
MariaDB 10.4+ |
jdbc:mariadb://${db-hostname}:${db-port}/${db-name} |
org.mariadb.jdbc.驱动程序 |
是的 |
MySQL 5.7 版本 |
jdbc:mysql://${db-hostname}:${db-port}/${db-name}?permitMysqlScheme |
org.mariadb.jdbc.驱动程序 |
是的 |
MySQL 8.0+ 版本 |
jdbc:mariadb://${db-hostname}:${db-port}/${db-name}?allowPublicKeyRetrieval=true&useSSL=false&autoReconnect=true&permitMysqlScheme[1] |
org.mariadb.jdbc.驱动程序 |
是的 |
PostgresSQL |
jdbc:postgres://${db-hostname}:${db-port}/${db-name} |
org.postgresql.驱动程序 |
是的 |
SQL 服务器 |
jdbc:sqlserver://${db-hostname}:${db-port};数据库名称=${数据库名称}&encrypt=false |
com.microsoft.sqlserver.jdbc.SQLServerDriver |
是的 |
DB2 |
jdbc:db2://${db-hostname}:${db-port}/{db-name} |
com.ibm.db2.jcc.DB2Driver |
不 |
神谕 |
jdbc:oracle:thin:@${db-hostname}:${db-port}/{db-name} |
oracle.jdbc.Oracle驱动程序 |
不 |
19.1. H2
如果未配置其他数据库并且 H2 驱动程序已添加到服务器 Classpath 中,则 Spring Cloud Skipper 使用 H2 数据库的嵌入式实例作为默认值。
H2 适用于开发目的,但不建议用于生产,也不支持作为外部模式。 |
要使用 H2,请添加com.h2database:h2:2.1.214
JDBC 驱动程序添加到 Classpath 中,并且不要配置任何其他数据库。
19.2. 添加自定义 JDBC 驱动程序
要为数据库添加自定义驱动程序(例如 Oracle),您应该重建 Skipper Server 并将依赖项添加到 Mavenpom.xml
文件。
您需要修改 mavenpom.xml
之spring-cloud-skipper
模块。
GitHub 存储库中有 GA 发布标签,因此您可以切换到所需的 GA 标签,以在生产就绪代码库中添加驱动程序。
要为 Spring Cloud Skipper 服务器添加自定义 JDBC 驱动程序依赖项,请执行以下作:
-
选择与要重建的服务器版本相对应的标记,并克隆 github 存储库。
-
编辑spring-cloud-skipper-server/pom.xml,然后在
dependencies
部分中,添加所需数据库驱动程序的依赖项。在以下示例中,已选择 Oracle 驱动程序:
<dependencies>
...
<dependency>
<groupId>com.oracle.jdbc</groupId>
<artifactId>ojdbc8</artifactId>
<version>12.2.0.1</version>
</dependency>
...
</dependencies>
-
按照构建 Spring Cloud Skipper = 安全性中所述构建应用程序
默认情况下,Spring Cloud Skipper 服务器是不安全的,并在未加密的 HTTP 连接上运行。 您可以通过启用 HTTPS 并要求客户端使用 OAuth 2.0 进行身份验证来保护您的 REST 终端节点
默认情况下,REST 终端节点(管理、管理和运行状况)不需要经过身份验证的访问。 |
20. 启用 HTTPS
默认情况下,REST 终端节点使用纯 HTTP 作为传输。
您可以通过向配置添加证书来切换到 HTTPS,如下所示skipper.yml
例:
server:
port: 8443 (1)
ssl:
key-alias: yourKeyAlias (2)
key-store: path/to/keystore (3)
key-store-password: yourKeyStorePassword (4)
key-password: yourKeyPassword (5)
trust-store: path/to/trust-store (6)
trust-store-password: yourTrustStorePassword (7)
1 | 由于默认端口为7577 ,您可以选择将端口更改为更常见的 HTTPS 典型端口。 |
2 | 密钥存储在密钥库中的别名(或名称)。 |
3 | 密钥库文件的路径。也可以使用 Classpath 前缀指定 Classpath 资源:classpath:path/to/keystore |
4 | 密钥库的密码。 |
5 | 密钥的密码。 |
6 | 信任库文件的路径。也可以使用 Classpath 前缀指定 Classpath 资源:classpath:path/to/trust-store |
7 | 信任存储的密码。 |
您可以使用以下参数引用 YAML 文件:--spring.config.additional-location=skipper.yml
|
如果启用了 HTTPS,它将完全取代 HTTP 作为 REST 端点交互的协议。 然后,普通 HTTP 请求将失败。因此,您必须确保相应地配置 Skipper shell。 |
20.1. 使用自签名证书
出于测试目的或在开发过程中,创建自签名证书可能很方便。 要开始使用,请运行以下命令以创建证书:
$ keytool -genkey -alias skipper -keyalg RSA -keystore skipper.keystore \
-validity 3650 -storetype JKS \
-dname "CN=localhost, OU=Spring, O=Pivotal, L=Holualoa, ST=HI, C=US" (1)
-keypass skipper -storepass skipper
1 | CN 是这里唯一重要的参数。它应该与您尝试访问的域匹配,例如localhost . |
然后将以下内容添加到您的skipper.yml
文件:
server:
port: 8443
ssl:
enabled: true
key-alias: skipper
key-store: "/your/path/to/skipper.keystore"
key-store-type: jks
key-store-password: skipper
key-password: skipper
这就是 Skipper Server 所需的全部内容。 启动服务器后,您应该能够在 https://localhost:8443/ 访问它。 由于这是自签名证书,因此您应该在浏览器中点击警告。你需要忽略这一点。
20.2. 自签名证书和 Shell
默认情况下,自签名证书是 shell 的一个问题。 要使 shell 使用自签名证书,还需要执行其他步骤。 有两个选项可用:
20.2.1. 将自签名证书添加到 JVM Truststore 中
为了使用 JVM truststore 选项,我们需要 从密钥库中导出之前创建的证书:
$ keytool -export -alias skipper -keystore skipper.keystore -file skipper_cert -storepass skipper
接下来,我们需要创建一个 Shell 使用的信任库:
$ keytool -importcert -keystore skipper.truststore -alias skipper -storepass skipper -file skipper_cert -noprompt
现在,您可以使用以下 JVM 参数启动 Skipper shell:
$ java -Djavax.net.ssl.trustStorePassword=skipper \
-Djavax.net.ssl.trustStore=/path/to/skipper.truststore \
-Djavax.net.ssl.trustStoreType=jks \
-jar spring-cloud-skipper-shell-2.11.5.jar
如果您在通过 SSL 建立连接时遇到问题,可以通过设置javax.net.debug JVM 参数设置为ssl . |
请记住使用类似于以下内容的 config 命令来定位 Skipper 服务器:
skipper:>skipper config --uri https://localhost:8443/api
21. OAuth 2.0 安全性
OAuth 2.0 允许您将 Spring Cloud Skipper 集成到单点登录 (SSO) 环境中。 您可以使用以下 OAuth2 授权类型:
-
密码:由 shell(和 REST 集成)使用,因此您可以使用用户名和密码登录
-
客户端凭证:直接从您的 OAuth 提供程序检索访问令牌,并将其传递给
Authorization
HTTP 标头。
可以通过两种方式访问 REST 端点:
-
基本身份验证:使用密码授权类型对 OAuth2 服务进行身份验证。
-
Access Token:使用 Client Credentials 授权类型
在设置身份验证时,我们强烈建议您同时启用 HTTPS,尤其是在生产环境中。 |
您可以通过设置环境变量或将以下块添加到skipper.yml
:
security:
oauth2:
client:
client-id: myclient (1)
client-secret: mysecret
access-token-uri: http://127.0.0.1:9999/oauth/token
user-authorization-uri: http://127.0.0.1:9999/oauth/authorize
resource:
user-info-uri: http://127.0.0.1:9999/me
spring:
security:
oauth2: (1)
client:
registration:
uaa: (2)
client-id: myclient
client-secret: mysecret
redirect-uri: '{baseUrl}/login/oauth2/code/{registrationId}'
authorization-grant-type: authorization_code
scope:
- openid (3)
provider:
uaa:
jwk-set-uri: http://uaa.local:8080/uaa/token_keys
token-uri: http://uaa.local:8080/uaa/oauth/token
user-info-uri: http://uaa.local:8080/uaa/userinfo (4)
user-name-attribute: user_name (5)
authorization-uri: http://uaa.local:8080/uaa/oauth/authorize
resourceserver:
opaquetoken:
introspection-uri: http://uaa.local:8080/uaa/introspect (6)
client-id: dataflow
client-secret: dataflow
cloud:
skipper:
security:
authorization:
provider-role-mappings: (7)
uaa:
map-oauth-scopes: true
role-mappings:
ROLE_VIEW: skipper.view
ROLE_CREATE: skipper.create
ROLE_MANAGE: skipper.manage
1 | 提供此属性会激活 OAuth2 安全性 |
2 | 提供程序 ID。可以指定多个提供商 |
3 | 由于 UAA 是 OpenID 提供程序,因此您至少必须指定openid 范围。
如果您的提供程序还提供了其他范围来控制角色分配,则
您还必须在此处指定这些范围 |
4 | OpenID 终端节点。用于检索用户名等用户信息。命令的。 |
5 | 包含用户名的响应的 JSON 属性 |
6 | 用于内省和验证直接传入的令牌。命令的。 |
7 | 用于授权的角色映射。
您可以使用curl 如下: |
`curl -u myusername:mypassword http://localhost:7577/`
因此,您应该会看到可用 REST 终端节点的列表。
除了基本身份验证之外,您还可以提供访问令牌来访问 REST API。
为此,请从 OAuth2 提供商处检索 OAuth2 访问令牌,然后使用Authorization
HTTP 标头,如下所示:
curl -H "Authorization: Bearer <ACCESS_TOKEN>" http://localhost:7577/
21.1. OAuth REST 端点授权
Spring Cloud Skipper 支持以下角色:
-
VIEW:用于与检索 state 相关的任何内容。
-
CREATE:用于涉及创建、删除或更改系统状态的任何内容。
-
MANAGE:用于启动管理终端节点。
有关哪些 REST 端点需要哪些角色的规则在application.yml
的spring-cloud-skipper-server-core
模块。
尽管如此,如果需要,您可以覆盖这些 ID。
配置采用 YAML 列表的形式(因为某些规则可能优先于其他规则)。
因此,您需要复制/粘贴整个列表并根据您的需要进行定制(因为无法合并列表)。
始终引用您的application.yml
,因为下面复制的代码段可能已过时。
默认规则如下:
# About
- GET /api/about => hasRole('ROLE_VIEW')
# AppDeployerDatas
- GET /api/appDeployerDatas => hasRole('ROLE_VIEW')
# Deployers
- GET /api/deployers => hasRole('ROLE_VIEW')
## Releases
- GET /api/releases => hasRole('ROLE_VIEW')
# Status
- GET /api/release/status/** => hasRole('ROLE_VIEW')
# Manifest
- GET /api/release/manifest/** => hasRole('ROLE_VIEW')
# Upgrade
- POST /api/release/upgrade => hasRole('ROLE_CREATE')
# Rollback
- POST /api/release/rollback/** => hasRole('ROLE_CREATE')
# Delete
- DELETE /api/release/** => hasRole('ROLE_CREATE')
# History
- GET /api/release/history/** => hasRole('ROLE_VIEW')
# List
- GET /api/release/list => hasRole('ROLE_VIEW')
- GET /api/release/list/** => hasRole('ROLE_VIEW')
# Packages
- GET /api/packages => hasRole('ROLE_VIEW')
# Upload
- POST /api/package/upload => hasRole('ROLE_CREATE')
# Install
- POST /api/package/install => hasRole('ROLE_CREATE')
- POST /api/package/install/** => hasRole('ROLE_CREATE')
# Delete
- DELETE /api/package/** => hasRole('ROLE_CREATE')
# PackageMetaData
- GET /api/packageMetadata => hasRole('ROLE_VIEW')
- GET /api/packageMetadata/** => hasRole('ROLE_VIEW')
# Repositories
- GET /api/repositories => hasRole('ROLE_VIEW')
- GET /api/repositories/** => hasRole('ROLE_VIEW')
# Boot Endpoints
- GET /actuator/** => hasRole('ROLE_MANAGE')
每行的格式如下:
HTTP_METHOD URL_PATTERN '⇒' SECURITY_ATTRIBUTE
哪里
-
HTTP_METHOD 是一种 HTTP 方法,大写。
-
URL_PATTERN 是一种 Ant 样式的 URL 模式。
-
SECURITY_ATTRIBUTE 是 SPEL 表达式(请参见 docs.spring.io/spring-security/site/docs/current/reference/htmlsingle/#el-access)
-
其中每个部分都由一个或多个空格字符(空格、制表符等)分隔。
请注意,上面确实是一个 YAML 列表,而不是位于spring.cloud.skipper.security.authorization.rules
钥匙。
21.2. 使用 Spring Cloud Skipper shell 进行 OAuth 身份验证
如果您的 OAuth2 提供商支持密码授予类型,则可以启动 使用以下命令的 Skipper shell:
$ java -jar spring-cloud-skipper-shell-2.11.5.jar \
--spring.cloud.skipper.client.serverUrl=http://localhost:7577 \
--spring.cloud.skipper.client.username=my_username \
--spring.cloud.skipper.client.password=my_password
启用 Spring Cloud Skipper 的身份验证后,如果您想使用地狱,底层 OAuth2 提供程序必须支持密码 OAuth2 授权类型。 |
在 Skipper shell 中,您还可以使用以下命令提供凭据:
skipper:> skipper config --uri https://localhost:7577/api --username my_username --password my_password
成功定位后,您应该会看到以下输出:
Successfully targeted http://localhost:7577/api
skipper:>
21.3. OAuth2 身份验证示例
本节提供了 Skipper 的一些常见安全安排示例:
21.3.1. 本地 OAuth2 服务器
借助 Spring Security OAuth,您可以 可以使用以下注释创建自己的 OAuth2 服务器:
-
@EnableResourceServer
-
@EnableAuthorizationServer
您可以在 https://github.com/ghillert/oauth-test-server/ 中找到一个工作示例应用程序。
为此,请克隆项目、构建项目并启动项目。 然后使用相应的 Client ID 和 Client Secret 配置 Spring Cloud Skipper。
此选项仅用于开发或演示目的。 |
21.3.2. 使用 UAA 进行身份验证
如果您需要设置生产就绪的 OAuth 提供程序,则可能需要考虑 使用 CloudFoundry 用户帐户和身份验证 (UAA) 服务器。虽然它被 Cloud Foundry 中,它也可以单独使用。有关更多信息,请参阅 github.com/cloudfoundry/uaa。