1 - 部署应用程序

了解如何将应用程序部署到 Drycc。

[应用程序][] 使用 git pushdrycc 客户端部署到 Drycc。

支持的应用程序

Drycc Workflow 可以部署任何可以在容器中运行的应用程序或服务。为了能够水平扩展,应用程序必须遵循 Twelve-Factor App 方法,并将任何应用程序状态存储在外部后端服务中。

例如,如果您的应用程序将状态持久化到本地文件系统(这在内容管理系统如 WordPress 和 Drupal 中很常见),则无法使用 drycc scale 进行水平扩展。

幸运的是,大多数现代应用程序具有无状态的应用程序层,可以在 Drycc 中水平扩展。

登录到控制器

在部署应用程序之前,用户必须首先使用 Drycc 管理员提供的 URL 对 Drycc [控制器][] 进行身份验证。

$ drycc login http://drycc.example.com
Opening browser to http://drycc.example.com/v2/login/drycc/?key=4ccc81ee2dce4349ad5261ceffe72c71
Waiting for login... .o.Logged in as admin
Configuration file written to /root/.drycc/client.json

或者您可以使用用户名和密码登录

$ drycc login http://drycc.example.com --username=demo --password=demo
Configuration file written to /root/.drycc/client.json

选择构建过程

Drycc Workflow 支持三种不同的应用程序构建方式:

Buildpacks

Cloud Native Buildpacks 如果您想遵循 cnb’s docs 来构建应用程序会很有用。

了解如何使用 Buildpacks 部署应用程序。

Dockerfiles

Dockerfiles 是一种强大的方式,可以定义基于您选择的基础操作系统的可移植执行环境。

了解如何使用 Dockerfiles 部署应用程序。

容器镜像

将容器镜像部署到 Drycc 允许您从公共或私有注册表获取容器镜像,并逐位复制,确保您在开发环境或 CI 流水线中运行的镜像与生产环境中的镜像相同。

了解如何使用容器镜像部署应用程序。

调整应用程序设置

可以使用 config:set 在每个应用程序基础上配置一些全局可调设置

设置 描述
DRYCC_DISABLE_CACHE 如果设置,将禁用 [imagebuilder 缓存][](默认:未设置)
DRYCC_DEPLOY_BATCHES 在扩展期间顺序启动和停止的 pod 数量(默认:可用节点数量)
DRYCC_DEPLOY_TIMEOUT 每个部署批次的部署超时时间(秒)(默认:120)
IMAGE_PULL_POLICY 应用程序镜像的 Kubernetes [镜像拉取策略][pull-policy](默认:“IfNotPresent”)(允许值:“Always”、“IfNotPresent”)
KUBERNETES_DEPLOYMENTS_REVISION_HISTORY_LIMIT Kubernetes 为给定 Deployment 保留的修订数量(默认:所有修订)
KUBERNETES_POD_TERMINATION_GRACE_PERIOD_SECONDS Kubernetes 在发送 SIGKILL 之前等待 pod 完成工作的秒数(默认:30)

部署超时

部署超时(秒)- 有两种部署方法,Deployments(见下文)和 RC(2.4 版本之前),此设置对它们的影响略有不同。

Deployments

Deployments 的行为与基于 RC 的部署策略略有不同。

Kubernetes 负责整个部署,在后台进行滚动更新。因此,只有一个整体部署超时,而不是可配置的每批次超时。

基础超时乘以 DRYCC_DEPLOY_BATCHES 来创建整体超时。这将是 240(超时)* 4(批次)= 960 秒整体超时。

RC 部署

此部署超时定义在 DRYCC_DEPLOY_BATCHES 中等待每个批次完成的时长。

基础超时的附加项

基础超时也会通过健康检查使用 livenessreadiness 上的 initialDelaySeconds 进行扩展,其中应用较大的那个。 此外,超时系统通过在看到镜像拉取超过 1 分钟时添加额外 10 分钟来考虑慢速镜像拉取。这允许超时值合理,而不必在基础部署超时中考虑镜像拉取的缓慢。

Deployments

Workflow 使用 Deployments 进行部署。在之前的版本中,使用 ReplicationControllers,可以通过 DRYCC_KUBERNETES_DEPLOYMENTS=1 启用 Deployments。

Deployments 的优势是滚动更新将在 Kubernetes 服务器端发生,而不是在 Drycc Workflow Controller 中进行,以及其他一些 Pod 管理相关功能。这允许即使 CLI 连接中断,部署也能继续。

在后台,您的应用程序部署将由每个进程类型的 Deployment 对象组成,每个对象有多个 ReplicaSets(每个发布一个),这些 ReplicaSets 反过来管理运行您的应用程序的 Pods。

Drycc Workflow 的行为在启用或禁用 DRYCC_KUBERNETES_DEPLOYMENTS 时相同(仅适用于 2.4 版本之前)。 变化发生在后台。您在使用 CLI 时会看到差异的地方是 drycc ps:list 将以不同的方式输出 Pod 名称。

2 - 使用 Buildpacks

Buildpacks 概述,负责将部署的代码转换为 slug,然后可以在容器上执行。

Drycc 支持通过 Cloud Native Buildpacks 部署应用程序。如果您想遵循 cnb 的文档 来构建应用程序,Cloud Native Buildpacks 会很有用。

添加 SSH 密钥

对于通过 git push 的基于 Buildpack 的应用程序部署,Drycc Workflow 通过 SSH 密钥识别用户。SSH 密钥被推送到平台,并且必须对每个用户唯一。

  • 请参阅 此文档 以获取生成 SSH 密钥的说明。

  • 运行 drycc keys add 将您的 SSH 密钥上传到 Drycc Workflow。

$ drycc keys add ~/.ssh/id_drycc.pub
Uploading id_drycc.pub to drycc... done

阅读有关添加/删除 SSH 密钥的更多信息 此处

准备应用程序

如果您没有现有应用程序,您可以克隆演示 Heroku Buildpack 工作流的示例应用程序。

$ git clone https://github.com/drycc/example-go.git
$ cd example-go

创建应用程序

使用 drycc createController 上创建应用程序。

$ drycc create
Creating application... done, created skiing-keypunch
Git remote drycc added

推送以部署

使用 git push drycc master 部署您的应用程序。

$ git push drycc master
Counting objects: 75, done.
Delta compression using up to 8 threads.
Compressing objects: 100% (75/75), 18.28 KiB | 0 bytes/s, done.
Total 75 (delta 30), reused 58 (delta 22)
remote: --->
Starting build... but first, coffee!
---> Waiting podman running.
---> Process podman started.
---> Waiting caddy running.
---> Process caddy started.
---> Building pack
---> Using builder registry.drycc.cc/drycc/buildpacks:bookworm
Builder 'registry.drycc.cc/drycc/buildpacks:bookworm' is trusted
Pulling image 'registry.drycc.cc/drycc/buildpacks:bookworm'
Resolving "drycc/buildpacks" using unqualified-search registries (/etc/containers/registries.conf)
Trying to pull registry.drycc.cc/drycc/buildpacks:bookworm...
Getting image source signatures
...
---> Skip generate base layer
---> Python Buildpack
---> Downloading and extracting Python 3.10.0
---> Installing requirements with pip
Collecting Django==3.2.8
Downloading Django-3.2.8-py3-none-any.whl (7.9 MB)
Collecting gunicorn==20.1.0
Downloading gunicorn-20.1.0-py3-none-any.whl (79 kB)
Collecting sqlparse>=0.2.2
Downloading sqlparse-0.4.2-py3-none-any.whl (42 kB)
Collecting pytz
Downloading pytz-2021.3-py2.py3-none-any.whl (503 kB)
Collecting asgiref<4,>=3.3.2
Downloading asgiref-3.4.1-py3-none-any.whl (25 kB)
Requirement already satisfied: setuptools>=3.0 in /layers/drycc_python/python/lib/python3.10/site-packages (from gunicorn==20.1.0->-r requirements.txt (line 2)) (57.5.0)
Installing collected packages: sqlparse, pytz, asgiref, gunicorn, Django
Successfully installed Django-3.2.8 asgiref-3.4.1 gunicorn-20.1.0 pytz-2021.3 sqlparse-0.4.2
---> Generate Launcher
...
Build complete.
Launching App...
...
Done, skiing-keypunch:v2 deployed to Workflow

Use 'drycc open' to view this application in your browser

To learn more, use 'drycc help' or visit https://www.drycc.cc

To ssh://git@drycc.staging-2.drycc.cc:2222/skiing-keypunch.git
 * [new branch]      master -> master

$ curl -s http://skiing-keypunch.example.com
Powered by Drycc
Release v2 on skiing-keypunch-v2-web-02zb9

因为检测到 Buildpacks 风格的应用程序,web 进程类型在首次部署时自动扩展到 1。

使用 drycc scale web=3web 进程增加到 3,例如。直接扩展进程类型会更改运行该进程的 pods 数量。

包含的 Buildpacks

为方便起见,Drycc 捆绑了许多 buildpacks:

Drycc 将循环遍历每个 buildpack 的 bin/detect 脚本以匹配您推送的代码。

使用自定义 Buildpack

