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

15

我正在阅读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>

向服务帐户添加机密对象

apiVersion: v1
kind: ServiceAccount
metadata:
 name: build-bot
secrets:
 - name: basic-user-pass

我对Kubernetes中的服务账户的认知是它是一个用于访问Kubernetes API服务器的JWT。但我不明白为什么要向ServiceAccount添加一个Secret,以及如何使用和为何使用。

问题:

  • 服务账户添加密钥是什么意思?
  • 将密钥添加到服务账户中有什么用处?
  • Tekton为什么要求必须将密钥添加到服务账户中?
  • 谁/什么会查看服务账户的密钥列表?

问题帖子应该一次只提出一个问题。 - Vega
2个回答

15

希望您喜欢您的Kubernetes之旅!

1) 服务账户添加秘密信息是什么意思?/将秘密信息添加到服务账户有何用处?

首先,提醒一下:

你可能知道,你必须把服务账户看作是机器/应用程序/脚本(不仅限于Kubernetes)的用户,而不是人类。与人类不同,为了向需要身份验证的事物(Git存储库/Docker注册表或API)进行身份验证,服务账户需要具备凭据(用户名+密码)。

在Kubernetes中,这些凭据,特别是密码,存储在“secrets”中。

现在,你应该知道在Kubernetes中,每个命名空间都有一个名为“default”的本地服务账户,它与每个运行的Pod相关联,而该服务账户连接到本地的“default” Kubernetes secret,在所有命名空间中也存在。此“默认”secret包含ca.crt和一个token,该token允许pod调用内部的Kubernetes API服务器端点等其他操作。

由于包含“凭据”的secrets链接到被挂载到pod的服务账户,因此该pod就可以认证需要身份验证的事物。

例如,如果有一天你需要使用私有Docker注册表来拉取你的镜像,你可以通过两种方式做到这一点,在其中每种方式中,你都必须首先创建一个包含敏感数据(凭据)的secret:

  • 第一种方式是直接将包含注册表凭据的secret名称添加到默认服务账户中(作为提醒,默认情况下该服务账户被挂载到pod上),或者在新创建的服务账户中添加(例如你的情况下所做的tekton),然后将其添加到Kubernetes部署清单中的serviceAccountName:字段。
  • 第二种方式是在Kubernetes部署清单中添加imagePullSecret字段。

这样,当Kubernetes尝试拉取您的私有Docker镜像时,它将检查服务账户secrets中的凭据是否有效。如果无效,它将检查您在imagePullSecret字段中添加的secret(或反之),然后连接到注册表并拉取镜像以在pod中运行它!

2) 谁/什么查看服务账户secrets列表?

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

❯ k get sa
NAME      SECRETS   AGE
default   1         30m

这个默认的serviceAccount与名为"default-token-r4vrb"的secret相关联:

 k get sa default -o yaml
apiVersion: v1
kind: ServiceAccount
metadata:
  creationTimestamp: "2022-05-06T08:48:38Z"
  name: default
  namespace: so-tests
  resourceVersion: "1771"
  uid: c3598708-ad14-4806-af31-5c54d60e29b7
secrets:
- name: default-token-r4vrb

这个默认令牌(secret)包含了用于认证Kubernetes API终端(certificate+token)所需的内容:

 k get secret default-token-r4vrb -o yaml
apiVersion: v1
data:
  ca.crt: base64encodedCaCertificate
  namespace: base64encodedNamespace
  token: base64encodedToken
kind: Secret
metadata:
  annotations:
    kubernetes.io/service-account.name: default
    kubernetes.io/service-account.uid: c3598708-ad14-4806-af31-5c54d60e29b7
  creationTimestamp: "2022-05-06T08:48:38Z"
  name: default-token-r4vrb
  namespace: so-tests
  resourceVersion: "1770"
  uid: d342a372-66d1-4c92-b520-23c23babc798
type: kubernetes.io/service-account-token

3) 为什么Tekton要求将秘钥添加到服务账户中?谁/什么查看服务账户秘钥列表?

现在我希望你知道为什么他们选择使用serviceAccount来处理这个问题,但是他们也可以直接将secret挂载到pod中 :)

希望这能帮助到你。以下是一些文档,以便更加熟悉K8S SA: https://kubernetes.io/docs/tasks/configure-pod-container/configure-service-account/

bguess/


服务账户不再自动使用令牌创建密钥:https://stackoverflow.com/a/72258300/11555535 - undefined

0
  • 服务账户加入密钥的含义是什么?

密钥存储其JWT令牌以进行认证。

  • 向服务账户添加密钥有什么用处?

实际上,Kubernetes默认会创建令牌,您不需要添加密钥,除非要手动创建令牌。但是您的密钥不正确,正确的应该是:

apiVersion: v1
kind: Secret
metadata:
  name: build-robot-secret
  annotations:
    kubernetes.io/service-account.name: build-robot
type: kubernetes.io/service-account-token

注意类型。

  • 为什么令牌需要将密钥添加到服务帐户中?

正如我所说,k8s需要jwt令牌进行api服务器身份验证。请查看this

  • 谁/什么查看服务帐户密码列表?

您可以登录pod并cat /run/secrets/kubernetes.io/serviceaccount/token


这个问题询问的是关于 SA 的 “secrets”字段,而不是如何为 SA 生成 JWT。它们都是与 SA 相关的“Secrets”,但是非常不同。 - agilgur5

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接