了解容器生态系统如何运作的一大优势是您可以将相同的模式用于多个规范。
没过多久, 舵 宣布将支持 OCI 工件,无非是一个 OCI 开放规范,用于分发容器图像和其他类型的数据,称为工件。
与所有其他 OCI 规范一样,该规范与云无关,这使其成为一个出色的工具。
容器记录
容器记录 (CR) 或注册表是曾经参与容器的每个人都必须使用的东西。 CR 是我们存储容器镜像的地方,因此我们可以随时随地获取它们。
从本质上讲,图像基本上是一组文件,它们或多或少地遵循这样的结构:
├── blobs
│ └── sha256
│ ├── 1b251d38cfe948dfc0a5745b7af5ca574ecb61e52aed10b19039db3...
│ ├── 31fb454efb3c69fafe53672598006790122269a1b3b458607dbe106...
│ └── 8ec7c0f2f6860037c19b54c3cfbab48d9b4b21b485a93d87b64690f...
├── index.json
└── oci-layout
文件 index.json
是所有可用清单的列表,也就是说,它是一个位置中所有可用图像的列表。 在我们的例子中,它是所有 helm 图表的列表。
里面的每个文件 blobs/sha256
是一个识别工件的 JSON,无论是图像还是图表。 此 JSON 符合 OCI 规范 对于 SHA 文件。
简而言之,它们是描述 blob 特征、其设置、属性、文件系统层以及初始命令的设置列表。
对于 Helm Chart,我们有以下文件:
{
"schemaVersion": 2,
"config": {
"mediaType": "application/vnd.cncf.helm.config.v1+json",
"digest": "sha256:8ec7c0f2f6860037c19b54c3cfbab48d9b4b21b485a93d87b64690fdb68c2111",
"size": 117
},
"layers": [
{
"mediaType": "application/tar+gzip",
"digest": "sha256:1b251d38cfe948dfc0a5745b7af5ca574ecb61e52aed10b19039db39af6e1617",
"size": 2487
}
]
}
请注意,我们有一个微分 mediaType
而一个普通的 Docker 镜像有一个类型 application/vnd.oci.image.config.v1+json
.
在这里,我们有一个类型 application/vnd.cncf.helm.config
层也一样,OCI 图像的每一层都是类型 application/vnd.oci.image.layer.v1.tar+gzip
而这里我们只有格式 .tar.gz
.
在 Azure 容器注册表中托管图表
在 Azure CR 上托管 Helm 图表与在本地存储它们非常相似。 您需要通过 Azure CLI 访问 azure。 我假设你已经有了 Azure CLI,所以让我们创建我们的 ACR。
首先,我们必须创建资源组,然后使用以下命令创建 ACR:
az group create -n helm-reg -l eastus
az acr create -n chartregistry$RANDOM -g helm-reg --sku Basic -o tsv --query loginServer
提示是将存储库名称存储在变量中:
export ACR=$(az acr create -n chartregistry$RANDOM -g helm-reg --sku Basic -o tsv --query loginServer)
现在我们将使用 Azure 托管密钥登录到我们的注册表,但我们需要启用管理控制 az acr update -n $ACR --admin-enabled true
.
接下来,运行以下两个命令来获取登录凭据并将它们保存在 shell 中:
export ACRUSER=$(az acr credential show -n $ACR --query username -o tsv)
export ACRPASS=$(az acr credential show -n $ACR --query 'passwords[0].value' -o tsv)
现在我们可以使用 Helm 登录到我们的注册表 helm registry login $ACR --username $ACRUSER --password $ACRPASS
,从这里我们已经配置了我们的注册表。
让我们创建另一个工件 helm chart save hrepo $ACR/hrepo:2.1.3
(作为一个 example,我将使用来自名为 hrepo 的垃圾存储库中的图表)。 然后我们将推动它 helm chart push $ACR/hrepo:3.8.0
.
一旦它在那里,我们将能够使用 Azure CLI 命令列出存储库中的所有内容:
az acr repository show -n $ACR --repository hrepo
请注意,我们将得到一个与我们发送的完全相同的输出:
{
"changeableAttributes": {
"deleteEnabled": true,
"listEnabled": true,
"readEnabled": true,
"writeEnabled": true
},
"createdTime": "2022-03-05T20:56:49.6118202Z",
"imageName": "hrepo",
"lastUpdateTime": "2022-03-05T20:56:49.7812323Z",
"manifestCount": 1,
"registry": "chartregistry23657.azurecr.io",
"tagCount": 1
}
我们还可以使用命令获取更多详细信息 show-manifests
通过添加一个 --detail
:
az acr repository show-manifests -n $ACR --repository hrepo --detail
这将为我们提供 OCI 工件的准确定义:
[
{
"changeableAttributes": {
"deleteEnabled": true,
"listEnabled": true,
"quarantineState": "Passed",
"readEnabled": true,
"writeEnabled": true
},
"configMediaType": "application/vnd.cncf.helm.config.v1+json",
"createdTime": "2022-03-05T20:56:49.7213057Z",
"digest": "sha256:4780713fa23d7144d356c353795b5b84e66ad2b8bbd47c7118b4b85435d50bbc",
"imageSize": 1378,
"lastUpdateTime": "2022-03-05T20:56:49.7213057Z",
"mediaType": "application/vnd.oci.image.manifest.v1+json",
"tags": [
"2.1.3"
]
}
]
要存储它,我们必须简单地:
helm chart pull $ACR/hrepo:3.8.0
helm chart export $ACR/hrepo:3.8.0 -d ./destination
helm install hrepo-acr ./destination
结论
尽管使用 Helm 很容易,但没有一种“简单”的方式可以将 Helm 图表作为某种私人记录来托管。
虽然 Helm 拥有出色的工具,例如 海图博物馆,它们仍然不是完全标准的,为了便于分布式开发,我们必须拥有每个人都可以整体遵循的开放标准。
Helm 最近将 OCI Registry 支持从实验性功能转移到了通用功能,这有力地表明容器生态系统正在变得越来越好。
作者信息:Talha Khalid 是一名自由 Web 开发人员和技术作家。