要使用自定义 buildpack,您需要在您的根路径应用中创建 .pack_builder 文件。

$  tee > .pack-builder << EOF
   > registry.drycc.cc/drycc/buildpacks:bookworm
   > EOF

在您的下一次 git push 中,将使用自定义 buildpack。

使用私有仓库

要从私有仓库拉取代码,将 SSH_KEY 环境变量设置为具有访问权限的私钥。使用私钥文件的路径或原始密钥材料:

$ drycc config set SSH_KEY=/home/user/.ssh/id_rsa
$ drycc config set SSH_KEY="""-----BEGIN RSA PRIVATE KEY-----
(...)
-----END RSA PRIVATE KEY-----"""

例如,要使用托管在私有 GitHub URL 的自定义 buildpack,请确保 SSH 公钥存在于您的 [GitHub 设置][] 中。然后将 SSH_KEY 设置为相应的 SSH 私钥,并将 .pack_builder 设置为构建器镜像:

$  tee > .pack-builder << EOF
   > registry.drycc.cc/drycc/buildpacks:bookworm
   > EOF
$ git add .buildpack
$ git commit -m "chore(buildpack): modify the pack_builder"
$ git push drycc master

构建器选择器

构建项目的哪种方式符合以下原则:

  • 如果项目中存在 Dockerfile,堆栈使用 container
  • 如果项目中存在 Procfile,堆栈使用 buildpack
  • 如果两者都存在,默认使用 container
  • 您也可以设置 DRYCC_STACKcontainerbuildpack 来确定使用哪种堆栈。

3 - 使用 Dockerfiles

Drycc 容器注册表允许您将基于 Docker 的应用部署到 Drycc。支持通用运行时和私有空间。

Drycc 支持通过 Dockerfiles 部署应用程序。Dockerfile 自动化了制作 [容器镜像][] 的步骤。 Dockerfiles 非常强大,但需要额外的工作来定义您的确切应用程序运行时环境。

添加 SSH 密钥

对于通过 git push 的基于 Dockerfile 的应用程序部署,Drycc Workflow 通过 SSH 密钥识别用户。SSH 密钥被推送到平台,并且必须对每个用户唯一。

  • 请参阅 此文档 以获取生成 SSH 密钥的说明。

  • 运行 drycc keys add 将您的 SSH 密钥上传到 Drycc Workflow。

$ drycc keys add ~/.ssh/id_drycc.pub
Uploading id_drycc.pub to drycc... done

阅读有关添加/删除 SSH 密钥的更多信息 此处

准备应用程序

如果您没有现有应用程序,您可以克隆演示 Dockerfile 工作流的示例应用程序。

$ git clone https://github.com/drycc/helloworld.git
$ cd helloworld

Dockerfile 要求

为了部署 Dockerfile 应用程序,它们必须符合以下要求:

  • Dockerfile 必须使用 EXPOSE 指令来公开恰好一个端口。
  • 该端口必须监听 HTTP 连接。
  • Dockerfile 必须使用 CMD 指令来定义将在容器内运行的默认进程。
  • 容器镜像必须包含 bash 来运行进程。

创建应用程序

使用 drycc createController 上创建应用程序。

$ drycc create
Creating application... done, created folksy-offshoot
Git remote drycc added

推送部署

使用 git push drycc master 部署您的应用程序。

$ git push drycc master
Counting objects: 13, done.
Delta compression using up to 8 threads.
Compressing objects: 100% (13/13), done.
Writing objects: 100% (13/13), 1.99 KiB | 0 bytes/s, done.
Total 13 (delta 2), reused 0 (delta 0)
-----> Building Docker image
Uploading context 4.096 kB
Uploading context
Step 0 : FROM drycc/base:latest
 ---> 60024338bc63
Step 1 : RUN wget -O /tmp/go1.2.1.linux-amd64.tar.gz -q https://go.googlecode.com/files/go1.2.1.linux-amd64.tar.gz
 ---> Using cache
 ---> cf9ef8c5caa7
Step 2 : RUN tar -C /usr/local -xzf /tmp/go1.2.1.linux-amd64.tar.gz
 ---> Using cache
 ---> 515b1faf3bd8
Step 3 : RUN mkdir -p /go
 ---> Using cache
 ---> ebf4927a00e9
Step 4 : ENV GOPATH /go
 ---> Using cache
 ---> c6a276eded37
Step 5 : ENV PATH /usr/local/go/bin:/go/bin:$PATH
 ---> Using cache
 ---> 2ba6f6c9f108
Step 6 : ADD . /go/src/github.com/drycc/helloworld
 ---> 94ab7f4b977b
Removing intermediate container 171b7d9fdb34
Step 7 : RUN cd /go/src/github.com/drycc/helloworld && go install -v .
 ---> Running in 0c8fbb2d2812
github.com/drycc/helloworld
 ---> 13b5af931393
Removing intermediate container 0c8fbb2d2812
Step 8 : ENV PORT 80
 ---> Running in 9b07da36a272
 ---> 2dce83167874
Removing intermediate container 9b07da36a272
Step 9 : CMD ["/go/bin/helloworld"]
 ---> Running in f7b215199940
 ---> b1e55ce5195a
Removing intermediate container f7b215199940
Step 10 : EXPOSE 80
 ---> Running in 7eb8ec45dcb0
 ---> ea1a8cc93ca3
Removing intermediate container 7eb8ec45dcb0
Successfully built ea1a8cc93ca3
-----> Pushing image to private registry

       Launching... done, v2

-----> folksy-offshoot deployed to Drycc
       http://folksy-offshoot.local3.dryccapp.com

       To learn more, use `drycc help` or visit https://www.drycc.cc

To ssh://git@local3.dryccapp.com:2222/folksy-offshoot.git
 * [new branch]      master -> master

$ curl -s http://folksy-offshoot.local3.dryccapp.com
Welcome to Drycc!
See the documentation at http://docs.drycc.cc/ for more information.

因为检测到 Dockerfile 应用程序,web 进程类型在首次部署时自动扩展到 1。

使用 drycc scale web=3web 进程增加到 3,例如。直接扩展进程类型会更改运行该进程的 容器 数量。

容器构建参数

从 Workflow v2.13.0 开始,用户可以使用 容器构建参数 将其应用程序配置注入到容器镜像中。要选择加入,用户必须向其应用程序添加新的环境变量:

$ drycc config set DRYCC_DOCKER_BUILD_ARGS_ENABLED=1

使用 drycc config set 设置的每个环境变量都将在用户的 Dockerfile 中可用。例如,如果用户运行 drycc config set POWERED_BY=Workflow,用户可以在其 Dockerfile 中使用该构建参数:

ARG POWERED_BY
RUN echo "Powered by $POWERED_BY" > /etc/motd

4 - 使用容器镜像

使用存储在 Drycc 容器注册表中的容器镜像部署应用程序。

Drycc 支持通过现有的 [Docker 镜像][] 部署应用程序。 这对于将 Drycc 集成到基于 Docker 的 CI/CD 流水线中很有用。

准备应用程序

首先克隆示例应用程序:

$ git clone https://github.com/drycc/example-dockerfile-http.git
$ cd example-dockerfile-http

接下来使用您的本地 docker 客户端构建镜像并推送 到 DockerHub

$ docker build -t <username>/example-dockerfile-http .
$ docker push <username>/example-dockerfile-http

Docker 镜像要求

为了部署 Docker 镜像,它们必须符合以下要求:

  • Dockerfile 必须使用 EXPOSE 指令来公开恰好一个端口。
  • 该端口必须监听 HTTP 连接。
  • Dockerfile 必须使用 CMD 指令来定义将在容器内运行的默认进程。
  • Docker 镜像必须包含 bash 来运行进程。

创建应用程序

使用 drycc createcontroller 上创建应用程序。

$ mkdir -p /tmp/example-dockerfile-http && cd /tmp/example-dockerfile-http
$ drycc create example-dockerfile-http --no-remote
Creating application... done, created example-dockerfile-http

部署应用程序

使用 drycc pullDockerHub 或 公共注册表部署您的应用程序。

$ drycc pull <username>/example-dockerfile-http:latest
Creating build...  done, v2

$ curl -s http://example-dockerfile-http.local3.dryccapp.com
Powered by Drycc

因为您正在部署 Docker 镜像,web 进程类型在首次部署时自动扩展到 1。

使用 drycc scale web=3web 进程增加到 3,例如。直接扩展进程类型会更改运行该进程的 容器 数量。

私有注册表

要从私有注册表或私有仓库部署 Docker 镜像,请使用 drycc registry 将凭据附加到您的应用程序。这些凭据与您在私有注册表运行 docker login 时使用的凭据相同。

要部署私有 Docker 镜像,请执行以下步骤:

  • 收集注册表的用户名和密码,例如 Quay.io Robot AccountGCR.io Long Lived Token
  • 运行 drycc registry set <the-user> <secret> -a <application-name>
  • 现在像往常一样对私有注册表中的镜像执行 drycc pull

当使用 GCR.io Long Lived Token 时,JSON blob 必须首先使用 jq 等工具压缩,然后在 drycc registry set 的密码字段中使用。对于用户名,使用 _json_key。例如:

