使用 kubectl 进行部署

要使用 kubectl 进行安装,您需要获取 Kubernetes 配置文件。

它们包含部署的不同应用程序和服务所需的服务发现所需的元数据。要查看代码,请输入以下命令

git clone https://github.com/spring-cloud/spring-cloud-dataflow
cd spring-cloud-dataflow
git checkout main

如果您使用 Minikube,请参阅设置 Minikube 资源,了解有关 CPU 和 RAM 资源需求的详细信息。

通过 install-scdf.sh 脚本安装 Spring Cloud Data Flow。

Spring Cloud Data Flow 提供了 install-scdf.sh 脚本,该脚本将执行 kubectl 命令,以便在 Kubernetes 上安装用于开发目的的 SCDF。如果您无法运行 shell 脚本,则可以按照下方所示的手动说明进行操作。该脚本当前支持以下 Kubernetes 平台:kindminikubegketmc

配置 Spring Cloud Data Flow 创建 Grafana 仪表板

如果您希望在 Grafana 中查看由 SCDF 启动的应用程序的指标,请在执行 install-scdf.sh 脚本之前,编辑 src/deploy/k8s/yaml/server-config.yaml 并将 management.defaults.metrics.export.enabled 设置为 true

配置 install-scdf.sh 并安装 Spring Cloud Data Flow

环境设置

该脚本提供以下环境变量来确定您希望如何安装 SCDF

  • NS - 确定将安装数据流实例的命名空间。
  • K8S_DRIVER - 根据您的 Kubernetes 部署配置 Kubernetes 环境。目前支持 kinddocker(minikube)、tmc。默认为 kind
  • DOCKER_SERVER - 您环境中支持的 Docker 注册表。
  • DOCKER_USER - Docker 服务器的用户。
  • DOCKER_PASSWORD - Docker 服务器的密码。
  • DOCKER_EMAIL - Docker 服务器的电子邮件。
  • DATABASE - 要由 Spring Cloud Data Flow 和任务应用程序设置和使用的数据库。目前支持 mariadbpostgresql。默认为 postgresql
  • BROKER - 要由 Spring Cloud Data Flow 及其流应用程序设置和使用的消息代理。目前支持 rabbitmqkafka。默认为 rabbitmq
  • PROMETHEUS - 如果设置为 true,则设置 prometheus、prometheus-proxy 和 grafana 实例。默认为 false

在执行 install-scdf.sh 之前,您可以使用 use-*.sh 脚本之一配置本地环境

cd <home directory of spring cloud data flow>/src/deploy/k8s/
source ./use-kind.sh --namespace test-ns mariadb kafka

这将导出 NS=test-ns, K8S_DRIVER=kind, DATABASE=mariadb, BROKER=kafka 并使用 kind 创建 Kubernetes 环境。

用于设置在本地机器上运行的 Kubernetes 环境的可用 use-* 脚本如下

  • use-kind.sh - 设置环境变量以在您的 Kind 实例上部署 SCDF 应用程序。
  • use-mk-docker.sh - 设置环境变量以在 Docker 上的 Minikube 实例上部署 SCDF 应用程序。
  • use-mk-kvm2.sh - 设置环境变量以使用 KVM2 在您的 Minikube 实例上部署 SCDF 应用程序。
  • use-tmc.sh - 建立使用 Tanzu Mission Control 部署 SCDF 应用程序的环境变量。
  • use-gke.sh - 建立在 Google Kubernetes Engine 上部署 SCDF 应用程序的环境变量。

可选地,SCDF 提供了 configure-k8s.sh 脚本,用于在运行 use-* 脚本后,根据 Kubernetes 实例类型验证或设置您的集群和命名空间。

  • Kind - 创建集群和命名空间。
  • Minikube 使用适合 SCDF 的大小启动 minikube 实例。
  • TMC 或 GKE - 验证是否已设置环境变量。

可以按如下方式启动

cd <home directory of spring cloud data flow>/src/deploy/k8s/
./configure-k8s.sh

要启动 install-scdf.sh 以便在 Minikube 的 default 命名空间中部署 Spring Cloud Data Flow,使用 Dockerhub 作为您的注册表,Mariadb 作为您的数据库,Rabbitmq 作为您的代理,以及 Prometheus 作为您的指标,您可以按如下方式设置和启动脚本

