K8s+ArgoCD,低投入构建内部开发者平台

news2024/9/23 7:23:30

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 等工具可以彻底改变我们管理和部署基础设施的方式。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1490441.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

java spring 03 启动细节

启动类ClassPathXmlApplicationContext public ClassPathXmlApplicationContext(String[] configLocations, boolean refresh, Nullable ApplicationContext parent)throws BeansException {super(parent);setConfigLocations(configLocations);if (refresh) {refresh();}}其中…

护眼台灯怎么样选择?5款好用的护眼台灯推荐,完全凭实力说话!

随着护眼台灯用户增长&#xff0c;近年来护眼台灯检测不合格的的问题频频爆出&#xff0c;这种情况大多数都是来自于一些价格低廉、非专业缺乏技术积累的品牌厂家&#xff0c;长期使用存在很大风险。所以我们在选购护眼台灯的时候不能盲目根据销量或者价格就购买&#xff0c;需…

vue2+vite+@vitejs/plugin-vue2可以使用require引用图片资源

很多文章都说vite不能用require&#xff0c;vue3vite确实是这样的&#xff0c;但今天无意间发现vue2vite中是可以使用require引用资源的 vue3搭配vite一般使用的是vitejs/plugin-vue解析vue语法&#xff0c;而vue2使用的则是另一个插件vitejs/plugin-vue2插件解析vue语法 看下…

表单验证、属性绑定(一个属性根据另一个属性有无进行操作)

表单验证 一个属性根据另一个属性有无进行操作&#xff08;属性绑定&#xff09; 1、问题描述 ​ 需求&#xff1a;表单里面后两个属性需要根据前面一个属性进行有无判断。如果前面属性没有输入值&#xff0c;则不需要进行操作&#xff1b;如果前面属性有输入值&#xff0c;则…

胜出之道:NCDA设计大赛获奖作品解读与交互程序设计的优化策略

第12届大赛简介 - 未来设计师全国高校数字艺术设计大赛&#xff08;NCDA&#xff09;开始啦&#xff01;未来设计师全国高校数字艺术设计大赛&#xff08;NCDA&#xff09;是由工信部人才交流中心主办&#xff0c;教育部中国高等教育学会认定&#xff0c;教育厅发文立项&#x…

RedisDesktopManager连接Ubuntu的Redis失败解决办法

配置redis 1.设置redis在后台服务&#xff0c;修改配置文件 默认情况下是 no ,修改为yes&#xff0c;可以后台服务 2、设置redis端口&#xff0c;默认端口是6379&#xff0c;可以根据自己的需要&#xff0c;找到/et/redis/redis.conf文件, 修改port 3、设置密码 配置文件中…

AI论文速读 | TimeXer:让 Transformer能够利用外部变量进行时间序列预测

题目&#xff1a; TimeXer: Empowering Transformers for Time Series Forecasting with Exogenous Variables 作者&#xff1a;Yuxuan Wang ; Haixu Wu&#xff08;吴海旭&#xff09; ; Jiaxiang Dong ; Yong Liu ; Yunzhong Qiu ; Haoran Zhang ; Jianmin Wang&#xff08;…

会员营销中如何让会员主动完善信息?

会员主动完善信息&#xff0c;可以通过积分、优惠券、会员权益进行激励。 会员信息主要包括会员姓名、生日、地址、兴趣爱好等&#xff1b;需要让会员完善的信息要围绕营销目标和营销计划&#xff0c;不要过度收集会员信息。 在博阳会员管理系统中定义会员完善个人信息页&#…

Java面试题总结8:springboot

Spring Boot自动配置原理 importConfigurationSpring spi 自动配置类由各个starter提供&#xff0c;使用ConfigurationBean定义配置类&#xff0c;放到META-INF/spring.factories下 使用Spring spi扫描META-INF/Spring.factories下的配置类 如何理解Spring Boot中Starter …

STM 32 HAL库 UART 调试的问题

问题1&#xff1a;STM32G0 系列 DMA中断接收&#xff0c;应用层无法接收到数据 分析&#xff1a; Debug发现&#xff0c;最终没有进入串口中断函数 。 于是&#xff0c;检查Stm32CubeMX 的工程配置 两个串口的全局中断没有使能。 解决&#xff1a;勾选上图中红框部分&#x…

STM32CubeIDE基础学习-安装芯片固件支持包

STM32CubeIDE基础学习-添加芯片固件支持包 前言 前面的文章在安装STM32CubeIDE软件时没有安装这个芯片PACK包&#xff0c;如果工程没有这个固件支持包的话是无法正常使用的&#xff0c;随便安装一个和芯片对应系列的支持包就可以了。 这篇文章来记录一下新增PACK包的常用操作…

SUSE12系统破解root密码

SUSE12系统破解root密码 1、重启系统&#xff0c;重启时出现引导界面&#xff0c;按e 2、在启动 linux 的启动选项里加上 init/bin/bash&#xff0c;然后按 F10 启动&#xff0c;通过给内核传递 init/bin/bash 参数使得 OS 在运行 login 程序之前运行 bash&#xff0c;出现命令…

微服务知识03

1、ES搜索引擎,高性能的分布式搜索引擎,底层基于Lucene 主要用于应用程序中的搜索系统 日志收集 2、基础概念 3、流程 4、 5、下载中文分词器

微信小程序开发系列(十八)·wxml语法·声明和绑定数据

目录 1. 双大括号写法用法一&#xff1a;展示内容 步骤一&#xff1a;创建一个data对象 步骤二&#xff1a;双大括号写法的使用 步骤三&#xff1a;拓展 2. 双大括号写法用法二&#xff1a;绑定属性值 步骤一&#xff1a;给对象赋一个属性值 步骤二&#xff1a;双大括…

两天学会微服务网关Gateway-Gateway路由规则

锋哥原创的微服务网关Gateway视频教程&#xff1a; Gateway微服务网关视频教程&#xff08;无废话版&#xff09;_哔哩哔哩_bilibiliGateway微服务网关视频教程&#xff08;无废话版&#xff09;共计17条视频&#xff0c;包括&#xff1a;1_Gateway简介、2_Gateway工作原理、3…

行人实时动作识别

详细资料和代码请加微信&#xff1a;17324069443 一、项目介绍 基于PyTorchVideo的实时动作识别框架&#xff1a; 我们选择了yolov5作为目标检测器&#xff0c;而不是Faster R-CNN&#xff0c;它速度更快、更方便。 我们使用一个跟踪器&#xff08;deepsort&#xff09;来为不…

STM32(15)USART编程

使用USART实现STM32与电脑之间的通信 中介&#xff1a;USB转TTL模块 闭合总开关&#xff0c;外部时钟才会传输到分频器 c8t6手册里面写了&#xff0c;usart最大支持4.5MHz&#xff0c;所以选10 重映射时记得开启AFIO的时钟

什么是MAC地址? win10电脑查看MAC地址的多种方法

您是否知道连接到家庭网络的每件硬件都有自己的身份&#xff1f;正如每个设备都分配有自己的 IP 地址一样&#xff0c;每个硬件都有一个唯一的网络标识符。 该标识符称为MAC 地址。MAC 代表媒体访问控制。您可能需要 MAC 地址来解决网络问题或配置新设备。在 Windows 中查找您…

java常用应用程序编程接口(API)——Arrays概述

前言&#xff1a; 学到Arrays了&#xff0c;整理下心得。打好基础&#xff0c;daydayup! Arrays 用来操作数组的一个工具类 Arrays的常见方法 方法名说明public static String toString(类型[] arr)返回数组的内容public static int[ ] copyOfRange(类型[ ] arr,启示索引&…

机器人工具箱学习(二)

一、机械臂及运动学 1.1 机械臂构成 机械臂多采用关节式机械结构&#xff0c;一般具有6个自由度&#xff0c;其中3个用来确定末端执行器的位置&#xff0c;另外3个则用来确定末端执行装置的方向(姿态)。   如图所示&#xff0c;一个机械臂是由一组可做相对运动的关节连接的连…