drycc registry set _json_key "$(cat google_cloud_cred.json | jq -c .)"

当使用私有注册表时,Docker 镜像不再通过 Drycc Workflow Controller 拉取到 Drycc 内部注册表,而是由 Kubernetes 管理。这将提高安全性和整体速度, 但是应用程序 port 信息无法再被发现。相反,应用程序 port 信息可以通过 drycc config set PORT=80 在设置注册表信息之前设置。

5 - 管理应用进程

Procfile 是应用中进程类型的列表。每个进程类型声明一个命令,该命令在启动该进程类型的容器时执行。

Drycc Workflow 将您的应用作为一组可以根据其角色命名、扩展和配置的进程进行管理。这为您提供了灵活性,可以轻松管理应用的各个方面。例如,您可能有面向 Web 的进程处理 HTTP 流量、后台工作进程执行异步工作,以及从 Twitter API 流式传输的辅助进程。

通过使用 Procfile(已检入您的应用或通过 CLI 提供),您可以指定类型的名称和应运行的应用命令。要生成其他进程类型,请使用 drycc scale <ptype>=<n> 来相应地扩展这些类型。

默认进程类型

在没有 Procfile 的情况下,为每个应用假设单个默认进程类型。

使用 Buildpacks 通过 git push 构建的应用隐式接收 web 进程类型,该类型启动应用服务器。例如,Rails 4 具有以下进程类型:

web: bundle exec rails server -p $PORT

所有使用 Dockerfiles 的应用都有一个隐含的 web 进程类型,该类型运行 Dockerfile 的 CMD 指令而不修改:

$ cat Dockerfile
FROM centos:latest
COPY . /app
WORKDIR /app
CMD python -m SimpleHTTPServer 5000
EXPOSE 5000

对于上述基于 Dockerfile 的应用,web 进程类型将运行容器的 CMD python -m SimpleHTTPServer 5000

使用 远程容器镜像 的应用也会隐含 web 进程类型,并运行容器镜像中指定的 CMD

声明进程类型

如果您使用 BuildpackDockerfile 构建并想要覆盖或指定其他进程类型,只需在应用源树的根目录中包含一个名为 Procfile 的文件。

Procfile 的格式是每行一个进程类型,每行包含要调用的命令:

<process type>: <command>

语法定义为:

  • <process type> – 小写字母数字字符串,是您的命令的名称,如 web、worker、urgentworker、clock 等。
  • <command> – 启动进程的命令行,如 rake jobs:work

此示例 Procfile 指定了两种类型,websleeperweb 进程在端口 5000 上启动 Web 服务器,一个简单的进程休眠 900 秒然后退出。

$ cat Procfile
web: bundle exec ruby web.rb -p ${PORT:-5000}
sleeper: sleep 900

如果您使用 远程容器镜像,您可以通过在工作目录中使用 Procfile 运行 drycc pull,或通过将字符串化的 Procfile 传递给 --procfile CLI 选项来定义进程类型。

例如,内联传递进程类型:

$ drycc pull drycc/example-go:latest --procfile="web: /app/bin/boot"

读取另一个目录中的 Procfile

$ drycc pull drycc/example-go:latest --procfile="$(cat deploy/Procfile)"

或通过位于当前工作目录中的 Procfile:

$ cat Procfile
web: /bin/boot
sleeper: echo "sleeping"; sleep 900


$ drycc pull -a steely-mainsail drycc/example-go
Creating build... done

$ drycc scale sleeper=1 -a steely-mainsail
Scaling processes... but first, coffee!
done in 0s

NAME                                        RELEASE    STATE    PTYPE      READY    RESTARTS     STARTED
steely-mainsail-sleeper-76c45b967c-4qm6w    v3         up       sleeper    1/1      0            2023-12-08T02:25:00UTC
steely-mainsail-web-c4f44c4b4-7p7dh         v3         up       web        1/1      0            2023-12-08T02:25:00UTC

要删除进程类型,只需将其扩展到 0:

$ drycc scale sleeper=0 -a steely-mainsail
Scaling processes... but first, coffee!
done in 3s

NAME                                        RELEASE    STATE    PTYPE      READY    RESTARTS     STARTED
steely-mainsail-web-c4f44c4b4-7p7dh         v3         up       web        1/1      0            2023-12-08T02:25:00UTC

扩展进程

部署在 Drycc Workflow 上的应用通过 [进程模型][] 向外扩展。使用 drycc scale 来控制为您的应用提供动力的 容器 数量。

$ drycc scale web=5 -a iciest-waggoner
Scaling processes... but first, coffee!
done in 3s

NAME                                        RELEASE    STATE    PTYPE      READY    RESTARTS     STARTED
iciest-waggoner-web-c4f44c4b4-7p7dh         v3         up       web        1/1      0            2023-12-08T02:25:00UTC
iciest-waggoner-web-c4f44c4b4-8p7dh         v3         up       web        1/1      0            2023-12-08T02:25:00UTC
iciest-waggoner-web-c4f44c4b4-9p7dh         v3         up       web        1/1      0            2023-12-08T02:25:00UTC
iciest-waggoner-web-c4f44c4b4-1p7dh         v3         up       web        1/1      0            2023-12-08T02:25:00UTC
iciest-waggoner-web-c4f44c4b4-2p7dh         v3         up       web        1/1      0            2023-12-08T02:25:00UTC

如果您的应用有多个进程类型,您可以分别为每个类型扩展进程计数。例如,这允许您独立管理 Web 进程和后台工作进程。有关进程类型的更多信息,请参阅我们的 管理应用进程 文档。

在此示例中,我们将进程类型 web 扩展到 5,但将进程类型 background 保留为一个工作进程。

$ drycc scale web=5
Scaling processes... but first, coffee!
done in 4s

NAME                                                RELEASE    STATE    PTYPE      READY    RESTARTS     STARTED
scenic-icehouse-web-3291896318-7lord                v3         up       web        1/1      0            2023-12-08T02:25:00UTC
scenic-icehouse-web-3291896318-jn957                v3         up       web        1/1      0            2023-12-08T02:25:00UTC
scenic-icehouse-web-3291896318-rsekj                v3         up       web        1/1      0            2023-12-08T02:25:00UTC
scenic-icehouse-web-3291896318-vwhnh                v3         up       web        1/1      0            2023-12-08T02:25:00UTC
scenic-icehouse-web-3291896318-vokg7                v3         up       web        1/1      0            2023-12-08T02:25:00UTC
scenic-icehouse-web-3291896318-vokg7                v3         up       web        1/1      0            2023-12-08T02:25:00UTC
scenic-icehouse-background-3291896318-yf8kh         v3         up       web        1/1      0            2023-12-08T02:25:00UTC

通过减少进程计数来扩展进程会向进程发送 TERM 信号,如果它们在 30 秒内未退出,则跟随 SIGKILL。根据您的应用,扩展可能会中断长时间运行的 HTTP 客户端连接。

例如,从 5 个进程扩展到 3:

$ drycc scale web=3
Scaling processes... but first, coffee!
done in 1s

NAME                                                RELEASE    STATE    PTYPE     READY    RESTARTS     STARTED
scenic-icehouse-web-3291896318-vwhnh                v2         up       web       1/1      0            2023-12-08T02:25:00UTC
scenic-icehouse-web-3291896318-vokg7                v2         up       web       1/1      0            2023-12-08T02:25:00UTC
scenic-icehouse-web-3291896318-vokg9                v2         up       web       1/1      0            2023-12-08T02:25:00UTC
scenic-icehouse-background-3291896318-yf8kh         v2         up       web       1/1      0            2023-12-08T02:25:00UTC

自动扩展

自动扩展允许在每个进程类型的基础上添加最小和最大数量的 Pod。这是通过指定所有可用 Pod 的目标 CPU 使用率来实现的。

此功能建立在 Kubernetes 中的 Horizontal Pod Autoscaling 或简称 HPA 之上。

$ drycc autoscale set web --min=3 --max=8 --cpu-percent=75
Applying autoscale settings for process type web on scenic-icehouse... done

然后查看为 web 创建的扩展规则

$ drycc autoscale list
PTYPE    PERCENT    MIN    MAX
web      75         3      8

删除扩展规则

$ drycc autoscale unset web
Removing autoscale for process type web on scenic-icehouse... done

为了使自动扩展工作,必须在每个应用 Pod 上指定 CPU 请求(可以通过 drycc limits --cpu 完成)。这允许自动扩展策略进行 适当计算 并决定何时向上和向下扩展。

向上扩展只能在过去 3 分钟内没有重新扩展的情况下发生。向下扩展将等待上次重新扩展后的 5 分钟。该信息和更多信息可以在 HPA 算法页面 找到。

获取应用容器的日志

列出容器:

$ drycc ps
NAME                                                RELEASE    STATE    PTYPEE     READY    RESTARTS     STARTED
python-getting-started-web-69b7d4bfdc-kl4xf         v2         up       web        1/1      0             2023-12-08T02:25:00UTC

=== python-getting-started Processes
--- web:
python-getting-started-web-69b7d4bfdc-kl4xf up (v2)

获取容器日志:

$ drycc ps logs -f python-getting-started-web-69b7d4bfdc-kl4xf
[2024-05-24 07:14:39 +0000] [1] [INFO] Starting gunicorn 20.1.0
[2024-05-24 07:14:39 +0000] [1] [INFO] Listening at: http://0.0.0.0:8000 (1)
[2024-05-24 07:14:39 +0000] [1] [INFO] Using worker: gevent
[2024-05-24 07:14:39 +0000] [8] [INFO] Booting worker with pid: 8
[2024-05-24 07:14:39 +0000] [9] [INFO] Booting worker with pid: 9
[2024-05-24 07:14:39 +0000] [10] [INFO] Booting worker with pid: 10
[2024-05-24 07:14:39 +0000] [11] [INFO] Booting worker with pid: 11

获取应用容器的信息

列出容器:

$ drycc ps describe python-getting-started-web-69b7d4bfdc-kl4xf
Container:        python-getting-started-web                   
Image:            drycc/python-getting-started:latest          
Command:          
Args:             
                  - gunicorn                                   
                  - -c                                         
                  - gunicorn_config.py                         
                  - helloworld.wsgi:application                
State:            running                                      
  startedAt:      "2024-05-24T07:14:39Z"                       
Ready:            true                                         
Restart Count:    0                 

删除应用容器

删除容器。 由于设置了副本数量,将启动新容器以满足数量要求。

$ drycc ps delete python-getting-started-web-69b7d4bfdc-kl4xf
Deleting python-getting-started-web-69b7d4bfdc-kl4xf from python-getting-started... done

获取运行容器的 Shell

验证容器正在运行:

$ drycc ps
NAME                                                RELEASE    STATE    PTYPEE     READY    RESTARTS     STARTED
python-getting-started-web-69b7d4bfdc-kl4xf         v2         up       web        1/1      0             2023-12-08T02:25:00UTC

=== python-getting-started Processes
--- web:
python-getting-started-web-69b7d4bfdc-kl4xf up (v2)

获取运行容器的 shell:

$ drycc ps exec python-getting-started-web-69b7d4bfdc-kl4xf -it -- bash

在您的 shell 中,列出根目录:

# 在容器内运行此命令
ls /

在容器中运行单个命令

$ drycc ps exec python-getting-started-web-69b7d4bfdc-kl4xf -- date

使用 “drycc ps –help” 获取全局命令行列表(适用于所有命令)。

重启应用进程

如果您需要重启应用进程,您可以使用 drycc pts restart。在幕后,Drycc Workflow 指示 Kubernetes 终止旧进程并启动新进程来替换它。

$ drycc ps
NAME                                               RELEASE    STATE       PTYPE      READY    RESTARTS     STARTED
scenic-icehouse-web-3291896318-vokg7               v2         up          web        1/1      0            2023-12-08T02:25:00UTC
scenic-icehouse-web-3291896318-rsekj               v2         up          web        1/1      0            2023-12-08T02:50:21UTC
scenic-icehouse-web-3291896318-vokg7               v2         up          web        1/1      0            2023-12-08T02:25:00UTC
scenic-icehouse-background-3291896318-yf8kh        v2         up          web        1/1      0            2023-12-08T02:25:00UTC

$ drycc pts restart scenic-icehouse-background
NAME                                               RELEASE    STATE       PTYPE      READY    RESTARTS    STARTED
scenic-icehouse-web-3291896318-vokg7               v2         up          web        1/1      0           2023-12-08T02:25:00UTC
scenic-icehouse-web-3291896318-rsekj               v2         up          web        1/1      0           2023-12-08T02:50:21UTC
scenic-icehouse-web-3291896318-vokg7               v2         up          web        1/1      0           2023-12-08T02:25:00UTC
scenic-icehouse-background-3291896318-yf8kh        v2         starting    web        1/1      0           2023-12-08T02:25:00UTC

注意进程名称已从 scenic-icehouse-background-3291896318-yf8kh 更改为 scenic-icehouse-background-3291896318-yd87g。在多节点 Kubernetes 集群中,这也可能具有将 Pod 调度到新节点的效果。

使用 “drycc pts –help” 获取 pts 命令行列表(进程类型信息)。

列出应用进程类型

$ drycc pts
NAME          RELEASE    READY    UP-TO-DATE    AVAILABLE    GARBAGE    STARTED                   
web           v2         3/3      1             1            true       2023-12-08T02:25:00UTC    
background    v2         1/1      1             1            false      2023-12-08T02:25:00UTC    

清理进程类型

清理不存在的 ptype,通常在 autodeploy 设置为 true 时自动执行。

$ drycc pts clean background

获取应用进程类型的部署信息

$ drycc pts describe web
Container:    python-getting-started-web                   
Image:        drycc/python-getting-started:latest          
Command:      
Args:         
              - gunicorn                                   
              - -c                                         
              - gunicorn_config.py                         
              - helloworld.wsgi:application                
Limits:       
              cpu 1                                                                                               
              ephemeral-storage 2Gi                                                                               
              memory 1Gi                                                                                          
Liveness:     http-get headers=[] path=/geo/ port=8000 delay=120s timeout=10s period=20s #success=1 #failure=3    
Readiness:    http-get headers=[] path=/geo/ port=8000 delay=120s timeout=10s period=20s #success=1 #failure=3  

6 - 配置应用程序

如何在环境中存储 Drycc 应用的配置,将配置与代码分离,使其易于维护应用或部署特定的配置。

配置应用程序

Drycc 应用程序[将配置存储在环境变量中][]。

设置环境变量

使用 drycc config 修改已部署应用程序的环境变量。

$ drycc help config
管理定义应用配置的环境变量

用法:
drycc config [flags]
drycc config [command]

可用命令:
info        应用配置信息
set         为应用设置环境变量
unset       取消设置应用的环境变量
pull        将环境变量拉取到路径
push        从路径推送环境变量
attach      选择要附加到应用 ptype 的环境组
detach      选择要从应用 ptype 分离的环境组

标志:
-a, --app string     应用程序的唯一可识别名称
-g, --group string   需要列出配置的组
-p, --ptype string   需要列出配置的 ptype
-v, --version int    需要列出配置的版本

全局标志:
-c, --config string   配置文件路径。(默认 "~/.drycc/client.json")
-h, --help            显示帮助信息

使用 "drycc config [command] --help" 获取有关命令的更多信息。

当配置更改时,会自动创建并部署新版本。

您可以使用一个 drycc config set 命令设置多个环境变量, 或者使用 drycc config push 和本地 .env 文件。

$ drycc config set FOO=1 BAR=baz && drycc config pull
$ cat .env
FOO=1
BAR=baz
$ echo "TIDE=high" >> .env
$ drycc config push
Creating config... done, v4

=== yuppie-earthman
DRYCC_APP: yuppie-earthman
FOO: 1
BAR: baz
TIDE: high

它可以修改应用程序进程类型的环境变量。

$ drycc config set FOO=1 BAR=baz --ptype=web

它还可以修改环境组的环境变量。

$ drycc config set FOO1=1 BAR1=baz --group=web.env

然后将此环境变量组绑定到 web。

$ drycc config attach web web.env

当然,您也可以分离它。

$ drycc config detach web web.env

附加到后端服务

Drycc 将数据库、缓存和队列等后端服务视为[附加资源][]。 附加使用环境变量执行。

例如,使用 drycc config 设置 DATABASE_URL,将 应用程序附加到外部 PostgreSQL 数据库。

$ drycc config set DATABASE_URL=postgres://user:pass@example.com:5432/db
=== peachy-waxworks
DATABASE_URL: postgres://user:pass@example.com:5432/db

可以使用 drycc config unset 执行分离。

Buildpacks 缓存

默认情况下,使用 [Imagebuilder][] 的应用将重用最新的镜像数据。 在部署依赖于必须获取的第三方库的应用程序时, 这可以大大加快部署速度。为了利用这一点,buildpack 必须通过写入缓存目录来实现 缓存。大多数 buildpack 已经实现了这一点,但在使用 自定义 buildpack 时,可能需要更改以充分利用缓存。

禁用和重新启用缓存

在某些情况下,缓存可能不会加快您的应用程序速度。要禁用缓存,您可以使用 drycc config set DRYCC_DISABLE_CACHE=1 设置 DRYCC_DISABLE_CACHE 变量。当您禁用缓存时,Drycc 将清除它创建的用于存储缓存的文件。关闭后,运行 drycc config unset DRYCC_DISABLE_CACHE 来重新启用缓存。

清除缓存

使用以下过程清除缓存:

$ drycc config set DRYCC_DISABLE_CACHE=1
$ git commit --allow-empty -m "Clearing Drycc cache"
$ git push drycc # (如果您使用不同的远程仓库,您应该使用您的远程仓库名称)
$ drycc config unset DRYCC_DISABLE_CACHE

自定义健康检查

默认情况下,Workflow 仅检查应用程序是否在其容器中启动。可以为应用程序配置健康检查探针来添加健康检查。健康检查作为 Kubernetes 容器探针实现。可以配置 ‘startupProbe’ ’livenessProbe’ 和 ‘readinessProbe’,每个探针可以是 ‘httpGet’、’exec’ 或 ’tcpSocket’ 类型,具体取决于容器所需的探针类型。

