注意: 这是一份需要具备 Kubernetes 和 Helm 使用经验的动手指南。为了跟随本教程的步骤,你还需要三个正在运行的 Kubernetes 集群。
如果你支持开源并认同这一理念,请考虑给这个项目点个 ⭐️ 以支持这些出色的工具的开发者!
您的事件驱动型云
想象你是一位访问提供商XY门户的用户,正在探索他们的数据库即服务(DbaaS)或托管数据库产品。点击一个按钮或调用API(如果有提供的话),然后——你的数据库实例就会准备好。但你有没有想过,这个数据库是不是真的运行在传统的虚拟机上?这感觉更像是在一个Kubernetes集群里运行,对吧?你有没有想过,他们是如何基于内部开发者平台来构建这个云环境,并将其部署到门户上的呢?
让我们顺着这个想法继续想下去:想象一下数据库确实运行在Kubernetes上。当你点击 “创建” 按钮的时候会发生什么?这个操作会触发一个事件资源,指示何时以及如何部署数据库集群。这时,Sveltos 就开始发挥作用了,负责将部署管理到适当的集群中,获取所需的配置,并提供你需要的详细信息,使你能够无缝地连接到你的数据库。
虽然我不能透露所有像主要云服务提供商那样的云的技术细节(让我们避免任何法律问题!),或者也许我会自己搭建一个IDP解决方案。我将带你搭建一个类似的事件驱动型云架构。我们将逐一介绍每个组件,到最后,你将对这种架构有一个扎实的理解——甚至可能你自己也能搭建出一个基于IDP的云!
快速浏览在我们开始之前,首先,这里有几个要点你需要知道:本指南从头到尾都是实战操作,从零开始起步!你只需要准备三个运行中的集群:
- 管理群组
- 服务团队
- 工作负载及应用团队
我们将按以下步骤来:
- 安装先决条件:安装
sveltosctl
、cert-manager
和sveltos
,并在管理集群上应用所需的标签。 - 注册服务集群:准备服务集群以进行部署管理。
- 部署数据库操作符:在服务集群上安装
cloudnative-pg
操作符。 - 自动化数据库部署:让 Sveltos 自动部署一个 Postgres 数据库实例。
- 注册工作负载集群:将工作负载集群连接到架构。
- 部署应用:启动一个与 Postgres 数据库连接的应用。
图1:你会选哪条路呢?
咱们直接说正题。下面有两部分,分别是A和B。A是一个详细的指南,会解释背后发生了哪些事。B是一个快速部署的方法,无需真正理解,你可以相信任何你想要相信的事情。
咱们从A或B路线开始吧!
Path A: 深入研究在这节里,我们将一起一步步地进行,解释每个命令的作用,让你更好地了解背后发生了什么。
1. 安装 sveltosctl、cert-manager 和 sveltos,并在管理集群上添加标签。首先,我们来安装sveltosctl
(可以从这里下载),这是一个用于与Sveltos交互的命令行工具。这个工具将帮助我们跨集群管理部署。
这里是如何安装它:
#MacOS系统
# 下载并安装sveltosctl工具到/usr/local/bin/sveltosctl
sudo wget https://github.com/projectsveltos/sveltosctl/releases/download/v0.41.1/sveltosctl-darwin-arm64 -O /usr/local/bin/sveltosctl
# 设置权限,使下载的文件可执行
sudo chmod +x /usr/local/bin/sveltosctl
#Linux系统
# 下载并安装sveltosctl工具到/usr/local/bin/sveltosctl
sudo wget https://github.com/projectsveltos/sveltosctl/releases/download/v0.41.1/sveltosctl-linux-amd64 -O /usr/local/bin/sveltosctl
# 设置权限,使下载的文件可执行
sudo chmod +x /usr/local/bin/sveltosctl
图2:在客户端设备上安装Sveltosctl软件
现在,我们来用Helm安装一下Cert-Manager。这个工具帮我们管理证书,这对于集群间的安全通讯来说非常重要。
helm install cert-manager jetstack/cert-manager --namespace cert-manager --create-namespace --version v1.16.1 --set crds.enabled=true
注:helm
是一个包管理工具,用于管理和部署 Kubernetes 应用程序。cert-manager
是一个 Kubernetes 自定义资源,用于自动管理和处理 TLS/SSL 证书。namespace
是 Kubernetes 中用于隔离不同组或用户的资源管理方式。这里的命令是在 cert-manager
命名空间中安装 cert-manager
并设置相应的参数。
图3:安装Cert-Manager的Helm Chart包
接下来,我们将通过Helm来部署Sveltos栈。在这个步骤中,将在我们的管理集群上设置Sveltos的核心组件。
helm install projectsveltos projectsveltos/projectsveltos -n projectsveltos --create-namespace
此命令用于在projectsveltos 命名空间中安装 Projectsveltos Helm 图表。
图4:安装Projectsveltos的Helm Chart
给管理集群打上标签有助于 Sveltos 识别和组织各类集群,从而简化后续部署。
kubectl label sveltoscluster -n mgmt mgmt type=mgmt
注释:此命令用于为名为 sveltoscluster
的集群添加标签,指定命名空间为 mgmt
,标签为 type=mgmt
。
图5:标签管理集群
为了允许 Sveltos 使用诸如 ConfigMaps 和 Secrets 等资源,我们需要赋予特定权限。以下是具体步骤,如何修补 addon-controller-role-extra
ClusterRole :
kubectl patch clusterrole addon-controller-role-extra --type='json' -p='[
{
"op": "add",
"path": "/rules",
"value": [
{
"apiGroups": [""],
"resources": ["configmaps", "secrets"],
"verbs": ["*"]
}
]
}
]'
注:此命令用于为 addon-controller-role-extra
集群角色添加对 configmaps
和 secrets
的资源访问权限。
恭喜你!你完成了基本设置。我们继续来做第二步吧。
2. 注册服务集群账号这一步非常简单,多亏了 sveltosctl
,以下是连接管理集群和服务集群的步骤:
在命令行输入以下命令:
kubectl create 命名空间 service-cluster
sveltosctl 注册 集群 --命名空间=service-cluster --集群=service-cluster --fleet-cluster-context=service-cluster --标签=type=services
图6:注册服务集群,并给它标上标签。
在这一步里,我们连接了管理集群与受管服务集群。但是,让我们看看提供的参数,更好地理解一下。
--namespace=service-cluster
:将为受管集群在管理集群中创建命名空间
--cluster=service-cluster
:会在名为sveltoscluster的CustomResource管理集群中指定一个标识符。
--fleet-cluster-context=service-cluster
:将使用你的上下文名来连接应由 sveltos 管理的集群。比如我这里的上下文名是 service-cluster
--labels=types=services
:这会将标签(label)添加到所加入的托管集群,并允许通过标签在 sveltoscluster
自定义资源中部署应用,其中 sveltoscluster
允许基于标签部署应用。
使用以下命令来验证标签:
kubectl get sveltoscluster -A --show-labels
NAMESPACE NAME READY VERSION: 标签:
mgmt mgmt true v1.29.2+k3s1 projectsveltos.io/k8s-version=v1.29.2,sveltos-agent=存在,type=管理
service-cluster service-cluster true v1.29.2+k3s1 projectsveltos.io/k8s-version=v1.29.2,sveltos-agent=存在,type=服务
这样的设置使 Sveltos 能够识别并管理带有标签的服务集群,这在部署应用时非常有用。
如果你对 Sveltos 管理附加组件的方式有兴趣,可以进一步探索更多资源。现在,让我们继续部署 [cloudnative-pg](https://cloudnative-pg.io)
运算符来帮助在服务集群上设置托管服务。
要部署 CloudNative-PG 操作符,我们需要在管理集群上应用一个 ClusterProfile
自定义资源对象。这个 ClusterProfile
告诉 Sveltos 在具有特定标签的集群上部署操作符(operator)。
运行以下命令来应用ClusterProfile
:
运行以下命令来应用云原生 PostgreSQL 配置文件:
kubectl apply -f https://raw.githubusercontent.com/projectsveltos/sveltos/main/docs/assets/cloudnative-pg.yaml
完成这一步后,我们的设置就会是这样。
图7:根据ClusterProfile配置部署PG-Operator组件
ClusterProfile 是什么?
一个 ClusterProfile
类似于一个蓝图,定义了应该部署在带有特定标签的集群上的资源。在这种情况下,该配置档针对带有 type=services
标签的集群,并指示 Sveltos 在那里安装 CloudNative-PG Helm chart。这里是一个示例配置档。
---
apiVersion: config.projectsveltos.io/v1beta1
kind: ClusterProfile
metadata:
name: deploy-cnpg
spec:
clusterSelector:
matchLabels:
type: 服务
sync: 同步
helm图表清单:
- repositoryURL: https://cloudnative-pg.github.io/charts
repositoryName: cloudnative-pg
chartName: 图表名称
chartVersion: 图表版本
releaseName: 发布名称
releaseNamespace: 发布命名空间
helm操作: 安装
在本例中,带有 type=services
标签的任何集群都将自动安装 CloudNative-PG Helm 图,并持续同步,按照指定的方式。
要检查部署在服务集群中的资源,你可以用这些方法。
sveltosctl 显示插件列表
+-----------------------------------+----------------------------+------------------+-----------------------------------+---------+-------------------------------+---------------------------------------------+
| 集群 | 资源类型 | 命名空间 | 名称 | 版本 | 时间 | 配置文件名称 |
+-----------------------------------+----------------------------+------------------+-----------------------------------+---------+-------------------------------+---------------------------------------------+
| service-cluster/service-cluster | Helm 图表 | cnpg-system | cnpg | 0.22.1 | 2024-11-02 11:35:40 +0100 CET | ClusterProfile/deploy-cnpg |
+-----------------------------------+----------------------------+------------------+-----------------------------------+---------+-------------------------------+---------------------------------------------+
这表明 CloudNative-PG 操作符已经在服务集群上成功部署。
4. 让 Sveltos 自动部署一下 PostgreSQL在这一步中,我们将配置 Sveltos 使其自动在带有 postgres=required
标签的集群上部署 PostgreSQL 数据库。每当 Sveltos 检测到带有此标签的集群时,它将开始部署流程。
- 在一个集群上创建一个 PostgreSQL 实例。
- 通过负载均衡器服务暴露数据库。
- 获取凭证信息和连接信息,包括外部 IP 和端口。
要开启这个功能,你可以使用以下设置。
kubectl apply -f https://raw.githubusercontent.com/projectsveltos/sveltos/main/docs/assets/auto-deploy-postgres-cluster.yaml # 这条命令会应用一个自动部署PostgreSQL集群的配置文件。
kubectl apply -f https://raw.githubusercontent.com/projectsveltos/sveltos/main/docs/assets/fetch-postgres-data.yaml # 这条命令会应用一个用于获取PostgreSQL数据的配置文件。
这些设置创建了两个工作流程:
- 自动部署 PostgreSQL 数据库集群:在触发后,在带有
type=services
标签的集群上部署 PostgreSQL。 - 获取 PostgreSQL 数据库集群信息:根据特定触发事件获取 PostgreSQL 集群的连接信息和凭据。
第一个工作流程会是这样的,比如:
图8:工作流程1:自动部署 PostgreSQL 集群
在 Sveltos 中,EventSource 定义了要监控的特定事件(例如资源的创建或删除),而 EventTrigger 则指定了在这些事件发生时要部署的插件或应用。
这是应用资源的样子。
# any SveltosCluster with label postgres: required is created, a postgres cluster will be deployed.
# 源集群是管理集群,目标集群是带有标签 type:services 的集群。
apiVersion: lib.projectsveltos.io/v1beta1
kind: EventSource
metadata:
name: detect-cluster-requiring-postgres
spec:
collectResources: true
resourceSelectors:
- group: "lib.projectsveltos.io"
version: "v1beta1"
kind: "SveltosCluster"
labelFilters:
- key: postgres
operation: Equal
value: required
---
apiVersion: lib.projectsveltos.io/v1beta1
kind: EventTrigger
metadata:
name: deploy-postgres-cluster
spec:
sourceClusterSelector:
matchLabels:
type: mgmt
destinationClusterSelector:
matchLabels:
type: services
eventSourceName: detect-cluster-requiring-postgres
oneForEvent: true
policyRefs:
- name: postgres-cluster
namespace: default
kind: ConfigMap
---
apiVersion: v1
data:
cluster.yaml: |
apiVersion: postgresql.cnpg.io/v1
kind: Cluster
metadata:
name: cluster-{{ .Resource.metadata.name }}
namespace: {{ .Resource.metadata.namespace }}
labels:
cluster: {{ .Resource.metadata.namespace }}-{{ .Resource.metadata.name }}
spec:
instances: 3
bootstrap:
initdb:
database: todo
storage:
size: 1Gi
managed:
services:
disabledDefaultServices: ["ro", "r"]
additional:
- selectorType: rw
serviceTemplate:
metadata:
name: cluster-rw-lb
spec:
type: LoadBalancer
kind: ConfigMap
metadata:
annotations:
projectsveltos.io/instantiate: ok
name: postgres-cluster
namespace: default
这是将会发生的情况的解释以及Sveltos将如何处理这种情况。
- EventSource 的定义:监控带有
postgres: required
标签的SveltosCluster
对象的创建。当创建了这样的标记集群时,Sveltos 会识别该事件为重要事件。 - EventTrigger 的定义:EventTrigger
deploy-postgres-cluster
在该事件发生时触发。它配置为在目标集群(带有type: services
标签)中部署 PostgreSQL 集群,源集群是带有type: mgmt
标签的管理集群。 - PostgreSQL 集群部署:EventTrigger 引用了包含 PostgreSQL 集群模板的
ConfigMap
(postgres-cluster
)。当事件被触发时,Sveltos 使用该模板在目标集群中创建 PostgreSQL 集群。模板动态地包含了原集群的名称和命名空间等详细信息。
总之,Sveltos 会查看带有特定标签的集群,当发现匹配时,自动部署一个 PostgreSQL 集群在指定的目标集群里。
第二个工作流程是由两个工作流程组合而成,它看起来像:
图9:工作流2:抓取PostgreSQL集群数据
在此设置中,Sveltos 被配置为从服务集群中提取 PostgreSQL 凭证和负载均衡器的相关信息,并将这些信息在管理集群中使可用,以便在管理集群中使用。
获取 PostgreSQL 凭据
- 事件来源 :
detect-credentials-secret
监控那些带有标签cnpg.io/reload: true
的Secret
对象,表明这些秘密包含 PostgreSQL 凭证。 - 触发器 : 当检测到带有
type: services
标签的集群中的此类Secret
时,credentials-secret
会被激活,从而启动创建一个包含 PostgreSQL 凭证的Secret
对象。 - ConfigMap 模板 :
credentials
ConfigMap 包含一个模板,用于在管理集群中创建名为pg-credentials
的Secret
对象。此模板动态地从服务集群中的原始Secret
中提取用户名和密码,让 Sveltos 能够安全地复制这些凭证。
查询负载均衡器信息:
- 事件来源 :
detect-loadbalancer
会监控 services 集群中标记为cnpg.io/isManaged: true
的Service
对象,表明这些是受管理的 PostgreSQL 负载均衡器。 - 事件触发器 : 当检测到这样的 Service 时,
cnpg-loadbalancer-data
会触发,并在管理集群中创建一个 ConfigMap,存储着负载均衡器的外部 IP 和端口信息。 - ConfigMap 模板 : 使用
loadbalancer-data
ConfigMap 模板在管理集群中生成一个名为pg-loadbalancer-data
的 ConfigMap。该 ConfigMap 包含负载均衡器的外部 IP 地址和端口,从而允许从管理集群外部可访问 PostgreSQL 实例。
这样,管理集群就可以安全且灵活地访问服务集群中实例的PostgreSQL凭证和连接信息。
接下来,我们按照以下步骤来注册工作负载集群来触发事件。
5. 注册工作集群。现在,让我们使用 Sveltos 来注册工作负载集群。通过给该集群加上 postgres=required
的标签,我们让 Sveltos 在服务集群中部署一个新的 PostgreSQL 实例并获取所需的连接信息。这里是如何注册工作负载集群。
使用 `kubectl` 创建名为 `workload-cluster` 的命名空间,然后使用 `sveltosctl` 注册集群,指定命名空间为 `workload-cluster`,集群名称也为 `workload-cluster`,并设置 `fleet-cluster-context` 为 `workload-cluster`,同时添加标签 `postgres=required`。
一旦集群注册成功,Sveltos 会自动触发我们在第 4 步设置的工作流(Workflow)。以下是幕后发生的情况:
- 触发部署并收集数据
Sveltos 使用之前EventTrigger
配置中定义的模板创建ClusterProfiles
和ConfigMaps
。基于这些模板,它在服务集群的workload-cluster
命名空间下部署一个 PostgreSQL 集群。它还会将数据库的连接信息(例如凭证和负载均衡器 IP 地址)存储到管理集群的workload-cluster
命名空间中。 - 自动创建 ClusterProfile 和 ConfigMap 对象
Sveltos 生成一个ClusterProfile
,该配置针对类型为services
的集群,并引用该从模板创建的新 ConfigMap。以下是一个生成的ClusterProfile
示例:
这会看起来像:
图10:将PG-Cluster部署到Service-Cluster上并获取PG-Data数据
所以 Sveltos 根据目标集群创建匹配的 ClusterProfile。它会让 ClusterProfile 引用新创建的 ConfigMap。
你可以看到它是如何创建一个新的_ClusterProfile_的。
apiVersion: config.projectsveltos.io/v1beta1
kind: ClusterProfile
metadata:
finalizers:
- clusterprofilefinalizer.projectsveltos.io
generation: 1
labels:
eventtrigger.lib.projectsveltos.io/clusterNamespace: mgmt
eventtrigger.lib.projectsveltos.io/clustername: mgmt
eventtrigger.lib.projectsveltos.io/clustertype: Sveltos
eventtrigger.lib.projectsveltos.io/eventreportname: detect-cluster-requiring-postgres
eventtrigger.lib.projectsveltos.io/eventtriggername: deploy-postgres-cluster
eventtrigger.lib.projectsveltos.io/resourcename: workload-cluster
eventtrigger.lib.projectsveltos.io/resourcenamespace: workload-cluster
projectsveltos.io/cluster-name: service-cluster
projectsveltos.io/cluster-profile-name: sveltos-j7dn263no745a5e58uya
projectsveltos.io/cluster-type: Sveltos
name: sveltos-j7dn263no745a5e58uya
spec:
clusterSelector:
matchLabels:
type: services
continueOnConflict: false
policyRefs:
- deploymentType: Remote
kind: ConfigMap
name: sveltos-bnnnp8dv2ndb8i7dx1vo
namespace: projectsveltos
reloader: false
stopMatchingBehavior: WithdrawPolicies
syncMode: Continuous
tier: 100
在这里你可以看到 ConfigMap 引用了用于创建集群的 CustomResource :
apiVersion: v1
kind: 配置映射
metadata:
labels:
eventtrigger.lib.projectsveltos.io/clusterNamespace: mgmt
eventtrigger.lib.projectsveltos.io/clustername: mgmt
eventtrigger.lib.projectsveltos.io/clustertype: Sveltos
eventtrigger.lib.projectsveltos.io/eventreportname: 检测需要PostgreSQL的集群
eventtrigger.lib.projectsveltos.io/eventtriggername: 部署PostgreSQL集群
eventtrigger.lib.projectsveltos.io/refname: postgres-cluster
eventtrigger.lib.projectsveltos.io/refnamespace: default
eventtrigger.lib.projectsveltos.io/resourcename: workload-cluster
eventtrigger.lib.projectsveltos.io/resourcenamespace: workload-cluster
name: sveltos-bnnnp8dv2ndb8i7dx1vo
namespace: 命名空间
data:
cluster.yaml: |
apiVersion: postgresql.cnpg.io/v1
kind: 集群
metadata:
name: cluster-workload-cluster
namespace: workload-cluster
labels:
cluster: workload-cluster-workload-cluster
spec:
实例: 3
引导:
初始化数据库:
数据库: todo
存储:
大小: 1Gi
管理:
服务:
禁用默认服务: ["ro", "r"]
额外:
- 选择器类型: rw
服务模板:
元数据:
名称: cluster-rw-lb
规范:
类型: 负载均衡器
当然,这只是其中一个例子——你可以做更多的事情,比如使用Helm安装一个图表,从而无需在_ConfigMap_中指定它(详见结尾部分)。
现在,让我们验证Sveltos是否已成功部署PostgreSQL实例并获取连接信息。要检查连接信息,请使用:
kubectl get secret -n workload-cluster
# 输出
名称 类型 数据量 持续时间
workload-cluster-sveltos-kubeconfig Opaque 1 47h
pg-credentials Opaque 2 47h
The pg-credentials
secret 包含 PostgreSQL 凭据:
data:
password: bTloa....
账号: d...
查看连接信息(外部IP和端口信息),可以使用:
kubectl get configmap -n workload-cluster service-cluster-loadbalancer-data -oyaml 04.11.24 11:32:44 management-cluster/default ⎈
# 输出像这样
apiVersion: v1
data:
external-ip: 212.2.....
port: "5432"
这完成了设置,现在管理集群可以安全且自动地获取PostgreSQL实例的连接信息和凭证。
6. 部署一个能访问Postgres数据库的应用程序现在可以使用 Sveltos 在 workload-cluster 集群中部署一个(任务)。这个(任务)将访问运行在 services-cluster 中的 Postgres 数据库服务器。
这个“任务”以模板的形式存在,并将在所有带有 type=app
标签的集群中由 Sveltos 部署。
使用以下命令应用 YAML 文件:
kubectl apply -f https://raw.githubusercontent.com/projectsveltos/sveltos/main/docs/assets/job-to-create-table.yaml
使用以下命令为工作负载集群添加标签:
kubectl label sveltoscluster -n workloadcluster workload-cluster type=app
注意:这些命令用于在 Kubernetes 环境中执行特定操作。第一个命令应用一个 YAML 文件,该文件定义了一个作业来创建表。第二个命令为指定的工作负载集群添加了一个标签,以便进行进一步的管理和识别。
它将会看起来像这样:
在可以访问服务集群中PG-DB的工作集群上部署一个任务
它连接到工作负载集群,创建一个新的ClusterProfile,指示Sveltos在该集群上部署一个type=app
的Job。
如果你仔细看看ClusterProfile,
apiVersion: config.projectsveltos.io/v1beta1
kind: ClusterProfile
metadata:
finalizers:
- 冒号clusterprofilefinalizer.projectsveltos.io冒号
name: deploy-job
spec:
clusterSelector:
matchLabels:
type: app
continueOnConflict: false
policyRefs:
- deploymentType: Remote
kind: ConfigMap
name: job-to-create-table
namespace: default
reloader: false
stopMatchingBehavior: WithdrawPolicies
syncMode: Continuous
templateResourceRefs:
- identifier: 凭证
resource:
apiVersion: v1
kind: Secret
name: pg-credentials
- identifier: 负载均衡器
resource:
apiVersion: v1
kind: ConfigMap
name: pg-loadbalancer-data
tier: 100
这里发生了什么。
- Sveltos 使用名为
job-to-create-table
的 ConfigMap,在default
命名空间中。 - 它用来自 Secret
pg-credentials
和 ConfigMappg-loadbalancer-data
中的数据替换模板中的值,根据标签type=app
(即 workload-cluster)匹配的命名空间。 - 然后,Sveltos 使用这些信息在远程集群中创建一个 Job,该 Job 匹配
type=app
标签(例如 workload-cluster)。
你可以检查资源配置是否按预期运行。
kubectl get clustersummaries -A -owide
NAMESPACE 名称 HELMCHARTS KUSTOMIZEREFS POLICYREFS
命名空间: mgmt 名字: sveltos-1a6ec1ce3bandndeqixd-sveltos-mgmt HELMCHARTS KUSTOMIZEREFS POLICYREFS 已配置
命名空间: mgmt 名字: sveltos-p46z943e935h2vtev56i-sveltos-mgmt HELMCHARTS KUSTOMIZEREFS POLICYREFS 已配置
命名空间: service-cluster 名字: deploy-cnpg-sveltos-service-cluster HELMCHARTS KUSTOMIZEREFS POLICYREFS 已配置
命名空间: service-cluster 名字: sveltos-xind5b6qvvrnbeur2flf-sveltos-service-cluster HELMCHARTS KUSTOMIZEREFS POLICYREFS 已配置
命名空间: workload-cluster 名字: deploy-job-sveltos-workload-cluster HELMCHARTS KUSTOMIZEREFS POLICYREFS 已配置
你现在应该能看到在工作负载集群中正在运行的 Job todo-table
。
#MacOs
# 下载并安装 sveltosctl for macOS
sudo wget https://github.com/projectsveltos/sveltosctl/releases/download/v0.41.1/sveltosctl-darwin-arm64 -O /usr/local/bin/sveltosctl
sudo chmod +x /usr/local/bin/sveltosctl
#Linux
# 下载并安装 sveltosctl for Linux
sudo wget https://github.com/projectsveltos/sveltosctl/releases/download/v0.41.1/sveltosctl-linux-amd64 -O /usr/local/bin/sveltosctl
sudo chmod +x /usr/local/bin/sveltosctl
#Cert-Manager
# 使用 Helm 安装 cert-manager
helm install cert-manager jetstack/cert-manager --namespace cert-manager --create-namespace --version v1.16.1 --set crds.enabled=true
#Sveltos
# 使用 Helm 安装 Sveltos
helm install projectsveltos projectsveltos/projectsveltos -n projectsveltos --create-namespace
# 标记管理的集群
kubectl label sveltoscluster -n mgmt mgmt type=mgmt
# 授予额外权限
kubectl patch clusterrole addon-controller-role-extra --type='json' -p='[
{
"op": "add",
"path": "/rules",
"value": [
{
"apiGroups": [""],
"resources": ["configmaps", "secrets"],
"verbs": ["*"]
}
]
}
]'
2. 注册服务组
# 创建服务集群的命名空间并注册集群
kubectl create ns service-cluster
sveltosctl register cluster --namespace=service-cluster --cluster=service-cluster --fleet-cluster-context=service-cluster --labels=type=services
检查标签:看看它们是否正确。
kubectl get sveltoscluster -A --show-labels
NAMESPACE 名称/NAME 就绪状态/READY 版本/VERSION 标签/LABELS
mgmt mgmt true v1.29.2+k3s1 projectsveltos.io/k8s-version=v1.29.2,sveltos-agent=present,type=mgmt
service-cluster 服务集群 true v1.29.2+k3s1 projectsveltos.io/k8s-version=v1.29.2,sveltos-agent=present,类型=服务
3. 在服务集群中部署 CloudNative-PG 操作符
kubectl apply -f https://raw.githubusercontent.com/projectsveltos/sveltos/main/docs/assets/cloudnative-pg.yaml
运行此命令来部署CloudNative PG。
现在你可以查看服务集群中部署的资源,方法如下:
sveltosctl 显示插件信息
+-----------------------------------+--------------------------+------------------+-----------------------------------+---------+-------------------------------+---------------------------------------------+
| 集群 | 资源种类 | 命名空间 | 插件名称 | 版本号 | 时间戳 | 配置文件 |
+-----------------------------------+--------------------------+------------------+-----------------------------------+---------+-------------------------------+---------------------------------------------+
| service-cluster/service-cluster | helm chart | cnpg-system | cnpg | 0.22.1 | 2024-11-02 11:35:40 +0100 CET | 部署配置文件/deploy-cnpg |
+-----------------------------------+--------------------------+------------------+-----------------------------------+---------+-------------------------------+---------------------------------------------+
4. 让 Sveltos 自动部署一个 PostgreSQL 数据库
执行以下命令来自动部署PostgreSQL集群和获取PostgreSQL数据:
kubectl apply -f https://raw.githubusercontent.com/projectsveltos/sveltos/main/docs/assets/auto-deploy-postgres-cluster.yaml
kubectl apply -f https://raw.githubusercontent.com/projectsveltos/sveltos/main/docs/assets/fetch-postgres-data.yaml
## 5\. 注册工作负载集群:
创建名为 workload-cluster 的命名空间
kubectl create ns workload-cluster
注册名为 workload-cluster 的集群,并设置相应的标签和上下文sveltosctl register cluster --namespace=workload-cluster --cluster=workload-cluster --fleet-cluster-context=workload-cluster --labels=postgres=required
现在 Sveltos 已经部署好了 Postgres 集群环境,并获取了连接所需的必要信息。
kubectl get secret -n workload-cluster
#结果
名称: 类型: 数据: 年龄:
workload-cluster-sveltos-kubeconfig Opaque 1 47h
pg-credentials Opaque 2 47h
## 6\. 部署一个可以访问PostgreSQL数据库的应用程序
使用 kubectl 应用从 GitHub 获取的 YAML 文件,并为 sveltoscluster 添加标签
kubectl apply -f https://raw.githubusercontent.com/projectsveltos/sveltos/main/docs/assets/job-to-create-table.yaml
kubectl label sveltoscluster -n workload-cluster workload-cluster type=app
检查是否按预期正确供应了:
kubectl get clustersummaries -A -owide
NAMESPACE 名称(NAME) HELMCHARTS KUSTOMIZEREFS POLICYREFS
mgmt sveltos-1a6ec1ce3bandndeqixd-sveltos-mgmt 已提供
mgmt sveltos-p46z943e935h2vtev56i-sveltos-mgmt 已提供
service-cluster deploy-cnpg-sveltos-service-cluster 已提供
service-cluster sveltos-xind5b6qvvrnbeur2flf-sveltos-service-cluster 已提供
workload-cluster deploy-job-sveltos-workload-cluster 已提供
你现在应该能看到有`todo-table`任务在工作负载集群中运行。
**恭喜!** 您已经创建了一个事件驱动的、管理型数据库即服务(DBaaS)! 您可以通过定义作业来扩展此设置,让用户或服务共享凭证,这些用户或服务是在UI中被引用的,如前面提到的例子所示。
# 结尾
我可以想象你现在在想GitOps部分在哪里呢?标题是不是只是想引起你的注意呢?实际上,Sveltos Addon-Controller的工作流实际上是基于GitOps方法的,但要获得完整的GitOps体验效果,你可以将Sveltos与Flux CD配对——它们已经集成在一起了。为什么使用Flux CD?要部署_ClusterProfiles_和应用其他的Sveltos自定义资源,你需要使用如Flux CD这样的GitOps工具。为什么使用Flux CD?要部署_ClusterProfiles_和应用其他的Sveltos自定义资源,你需要使用如Flux CD这样的GitOps工具。为什么使用Flux CD?要部署_ClusterProfiles_和应用其他的Sveltos自定义资源,你需要使用如Flux CD这样的GitOps工具。为什么使用Flux CD?要部署_ClusterProfiles_和应用其他的Sveltos自定义资源,你需要使用如Flux CD这样的GitOps工具。为什么要使用Flux CD?要部署_ClusterProfiles_和应用其他的Sveltos自定义资源,你需要使用如Flux CD这样的GitOps工具。为什么要使用Flux CD?要部署_ClusterProfiles_和应用其他的Sveltos自定义资源,你需要使用如Flux CD这样的GitOps工具。为什么要使用Flux CD?要部署_ClusterProfiles_和应用其他的Sveltos自定义资源,你需要使用如Flux CD这样的GitOps工具。为什么要使用Flux CD?要部署_ClusterProfiles_和应用其他的Sveltos自定义资源,你需要使用如Flux CD这样的GitOps工具。为什么要使用Flux CD?要部署_ClusterProfiles_和应用其他的Sveltos自定义资源,你需要使用如Flux CD这样的GitOps工具。为什么要使用Flux CD?要部署_ClusterProfiles_和应用其他的Sveltos自定义资源,你需要使用如Flux CD这样的GitOps工具。为什么要使用Flux CD?要部署_ClusterProfiles_和应用其他的Sveltos自定义资源,你需要使用如Flux CD这样的GitOps工具。为什么要使用Flux CD?要部署_ClusterProfiles_和应用其他的Sveltos自定义资源,你需要使用如Flux CD这样的GitOps工具。为什么要使用Flux CD?要部署_ClusterProfiles_和应用其他的Sveltos自定义资源,你需要使用如Flux CD这样的GitOps工具。为什么要使用Flux CD?要部署_ClusterProfiles_和应用其他的Sveltos自定义资源,你需要使用如Flux CD这样的GitOps工具。为什么要使用Flux CD?要部署_ClusterProfiles_和应用其他的Sveltos自定义资源,你需要使用如Flux CD这样的GitOps工具。为什么要使用Flux CD?要部署_ClusterProfiles_和应用其他的Sveltos自定义资源,你需要使用如Flux CD这样的GitOps工具。为什么要使用Flux CD?要部署_ClusterProfiles_和应用其他的Sveltos自定义资源,你需要使用如Flux CD这样的GitOps工具。为什么要使用Flux CD?要部署_ClusterProfiles_和应用其他的Sveltos自定义资源,你需要使用如Flux CD这样的GitOps工具。为什么要使用Flux CD?要部署_ClusterProfiles_和应用其他的Sveltos自定义资源,你需要使用如Flux CD这样的GitOps工具。为什么要使用Flux CD?要部署_ClusterProfiles_和应用其他的Sveltos自定义资源,你需要使用如Flux CD这样的GitOps工具。为什么要使用Flux CD?要部署_ClusterProfiles_和应用其他的Sveltos自定义资源,你需要使用如Flux CD这样的GitOps工具。为什么要使用Flux CD?要部署_ClusterProfiles_和应用其他的Sveltos自定义资源,你需要使用如Flux CD这样的GitOps工具。为什么要使用Flux CD?要部署_ClusterProfiles_和应用其他的Sveltos自定义资源,你需要使用如Flux CD这样的GitOps工具。为什么要使用Flux CD?要部署_ClusterProfiles_和应用其他的Sveltos自定义资源,你需要使用如Flux CD这样的GitOps工具。为什么要使用Flux CD?要部署_ClusterProfiles_和应用其他的Sveltos自定义资源,你需要使用如Flux CD这样的GitOps工具。为什么要使用Flux CD?要部署_ClusterProfiles_和应用其他的Sveltos自定义资源,你需要使用如Flux CD这样的GitOps工具。为什么要使用Flux CD?要部署_ClusterProfiles_和应用其他的Sveltos自定义资源,你需要使用如Flux CD这样的GitOps工具。为什么要使用Flux CD?要部署_ClusterProfiles_和应用其他的Sveltos自定义资源,你需要使用如Flux CD这样的GitOps工具。为什么要使用Flux CD?要部署_ClusterProfiles_和应用其他的Sveltos自定义资源,你需要使用如Flux CD这样的GitOps工具。为什么要使用Flux CD?要部署_ClusterProfiles_和应用其他的Sveltos自定义资源,你需要使用如Flux CD这样的GitOps工具。为什么要使用Flux CD?要部署_ClusterProfiles_和应用其他的Sveltos自定义资源,你需要使用如Flux CD这样的GitOps工具。为什么要使用Flux CD?要部署_ClusterProfiles_和应用其他的Sveltos自定义资源,你需要使用如Flux CD这样的GitOps工具。为什么要使用Flux CD?要部署_ClusterProfiles_和应用其他的Sveltos自定义资源,你需要使用如Flux CD这样的GitOps工具。为什么要使用Flux CD?要部署_ClusterProfiles_和应用其他的Sveltos自定义资源,你需要使用如Flux CD这样的GitOps工具。为什么要使用Flux CD?要部署_ClusterProfiles_和应用其他的Sveltos自定义资源,你需要使用如Flux CD这样的GitOps工具。为什么要使用Flux CD?要部署_ClusterProfiles_和应用其他的Sveltos自定义资源,你需要使用如Flux CD这样的GitOps工具。为什么要使用Flux CD?要部署_ClusterProfiles_和应用其他的Sveltos自定义资源,你需要使用如Flux CD这样的GitOps工具。为什么要使用Flux CD?要部署_ClusterProfiles_和应用其他的Sveltos自定义资源,你需要使用如Flux CD这样的GitOps工具。为什么要使用Flux CD?要部署_ClusterProfiles_和应用其他的Sveltos自定义资源,你需要使用如Flux CD这样的GitOps工具。为什么要使用Flux CD?要部署_ClusterProfiles_和应用其他的Sveltos自定义资源,你需要使用如Flux CD这样的GitOps工具。为什么要使用Flux CD?要部署_ClusterProfiles_和应用其他的Sveltos自定义资源,你需要使用如Flux CD这样的GitOps工具。为什么要使用Flux CD?要部署_ClusterProfiles_和应用其他的Sveltos自定义资源,你需要使用如Flux CD这样的GitOps工具。为什么要使用Flux CD?要部署_ClusterProfiles_和应用其他的Sveltos自定义资源,你需要使用如Flux CD这样的GitOps工具。为什么要使用Flux CD?要部署_ClusterProfiles_和应用其他的Sveltos自定义资源,你需要使用如Flux CD这样的GitOps工具。为什么要使用Flux CD?要部署_ClusterProfiles_和应用其他的Sveltos自定义资源,你需要使用如Flux CD这样的GitOps工具。为什么要使用Flux CD?要部署_ClusterProfiles_和应用其他的Sveltos自定义资源,你需要使用如Flux CD这样的GitOps工具。为什么要使用Flux CD?要部署_ClusterProfiles_和应用其他的Sveltos自定义资源,你需要使用如Flux CD这样的GitOps工具。为什么要使用Flux CD?要部署_ClusterProfiles_和应用其他的Sveltos自定义资源,你需要使用如Flux CD这样的GitOps工具。为什么要使用Flux CD?要部署_ClusterProfiles_和应用其他的Sveltos自定义资源,你需要使用如Flux CD这样的GitOps工具。为什么要使用Flux CD?要部署_ClusterProfiles_和应用其他的Sveltos自定义资源,你需要使用如Flux CD这样的GitOps工具。为什么要使用Flux CD?要部署_ClusterProfiles_和应用其他的Sveltos自定义资源,你需要使用如Flux CD这样的GitOps工具。为什么要使用Flux CD?要部署_ClusterProfiles_和应用其他的Sveltos自定义资源,你需要使用如Flux CD这样的GitOps工具。为什么要使用Flux CD?要部署_ClusterProfiles_和应用其他的Sveltos自定义资源,你需要使用如Flux CD这样的GitOps工具。为什么要使用Flux CD?要部署_ClusterProfiles_和应用其他的Sveltos自定义资源,你需要使用如Flux CD这样的GitOps工具。为什么要使用Flux CD?要部署_ClusterProfiles_和应用其他的Sveltos自定义资源,你需要使用如Flux CD这样的GitOps工具。为什么要使用Flux CD?要部署_ClusterProfiles_和应用其他的Sveltos自定义资源,你需要使用如Flux CD这样的GitOps工具。为什么要使用Flux CD?要部署_ClusterProfiles_和应用其他的Sveltos自定义资源,你需要使用如Flux CD这样的GitOps工具。为什么要使用Flux CD?要部署_ClusterProfiles_和应用其他的Sveltos自定义资源,你需要使用如Flux CD这样的GitOps工具。为什么要使用Flux CD?要部署_ClusterProfiles_和应用其他的Sveltos自定义资源,你需要使用如Flux CD这样的GitOps工具。为什么要使用Flux CD?要部署_ClusterProfiles_和应用其他的Sveltos自定义资源,你需要使用如Flux CD这样的GitOps工具。为什么要使用Flux CD?要部署_ClusterProfiles_和应用其他的Sveltos自定义资源,你需要使用如Flux CD这样的GitOps工具。为什么要使用Flux CD?要部署_ClusterProfiles_和应用其他的Sveltos自定义资源,你需要使用如Flux CD这样的GitOps工具。为什么要使用Flux CD?要部署_ClusterProfiles_和应用其他的Sveltos自定义资源,你需要使用如Flux CD这样的GitOps工具。为什么要使用Flux CD?要部署_ClusterProfiles_和应用其他的Sveltos自定义资源,你需要使用如Flux CD这样的GitOps工具。为什么要使用Flux CD?要部署_ClusterProfiles_和应用其他的Sveltos自定义资源,你需要使用如Flux CD这样的GitOps工具。为什么要使用Flux CD?要部署_ClusterProfiles_和应用其他的Sveltos自定义资源,你需要使用如Flux CD这样的GitOps工具。为什么要使用Flux CD?要部署_ClusterProfiles_和应用其他的Sveltos自定义资源,你需要使用如Flux CD这样的GitOps工具。为什么要使用Flux CD?要部署_ClusterProfiles_和应用其他的Sveltos自定义资源,你需要使用如Flux CD这样的GitOps工具。为什么要使用Flux CD?要部署_ClusterProfiles_和应用其他的Sveltos自定义资源,你需要使用如Flux CD这样的GitOps工具。为什么要使用Flux CD?要部署_ClusterProfiles_和应用其他的Sveltos自定义资源,你需要使用如Flux CD这样的GitOps工具。为什么要使用Flux CD?要部署_ClusterProfiles_和应用其他的Sveltos自定义资源,你需要使用如Flux CD这样的GitOps工具。为什么要使用Flux CD?要部署_ClusterProfiles_和应用其他的Sveltos自定义资源,你需要使用如Flux CD这样的GitOps工具。为什么要使用Flux CD?要部署_ClusterProfiles_和应用其他的Sveltos自定义资源,你需要使用如Flux CD这样的GitOps工具。为什么要使用Flux CD?要部署_ClusterProfiles_和应用其他的Sveltos自定义资源,你需要使用如Flux CD这样的GitOps工具。为什么要使用Flux CD?要部署_ClusterProfiles_和应用其他的Sveltos自定义资源,你需要使用如Flux CD这样的GitOps工具。为什么要使用Flux CD?要部署_ClusterProfiles_和应用其他的Sveltos自定义资源,你需要使用如Flux CD这样的GitOps工具。为什么要使用Flux CD?要部署_ClusterProfiles_和应用其他的Sveltos自定义资源,你需要使用如Flux CD这样的GitOps工具。为什么要使用Flux CD?要部署_ClusterProfiles_和应用其他的Sveltos自定义资源,你需要使用如Flux CD这样的GitOps工具。为什么要使用Flux CD?要部署_ClusterProfiles_和应用其他的Sveltos自定义资源,你需要使用如Flux CD这样的GitOps工具。为什么要使用Flux CD?要部署_ClusterProfiles_和应用其他的Sveltos自定义资源,你需要使用如Flux CD这样的GitOps工具。为什么要使用Flux CD?要部署_ClusterProfiles_和应用其他的Sveltos自定义资源,你需要使用如Flux CD这样的GitOps工具。为什么要使用Flux CD?要部署_ClusterProfiles_和应用其他的Sveltos自定义资源,你需要使用如Flux CD这样的GitOps工具。为什么要使用Flux CD?要部署_ClusterProfiles_和应用其他的Sveltos自定义资源,你需要使用如Flux CD这样的GitOps工具。为什么要使用Flux CD?要部署_ClusterProfiles_和应用其他的Sveltos自定义资源,你需要使用如Flux CD这样的GitOps工具。为什么要使用Flux CD?要部署_ClusterProfiles_和应用其他的Sveltos自定义资源,你需要使用如Flux CD这样的GitOps工具。为什么要使用Flux CD?要部署_ClusterProfiles_和应用其他的Sveltos自定义资源,你需要使用如Flux CD这样的GitOps工具。为什么要使用Flux CD?要部署_ClusterProfiles_和应用其他的Sveltos自定义资源,你需要使用如Flux CD这样的GitOps工具。为什么要使用Flux CD?要部署_ClusterProfiles_和应用其他的Sveltos自定义资源,你需要使用如Flux CD这样的GitOps工具。为什么要使用Flux CD?要部署_ClusterProfiles_和应用其他的Sveltos自定义资源,你需要使用如Flux CD这样的GitOps工具。为什么要使用Flux CD?要部署_ClusterProfiles_和应用其他的Sveltos自定义资源,你需要使用如Flux CD这样的GitOps工具。为什么要使用Flux CD?要部署_ClusterProfiles_和应用其他的Sveltos自定义资源,你需要使用如Flux CD这样的GitOps工具。为什么要使用Flux CD?要部署_ClusterProfiles_和应用其他的Sveltos自定义资源,你需要使用如Flux CD这样的GitOps工具。为什么要使用Flux CD?要部署_ClusterProfiles_和应用其他的Sveltos自定义资源,你需要使用如Flux CD这样的GitOps工具。为什么要使用Flux CD?要部署_ClusterProfiles_和应用其他的Sveltos自定义资源,你需要使用如Flux CD这样的GitOps工具。为什么要使用Flux CD?要部署_ClusterProfiles_和应用其他的Sveltos自定义资源,你需要使用如Flux CD这样的GitOps工具。为什么要使用Flux CD?要部署_ClusterProfiles_和应用其他的Sveltos自定义资源,你需要使用如Flux CD这样的GitOps工具。为什么要使用Flux CD?要部署_ClusterProfiles_和应用其他的Sveltos自定义资源,你需要使用如Flux CD这样的GitOps工具。为什么要使用Flux CD?要部署_ClusterProfiles_和应用其他的Sveltos自定义资源,你需要使用如Flux CD这样的GitOps工具。为什么要使用Flux CD?要部署_ClusterProfiles_和应用其他的Sveltos自定义资源,你需要使用如Flux CD这样的GitOps工具。为什么要使用Flux CD?要部署_ClusterProfiles_和应用其他的Sveltos自定义资源,你需要使用如Flux CD这样的GitOps工具。为什么要使用Flux CD?要部署_ClusterProfiles_和应用其他的Sveltos自定义资源,你需要使用如Flux CD这样的GitOps工具。为什么要使用Flux CD?要部署_ClusterProfiles_和应用其他的Sveltos自定义资源,你需要使用如Flux CD这样的GitOps工具。为什么要使用Flux CD?要部署_ClusterProfiles_和应用其他的Sveltos自定义资源,你需要使用如Flux CD这样的GitOps工具。为什么要使用Flux CD?要部署_ClusterProfiles_和应用其他的Sveltos自定义资源,你需要使用如Flux CD这样的GitOps工具。为什么要使用Flux CD?要部署_ClusterProfiles_和应用其他的Sveltos自定义资源,你需要使用如Flux CD这样的GitOps工具。为什么要使用Flux CD?要部署_ClusterProfiles_和应用其他的Sveltos自定义资源,你需要使用如Flux CD这样的GitOps工具。为什么要使用Flux CD?要部署_ClusterProfiles_和应用其他的Sveltos自定义资源,你需要使用如Flux CD这样的GitOps工具。为什么要使用Flux CD?要部署_ClusterProfiles_和应用其他的Sveltos自定义资源,你需要使用如Flux CD这样的GitOps工具。为什么要使用Flux CD?要部署_ClusterProfiles_和应用其他的Sveltos自定义资源,你需要使用如Flux CD这样的GitOps工具。为什么要使用Flux CD?要部署_ClusterProfiles_和应用其他的Sveltos自定义资源,你需要使用如Flux CD这样的GitOps工具。为什么要使用Flux CD?要部署_ClusterProfiles_和应用其他的Sveltos自定义资源,你需要使用如Flux CD这样的GitOps工具。
这只是你可以实现的一小部分。Sveltos 提供了多种事件驱动的管理服务。同时,该管理服务可以集成到内部开发者平台,为团队提供自助服务。
我们描绘了以下场景:

图12所示:1 K8s-集群 : 1 PG-集群
因为我们配置了ClusterProfiles,所以我们在服务集群内为工作负载集群与PostgreSQL集群建立了一一对应的关系,因为我们根据集群标签配置了ClusterProfiles。
也可以选择这样构建。

图13:关系 1 K8s-Cluster:N-PG-Cluster
与其根据集群的标签响应,你可以使用一个ConfigMap,例如,来表示需要一个PostgreSQL集群。基于这一点,Sveltos 可以基于每个命名空间/ConfigMap 创建多个 PostgreSQL 集群。但这超出了本文的讨论范围,但你可以在 [这里](https://projectsveltos.github.io/sveltos/events/db-as-a-service-multiple-db-per-cluster/) 找到相关说明和指导。
如果你不想让所有托管服务的凭证留在管理集群里,来解决安全问题的担忧,你可以这样做。

图14:1个K8s集群:N个PG集群和增强的安全性
在这里,凭证被存储在相应的计算集群中。
希望你能看到,这里的可能性是无限的,而你的想象力也许是这里唯一的限制。
如果你正在构建激动人心的解决方案,欢迎通过博客、教程等形式分享。但更重要的是,如果你相信开源并践行这一理念,[请给一个⭐️](https://github.com/projectsveltos/addon-controller)! 更酷的是通过博客分享,或者直接为[Projectsveltos](https://github.com/projectsveltos)贡献代码,如果你有足够的技能。
**附言**:请在评论中留言说明你选择了哪条路——你是“需要知道每个细节”的类型,还是“直接部署然后祈祷”的类型? 😬
# 联络方式
有问题想问、想聊天,或者只是想保持联系?不要在 Medium 的评论区停留,我们可以 [LinkedIn](http://www.linkedin.com/in/lajko) 上见 🤙。别忘了订阅 [Medium Newsletter](https://medium.com/@artem_lajko/subscribe),这样你就不会错过任何更新了。