Pulumiverse 的# 个 Kubernetes SDK

您所在的位置:网站首页 atom配置python Pulumiverse 的# 个 Kubernetes SDK

Pulumiverse 的# 个 Kubernetes SDK

2023-03-31 07:44| 来源: 网络整理| 查看: 265

Pulumi 为开发人员和操作人员提供了一个非常丰富的接口来定义他们的 Kubernetes 工作负载,提供对 Kubernetes API 资源的类型化访问,并允许我们的 IDE 通过本地语言插件提供代码完成和重构机会。

尽管如此,当涉及到自定义资源定义 (CRD) 时,它总是会变得有点麻烦,因为第一个选项是利用 CustomResource 转义舱,它允许您定义任何您想要的 Kubernetes 对象;然而,这确实意味着我们失去了我们已经习惯的丰富界面。

new k8s.apiextensions.CustomResource('marvin-the-martian', { apiVersion: 'looneytunes.com/v1990', kind: 'LooneyTune', metadata: { name: 'Marvin the Martian', planet: 'mars' }, spec: { armor: { style: 'hoplite', colors: ['green', 'red'], }, phrases: [ 'Wheres the kaboom', 'Oh, drat these computers. They’re so naughty and so complex. I could pinch them', 'I do so enjoy observing the flora and fauna of that tiny planet', 'Please, sir. Do not interrupt my chain of thought. I am a busy Martian', 'Brace yourself for immediate disintegration' ] }, });

进入全屏模式 退出全屏模式

虽然这是与 Kubernetes 合作的巨大障碍,但我们可以做得更好。

crd2pulumi

早在 2020 年 8 月,我们发布了}}">crd2pulumi。crd2pulumi允许您为任何 Kubernetes 自定义资源生成 Pulumi SDK。现在,当您想开始使用 cert-manager、Ambassador、Linkerd 或任何其他Kubernetes 和 Cloud Native 空间中的项目;您可以下载 CRD YAML 并运行crd2pulumi,它将为您希望的任何支持的语言生成 SDK。整洁吗?

过去一年我一直在使用这种方法,它是向开发人员提供丰富界面的最简单方法,但重复可能会变得有点令人沮丧。对于我正在处理的每个新项目,我都需要构建相同的自动化,并且还有确保 SDK 与部署到集群的最新版本保持同步的维护负担。

此外,这些 SDK 永远不会改变;如果您为 cert-manager 生成一个 SDK,而其他人则支持相同的版本 - 生成的代码没有区别。我们真的需要每个人都自己做吗?

也许需要一些进一步的工具。

Pulumiverse 的## Kubernetes SDK

我喜欢解决这样的问题。技术难度不大,支持crd2pulumi的团队已经完成了艰苦的工作。我们这里需要解决的问题是生活质量/开发者体验问题。我们如何才能让开发人员更容易使用它?

为了让这更容易,我们有两个问题:

我们如何自动生成 SDK,确保 SDK 始终是最新的?

我们在哪里发布它们?

自动化

如今,GitHub Actions 在我们的开发者世界中扮演着如此重要的角色,尤其是对于开源项目。因此,我为此构建的任何自动化都将构建在 GitHub Actions 之上,这是一个简单的选择。知道我们希望 SDK 是最新的,我们也知道这种自动化必须定期运行。因此,我们的 GitHub Action 的开始可以形成一些形式:

name: Build SDKs on: schedule: - cron: "10 3,15 * * *"

进入全屏模式 退出全屏模式

在这里,我们将 GitHub Action 安排在每天凌晨 3:10 和下午 3:10 运行。

接下来,我们需要知道要构建什么。我们不想构建项目知道的每个 SDK,因此我们需要一些代码来查找 GitHub Releases 中的一些新标签。为此,我们可以使用 Python 进行一些快速查找。

from atoma import parse_atom_bytes from datetime import datetime, timedelta, timezone from json import dumps from requests import get as httpget from typing import List, Mapping, Optional from yaml import safe_load, YAMLError import sys def has_been_updated(updated_at: Optional[datetime] = None) -> bool: if updated_at == None: return False hours_since: int = int(sys.argv[1]) if len(sys.argv) > 1 else 12 return (datetime.now(timezone.utc) - updated_at) < timedelta(hours=hours_since) def get_new_tags(repository: str) -> List[str]: response = httpget(f'https://{repository}/tags.atom') feed = parse_atom_bytes(response.content) return list(map(lambda entry: entry.title.value, filter(lambda entry: has_been_updated(entry.updated), feed.entries))) with open("./sdks.yaml", "r") as stream: try: sdks: Mapping[str, str] = safe_load(stream) except YAMLError as exc: print(f"Error parsing SDK Yaml: {exc}") sdks_to_build: List[str] = [] for name, repository in sdks.items(): for tag in get_new_tags(repository): sdks_to_build.append( f'{name}|{repository}|{tag}') print(dumps(sdks_to_build))

进入全屏模式 退出全屏模式

这个 Python 将遍历我们配置的 SDK,从 YAML 文档加载,并访问 GitHub 为每个公共存储库提供的 atom 提要。这使我们能够快速遍历标签/版本并在最后一个窗口中找到任何已发布的内容。除了将其打印到终端并允许 GitHub Actions 存储输出以在我们的构建矩阵中使用之外,我们不需要做任何其他事情。

jobs: find_new_tags: runs-on: ubuntu-latest steps: - ... random boring steps - id: find_new_tags run: echo "::set-output name=sdk_versions::$(poetry run python ./bin/find-new-tags.py ${{ github.event.inputs.since_hours }})" outputs: sdk_versions: ${{ steps.find_new_tags.outputs.sdk_versions }} build_nodejs_sdk: needs: find_new_tags runs-on: ubuntu-latest strategy: matrix: version: ${{ fromJson(needs.find_new_tags.outputs.sdk_versions) }}

进入全屏模式 退出全屏模式

一旦我们的 Python 脚本运行并存储了输出,我们将使用来自 GitHub 的名为fromJson的辅助函数将输出用作其矩阵构建系统的动态输入。对于我们发现的每一个新标签,我们都会得到一份工作。

生成 SDK 并将其发布到 npm 的工作如下所示:

- name: crd2pulumi-generate-sdk run: | IFS='|' read -r -a build_parts


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3