容器编排之战(十九)连载

tech2026-03-02  2

ServiceAccount详解

官方文档地址:https://kubernetes.io/docs/tasks/configure-pod-container/configure-service-account/

k8s中提供了良好的多租户认证管理机制,如RBAC、ServiceAccount还有各种Policy等。

什么是 Service Account ?

当用户访问集群(例如使用kubectl命令)时,apiserver 会将用户认证为一个特定的 User Account(目前通常是admin,除非系统管理员自定义了集群配置)。 ​ Pod 容器中的进程也可以与 apiserver 联系。 当它们在联系 apiserver 的时候,它们会被认证为一个特定的 Service Account(例如default)。

使用场景:

Service Account它并不是给kubernetes集群的用户使用的,而是给pod里面的进程使用的,它为pod提供必要的身份认证。----专门为pod里面的进程和apiserver通信提供认证的。

Service account与User account区别:

1. User account是为人设计的,而service account则是为Pod中的进程调用Kubernetes API或其他外部服务而设计的 ​ 2. User account是跨namespace的,而service account则是仅局限它所在的namespace; ​ 3. 每个namespace都会自动创建一个default service account ​ 4. Token controller检测service account的创建,并为它们创建secret ​ 5. 开启ServiceAccount Admission Controller后: 5.1 每个Pod在创建后都会自动设置spec.serviceAccount为default(除非指定了其他ServiceAccout) 5.2 验证Pod引用的service account已经存在,否则拒绝创建 5.3 如果Pod没有指定ImagePullSecrets,则把service account的ImagePullSecrets加到Pod中 5.4 每个container启动后都会挂载该service account的token和ca.crt到/run/secrets/kubernetes.io/serviceaccount/ 每一个pod启动之后都会有一个和认证相关的东西存在pod里面,,存在到哪里呢?

查看系统的config配置:

这里用到的token就是被授权过的SeviceAccount账户的token,集群利用token来使用ServiceAccount账户 [root@kub-k8s-master prome]# cat /root/.kube/config

Service Account应用示例

Service Account(服务账号)测试示例

因为平时系统会使用默认service account,我们不需要自己创建,感觉不到service account的存在,本实验是使用自己手动创建的service account

1、创建serviceaccount [root@kub-k8s-master ~]# kubectl create serviceaccount mysa serviceaccount/mysa created 2、查看mysa [root@kub-k8s-master ~]# kubectl describe sa mysa Name: mysa Namespace: default Labels: <none> Annotations: <none> Image pull secrets: <none> Mountable secrets: mysa-token-cknwf Tokens: mysa-token-cknwf Events: <none> 3、查看mysa自动创建的secret [root@kub-k8s-master ~]# kubectl get secret NAME TYPE DATA AGE db-user-pass Opaque 2 11h default-token-6svwp kubernetes.io/service-account-token 3 4d23h mysa-token-cknwf kubernetes.io/service-account-token 3 76s mysecret Opaque 2 11h mysecret-01 Opaque 2 6h58m pass Opaque 1 7h6m user Opaque 1 7h7m 4、使用mysa的sa资源配置pod [root@kub-k8s-master ~]# cd prome/ [root@kub-k8s-master prome]# vim mysa-pod.yaml --- apiVersion: v1 kind: Pod metadata: name: nginx-pod labels: app: my-pod spec: containers: - name: my-pod image: daocloud.io/library/nginx ports: - name: http containerPort: 80 serviceAccountName: mysa #指定serviceaccount的名称 5、导入 [root@kub-k8s-master prome]# kubectl apply -f mysa-pod.yaml pod/nginx-pod created 6、查看 [root@kub-k8s-master prome]# kubectl describe pod nginx-pod 7、查看使用的token和secret(使用的是mysa的token) [root@kub-k8s-master prome]# kubectl get pod nginx-pod -o jsonpath={".spec.volumes"} [map[name:mysa-token-cknwf secret:map[defaultMode:420 secretName:mysa-token-cknwf]]] [root@kub-k8s-master prome]#
最新回复(0)