在 Kubernetes 中向 ServiceAccount 添加密钥有什么作用?

ams*_*ams 16 kubernetes tekton

我正在阅读有关身份验证的 tekton文档,它解释了进行身份验证需要两件事

创建一个秘密文档,下面给出示例

apiVersion: v1
kind: Secret
metadata:
 name: basic-user-pass
 annotations:
   tekton.dev/git-0: https://github.com # Described below
type: kubernetes.io/basic-auth
stringData:
 username: <username>
 password: <password>
Run Code Online (Sandbox Code Playgroud)

将秘密对象添加到服务帐户

apiVersion: v1
kind: ServiceAccount
metadata:
 name: build-bot
secrets:
 - name: basic-user-pass
Run Code Online (Sandbox Code Playgroud)

我对 k8s 中服务帐户的心理模型是,它是用于访问 k8s API 服务器的 JWT。我不明白向 ServiceAccount 添加秘密有什么意义,如何以及为什么使用它。

问题:

  • 对于服务帐户添加机密意味着什么?
  • 为什么向服务帐户添加机密很有用?
  • 为什么 tekton 要求将密钥添加到服务帐户?
  • 谁/什么查看服务帐户机密列表?

Bgu*_*ess 16

希望您享受您的 Kubernetes 之旅!

\n

1)服务帐户添加机密意味着什么?/ 为什么向服务帐户添加机密很有用?

\n

首先,有一点提醒:

\n

正如您可能知道的,您必须将 serviceAccount 视为机器/应用程序/脚本的用户(并且不仅在 Kubernetes 中),简而言之,一切都不是人类的。作为人类服务帐户,为了对需要身份验证的事物(Git 存储库/docker 注册表或 API)进行身份验证,需要拥有凭据(用户名+密码)。

\n

在 Kubernetes 中,此凭证(尤其是密码)存储在“秘密”中。

\n

现在,您应该知道,kubernetes 中的每个命名空间都有一个名为“default”的本机服务帐户,该帐户与每个正在运行的 pod关联,并且该服务帐户链接到也存在于所有命名空间中的本机“默认”kubernetes 密钥。\此“默认”密钥包含 ca.crt 和一个令牌,使 pod 可以调用内部 Kubernetes API 服务器端点等。

\n

由于包含“凭据”的机密链接到安装到 pod 的服务帐户,因此该 pod 能够对需要身份验证的事物进行身份验证。

\n

例如,如果有一天您必须使用私有 docker 注册表来提取图像,您可以通过两种方式执行此操作,在每种方式中,您必须首先创建一个包含敏感数据(凭据)的秘密:

\n
    \n
  • 第一种方法包括添加您的秘密名称,该名称直接在默认的 serviceAccount 中包含注册表凭据(提醒一下,默认情况下会在 pod 中安装,或者在新创建的 serviceAccount 中安装(就像 tekton 在您的情况下所做的那样)它将被添加到 字段中的 kubernetes 部署清单中serviceAccountName:
  • \n
  • 第二种方法包括imagePullSecret在 kubernetes 部署清单中添加该字段。
  • \n
\n

这样,当 kubernetes 拉取您的私有 docker 映像时,它将检查 serviceAccount 机密中所需的凭据是否有效,如果无效,它将检查您在 imagePullSecret 字段中添加的机密(或相反),然后它将能够连接到注册表并拉取映像以将其作为容器中的容器运行!

\n

2)谁/什么查看服务帐户机密列表?

\n

例如在一个全新的命名空间中:

\n
\xe2\x9d\xaf k get sa\nNAME      SECRETS   AGE\ndefault   1         30m\n
Run Code Online (Sandbox Code Playgroud)\n

此默认 serviceAccount 链接到名为“default-token-r4vrb”的密钥:

\n
\xe2\x9d\xaf k get sa default -o yaml\napiVersion: v1\nkind: ServiceAccount\nmetadata:\n  creationTimestamp: "2022-05-06T08:48:38Z"\n  name: default\n  namespace: so-tests\n  resourceVersion: "1771"\n  uid: c3598708-ad14-4806-af31-5c54d60e29b7\nsecrets:\n- name: default-token-r4vrb\n
Run Code Online (Sandbox Code Playgroud)\n

此默认令牌密钥包含验证 Kubernetes APi 端点所需的内容(证书 + 令牌):

\n
\xe2\x9d\xaf k get secret default-token-r4vrb -o yaml\napiVersion: v1\ndata:\n  ca.crt: base64encodedCaCertificate\n  namespace: base64encodedNamespace\n  token: base64encodedToken\nkind: Secret\nmetadata:\n  annotations:\n    kubernetes.io/service-account.name: default\n    kubernetes.io/service-account.uid: c3598708-ad14-4806-af31-5c54d60e29b7\n  creationTimestamp: "2022-05-06T08:48:38Z"\n  name: default-token-r4vrb\n  namespace: so-tests\n  resourceVersion: "1770"\n  uid: d342a372-66d1-4c92-b520-23c23babc798\ntype: kubernetes.io/service-account-token\n
Run Code Online (Sandbox Code Playgroud)\n

3) 为什么 tekton 要求将机密添加到服务帐户?\n谁/什么查看服务帐户机密列表?

\n

现在我希望你知道为什么,他们选择使用 serviceAccount 来执行此操作,但他们也可以直接将秘密安装到 pod 中:)

\n

希望这对您有帮助。以下是一些更熟悉 K8S SA 的文档:\n https://kubernetes.io/docs/tasks/configure-pod-container/configure-service-account/

\n

猜猜/

\n