01 简介
许多人认为,要建立内部开发人员平台,就必须使用像 Spotify Backstage 这样的工具。其实未必,如果将 Kubernetes label 等更原生的方法与 Argo CD 等工具和 GitOps 原则相结合,也可以有效地为开发人员和平台团队提供自助服务功能。这种方法不仅能简化流程,还能与 Kubernetes 的核心理念紧密结合。
因此本文将展示如何在不依赖 Backstage 的情况下创建一个轻量级的内部开发人员平台,同时还能以自助服务的方式为您和您的开发人员赋权。通过利用 GitOps 和 Argo CD 以及 Kubernetes label,该方法为管理和部署基础架构提供了一个精简高效的解决方案。
02 解读 Kubernetes 标签和 Argo CD
首先,让我们来定义一下内部开发人员平台(IDP),因为如今许多公司都在积极构建 IDP,并为此专门成立了平台工程团队。
事实上,内部开发人员平台和负责创建该平台的团队可以从两个截然不同的角度来理解:
- 作为开发人员的自助服务:在这里,平台工程团队的职责是提供模板或模块,开发人员可以利用这些模板或模块部署自己的集群,并提供所需的工具包。该团队的职责是创建和维护各种模块和模板,以满足不同团队的需求。他们还负责响应开发人员的常见请求,如额外服务的功能请求。在这种情况下,产品能由客户组装。
- 作为平台团队的自助服务:在这种方法中,平台工程师使用模板或模块为开发人员提供集群和必要的堆栈。平台工程团队的职责包括提供、维护和运行这些模块和模板。这种模式更倾向于SRE(网站可靠性工程)即服务。
虽然这些方法听起来相似,但本质上是不同的。在第二种方法中,平台团队扮演着更全面的角色,专注于堆栈的构建、维护和运行。相比之下,第一种方法将他们的职责限制在构建和维护堆栈上。这不仅仅是提供解决方案,而是要确保解决方案顺利运行并与其他服务良好集成——这是一种更加以 SRE 为中心的方法。
许多公司的目标是采用第一种方法,但很快就意识到这不仅仅是一个技术决策,还涉及到文化的重大转变。
现在,我们有了更清晰的认识,让我们把重点转移到使用 label 或标记来构建轻量级 IDP 上。在继续之前,建立一个强大的标签或标记策略至关重要,尤其是如果您的目标是避免将整个堆栈部署到每个集群。创建和扩展服务目录也有好处。在这种情况下,部署一个为特定用途定制的基本 Kubernetes 集群可能是一种实用的方法。让我们来探讨一下如何有效实施。
这就是我们在 tanzu kubernetes 集群中使用它的方法。
- 创建 Tanzu Kubernetes 集群:从创建和部署访客集群开始。这个过程包括根据特定要求(标签)配置 Tanzu Kubernetes 集群(TKC),并确保它在我们的环境(ApplicationSets)中按预期运行。
---
apiVersion: run.tanzu.vmware.com/v1alpha3
kind: TanzuKubernetesCluster
metadata:
name: label-example-cluster
labels:
env: dev
core-basic: enabled
monitoring-basic: enabled
monitoring-medium: enabled
security-basic: enabled
annotations:
run.tanzu.vmware.com/resolve-os-image: os-name=ubuntu
spec:
topology:
controlPlane:
replicas: 3
...
- 与 Argo CD Cockpit 集成:接下来,我们将新创建的 Tanzu Kubernetes 集群 连接到 Argo CD
Cockpit。这一集成是通过定期运行的流水线自动完成的,流水线会检查新的舰队。该流水线旨在识别任何尚未添加到 Argo CD Cockpit 的新集群。它利用 tkc.yaml 文件中定义的标签,将 Tanzu Kubernetes 集群映射到 Argo CD 集群。这一过程涉及 add cluster … 等命令,这些命令根据配置中的 label 执行。
其次,我们将探讨流水线中的一个潜在步骤,该步骤应根据具体模式和环境进行调整:
#Cleanup
if [ -f cluster.csv ]; then
rm cluster.csv
fi
kubectl config use-context ${{ cluster.name }}
argocd login $(kubectl get ingress argocd-server-ingress -n argocd --output=jsonpath='{.spec.rules[0].host}') --username admin --password $(kubectl -n argocd get secret argocd-initial-admin-secret -o jsonpath="{.data.password}" | base64 -d; echo) --insecure --grpc-web
# Get all Supervisor Namespaces
kubectl config get-contexts -oname | grep -E "example" > tanzu_namespace.csv
# Process each tanzu namespace to fetch and save TKC labels
while IFS= read -r namespace
do
kubectl config use-context "$namespace"
kubectl get tkc -n $namespace -o json | jq -r '.items[] | select(.metadata.labels and (.metadata.labels["env"] == "prod" or .metadata.labels["env"] == "staging")) | [.metadata.name, (.metadata.labels | to_entries | map("--label \(.key)=\(.value)") | join(" "))] | @tsv' >> cluster.csv
done < tanzu_namespace.csv
# Add clusters to Argo CD with specific labels
while IFS= read -r line
do
cluster=$(echo "$line" | awk '{print $1}')
label_string=$(echo "$line" | awk '{ $1=""; print $0 }' | sed 's/^ //')
argocd cluster add $cluster $label_string --upsert
done < cluster.csv
- 使用 Argo CD 实现部署自动化:集成后,我们让 Cockpit 集群上的 Argo CD 接管部署任务。它使用 ApplicationSets 和集群生成器,根据预定义的标签部署服务。这种方法可在多个集群上实现标签驱动的自动部署,确保在正确的环境中部署正确的服务。使用 ApplicationSets 和集群生成器是我们战略的关键部分,因为它允许在我们的 Tanzu Kubernetes 集群中进行可扩展和可管理的部署。
apiVersion: argoproj.io/v1alpha1
kind: ApplicationSet
metadata:
name: external-dns
namespace: argocd
spec:
generators:
- clusters:
selector:
matchLabels:
env: dev
core-basic: enabled
values:
branch: development
- clusters:
selector:
matchLabels:
env: staging
core-basic: enabled
values:
branch: staging
- clusters:
selector:
matchLabels:
env: prod
core-basic: enabled
values:
branch: main
template:
metadata:
name: "{{name}}-external-dns"
annotations:
argocd.argoproj.io/manifest-generate-paths: ".;.."
spec:
....
这种方法简化了部署和管理多个 Tanzu Kubernetes 集群的流程,使其高效且可扩展。通过利用 Argo CD 的功能和 Tanzu 强大的 Kubernetes 管理,我们实现了部署的高度自动化和一致性。这是通过将 Kubernetes 的基本功能之一 “label”与 GitOps 方法相结合来实现的,从而提高了我们部署流程的效率和一致性。
03 总结
这种简单而强大的策略可以创建一个带有特定标签的 tkc.yaml 文件,然后无缝连接到 Argo CD Cockpit。这种方法的优点在于简单高效。开发人员只需设置带有所需标签的 tkc.yaml,即可自行启动部署流程,无需平台团队的干预。这为开发人员提供了一定程度的自助服务,使他们能够根据自己的项目要求部署 Kubernetes 集群。
这种方法的灵活性是其最大优势之一。无论是开发人员部署自己的 Kubernetes 集群,还是平台团队为开发人员提供集群,它都同样有效。这种适应性使其成为一种有价值的工具,可适应各种组织结构、技能组合和特定要求。
从本质上讲,这种方法简化了集群部署流程,营造了一个更加自主和高效的环境。它不仅提高了部署速度,还通过促进协作和减少工作流程中的瓶颈,符合现代 DevOps 实践的原则。这充分证明,集成 Tanzu Kubernetes Clusters 和 Argo CD 等工具可以彻底改变我们管理和部署基础设施的方式。