希望您喜欢您的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/