5.2. 使用服务帐户提供 secret
您可以使用服务帐户为 secret 提供 Git 存储库和容器存储库身份验证。
您可以将 secret 与服务帐户关联。机密中的信息可供此服务帐户下运行的任务使用。
5.2.1. 服务帐户的 secret 的类型和注解
如果使用服务帐户提供身份验证 secret,OpenShift Pipelines 支持多种 secret 类型。对于大多数这些 secret 类型,您必须提供注解来定义身份验证 secret 有效的存储库。
5.2.1.1. Git 身份验证 secret
如果使用服务帐户提供身份验证 secret,OpenShift Pipelines 支持以下 Git 身份验证的 secret 类型:
-
kubernetes.io/basic-auth
:基本身份验证的用户名和密码 -
kubernetes.io/ssh-auth
: 基于 SSH 的身份验证的密钥
如果使用服务帐户提供身份验证 secret,Git secret 必须具有一个或多个注解键。每个键的名称必须以 tekton.dev/git-
开头,值是 OpenShift Pipelines 必须使用 secret 中的凭证的 URL。
在以下示例中,OpenShift Pipelines 使用 basic-auth
secret 访问位于 github.com
和 gitlab.com
的存储库。
示例:使用多个 Git 存储库进行基本身份验证的凭证
apiVersion: v1 kind: Secret metadata: name: git-secret-basic annotations: tekton.dev/git-0: github.com tekton.dev/git-1: gitlab.com type: kubernetes.io/basic-auth stringData: username: <username> 1 password: <password> 2
您还可以使用 ssh-auth
secret 为访问 Git 存储库提供私钥,如下例所示:
示例:用于基于 SSH 的身份验证的私钥
apiVersion: v1
kind: Secret
metadata:
name: git-secret-ssh
annotations:
tekton.dev/git-0: https://github.com
type: kubernetes.io/ssh-auth
stringData:
ssh-privatekey: 1
- 1
- SSH 私钥文件的内容。
5.2.1.2. 容器 registry 身份验证 secret
如果使用服务帐户提供身份验证 secret,OpenShift Pipelines 支持以下容器(Docker) registry 身份验证的 secret 类型:
-
kubernetes.io/basic-auth
:基本身份验证的用户名和密码 -
kubernetes.io/dockercfg
:序列化的~/.dockercfg
文件 -
kubernetes.io/dockerconfigjson
:序列化~/.docker/config.json
文件
如果使用服务帐户提供身份验证 secret,kubernetes.io/basic-auth
类型的容器 registry secret 必须具有一个或多个注解键。每个键的名称必须以 tekton.dev/docker-
开头,值是 OpenShift Pipelines 必须使用 secret 中的凭证的 URL。其他类型的容器 registry secret 不需要此注解。
在以下示例中,OpenShift Pipelines 使用 basic-auth
secret (依赖于用户名和密码)访问位于 quay.io
和 my-registry.example.com
的容器 registry。
示例:使用多个容器存储库进行基本身份验证的凭证
apiVersion: v1 kind: Secret metadata: name: docker-secret-basic annotations: tekton.dev/docker-0: quay.io tekton.dev/docker-1: my-registry.example.com type: kubernetes.io/basic-auth stringData: username: <username> 1 password: <password> 2
您可以从现有配置文件创建 kubernetes.io/dockercfg
和 kubernetes.io/dockerconfigjson
secret,如下例所示:
示例:创建用于从现有配置文件中向容器存储库进行身份验证的 secret 的命令
$ oc create secret generic docker-secret-config \ --from-file=config.json=/home/user/.docker/config.json \ --type=kubernetes.io/dockerconfigjson
您还可以使用 oc
命令行工具从凭证创建 kubernetes.io/dockerconfigjson
secret,如下例所示:
示例:创建用于从凭证向容器存储库进行身份验证的 secret 的命令
$ oc create secret docker-registry docker-secret-config \ --docker-email=<email> \ 1 --docker-username=<username> \ 2 --docker-password=<password> \ 3 --docker-server=my-registry.example.com:5000 4
5.2.2. 使用服务帐户为 Git 配置基本身份验证
对于管道从密码保护的存储库检索资源,您可以为该管道配置基本身份验证。
考虑使用基于 SSH 的身份验证而不是基本身份验证。
要为管道配置基本身份验证,请创建一个基本身份验证 secret,将此 secret 与服务帐户关联,并将此服务帐户与 TaskRun
或 PipelineRun
资源关联。
对于 GitHub,已弃用使用普通密码进行身份验证。而应使用个人访问令牌。
流程
在
secret.yaml
文件中为 secret 创建 YAML 清单。在此清单中,指定用户名和密码或 GitHub 个人访问令牌来访问 目标 Git 存储库。apiVersion: v1 kind: Secret metadata: name: basic-user-pass 1 annotations: tekton.dev/git-0: https://github.com type: kubernetes.io/basic-auth stringData: username: <username> 2 password: <password> 3
在
serviceaccount.yaml
文件中为服务帐户创建 YAML 清单。在此清单中,将 secret 与服务帐户关联。apiVersion: v1 kind: ServiceAccount metadata: name: build-bot 1 secrets: - name: basic-user-pass 2
为
run.yaml
文件中的任务运行或管道运行创建 YAML 清单,并将服务帐户与任务运行或管道运行关联。使用以下示例之一:将服务帐户与
TaskRun
资源关联:apiVersion: tekton.dev/v1 kind: TaskRun metadata: name: build-push-task-run-2 1 spec: taskRunTemplate: serviceAccountName: build-bot 2 taskRef: name: build-push 3
将服务帐户与
PipelineRun
资源关联:apiVersion: tekton.dev/v1 kind: PipelineRun metadata: name: demo-pipeline 1 namespace: default spec: taskRunTemplate: serviceAccountName: build-bot 2 pipelineRef: name: demo-pipeline 3
输入以下命令应用您创建的 YAML 清单:
$ oc apply --filename secret.yaml,serviceaccount.yaml,run.yaml
5.2.3. 使用服务帐户为 Git 配置 SSH 身份验证
若要让管道从配置了 SSH 密钥的存储库检索资源,您必须为该管道配置基于 SSH 的身份验证。
要为管道配置基于 SSH 的身份验证,请使用 SSH 私钥创建身份验证 secret,将此 secret 与服务帐户关联,并将此服务帐户与 TaskRun
或 PipelineRun
资源关联。
流程
-
生成 SSH 私钥,或复制通常在
~/.ssh/id_rsa
文件中提供的现有私钥。 在
secret.yaml
文件中为 secret 创建 YAML 清单。在此清单中,将ssh-privatekey
的值设置为 SSH 私钥文件的内容,并将known_hosts
的值设置为已知主机文件的内容。apiVersion: v1 kind: Secret metadata: name: ssh-key 1 annotations: tekton.dev/git-0: github.com type: kubernetes.io/ssh-auth stringData: ssh-privatekey: 2 known_hosts: 3
重要如果省略已知主机文件,OpenShift Pipelines 会接受任何服务器的公钥。
-
可选:通过在注解值末尾添加 :<
;port_number&
gt; 来指定自定义 SSH 端口。例如:tekton.dev/git-0: github.com:2222
。 在
serviceaccount.yaml
文件中为服务帐户创建 YAML 清单。在此清单中,将 secret 与服务帐户关联。apiVersion: v1 kind: ServiceAccount metadata: name: build-bot 1 secrets: - name: ssh-key 2
在
run.yaml
文件中,将服务帐户与任务运行或管道运行关联。使用以下示例之一:将服务帐户与任务运行关联:
apiVersion: tekton.dev/v1 kind: TaskRun metadata: name: build-push-task-run-2 1 spec: taskRunTemplate: serviceAccountName: build-bot 2 taskRef: name: build-push 3
将服务帐户与管道运行关联:
apiVersion: tekton.dev/v1 kind: PipelineRun metadata: name: demo-pipeline 1 namespace: default spec: taskRunTemplate: serviceAccountName: build-bot 2 pipelineRef: name: demo-pipeline 3
应用更改。
$ oc apply --filename secret.yaml,serviceaccount.yaml,run.yaml
5.2.4. 使用服务帐户配置容器 registry 身份验证
要使管道从 registry 检索容器镜像或将容器镜像推送到 registry,您必须为该 registry 配置身份验证。
要为管道配置 registry 身份验证,请使用 Docker 配置文件创建身份验证 secret,将此 secret 与服务帐户关联,并将此服务帐户与 TaskRun
或 PipelineRun
资源关联。
流程
输入以下命令,从现有
config.json
文件创建容器 registry 身份验证 secret,该文件包含身份验证信息:$ oc create secret generic my-registry-credentials \ 1 --from-file=config.json=/home/user/credentials/config.json 2
在
serviceaccount.yaml
文件中为服务帐户创建 YAML 清单。在此清单中,将 secret 与服务帐户关联。apiVersion: v1 kind: ServiceAccount metadata: name: container-bot 1 secrets: - name: my-registry-credentials 2
为任务运行或管道运行创建 YAML 清单,作为
run.yaml
文件运行。在这个文件中,将服务帐户与任务运行或管道运行关联。使用以下示例之一:将服务帐户与任务运行关联:
apiVersion: tekton.dev/v1 kind: TaskRun metadata: name: build-container-task-run-2 1 spec: taskRunTemplate: serviceAccountName: container-bot 2 taskRef: name: build-container 3
将服务帐户与管道运行关联:
apiVersion: tekton.dev/v1 kind: PipelineRun metadata: name: demo-pipeline 1 namespace: default spec: taskRunTemplate: serviceAccountName: container-bot 2 pipelineRef: name: demo-pipeline 3
输入以下命令应用更改:
$ oc apply --filename serviceaccount.yaml,run.yaml
5.2.5. 使用服务帐户进行身份验证的其他注意事项
在某些情况下,您必须完成额外的步骤来使用使用服务帐户提供的身份验证 secret。
5.2.5.1. 任务中的 SSH Git 身份验证
您可以在任务步骤中直接调用 Git 命令并使用 SSH 身份验证,但您必须完成额外的步骤。
OpenShift Pipelines 在 /tekton/home/.ssh
目录中提供 SSH 文件,并将 $HOME
变量设置为 /tekton/home
。但是,Git SSH 身份验证会忽略 $HOME
变量,并将 /etc/passwd
文件中指定的主目录用于用户。因此,使用 Git 命令的步骤必须将 /tekton/home/.ssh
目录符号链接到相关用户的主目录。
例如,如果任务以 root
用户身份运行,则步骤必须在 Git 命令前使用以下命令:
apiVersion: tekton.dev/v1 kind: Task metadata: name: example-git-task spec: steps: - name: example-git-step # ... script: ln -s $HOME/.ssh /root/.ssh # ...
但是,当使用 git
类型的管道资源或 Tekton 目录中提供的 git-clone
任务时,不需要显式符号链接。
有关在 git
类型任务中使用 SSH 身份验证的示例,请参阅 authenticating-git-commands.yaml。
5.2.5.2. 以非 root 用户身份使用 secret
在某些情况下,您可能需要将 secret 用作非 root 用户,例如:
- 容器用于执行运行的用户和组由平台随机化。
- 任务中的步骤定义非 root 安全性上下文。
- 任务指定一个全局非 root 安全上下文,它应用到任务中的所有步骤。
在这种情况下,请考虑以非 root 用户身份运行任务和管道运行的以下方面:
-
Git 的 SSH 身份验证要求用户在
/etc/passwd
目录中配置有效的主目录。指定没有有效主目录的 UID 会导致身份验证失败。 -
SSH 身份验证会忽略
$HOME
环境变量。因此,您必须将 OpenShift Pipelines 定义的$HOME
目录(/tekton/home
)中的 secret 文件符号链接到非 root 用户的有效主目录。
另外,要在非 root 安全上下文中配置 SSH 身份验证,请参阅示例中的 git-clone-and-check
步骤,以验证 git 命令。