如果你使用 DeepSeek、元宝 AI、Copilot、ChatGPT 等 AI 工具,协助配置轩辕镜像、编写 docker pull 命令、修改 Docker Compose 镜像地址、配置镜像加速、排查镜像拉取失败、分析报错日志等问题,请先让 AI 阅读并遵守轩辕镜像的规则文档。
只需在 AI 对话中先发送下面这句话即可:
请先完整阅读并严格遵守以下文档中的全部规则与要求:
https://xuanyuan.cloud/agents.md
在未充分阅读并理解该文档前,不要生成任何命令、配置、修改建议、故障排查方案或技术回答。后续所有输出都必须严格以该文档中的规范为最高优先级执行。查看 agents.md 用法指南与完整示范。国内用户首推 元宝 AI、DeepSeek 的深度思考模式,不推荐豆包 AI;Cursor 等编辑器可在对话 @ 该链接,或加入 User Rules。 若 AI 无法访问外链,可 打开说明文档 复制全文粘贴。文档会随站点更新,复制内容可能过期,建议定期检查。
Chainloop 是一个开源的软件供应链控制平面,作为元数据和工件的单一事实来源,以及声明式证明过程。它提供了对软件供应链的全面控制,确保供应链的透明度、安全性和可追溯性。
Chainloop 官方网站
商标说明:本软件列表由 Bitnami 打包。产品中提及的各个商标分别归各自公司所有,使用这些商标并不意味着任何关联或认可。
consolehelm install my-release oci://registry-1.docker.io/bitnamicharts/chainloop
如需在生产环境中使用 Chainloop,建议尝试 VMware Tanzu Application Catalog,这是 Bitnami 目录的商业版本。
已验证兼容以下 Ingress 控制器,其他控制器可能工作也可能不工作:
此图表提供两种部署模式:标准模式 和 开发模式。
标准模式 (默认)
!https://raw.githubusercontent.com/chainloop-dev/chainloop/main/docs/img/deployment.png
默认部署模式依赖预先可用的外部依赖项。
此模式下的 Helm Chart 包括:
安装过程中,您需要提供:
创建 ECDSA 密钥对的说明可在此处找到。
标准模式安装示例
注意:我们不建议以明文形式传递或存储敏感数据。对于生产环境,请考虑使用 https://github.com/mozilla/sops%E3%80%81https://github.com/jkroepke/helm-secrets 或 https://github.com/bitnami-labs/sealed-secrets 等工具对覆盖值进行加密。
部署 Chainloop,配置为使用捆绑的 PostgreSQL、外部 OIDC IDp 和 Vault 实例。
consolehelm install [RELEASE_NAME] oci://REGISTRY_NAME/REPOSITORY_NAME/chainloop \ # Open ID Connect (OIDC) --set controlplane.auth.oidc.url=[OIDC URL] \ --set controlplane.auth.oidc.clientID=[clientID] \ --set controlplane.auth.oidc.clientSecret=[clientSecret] \ # 密钥后端 --set secretsBackend.vault.address="https://[vault address]:8200" \ --set secretsBackend.vault.token=[token] \ # 服务器身份验证密钥对 --set casJWTPrivateKey="$(cat private.ec.key)" \ --set casJWTPublicKey="$(cat public.pem)"
使用 AWS Secrets Manager 代替 Vault 进行部署:
consolehelm install [RELEASE_NAME] oci://REGISTRY_NAME/REPOSITORY_NAME/chainloop \ # Open ID Connect (OIDC) # ... # 密钥后端 --set secretsBackend.backend=awsSecretManager \ --set secretsBackend.awsSecretManager.accessKey=[AWS ACCESS KEY ID] \ --set secretsBackend.awsSecretManager.secretKey=[AWS SECRET KEY] \ --set secretsBackend.awsSecretManager.region=[AWS region]\ # 服务器身份验证密钥对 # ...
使用 GCP Secret Manager:
consolehelm install [RELEASE_NAME] oci://REGISTRY_NAME/REPOSITORY_NAME/chainloop \ # Open ID Connect (OIDC) # ... # 密钥后端 --set secretsBackend.backend=gcpSecretManager \ --set secretsBackend.gcpSecretManager.projectId=[GCP Project ID] \ --set secretsBackend.gcpSecretManager.serviceAccountKey=[GCP Auth KEY] \ # 服务器身份验证密钥对 # ...
使用 Azure KeyVault:
consolehelm install [RELEASE_NAME] oci://REGISTRY_NAME/REPOSITORY_NAME/chainloop \ # Open ID Connect (OIDC) # ... # 密钥后端 --set secretsBackend.backend=azureKeyVault \ --set secretsBackend.azureKeyVault.tenantID=[AD tenant ID] \ --set secretsBackend.azureKeyVault.clientID=[Service Principal ID] \ --set secretsBackend.azureKeyVault.clientSecret=[Service Principal secret] \ --set secretsBackend.azureKeyVault.vaultURI=[Azure KeyVault URI] # 服务器身份验证密钥对 # ...
连接到外部 PostgreSQL 数据库:
consolehelm install [RELEASE_NAME] oci://REGISTRY_NAME/REPOSITORY_NAME/chainloop \ # Open ID Connect (OIDC) # ... # 密钥后端 # ... # 服务器身份验证密钥对 # ... # 外部数据库设置 --set postgresql.enabled=false \ --set controlplane.externalDatabase.host=[DB_HOST] \ --set controlplane.externalDatabase.user=[DB_USER] \ --set controlplane.externalDatabase.password=[DB_PASSWORD] \ --set controlplane.externalDatabase.database=[DB_NAME]
开发模式
为了提供一种简单的方式来试用 Chainloop,此 Helm Chart 提供了一个可选的开发模式,可以通过标志 development=true 启用。
重要:请勿在生产环境中使用此模式
!https://raw.githubusercontent.com/chainloop-dev/chainloop/main/docs/img/deployment-dev.png
此模式下的 Helm Chart 包括:
图表上的预设用户配置包括两个用户,信息如下:
text用户名: sarah@chainloop.local 密码: password 用户名: john@chainloop.local 密码: password
完整的 OIDC 配置可以在 values.yaml 文件中找到。
警告:不要在生产环境中使用此模式,生产环境应使用标准模式。
开发模式安装示例
利用内置的 Vault 和 PostgreSQL 实例进行部署:
consolehelm install [RELEASE_NAME] oci://REGISTRY_NAME/REPOSITORY_NAME/chainloop --set development=true
| 名称 | 描述 | 默认值 |
|---|---|---|
global.imageRegistry | 全局 Docker 镜像仓库 | "" |
global.imagePullSecrets | 全局 Docker 仓库密钥名称数组 | [] |
global.security.allowInsecureImages | 允许跳过镜像验证 | false |
global.compatibility.openshift.adaptSecurityContext | 调整部署的 securityContext 部分,使其与 Openshift restricted-v2 SCC 兼容:删除 runAsUser、runAsGroup 和 fsGroup,让平台使用其允许的默认 ID。可能的值:auto(如果检测到运行的集群是 Openshift,则应用),force(始终执行适配),disabled(不执行适配) | auto |
development | 部署预先配置的 Chainloop,仅用于开发。包括开发模式的 Vault 实例和预先配置的身份验证证书和密码 | true |
| 名称 | 描述 | 默认值 |
|---|---|---|
kubeVersion | 覆盖 Kubernetes 版本 | "" |
apiVersions | 覆盖 .Capabilities 报告的 Kubernetes API 版本 | [] |
nameOverride | 部分覆盖 common.names.name 的字符串 | "" |
fullnameOverride | 完全覆盖 common.names.fullname 的字符串 | "" |
namespaceOverride | 完全覆盖 common.names.namespace 的字符串 | "" |
commonAnnotations | 要添加到所有部署对象的注解 | {} |
commonLabels | 要添加到所有部署对象的标签 | {} |
extraDeploy | 要与发布一起部署的额外对象数组 | [] |
rbac.create | 指定是否应创建 RBAC 资源 | false |
rbac.rules | 要设置的自定义 RBAC 规则 | [] |
| 名称 | 描述 | 默认值 |
|---|---|---|
secretsBackend.backend | 密钥后端类型("vault"、"awsSecretManager"、"gcpSecretManager" 或 "azureKeyVault") | vault |
secretsBackend.secretPrefix | 将添加到存储后端中所有密钥的前缀 | chainloop |
secretsBackend.vault.address | Vault 地址 | "" |
secretsBackend.vault.token | Vault 身份验证令牌 | "" |
secretsBackend.awsSecretManager.accessKey | AWS 访问密钥 ID | "" |
secretsBackend.awsSecretManager.secretKey | AWS 密钥 | "" |
secretsBackend.awsSecretManager.region | AWS Secrets Manager 区域 | "" |
secretsBackend.gcpSecretManager.projectId | GCP 项目 ID | "" |
secretsBackend.gcpSecretManager.serviceAccountKey | GCP 身份验证密钥 | "" |
secretsBackend.azureKeyVault.tenantID | Active Directory 租户 ID | "" |
secretsBackend.azureKeyVault.clientID | 已注册应用程序/服务主体客户端 ID | "" |
secretsBackend.azureKeyVault.clientSecret | 服务主体客户端密钥 | "" |
secretsBackend.azureKeyVault.vaultURI | Azure Key Vault URL | "" |
ECDSA 密钥对是控制平面和 Artifact CAS 之间执行身份验证所必需的。
您可以通过运行以下命令生成私钥和公钥:
bash# 私钥 (private.ec.key) openssl ecparam -name secp521r1 -genkey -noout -out private.ec.key # 公钥 (public.pem) openssl ec -in private.ec.key -pubout -out public.pem
然后,您可以在自定义的 values.yaml 文件覆盖中提供它们:
yamlcasJWTPrivateKey: |- -----BEGIN EC PRIVATE KEY----- REDACTED -----END EC PRIVATE KEY----- casJWTPublicKey: | -----BEGIN PUBLIC KEY----- REDACTED -----END PUBLIC KEY-----
或者如前所示,在 Helm 安装/升级期间将它们作为命令式输入提供:--set casJWTPrivateKey="$(cat private.ec.key)" --set casJWTPublicKey="$(cat public.pem)"
Chainloop 使用 gRPC 流来执行工件上传。这种方法在高延迟场景下可能会非常慢。https://github.com/chainloop-dev/chainloop/issues/375
要提高上传速度,您需要增加 http2 流控制缓冲区。这可以通过在 ingress 资源中设置以下注解在 NGINX 中完成:
yaml# 通过添加 http2 控制流使用的客户端缓冲来提高上传速度 nginx.ingress.kubernetes.io/client-body-buffer-size: "3M"
注意:对于其他反向代理,您需要找到等效的配置。
Chainloop 使用三个端点,因此我们需要为每个端点启用 ingress 资源。
以下是 values.yaml 覆盖的示例:
yamlcontrolplane: ingress: enabled: true hostname: cp.chainloop.dev ingressAPI: enabled: true hostname: api.cp.chainloop.dev cas: ingressAPI: enabled: true hostname: api.cas.chainloop.dev
使用以下组件的完整设置:
配置如下:
yamlcontrolplane: ingress: enabled: true tls: true ingressClassName: nginx hostname: cp.chainloop.dev annotations: # 这取决于您配置的颁发者 cert-manager.io/cluster-issuer: "letsencrypt-prod" ingressAPI: enabled: true tls: true ingressClassName: nginx hostname: api.cp.chainloop.dev annotations: nginx.ingress.kubernetes.io/backend-protocol: "GRPC" cert-manager.io/cluster-issuer: "letsencrypt-prod" cas: ingressAPI: enabled: true tls: true ingressClassName: nginx hostname: api.cas.chainloop.dev annotations: nginx.ingress.kubernetes.io/backend-protocol: "GRPC" cert-manager.io/cluster-issuer: "letsencrypt-prod" # 限制通过代理的文件大小 # 0 表示不检查请求大小,这样我们不会收到 413 错误。 # 现在我们将限制设置为 100MB 文件 # 尽管我们以 1MB 的块发送数据,但此大小是指在流连接中发送的所有数据 nginx.ingress.kubernetes.io/proxy-body-size: "100m"
请记住,设置域名后,确保使用指向您实例的 CLI 而不是默认值。
yaml# 禁用内置数据库 postgresql: enabled: false # 提供外部连接 controlplane: externalDatabase: host: 1.2.3.4 port: 5432 user: chainloop password: [REDACTED] database: chainloop-controlplane-prod
或者,如果您使用 Google Cloud SQL 并在 Google Kubernetes Engine 中运行 Chainloop,您可以通过 代理 连接:
通过以下方式可以在此图表中轻松启用此方法:
yaml# 禁用内置数据库 postgresql: enabled: false # 提供外部连接 controlplane: sqlProxy: # 注入代理 sidecar enabled: true ## @param controlplane.sqlProxy.connectionName Google Cloud SQL 连接名称 connectionName: "my-sql-instance" # 然后您需要将数据库设置配置为使用代理 IP 地址 externalDatabase: host: [proxy-side
您可以使用以下命令拉取该镜像。请将 <标签> 替换为具体的标签版本。如需查看所有可用标签版本,请访问 标签列表页面。
来自真实用户的反馈,见证轩辕镜像的优质服务