‘startupProbe’ 指示容器内的应用程序是否已启动。 如果提供了启动探针,则所有其他探针都被禁用,直到它成功。 如果启动探针失败,容器将受到其重启策略的影响。

’livenessProbe’ 对于长时间运行的应用程序很有用,最终 会过渡到损坏状态,除非通过重启它们,否则无法恢复。

其他时候,‘readinessProbe’ 很有用,当容器只是暂时无法 服务,并且会自行恢复。在这种情况下,如果容器未能通过 ‘readinessProbe’, 容器不会被关闭,而是容器将停止接收 传入请求。

‘httpGet’ 探针正如其名称:它在容器上执行 HTTP GET 操作。 200-399 范围内的响应代码被视为通过。‘httpGet’ 探针接受一个 端口号,以便在容器上执行 HTTP GET 操作。

’exec’ 探针在容器内运行命令来确定其健康状况。退出代码为 零被视为通过,而非零状态代码被视为失败。’exec’ 探针接受要在容器内运行的参数字符串。

’tcpSocket’ 探针尝试在容器中打开套接字。只有当检查可以建立连接时,容器才被视为健康。’tcpSocket’ 探针接受一个 端口号,以便在容器上执行套接字连接。

可以使用 drycc healthchecks set 为每个应用程序的每个 proctype 配置健康检查。如果未提及类型,则健康检查将应用于默认进程类型 web(无论存在哪个)。要 配置 httpGet liveness 探针:

$ drycc healthchecks set livenessProbe httpGet 80 --ptype web
Applying livenessProbe healthcheck... done

App:             peachy-waxworks
UUID:            afd84067-29e9-4a5f-9f3a-60d91e938812
Owner:           dev
Created:         2023-12-08T10:25:00Z
Updated:         2023-12-08T10:25:00Z
Healthchecks:
                 livenessProbe web http-get headers=[] path=/ port=80 delay=50s timeout=50s period=10s #success=1 #failure=3

If the application relies on certain headers being set (such as the Host header) or a specific URL path relative to the root, you can also send specific HTTP headers:

$ drycc healthchecks set livenessProbe httpGet 80 \
    --path /welcome/index.html \
    --headers "X-Client-Version:v1.0,X-Foo:bar"
Applying livenessProbe healthcheck... done

App:             peachy-waxworks
UUID:            afd84067-29e9-4a5f-9f3a-60d91e938812
Owner:           dev
Created:         2023-12-08T10:25:00Z
Updated:         2023-12-08T10:25:00Z
Healthchecks:
                 livenessProbe web http-get headers=[X-Client-Version=v1.0] path=/welcome/index.html port=80 delay=50s timeout=50s period=10s #success=1 #failure=3

To configure an exec readiness probe:

$ drycc healthchecks set readinessProbe exec -- /bin/echo -n hello --ptype web
Applying readinessProbe healthcheck... done

App:             peachy-waxworks
UUID:            afd84067-29e9-4a5f-9f3a-60d91e938812
Owner:           dev
Created:         2023-12-08T10:25:00Z
Updated:         2023-12-08T10:25:00Z
Healthchecks:
                 readinessProbe web exec /bin/echo -n hello delay=50s timeout=50s period=10s #success=1 #failure=3

You can overwrite a probe by running drycc healthchecks set again:

$ drycc healthchecks set readinessProbe httpGet 80 --ptype web
Applying livenessProbe healthcheck... done

App:             peachy-waxworks
UUID:            afd84067-29e9-4a5f-9f3a-60d91e938812
Owner:           dev
Created:         2023-12-08T10:25:00Z
Updated:         2023-12-08T10:25:00Z
Healthchecks:
                 livenessProbe web http-get headers=[] path=/ port=80 delay=50s timeout=50s period=10s #success=1 #failure=3

Configured health checks also modify the default application deploy behavior. When starting a new Pod, Workflow will wait for the health check to pass before moving onto the next Pod.

自动部署

默认情况下,更改配置、限制或健康检查等将触发部署。 如果您不想部署,可以禁用。

$ drycc autodeploy disable

要重新启用自动部署。

drycc autodeploy enable

您可以通过执行以下命令进行部署。 部署所有 ptype

drycc releases deploy

部署 web 进程类型,并支持 --force 选项强制部署。

drycc releases deploy web --force

自动回滚

默认情况下,部署失败将回滚到之前的成功版本。 如果您不想发生这种情况,可以禁用。

$ drycc autorollback disable

要重新启用自动回滚。

drycc autorollback enable

隔离应用程序

Workflow 支持使用 drycc tags 将应用程序隔离到一组节点上。

一旦您的节点配置了适当的标签选择器,使用 drycc tags set 将应用程序 ptype 限制到这些节点:

$ drycc tags set web environ=prod
Applying tags...  done, v4

environ  prod

7 - 管理应用指标

指标支持 Pod 的基本监控功能,提供 CPU、内存、磁盘、网络等各种监控指标,以满足 Pod 资源的基本监控需求。

创建认证令牌

使用 drycc 客户端创建认证令牌。

# drycc tokens add prometheus --password admin --username admin
 !    WARNING: Make sure to copy your token now.
 !    You won't be able to see it again, please confirm whether to continue.
 !    To proceed, type "yes" !

> yes
UUID                                  USERNAME    TOKEN
58176cf1-37a8-4c52-9b27-4c7a47269dfb  admin       1F2c7A802aF640fd9F31dD846AdDf56BcMsay

为 prometheus 添加抓取配置

有效的示例文件可以在这里找到。

全局配置指定在所有其他配置上下文中有效的参数。它们还作为其他配置部分的默认值。

global:
  scrape_interval:   60s
  evaluation_interval: 60s
scrape_configs:
- job_name: 'drycc'
  scheme: https
  metrics_path: /v2/apps/<appname>/metrics
  authorization:
    type: Token
    credentials: 1F2c7A802aF640fd9F31dD846AdDf56BcMsay
  static_configs:
  - targets: ['drycc.domain.com']

8 - 管理应用

这是 Drycc 工作方式的高级技术描述。它将您在 Drycc 平台上编写、配置、部署和运行应用时遇到的许多概念联系在一起。

跟踪应用更改

Drycc Workflow 跟踪对您的应用的所有更改。应用更改是新应用代码推送到平台(通过 git push drycc master)或应用配置更新(通过 drycc config:set KEY=VAL)的结果。

每次对您的应用进行构建或配置更改时,都会创建一个新的 release。这些发布编号单调递增。

您可以使用 drycc releases 查看对您的应用的更改记录:

$ drycc releases
OWNER    STATE      VERSION    CREATED                 SUMMARY
dev      succeed    v3         2023-12-04T10:17:46Z    dev deleted PIP_INDEX_URL, DISABLE_COLLECTSTATIC
dev      succeed    v2         2023-12-01T10:20:22Z    dev added IMAGE_PULL_POLICY, PIP_INDEX_URL, PORT, DISABLE_COLLEC[...]
dev      succeed    v1         2023-11-30T17:54:57Z    dev created initial release

回滚发布

Drycc Workflow 还支持回滚到以前的发布。如果有问题的代码或错误的配置更改被推送到您的应用,您可以回滚到以前已知良好的发布。

在此示例中,应用当前运行发布 v4。使用 drycc rollback v2 告诉 Workflow 部署用于发布 v2 的构建和配置。这创建一个名为 v5 的新发布,其内容是发布 v2 的源代码和配置:

$ drycc releases
OWNER    STATE      VERSION    CREATED                 SUMMARY
dev      succeed    v3         2023-12-04T10:17:46Z    dev deleted PIP_INDEX_URL, DISABLE_COLLECTSTATIC
dev      succeed    v2         2023-12-01T10:20:22Z    dev added IMAGE_PULL_POLICY, PIP_INDEX_URL, PORT, DISABLE_COLLEC[...]
dev      succeed    v1         2023-11-30T17:54:57Z    dev created initial release

$ drycc rollback v2
Rolled back to v2

$ drycc releases
OWNER    STATE      VERSION    CREATED                 SUMMARY
dev      succeed    v4         2023-12-04T10:20:46Z    dev rolled back to v2
dev      succeed    v3         2023-12-04T10:17:46Z    dev deleted PIP_INDEX_URL, DISABLE_COLLECTSTATIC
dev      succeed    v2         2023-12-01T10:20:22Z    dev added IMAGE_PULL_POLICY, PIP_INDEX_URL, PORT, DISABLE_COLLEC[...]
dev      succeed    v1         2023-11-30T17:54:57Z    dev created initial release

仅回滚 web 进程类型:

$ drycc rollback v3 web
Rolled back to v3

$ drycc releases
OWNER    STATE      VERSION    CREATED                 SUMMARY
dev      succeed    v5         2023-12-04T10:23:49Z    dev rolled back to v3
dev      succeed    v4         2023-12-04T10:20:46Z    dev rolled back to v2
dev      succeed    v3         2023-12-04T10:17:46Z    dev deleted PIP_INDEX_URL, DISABLE_COLLECTSTATIC
dev      succeed    v2         2023-12-01T10:20:22Z    dev added IMAGE_PULL_POLICY, PIP_INDEX_URL, PORT, DISABLE_COLLEC[...]
dev      succeed    v1         2023-11-30T17:54:57Z    dev created initial release

