Kubernetes & ServiceAccount

乐正穆冉
2023-12-01

ServiceAccount

每个namespace下有一个名为default的默认的ServiceAccount对象,这个ServiceAccount里有一个名为Tokens的可以作为Volume一样被Mount到Pod里的Secret,当Pod启动时这个Secret会被自动Mount到Pod的指定目录下,用来协助完成Pod中的进程访问API Server时的身份鉴权过程。

如果一个Pod在定义时没有指定spec.service.AccountName属性,则系统会自动为其赋值为“Default”,即使用同一namespace下默认的ServiceAccount,如果某个Pod需要使用非default的ServiceAccount,需要在定义时指定:

 apiVersion:v1
    kind:Pod
    metadata:
        name:mypod
    spec:
        containers:
        - name:mycontainer
          image:
        serviceAccountName:myserviceaccount

Secrets

一旦secret被创建,可以通过以下三个方式使用它:

  1. 在创建Pod时,通过为Pod指定ServiceAccount来自动使用该Secret;
  2. 通过挂载该Secret到Pod来使用它;在使用Mount方式挂载Secret时,Container中Secret的“data”域的各个域的key值作为目录中的文件,Value值被BASE64编码后存储在相应的文件中。
  3. Docker镜像下载时使用,通过指定Pod的spec.ImagePullSecrets来引用它;

Usage

我们可以通过Secret保管其他系统的敏感信息(比如数据库用户名和密码),并以Mount的方式将Secret挂载到Container中,然后通过访问目录中的文件的方式获取该敏感信息。当Pod被API Server创建时,API Server不会校验该Pod引用的Secret是否存在。一旦这个Pod被调度,则Kubelet将试着获取Secret的值。如果Secret不存在或暂时无法连接到API Server,则kubelet将按一定的时间间隔定期重试获取该Secret,并发送一个Event来解释Pod没有启动的原因。一旦Secret被Pod获取,则Kubelet将创建并Mount包含Secret的Volume。只有所有的Volume被Mount后,Pod中的Container才会被启动。在kubelet启动Pod中container后,Container中和Secret相关的Volume将不会被改变,即使Secret本身被修改了。为了使用更新后的Secret,必须删除旧的Pod,并重新创建一个新的Pod,因此更新Secret的流程和部署一个新的Image是一样的。

参考

《Kubernetes权威指南》

 类似资料: