🌍 Available in: English
Note: Brought to you by the fantastic cloud-native community's 🌟 contributors!
本章内容将会通过复用 Kubernetes API 的方式来创建我们平台的 API。平台要为开发者解决的第一个问题就是用自助的方式创建新的开发环境。
我们会使用 Crossplane 和 vcluster
这两个 CNCF 开源项目。
要有一个 Kubernetes 集群才能安装 Crossplane,可以按照第二章提到的步骤使用 Kind 创建集群。
然后按照第五章的介绍,部署 Crosspllane 和 Crossplane 的 Helm Provider。
后面的内容将会使用 vcluster
,但是其实不需要在集群中进行任何操作。只需要安装一个 vcluster
客户端来连接到我们的 vcluster
即可。可以遵照官网教程完成安装
这里说的环境,代表的是一个 Kubernetes 集群,我们将会把会议应用部署在这里。这样研发团队就能用这个自助的环境来完成工作了。
本文中我们会定义一个环境 API,以及一个使用 Helm Provider 的 Crossplane Composition,来创建一个 vcluster
的新实例,配置文件包含在 resources/composition-devenv.yaml 里。创建新的 vcluster
之后,Composition 会使用 Helm Provider 把我们的会议应用安装在新建的 vcluster
里,代码保存在 resources/composition-devenv.yaml 里。
运行下面的命令来部署 XRD 和 Composition:
kubectl apply -f resources/
你会看到:
composition.apiextensions.crossplane.io/dev.env.salaboy.com created
compositeresourcedefinition.apiextensions.crossplane.io/environments.salaboy.com created
有了环境和 Crossplane Composition,开发团队就可以按需申请环境了。
研发团队创建一个如下请求就可以申请新环境:
apiVersion: salaboy.com/v1alpha1
kind: Environment
metadata:
name: team-a-dev-env
spec:
compositionSelector:
matchLabels:
type: development
parameters:
installInfra: true
提交到集群之后,Crossplane Composition 就会创建新的 vcluster
,其中包含了一个会议应用的实例。
kubectl apply -f team-a-dev-env.yaml
你会看到如下输出:
environment.salaboy.com/team-a-dev-env created
可以使用如下命令查看环境状态:
> kubectl get env
NAME CONNECT-TO TYPE INFRA DEBUG SYNCED READY CONNECTION-SECRET AGE
team-a-dev-env team-a-dev-env-jp7j4 development true true True False team-a-dev-env 1s
以下命令可以用来检查 Crossplane 是否正在创建和管理 Compostion 相关的 资源:
> kubectl get managed
NAME CHART VERSION SYNCED READY STATE REVISION DESCRIPTION AGE
team-a-dev-env-jp7j4-8lbtj conference-app v1.0.0 True True deployed 1 Install complete 57s
team-a-dev-env-jp7j4-vcluster vcluster 0.15.0-alpha.0 True True deployed 1 Install complete 57s
看看这些 Helm Release 类型的资源:
kubectl get releases
NAME CHART VERSION SYNCED READY STATE REVISION DESCRIPTION AGE
team-a-dev-env-jp7j4-8lbtj conference-app v1.0.0 True True deployed 1 Install complete 45s
team-a-dev-env-jp7j4-vcluster vcluster 0.15.0-alpha.0 True True deployed 1 Install complete 45s
然后我们连接到新环境(使用 vcluster 名字中的 connect-to 列):
vcluster connect team-a-dev-env-jp7j4 --server https://localhost:8443 -- zsh
vcluster
模拟了一个不同的 Kubernetes 集群,所以如果要列出所有命名空间,会看到:
kubectl get ns
NAME STATUS AGE
default Active 64s
kube-system Active 64s
kube-public Active 64s
kube-node-lease Active 64s
如你所见,这里没有安装 Crossplane。列出所有 Pod:
NAME READY STATUS RESTARTS AGE
conference-app-kafka-0 1/1 Running 0 103s
conference-app-postgresql-0 1/1 Running 0 103s
conference-app-c4p-service-deployment-57d4ddcd68-45f6h 1/1 Running 2 (99s ago) 104s
conference-app-agenda-service-deployment-9bf7946c9-mmx8h 1/1 Running 2 (98s ago) 104s
conference-app-redis-master-0 1/1 Running 0 103s
conference-app-frontend-deployment-c8c64c54d-lntnw 1/1 Running 2 (98s ago) 104s
conference-app-notifications-service-deployment-64ff7bcdf8nbvhl 1/1 Running 3 (80s ago) 104s
使用端口转发方式访问应用页面:
kubectl port-forward svc/frontend 8080:80
这样就可以浏览 http://localhost:8080 的应用页面了。
使用 exit
命令来退出 vcluster 上下文。
针对平台 API 进行进一步的简化,拒绝开发团队访问平台所在集群,并免除开发团队访问 Kubernetes API 的需要。
我们要部署一个管理界面,让团队能在 Web 页面上或者用 REST API 申请新环境。
在部署管理界面之前,需要确保当前没有在 vcluster
上下文之中(可以用 exit
命令退出 vcluster 上下文)。确定当前集群的一个方法是看看当前集群里有没有包含 crossplane-system
命名空间。
使用 Helm 安装管理界面:
helm install admin oci://docker.io/salaboy/conference-admin --version v1.0.0
安装成功之后,使用端口转发来访问管理界面:
kubectl port-forward svc/admin 8081:80
这样一来,开发团队就可以使用这样的简单界面来创建环境了。环境创建成功之后,可以使用 vcluster
命令连接到环境。
有了这个简易页面,开发团队就能直接使用过平台工具(Crossplane 和 Argo CD),无需 Kubernetes API 了。
除了用户界面之外,这个平台管理服务还提供了一组简单的 RESTFUL 接口,这样你就可以摆脱 Kubernetes 直接定义资源了。例如我们可以用下面的 JSON 创建新环境:
{
"name": "team-curl-dev-env",
"parameters":{
"type": "development",
"installInfra": true,
"frontend":{
"debug": true
}
}
}
使用 curl
就可以完成任务:
curl -X POST -H "Content-Type: application/json" -d @team-a-dev-env-simple.json http://localhost:8081/api/environments/
列出所有环境:
curl localhost:8081/api/environments/
删除环境:
curl -X DELETE http://localhost:8081/api/environments/team-curl-dev-env
这个应用在 Kubernetes 和外部世界之间建起了桥梁。组织可能希望尽早建立这种抽象(应用程序接口),这样平台团队就可以对工具和工作流程决策进行调整。
可以用如下命令清理 Kind 创建的集群:
kind delete clusters dev
第五章中的数据库和消息中间件,是不是也可以在管理界面中创建出来呢?这并不难,只是编写一个组件,在 Kubernetes API 基础之上构建一个面向用户的简化的接口即可。
根据实际需求,还可以创建一个 Compositon 来创建真正的集群来代替 vcluster
。
要用真实集群代替 Kind 集群,需要做些什么呢?
在本教程中,我们在使用 Kubernetes 资源模型基础上构建了一个新的平台 API,用来按需配置开发环境。我们还创建了一个简化层,无需团队学习 Kubernetes 的工作原理或底层细节、项目和技术,就能实现相同的功能。
通过依赖定义(在本例中为环境资源定义),平台团队可以根据自己的需求和可用工具,灵活地用不同策略和方法来进行环境供给。
要改进这些教程,欢迎在 Twitter 上联系我或者提交 PR。