运行一次性管理任务

Drycc 应用 [使用一次性进程进行管理任务][] 如数据库迁移和其他必须针对实时应用运行的命令。

使用 drycc run 在部署的应用上执行命令。

$ drycc run -- 'ls -l'
Running `ls -l`...

total 28
-rw-r--r-- 1 root root  553 Dec  2 23:59 LICENSE
-rw-r--r-- 1 root root   60 Dec  2 23:59 Procfile
-rw-r--r-- 1 root root   33 Dec  2 23:59 README.md
-rw-r--r-- 1 root root 1622 Dec  2 23:59 pom.xml
drwxr-xr-x 3 root root 4096 Dec  2 23:59 src
-rw-r--r-- 1 root root   25 Dec  2 23:59 system.properties
drwxr-xr-x 6 root root 4096 Dec  3 00:00 target

共享应用

使用 drycc perms add 允许其他 Drycc 用户与您协作应用。

$ drycc perms add otheruser view,change,delete
Adding user otheruser as a collaborator for view,change,delete peachy-waxwork... done

使用 drycc perms 查看应用当前与谁共享,使用 drycc perms remove 删除协作者。

在使用与您共享的应用时,克隆原始存储库并在尝试 git push 任何更改到 Drycc 之前添加 Drycc 的 git 远程条目。

$ git clone https://github.com/drycc/example-java-jetty.git
Cloning into 'example-java-jetty'... done
$ cd example-java-jetty
$ git remote add -f drycc ssh://git@local3.dryccapp.com:2222/peachy-waxworks.git
Updating drycc
From drycc-controller.local:peachy-waxworks
 * [new branch]      master     -> drycc/master

应用故障排除

部署在 Drycc Workflow 上的应用 [将日志视为事件流][]。Drycc Workflow 聚合每个 Containerstdoutstderr,使排除应用问题变得容易。

使用Drycc Grafana查看部署应用的日志输出。

Dec  3 00:30:31 ip-10-250-15-201 peachy-waxworks[web.5]: INFO:oejsh.ContextHandler:started o.e.j.s.ServletContextHandler{/,null}
Dec  3 00:30:31 ip-10-250-15-201 peachy-waxworks[web.8]: INFO:oejs.Server:jetty-7.6.0.v20120127
Dec  3 00:30:31 ip-10-250-15-201 peachy-waxworks[web.5]: INFO:oejs.AbstractConnector:Started SelectChannelConnector@0.0.0.0:10005
Dec  3 00:30:31 ip-10-250-15-201 peachy-waxworks[web.6]: INFO:oejsh.ContextHandler:started o.e.j.s.ServletContextHandler{/,null}
Dec  3 00:30:31 ip-10-250-15-201 peachy-waxworks[web.7]: INFO:oejsh.ContextHandler:started o.e.j.s.ServletContextHandler{/,null}
Dec  3 00:30:31 ip-10-250-15-201 peachy-waxworks[web.6]: INFO:oejs.AbstractConnector:Started SelectChannelConnector@0.0.0.0:10006
Dec  3 00:30:31 ip-10-250-15-201 peachy-waxworks[web.7]: INFO:oejs.AbstractConnector:Started SelectChannelConnector@0.0.0.0:10007
Dec  3 00:30:31 ip-10-250-15-201 peachy-waxworks[web.8]: INFO:oejs.AbstractConnector:Started SelectChannelConnector@0.0.0.0:10008

9 - 为应用挂载卷

Drycc 支持多种类型的卷。一个容器可以同时使用任意数量的卷类型。

我们可以使用以下命令创建卷并挂载已创建的卷。 Drycc 创建卷支持 ReadWriteMany,因此在部署 drycc 之前,您需要有一个支持 ReadWriteMany 的 StorageClass。 部署 drycc 时,将 controller.appStorageClass 设置为此 StorageClass。

使用 drycc volumes 为已部署应用的进程挂载卷。

$ drycc help volumes
Valid commands for volumes:

add              create a volume for the application
expand           expand a volume for the application
list             list volumes in the application
info             print information about a volume
remove           delete a volume from the application
client           the client used to manage volume files
mount            mount a volume to process of the application
unmount          unmount a volume from process of the application

Use 'drycc help [command]' to learn more.

为应用创建卷

您可以使用 drycc volumes add 命令创建 csi 卷。

$ drycc volumes add myvolume 200M
Creating myvolume to scenic-icehouse... done

或使用现有的 nfs 服务器

$ drycc volumes add mynfsvolume 200M -t nfs --nfs-server=nfs.drycc.com --nfs-path=/
Creating mynfsvolume to scenic-icehouse... done

或使用现有的 oss3

$ drycc volumes add myossvolume 200M -t oss --oss-server=oss.drycc.com --oss-bucket=vbucket --oss-access-key=ak --oss-secret-key=sk
Creating myossvolume to scenic-icehouse... done

列出应用中的卷

卷创建后,您可以列出此应用中的卷。

$ drycc volumes list
NAME          OWNER    TYPE    PTYPE    PATH     SIZE
myvolume      admin    csi                       200M
mynfsvolume   admin    nfs                       200M
myossvolume   admin    oss                       200M

挂载卷

名为 myvolume 的卷已创建,您可以使用应用的进程挂载该卷,使用 drycc volumes mount 命令。卷挂载时,将自动创建并部署新版本。

$ drycc volumes mount myvolume web=/data/web
Mounting volume... done

使用 drycc volumes list 显示挂载详情。

$ drycc volumes list
NAME       OWNER    TYPE    PTYPE    PATH         SIZE
myvolume   admin    nfs     web      /data/web    200M

如果您不再需要卷,请使用 drycc volumes unmount 卸载卷,然后使用 drycc volumes remove 从应用中删除卷。 删除卷之前,必须先卸载卷。

$ drycc volumes unmount myvolume web
Unmounting volume... done

$ drycc volumes remove myvolume
Deleting myvolume from scenic-icehouse... done

使用卷客户端管理卷文件。

假设名为 myvolume 的卷已创建并挂载。

准备一个名为 testfile 的文件。

$ echo "testtext" > testfile

上传。 $ drycc volumes client cp testfile vol://myvolume/ [↑] testfile 100% [==================================================] (5/ 5 B, 355 B/s)

列出 myvolume 中的文件。

$ drycc volumes client ls vol://myvolume/
[2024-07-22T15:32:28+08:00]    5    testfile

删除 myvolume 中的 testfile。

$ drycc volumes client rm vol://myvolume/testfile

10 - 关于应用的网关

Gateway 描述了如何将流量转换为集群内的服务。

Gateway 描述了如何将流量转换为集群内的服务。也就是说,它定义了一种将流量从不知道 Kubernetes 的地方转换为知道的地方的方式。例如,由云负载均衡器、集群内代理或外部硬件负载均衡器发送到 Kubernetes 服务的流量。虽然许多用例的客户端流量源于"集群外部",但这不是必需的。

为应用创建网关

网关是一种对外暴露服务的方式,它生成一个外部 IP 地址来连接路由和服务。 部署后,网关已创建。

列出容器:

# drycc gateways
NAME                      LISENTER       PORT     PROTOCOL    ADDRESSES
python-getting-started    tcp-80-0       80       HTTP        101.65.132.51

您也可以在此网关中添加端口或创建一个端口。

# drycc gateways add python-getting-started --port=443 --protocol=HTTPS
Adding gateway python-getting-started to python-getting-started... done

为应用创建服务

服务是一种对内暴露服务的方式,创建服务会生成一个内部 DNS,可以访问 ptype。 web 进程类型已创建,对于其他类型,您应该根据需要添加。

列出服务:

$ drycc services
PTYPE      PORT    PROTOCOL    TARGET-PORT    DOMAIN
web        80      TCP         8000           python-getting-started.python-getting-started.svc

为进程类型添加新服务

# drycc services add --help
# drycc services add sleep 8001:8001

为应用创建路由

网关可以附加到一个或多个路由引用,这些路由引用用于将部分流量引导到特定服务。 与上述相同,web 进程类型已经绑定了网关和服务。

# drycc routes
NAME                           OWNER        KIND           GATEWAYS                              SERVICES
python-getting-started         demo         HTTPRoute      ["python-getting-started:80"]         ["python-getting-started:80"]

创建新路由并附加网关。

drycc routes add sleep HTTPRoute --ptype=sleep  sleep:8001,100
drycc routes attach sleep --gateway=python-getting-started --port=80

11 - 管理应用的资源

用于开发、扩展和操作您的应用的工具和服务。

我们可以使用以下命令创建资源并绑定已创建的资源。 此命令依赖于 service-catalog

使用 drycc resources 为已部署的应用创建和绑定资源。

$ drycc help resources
Manage resources for your applications

Usage:
drycc resources [flags]
drycc resources [command]

Available Commands:
services    List all available resource services
plans       List all available plans for a resource service
create      Create a resource for the application
list        List resources in the application
describe    Get a resource's detail in the application
update      Update a resource from the application
bind        Bind a resource for an application
unbind      unbind a resources for an application
destroy     Delete a resource from the application