cd <home directory of spring cloud data flow>/src/deploy/k8s/
source ./use-mk-docker.sh --namespace mariadb rabbitmq
export DOCKER_SERVER=registry.hub.docker.com
export DOCKER_USER=<your user name>
export DOCKER_PASSWORD=<your password>
export DOCKER_EMAIL=<your email>
export PROMETHEUS=true
./install-scdf.sh

要从您的本地机器访问上述示例的 SCDF 和 Grafana 端口,请运行以下命令

kubectl port-forward <scdf-podname> 9393:9393
kubectl port-forward <grafana-podname> 3000:3000

在某些机器上,Spring Cloud Data Flow 或 Skipper 的启动时间可能比当前配置要长。如果是这样,您可能需要更新 src/deploy/k8s/yaml/server-deployment.yamlsrc/deploy/k8s/yaml/skipper-deployment.yaml 文件中的 spec.template.spec.containers.startupProbe.initialDelaySeconds

通过 delete-scdf.sh 脚本卸载 Spring Cloud Data Flow。

如果要删除由 install-scdf.sh 创建的 SCDF 部署,请设置以下环境变量

  • NS - 建立部署数据流实例的命名空间。
  • K8S_DRIVER - 部署 SCDF 的 Kubernetes 环境。目前支持 kinddocker (minikube)、tmc。默认为 kind
  • DOCKER_SERVER - 您的环境支持的 Docker 注册表
  • DATABASE - 要删除的由 Spring Cloud Data Flow 和 Task 应用程序使用的数据库。目前支持 mariadbpostgresql。默认为 postgresql
  • BROKER - 要删除的由 Spring Cloud Data Flow 及其流应用程序使用的消息代理。目前支持 rabbitmqkafka。默认为 rabbitmq
  • PROMETHEUS - 如果设置为 true,则删除 prometheus、prometheus-proxy 和 grafana 实例。默认为 false

例如,如果要删除部署在 Minikube 的 default 命名空间中的 Spring Cloud Data Flow,使用 Mariadb 作为数据库,Rabbitmq 作为代理,以及 Prometheus,您可以按如下方式设置和启动脚本

cd <home directory of spring cloud data flow>/src/deploy/k8s/
export NS=default
export K8S_DRIVER=docker
export DATABASE=mariadb
export PROMETHEUS=true
./delete-scdf.sh

Kubectl 安装说明

如果 install-scdf.sh 脚本对您不起作用,或者您希望以其他方式安装 SCDF,则可以使用以下说明

选择消息代理

为了使已部署的应用程序能够相互通信,您需要选择一个消息代理。示例部署和服务 YAML 文件提供了 RabbitMQ 和 Kafka 的配置。您只需要配置一个消息代理。

RabbitMQ

运行以下命令以启动 RabbitMQ 服务

kubectl create -f src/kubernetes/rabbitmq/

您可以使用 kubectl get all -l app=rabbitmq 来验证部署、Pod 和服务资源是否正在运行。

Kafka

运行以下命令以启动 Kafka 服务

kubectl create -f src/kubernetes/kafka/

您可以使用 kubectl get all -l app=kafka 来验证部署、Pod 和服务资源是否正在运行。

部署服务、Skipper 和数据流

您必须部署许多服务和数据流服务器。以下小节介绍了如何执行此操作

  1. 部署 MariaDB
  2. 启用监控
  3. 创建数据流角色绑定和服务帐户
  4. 部署 Skipper
  5. 部署数据流服务器

部署 MariaDB

我们在本指南中使用 MariaDB,但您也可以使用 Postgres 或 H2 数据库。我们包含了这三种数据库的 JDBC 驱动程序。要使用 MariaDB 以外的数据库,您必须调整数据库 URL 和驱动程序类名设置。

密码管理

如果您希望更加安全,可以修改 src/kubernetes/mariadb/mariadb-deployment.yaml 文件中的密码。如果修改了密码,则还必须在 src/kubernetes/mariadb/mariadb-secrets.yaml 文件中以 base64 编码字符串的形式提供它。

运行以下命令以启动 MariaDB 服务

kubectl create -f src/kubernetes/mariadb/

您可以使用 kubectl get all -l app=mariadb 来验证部署、Pod 和服务资源是否正在运行。您可以使用

启用监控

如何启用监控因监控平台而异

Prometheus 和 Grafana

Prometheus RSocket 实现允许您在所有流和任务应用程序与一个或多个 Prometheus RSocket 代理 实例之间建立持久的双向 RSocket 连接。Prometheus 配置为抓取每个代理实例。代理进而使用该连接从每个应用程序中拉取指标。抓取的指标可通过 Grafana 仪表板查看。开箱即用,Grafana 仪表板预先配置了 Prometheus 数据源连接以及特定于数据流的仪表板,以监控数据管道中的流和任务应用程序。

内存资源

如果您使用 Minikube,请参阅设置 Minikube 资源,了解有关 CPU 和 RAM 资源需求的详细信息。

要运行 Prometheus 和 Grafana,您至少需要额外的 2GB 到 3GB 内存。

设置 Prometheus 角色、角色绑定和服务帐户

运行以下命令以创建集群角色、绑定和服务帐户

kubectl create -f src/kubernetes/prometheus/prometheus-clusterroles.yaml
kubectl create -f src/kubernetes/prometheus/prometheus-clusterrolebinding.yaml
kubectl create -f src/kubernetes/prometheus/prometheus-serviceaccount.yaml
部署 Prometheus 代理

运行以下命令以部署 Prometheus RSocket 代理

kubectl create -f src/kubernetes/prometheus-proxy/

您可以使用 kubectl get all -l app=prometheus-proxy 来验证部署、Pod 和服务资源是否正在运行。

部署 Prometheus

运行以下命令以部署 Prometheus

kubectl create -f src/kubernetes/prometheus/prometheus-configmap.yaml
kubectl create -f src/kubernetes/prometheus/prometheus-deployment.yaml
kubectl create -f src/kubernetes/prometheus/prometheus-service.yaml

您可以使用 kubectl get all -l app=prometheus 来验证部署、Pod 和服务资源是否正在运行。

部署 Grafana

运行以下命令以部署 Grafana

kubectl create -f src/kubernetes/grafana/

您可以使用 kubectl get all -l app=grafana 来验证部署、Pod 和服务资源是否正在运行。

您应该替换以下示例中显示的 url 属性值(来自 src/kubernetes/server/server-config.yaml),以反映 Grafana 运行的地址和端口。在 Minikube 上,您可以通过运行 minikube service --url grafana 获取该值。

如果您看到以下消息

❗  Because you are using a Docker driver on darwin, the terminal needs to be open to run it.

请改用以下命令:kubectl port-forward <grafana pod name> 3000:3000 并将 server-config.yaml 中的 url 设置为 http://localhost:3000

spring:
  cloud:
    dataflow:
      metrics.dashboard:
        url: 'https://grafana:3000'

默认的 Grafana 仪表板凭据是用户名 admin 和密码 password。您可以通过修改 src/kubernetes/grafana/grafana-secret.yaml 文件来更改这些默认值。

要为 Spring Cloud Skipper Server 启用 Prometheus,请将 Data Flow 配置镜像到 Skipper 的配置文件(src/kubernetes/skipper/skipper-config-{kafka|rabbit}.yaml

management:
  metrics:
    export:
      prometheus:
        enabled: true
        rsocket:
          enabled: true
          host: prometheus-proxy
          port: 7001

如果您不想部署 Prometheus 和 Grafana 来进行指标收集和监控,则应删除 src/kubernetes/server/server-config.yaml 的以下部分

management:
  metrics:
    export:
      prometheus:
        enabled: true
        rsocket:
          enabled: true
          host: prometheus-proxy
          port: 7001
spring:
  cloud:
    dataflow:
      metrics.dashboard:
        url: 'https://grafana:3000'
Wavefront

Spring Cloud Data Flow 服务器以及已部署的流和任务的指标可以发送到 Wavefront 服务。在启用 Wavefront 之前,请确保您拥有 Wavefront URL 和 API 令牌。

首先,在一个名为 wavefront-secret.yaml 的文件中创建一个密钥(用于编码您的 API 令牌)

apiVersion: v1
kind: Secret
metadata:
  name: wavefront-api
  labels:
    app: wavefront
data:
  wavefront-api-token: bXl0b2tlbg==

wavefront-api-token 的值是一个 base64 编码的字符串,表示您的 API 令牌。有关密钥的更多信息,请参阅 Kubernetes 文档

创建密钥

kubectl create -f wavefront-secret.yaml

要挂载密钥并使其可用于 Spring Cloud Data Flow,请修改 src/kubernetes/server/server-deployment.yaml 文件,进行以下添加

密钥 mountPath 应该与 SPRING_CLOUD_KUBERNETES_SECRETS_PATHS 位于同一路径下。

spec:
  containers:
    - name: scdf-server
      volumeMounts:
        - name: wavefront-api
          mountPath: /etc/secrets/wavefront-api
          readOnly: true
  volumes:
    - name: wavefront-api
      secret:
        secretName: wavefront-api

您可以根据需要为 Spring Cloud Data Flow 服务器、流或任务启用 Wavefront。每个组件都是独立配置的,可以单独配置一个或全部配置。

要为 Spring Cloud Data Flow 服务器启用 Wavefront,请修改 src/kubernetes/server/server-config.yaml 文件,进行以下添加

data:
  application.yaml: |-
    management:
      metrics:
        export:
          wavefront:
            enabled: true
            api-token: ${wavefront-api-token}
            uri: https://yourwfuri.wavefront.com
            source: yoursourcename

urisource 的值更改为与您的设置相匹配的值。api-token 值会自动从密钥中解析。

默认情况下,上述配置也会自动应用于已部署的流和任务,并且来自它们的指标会发送到 Wavefront。使用 applicationProperties.stream.*applicationProperties.task.* 可以更改默认值。

要为 Spring Cloud Skipper 服务器启用 Wavefront,请将 Data Flow 配置镜像到 Skipper 的配置文件(src/kubernetes/skipper/skipper-config-{kafka|rabbit}.yaml),并将 wavefront-api 卷添加到 src/kubernetes/skipper/skipper-deployment.yaml 文件中。

您应该替换 src/kubernetes/server/server-config.yaml 中以下示例中的 url 属性值,以反映 Wavefront 仪表板运行的地址和端口。当从 Web 浏览器访问仪表板时,需要此配置才能访问 Wavefront 链接。

spring:
  cloud:
    dataflow:
      metrics.dashboard:
        url: 'https://yourwfuri.wavefront.com'
        type: 'WAVEFRONT'

创建数据流角色绑定和服务帐户

要创建角色绑定和服务帐户,请运行以下命令

kubectl create -f src/kubernetes/server/server-roles.yaml
kubectl create -f src/kubernetes/server/server-rolebinding.yaml
kubectl create -f src/kubernetes/server/service-account.yaml

您可以使用 kubectl get roleskubectl get sa 列出可用的角色和服务帐户。

部署 Skipper

Data Flow 将流生命周期管理委托给 Skipper。您需要部署 Skipper 才能启用流管理功能。

部署定义在 src/kubernetes/skipper/skipper-deployment.yaml 文件中。要控制部署哪个版本的 Skipper,您可以修改容器规范中 Docker 镜像使用的标签,如下所示

spec:
  containers:
    - name: skipper
      image: springcloud/spring-cloud-skipper-server:2.11.3 #
  • 您可以根据需要更改版本。

多平台支持

Skipper 包含平台的概念,因此根据项目偏好定义“帐户”非常重要。

要使用 RabbitMQ 作为消息中间件,请运行以下命令

kubectl create -f src/kubernetes/skipper/skipper-config-rabbit.yaml

要使用 Apache Kafka 作为消息中间件,请运行以下命令

kubectl create -f src/kubernetes/skipper/skipper-config-kafka.yaml

此外,要使用Apache Kafka Streams Binder,请更新 environmentVariables 属性以在 src/kubernetes/skipper/skipper-config-kafka.yaml 中包含 Kafka Streams Binder 配置,如下所示

environmentVariables: 'SPRING_CLOUD_STREAM_KAFKA_BINDER_BROKERS=kafka-broker:9092,SPRING_CLOUD_STREAM_KAFKA_BINDER_ZK_NODES=${KAFKA_ZK_SERVICE_HOST}:${KAFKA_ZK_SERVICE_PORT}, SPRING_CLOUD_STREAM_KAFKA_STREAMS_BINDER_BROKERS=kafka-broker:9092,SPRING_CLOUD_STREAM_KAFKA_STREAMS_BINDER_ZK_NODES=${KAFKA_ZK_SERVICE_HOST}:${KAFKA_ZK_SERVICE_PORT}'

运行以下命令以启动 Skipper 作为 Spring Cloud Data Flow 的伴随服务器

kubectl create -f src/kubernetes/skipper/skipper-deployment.yaml
kubectl create -f src/kubernetes/skipper/skipper-svc.yaml

您可以使用 kubectl get all -l app=skipper 来验证部署、Pod 和服务资源是否正在运行。

部署 Data Flow 服务器

部署定义在 src/kubernetes/server/server-deployment.yaml 文件中。要控制部署哪个版本的 Spring Cloud Data Flow 服务器,请修改容器规范中 Docker 镜像使用的标签,如下所示

spec:
  containers:
    - name: scdf-server
      image: springcloud/spring-cloud-dataflow-server:2.11.3

您必须指定要部署的 Spring Cloud Data Flow 服务器版本。为此,请根据需要更改版本。本文档基于 2.11.3 版本。您可以将 docker latest 标签用于 BUILD-SNAPSHOT 版本。Skipper 服务应该正在运行,并且 src/kubernetes/server/server-deployment.yaml 中的 SPRING_CLOUD_SKIPPER_CLIENT_SERVER_URI 属性应该指向它。

Data Flow 服务器使用 Fabric8 Java 客户端库连接到 Kubernetes 集群。有多种方法可以配置客户端以连接集群。我们在将 Data Flow 服务器部署到 Kubernetes 时,使用环境变量来设置所需的值。我们还使用Spring Cloud Kubernetes 库来访问 Kubernetes ConfigMapSecrets 设置。

RabbitMQ 的 ConfigMap 设置在 src/kubernetes/skipper/skipper-config-rabbit.yaml 文件中指定,Kafka 的设置在 src/kubernetes/skipper/skipper-config-kafka.yaml 文件中指定。

MariaDB 密钥位于 src/kubernetes/mariadb/mariadb-secrets.yaml 文件中。如果您修改了 MariaDB 的密码,则应在 src/kubernetes/maria/mariadb-secrets.yaml 文件中进行更改。任何密钥都必须以 base64 编码提供。

要使用默认设置创建配置映射,请运行以下命令

kubectl create -f src/kubernetes/server/server-config.yaml

现在您需要创建服务器部署,方法是运行以下命令

kubectl create -f src/kubernetes/server/server-svc.yaml
kubectl create -f src/kubernetes/server/server-deployment.yaml

您可以使用 kubectl get all -l app=scdf-server 来验证部署、Pod 和服务资源是否正在运行。

您可以使用 kubectl get svc scdf-server 命令找到分配给 scdf-serverEXTERNAL_IP 地址。您可以在稍后使用该地址从 shell 进行连接。以下示例(包含输出)展示了如何执行此操作

kubectl get svc scdf-server
NAME         CLUSTER-IP       EXTERNAL-IP       PORT(S)    AGE
scdf-server  10.103.246.82    130.211.203.246   80/TCP     4m

在这种情况下,您需要使用的 URL 是 https://130.211.203.246

如果您使用 Minikube,则没有外部负载均衡器,并且 EXTERNAL_IP 显示为 <pending>。您需要使用为 scdf-server 服务分配的 NodePort。您可以使用以下命令(显示了其输出)来查找要使用的 URL

minikube service --url scdf-server
https://192.168.99.100:31991

如果您看到以下消息:❗ 因为您在 darwin 上使用 Docker 驱动程序,所以需要打开终端才能运行它。,请改用以下命令

kubectl port-forward <scdf-server pod name> 9393:80

关闭并清理数据流

停止并清理 RabbitMQ

使用 RabbitMQ 时,请使用 kubectl delete all -l app=rabbitmq 清理 RabbitMQ。

停止并清理 Kafka

使用 Kafka 时,请使用 kubectl delete all -l app=kafka 清理 Kafka。

停止并清理 MariaDB

使用 kubectl delete all,pvc,secrets -l app=mariadb 清理 Mariadb。

停止和清理 Prometheus 代理

您可以使用 kubectl delete all,cm,svc -l app=prometheus-proxy 来清理 Prometheus 代理。要清理 Prometheus 代理的角色、绑定和服务帐户,请运行以下命令

kubectl delete clusterrole,clusterrolebinding,sa -l app=prometheus-proxy

停止和清理 Prometheus

使用 kubectl delete all,cm,svc -l app=prometheus 来清理 Prometheus。

在需要清理 Prometheus 的集群角色和角色绑定时,请使用以下命令

kubectl delete clusterrole,clusterrolebinding,sa -l app=prometheus

停止和清理 Grafana

您可以使用 kubectl delete all,cm,svc,secrets -l app=grafana 来清理 Grafana。

停止和清理 Skipper

您可以使用 kubectl delete all,cm -l app=skipper 来清理 Skipper。

停止和清理数据流服务器

清理数据流的角色和绑定

要清理角色、绑定和服务帐户,请使用以下命令

kubectl delete role scdf-role
kubectl delete rolebinding scdf-rb
kubectl delete serviceaccount scdf-sa

停止并清理数据流服务器应用程序

您可以使用 kubectl delete all,cm -l app=scdf-server 来清理数据流服务器。