Flags:
-a, --app string   The uniquely identifiable name for the application
-l, --limit int    The maximum number of results to display

Global Flags:
-c, --config string   Path to configuration file. (default "~/.drycc/client.json")
-h, --help            Display help information
-v, --version         Display client version

Use "drycc resources [command] --help" for more information about a command.

列出所有可用的资源服务

您可以使用 drycc resources services 命令列出可用的资源服务

$ drycc resources services
ID                                      NAME                  UPDATEABLE
15032a52-33c2-4b40-97aa-ceb972f51509    airflow               true
b7cb26a4-b258-445c-860b-a664239a67f8    cloudbeaver           true
9ce3c3ba-33b5-4e4e-a5e9-a338a83d5070    flink                 true
b80c51a1-957c-4d93-b3d5-efde84cd8031    fluentbit             true
fff5b6c7-ed85-429b-8265-493e40cc53c7    grafana               true
412e368f-bf78-4798-92cc-43343119a57d    kafka                 true
ea2a9b87-fbc4-4e2a-adee-161c1f91d98d    minio                 true
383f7316-84f3-4955-8491-1d4b02b749c8    mongodb               true
fbee746b-f3a7-4bef-8b55-cbecfd4c8ac3    mysql-cluster         true
5975094d-45cc-4e85-8573-f93937d026c7    opensearch            true
1db95161-7193-4544-8c76-e5ad5f6c03f6    pmm                   true
5cfb0abf-276c-445b-9060-9aa964ede87d    postgresql-cluster    true
b8f70264-eafc-4b2f-848e-2ec0d059032b    prometheus            true
e1fd0d37-9046-4152-a29b-d155c5657c8b    redis                 true
7d2b64c6-0b59-4f08-a2f5-7b17cea6e5ee    redis-cluster         true
2e6877df-86e7-4bcc-a869-2a9b6847a465    seaweedfs             true
4aea5c0f-9495-420d-896a-ffc61a3eced5    spark                 true
b50db3b5-8d5f-4be9-b8bd-467ecd6cc11d    zookeeper             true

列出资源服务的所有可用计划

您可以使用 drycc resources plans 命令列出资源服务的所有可用计划

$ drycc resources plans redis
ID                                      NAME              DESCRIPTION
8d659058-a3b4-4058-b039-cc03a31b9442    standard-128      Redis standard-128 plan which limit resources memory size 128Mi.
36e3dbec-fc51-4f6b-9baa-e31e316858be    standard-256      Redis standard-256 plan which limit resources memory size 256Mi.
560817c2-5aa1-41c4-9ee6-a77e3ee552d5    standard-512      Redis standard-512 plan which limit resources memory size 512Mi.
d544d989-9fb8-43e9-a74e-0840ce1b8f0f    standard-1024     Redis standard-1024 plan which limit resources memory size 1Gi.
ad51b7bb-9b12-4ffd-8e49-010c0141b263    standard-2048     Redis standard-2048 plan which limit resources memory size 2Gi.
5097d76e-557c-453f-bdb1-54009e0df78d    standard-4096     Redis standard-4096 plan which limit resources memory size 4Gi.
be3fa2d0-36d2-47c5-9561-9deffe5ba373    standard-8192     Redis standard-8192 plan which limit resources memory size 8Gi.
4ca812a8-d7c3-439f-96cd-26523e88400e    standard-16384    Redis standard-16384 plan which limit resources memory size 16Gi.
b7f2a71f-0d97-48fd-8eed-aab24a7822f3    standard-32768    Redis standard-32768 plan which limit resources memory size 32Gi.
25c6b5d5-7505-47c8-95b1-dc9bdc698063    standard-65536    Redis standard-65536 plan which limit resources memory size 64Gi.

在应用中创建资源

您可以使用 drycc resources create 命令创建资源

$ drycc resources create redis redis standard-128
Creating redis to scenic-icehouse... done

资源创建后,您可以列出此应用中的资源。

$ drycc resources list
UUID                                    NAME     OWNER    PLAN                  UPDATED
07220e9e-d54d-4d74-a88c-f464aa374386    redis    admin    redis:standard-128    2024-05-08T01:01:00Z

绑定资源

名为 redis 的资源已创建,您可以将 redis 绑定到应用,使用 drycc resources bind redis 命令。

$ drycc resources bind redis
Binding resource... done

描述资源

使用 drycc resources describe 显示绑定详情。如果绑定成功,此命令将显示连接到资源的信息。

$ drycc resources describe redis
=== scenic-icehouse resource redis
plan:               redis:1000
status:             Ready
binding:            Ready

REDISPORT:          6379
REDIS_PASSWORD:     RzG87SJWG1
SENTINELHOST:       172.16.0.2
SENTINELPORT:       26379

更新资源

您可以使用 drycc resources update 命令升级到新计划。 将计划容量升级到 128MB 的示例:

$ drycc resources update redis redis standard-128
Updating redis to scenic-icehouse... done

删除资源

如果您不再需要资源,请使用 drycc resources unbind 取消绑定资源,然后使用 drycc resources destroy 从应用中删除资源。 删除资源之前,必须先取消绑定资源。

$ drycc resources unbind redis
Unbinding resource... done

$ drycc resources destroy redis
Deleting redis from scenic-icehouse... done

12 - 应用间通信

Drycc 应用程序之间的通信解决方案。

多进程应用程序的常见架构模式是让一个进程服务公共请求,同时让多个其他进程支持公共进程,例如按计划执行操作或处理队列中的工作项。要在 Drycc Workflow 中实现这种应用程序系统,请设置应用程序使用 DNS 解析进行通信,如上所示,并通过从 Drycc Workflow 路由器中删除它们来隐藏支持进程的公共视图。

DNS 服务发现

Drycc Workflow 支持部署由进程系统组成的单个应用程序。每个 Drycc Workflow 应用程序都在单个端口上通信,因此与其他 Workflow 应用程序通信意味着找到该应用程序的地址和端口。所有 Workflow 应用程序在外部都映射到端口 80,因此找到其 IP 地址是唯一的挑战。Workflow 为每个应用程序创建一个 Kubernetes Service,这有效地为应用程序分配了一个名称和一个集群内部 IP 地址。集群中运行的 DNS 服务添加和删除 DNS 记录,这些记录在添加和删除服务时从应用程序名称指向其 IP 地址。然后,Drycc Workflow 应用程序可以简单地向服务的域名发送请求,该域名是"app-name.app-namespace"。

13 - 资源限制

Drycc Workflow 支持限制每个进程的内存和 CPU 份额。

管理应用资源限制

Drycc Workflow 支持限制每个进程的内存和 CPU 份额。为每个进程类型设置的请求/限制将作为请求和限制提供给 Kubernetes。这意味着您为进程保证 <requests> 数量的资源,同时限制进程使用不超过 <limits> 的资源。 默认情况下,如果我们没有明确设置 <requests> 值,Kubernetes 会将 <requests> 设置为等于 <limit>。请记住 0 <= requests <= limits

限制

如果您设置的请求/限制超出集群的范围,Kubernetes 将无法将您的应用进程调度到集群中!

$ drycc limits plans

ID                    SPEC    CPU              VCPUS    MEMORY     FEATURES
std1.large.c1m1       std1    Universal CPU    1        1 GiB      Integrated GPU shared
std1.large.c1m2       std1    Universal CPU    1        2 GiB      Integrated GPU shared
std1.large.c1m4       std1    Universal CPU    1        4 GiB      Integrated GPU shared
std1.large.c1m8       std1    Universal CPU    1        8 GiB      Integrated GPU shared
std1.large.c2m2       std1    Universal CPU    2        2 GiB      Integrated GPU shared
std1.large.c2m4       std1    Universal CPU    2        4 GiB      Integrated GPU shared
std1.large.c2m8       std1    Universal CPU    2        8 GiB      Integrated GPU shared
std1.large.c2m16      std1    Universal CPU    2        16 GiB     Integrated GPU shared

$ drycc limits set web=std1.large.c1m1
Applying limits... done

14 - 域名和路由

通过自定义域名使您的应用可访问。

您可以使用 drycc domains 向应用程序添加或删除自定义域名:

$ drycc domains add hello.bacongobbler.com --ptype=web
Adding hello.bacongobbler.com to finest-woodshed... done

完成后,您可以进入 DNS 注册商并设置从新应用名称到旧应用名称的 CNAME:

$ dig hello.dryccapp.com
[...]
;; ANSWER SECTION:
hello.bacongobbler.com.         1759    IN    CNAME    finest-woodshed.dryccapp.com.
finest-woodshed.dryccapp.com.    270     IN    A        172.17.8.100

要从路由网格中添加或删除应用程序,请使用 drycc routing

$ drycc routing disable
Disabling routing for finest-woodshed... done

这将使应用程序无法通过 [路由器][] 访问,但应用程序仍然可以通过其 Kubernetes 服务 在内部访问。要重新启用路由:

$ drycc routing enable
Enabling routing for finest-woodshed... done

15 - 应用 SSL 证书

SSL 是一种加密协议,为所有 Web 请求提供端到端加密和完整性。

应用 SSL 证书

SSL 是一种加密协议,为所有 Web 请求提供端到端加密和完整性。传输敏感数据的应用应启用 SSL,以确保所有信息安全传输。

要在自定义域名(如 www.example.com)上启用 SSL,请使用 SSL 端点。

概述

由于 SSL 验证的独特性质,为您的域名配置 SSL 是一个涉及多个第三方的多步骤过程。您需要:

  1. 从 SSL 提供商处购买 SSL 证书
  2. 将证书上传到 Drycc

获取 SSL 证书

购买 SSL 证书的成本和过程因供应商而异。RapidSSL 提供了一种简单的方式来购买证书,是推荐的解决方案。如果您可以使用此提供商,请参阅[使用 RapidSSL 购买 SSL 证书][]以获取说明。

DNS 和域名配置

SSL 证书配置完成后,您的证书确认后,您必须通过 Drycc 路由对域名的请求。除非您已经这样做,否则使用以下命令将生成 CSR 时指定的域名添加到您的应用中:

$ drycc domains add www.example.com --ptype==web -a foo
Adding www.example.com to foo... done

添加证书

使用 certs:add 命令将您的证书、任何中间证书和私钥添加到端点。

$ drycc certs add example-com server.crt server.key -a foo
Adding SSL endpoint... done
www.example.com

Drycc 平台将检查证书并从中提取相关信息,如通用名称、主题备用名称 (SAN)、指纹等。

这允许通配符证书和 SAN 中的多个域名,而无需上传重复项。

添加证书链

有时,您的证书(如自签名或廉价证书)需要额外的证书来建立信任链。您需要将所有证书捆绑到一个文件中并提供给 Drycc。重要的是,您的站点证书必须是第一个:

$ cat server.crt server.ca > server.bundle

之后,您可以使用 certs add 命令将其添加到 Drycc:

$ drycc certs add example-com server.bundle server.key -a foo
Adding SSL endpoint... done
www.example.com

将 SSL 证书附加到域名

证书不会自动连接到域名,而是您必须将证书附加到域名

$ drycc certs attach example-com example.com -a foo

每个证书可以连接到多个域名。不需要上传重复项。

要删除关联

$ drycc certs detach example-com example.com -a foo

端点概述

您可以使用 drycc certs 验证域名的 SSL 配置详情。

$ drycc certs
NAME           COMMON-NAME    EXPIRES        SAN                 DOMAINS           
example-com    example.com    14 Jan 2017    blog.example.com    example.com

或通过查看每个证书的详细信息

$ drycc certs info example-com -a foo

=== bar-com Certificate
Common Name(s):     example.com
Expires At:         2017-01-14 23:57:57 +0000 UTC
Starts At:          2016-01-15 23:57:57 +0000 UTC
Fingerprint:        7A:CA:B8:50:FF:8D:EB:03:3D:AC:AD:13:4F:EE:03:D5:5D:EB:5E:37:51:8C:E0:98:F8:1B:36:2B:20:83:0D:C0
Subject Alt Name:   blog.example.com
Issuer:             /C=US/ST=CA/L=San Francisco/O=Drycc/OU=Engineering/CN=example.com/emailAddress=engineering@drycc.cc
Subject:            /C=US/ST=CA/L=San Francisco/O=Drycc/OU=Engineering/CN=example.com/emailAddress=engineering@drycc.cc

Connected Domains:  example.com
Owner:              admin-user
Created:            2016-01-28 19:07:41 +0000 UTC
Updated:            2016-01-30 00:10:02 +0000 UTC

测试 SSL

使用命令行工具如 curl 来测试您的安全域名的配置是否正确。

注意输出。它应该打印 SSL certificate verify ok。如果它打印类似 common name: www.example.com (does not match 'www.somedomain.com') 的内容,则说明配置不正确。

在路由器上强制 SSL

要强制所有 HTTP 请求重定向到 HTTPS,可以通过运行以下命令在路由器级别强制 TLS

$ drycc tls force enable -a foo
Enabling https-only requests for foo... done

访问应用 HTTP 端点的用户现在将收到 301 重定向到 HTTPS 端点。

要禁用强制 TLS,请运行

$ drycc tls force disable -a foo
Disabling https-only requests for foo... done

自动证书管理

通过自动证书管理 (ACM),Drycc 自动管理通用运行时上具有 Hobby 和 Professional dyno 的应用的 TLS 证书,以及启用该功能的私有空间中的应用。由 ACM 处理的证书会在到期前一个月自动续订,每当您添加或删除自定义域名时,会自动创建新证书。所有具有付费 dyno 的应用都免费包含 ACM。自动证书管理使用 Let’s Encrypt,这是免费、自动化和开放的证书颁发机构,用于管理您的应用的 TLS 证书。Let’s Encrypt 由互联网安全研究小组 (ISRG) 为公共利益运营。

使用以下命令启用 ACM: $ drycc tls auto enable -a foo

使用以下命令禁用 ACM: $ drycc tls auto disable -a foo

删除证书

您可以使用 certs:remove 命令删除证书:

$ drycc certs remove my-cert -a foo
Removing www.example.com... Done.

更换证书

在应用的生命周期中,操作员将不得不获取具有新到期日期的证书并将其应用到所有相关应用,下面是更换证书的推荐方法。

有意选择证书名称,尽可能将其命名为 example-com-2017,其中年份表示到期年份。这允许在购买新证书时使用 example-com-2018

假设所有应用已经在使用 example-com-2017,可以运行以下命令,链接在一起或其他方式:

$ drycc certs detach example-com-2017 example.com -a foo
$ drycc certs attach example-com-2018 example.com -a foo

这将处理单个域名,允许操作员验证一切按计划进行,并慢慢将其推广到使用相同方法的任何其他应用。

故障排除

如果您的 SSL 端点未按预期工作,以下是一些可以遵循的步骤。

不受信任的证书

在某些情况下访问 SSL 端点时,它可能会将您的证书列为不受信任。

如果发生这种情况,可能是因为它不受 Mozilla 的[root CA][]列表信任。如果是这种情况,您的证书可能被许多浏览器视为不受信任。

如果您上传了由根机构签名的证书,但收到消息说它不受信任,则证书有问题。例如,它可能缺少[中间证书][]。如果是这样,从您的 SSL 提供商下载中间证书,从 Drycc 中删除证书,然后重新运行 certs add 命令。

16 - 使用 drycc 路径

Drycc 容器注册表允许您将基于 Docker 的应用部署到 Drycc。支持通用运行时和私有空间。

Drycc 堆栈仅适用于高级用例。除非您有自定义 Docker 镜像的具体需求,否则我们建议使用 Drycc 的默认 buildpack 驱动的构建系统。它提供自动基础镜像安全更新和特定于语言的优化。它还避免了维护容器 Dockerfile 的需要。

Drycc 配置路径概述

Drycc 仓库有两种不同的形式:

  • 工作树根目录下的 .drycc 目录;

  • 根目录是一个"裸"仓库(即没有自己的工作树)。 通常用于 drycc pull

Drycc 仓库中可能存在这些东西。

config/[a-z0-9]+(\.[a-z0-9]+)*::
        配置文件名,文件名是组名。
        格式是环境变量格式。

[a-z0-9]+(\-[a-z0-9]+)*.(yaml|yml)::
        流水线配置文件。

配置格式

Environment variables follow = formatting. By convention, but not rule, environment variable names are always capitalized.

配置格式

环境变量遵循 = 格式。按照惯例,但不是规则,环境变量名称总是大写的。

DEBUG=true
JVM_OPTIONS=-XX:+UseG1GC

流水线格式

清单有三个顶级部分。

  • build – 指定要构建的 Dockerfile。
  • env – 指定容器中的环境变量。
  • run – 指定要执行的发布阶段任务。
  • config – 指定配置组,全局组自动引用。
  • deploy – 指定部署的命令和参数。

这是一个说明使用清单构建 Docker 镜像的示例。

kind: pipeline
ptype: web
build:
  docker: Dockerfile
  arg:
    CODENAME: bookworm
env:
  VERSION: 1.2.1
run:
  command:
  - ./deployment-tasks.sh
  image: task
  timeout: 100
config:
- jvm-config
deploy:
  command:
  - bash
  - -ec
  args:
  - bundle exec puma -C config/puma.rb

有关更多部署信息,请参考 drycc 示例

Pipeline format

A manifest has three top-level sections.

  • build – Specifies the to build Dockerfile.
  • env – Specifies environment variables in container.
  • run – Specifies the release phase tasks to execute.
  • config – Specifies config group, global group automatic reference.
  • deploy – Specifies the commands and args to deploy.

Here’s an example that illustrates using a manifest to build Docker images.

kind: pipeline
ptype: web
build:
  docker: Dockerfile
  arg:
    CODENAME: bookworm
env:
  VERSION: 1.2.1
run:
  command:
  - ./deployment-tasks.sh
  image: task
  timeout: 100
config:
- jvm-config
deploy:
  command:
  - bash
  - -ec
  args:
  - bundle exec puma -C config/puma.rb

For more deployment information, please refer to the drycc examples.