所属技术领域:
Pod
|名词定义|
ServiceAccount主要用于解决Pod在集群中的身份认证问题,其中认证使用的授权信息,则利用Secret(type=kubernetes.io/service-account-token)进行管理。
|技术特点|
ServiceAccount 介绍
先看一下上面的左侧截图,可以看到最下面的红框里,有一个 Secret 字段,它指定 ServiceAccount 用哪一个 Secret,这个是K8s 自动为 ServiceAccount 加上的。然后再来看一下上图中的右侧截图,它对应的 Secret 的 data 里有两块数据,一个是 ca.crt,一个是 token。ca.crt 用于对服务端的校验,token 用于 Pod 的身份认证,它们都是用 base64 编码过的。然后可以看到 metadata 即元信息里,其实是有关联 ServiceAccount 信息的(这个 secret 被哪个 ServiceAccount 使用)。最后我们注意一下 type,这个就是 service-account-token 这种类型。
举例:Pod 里的应用访问它所属的 K8s 集群
我们来看一下,pod 是怎么利用 ServiceAccount 或者说它是怎么利用 secret 来访问所属 K8s 集群的。
其实 pod 创建的时候,首先它会把这个 secret 挂载到容器固定的目录下,这是 K8s 功能上实现的。它要把这个 ca.crt 和 token 这两个文件挂载到固定目录下面。
pod 要访问集群的时候,它是怎么来利用这个文件的呢?我们看一下下面的代码截图:
我们在 Go 里面实现 Pod 访问 K8s 集群时,一般直接会调一个 InClusterConfig 方法,来生成这个访问服务 Client 的一些信息。然后可以看一下,最后这个 Config 里面有两部分信息:
一个是 tlsClientConfig,这个主要是用于 ca.crt 校验服务端;
第二个是 Bearer Token,这个就是 pod 的身份认证。在服务端,会利用 token 对 pod 进行一个身份认证。
再次回到上图左侧。认证完之后 pod 的身份信息会有两部分:一个是 Group,一个是 User。身份认证是就是认证这两部分信息。接着可以使用 RBAC 功能,对 pod 进行一个授权管理。
假如 RBAC 没有配置的话,默认的 pod 具有资源 GET 权限,就是可以从所属的 K8s 集群里 get 数据。如果是需要更多的权限,那么就需要自行配置 RBAC 。
创建一个serviceaccount
$ kubectl create serviceaccount jaxzhai
$ kubectl get sa
NAME SECRETS AGE
default 1 52d
jaxzhai 1 8s
$ kubectl describe sa jaxzhai
Name: jaxzhai
Namespace: default
Labels:
Annotations:
Image pull secrets:
Mountable secrets: jaxzhai-token-9n5th
Tokens: jaxzhai-token-9n5th
Events:
$ kubectl get secret
NAME TYPE DATA AGE
default-token-lplp6 kubernetes.io/service-account-token 3 52d
jaxzhai-token-9n5th kubernetes.io/service-account-token 3 4m
复制代码
这里我们看到Kubernetes集群会自动创建一个token的secert,并被jaxzhai这个serviceaccount引用。
设置非默认的 service account,只需要在 pod 的spec.serviceAccountName 字段中将name设置为您想要用的 service account 名字即可。
在 pod 创建之初 service account 就必须已经存在,否则创建将被拒绝。
您不能更新已创建的 pod 的 service account。
在pod中使用service account
apiVersion: v1
kind: Pod
metadata:
name: my-sa-demo
namespace: default
labels:
name: myapp
tier: appfront
spec:
containers:
-
name: myapp
image: ikubernetes/myapp:v1
ports:- name: http
containerPort: 80
serviceAccountName: jaxzhai
- name: http
$ kubectl apply -f myapp-serviceaccount.yaml
pod/my-sa-demo created
$ kubectl describe pod my-sa-demo
......
Volumes:
jaxzhai-token-9n5th:
Type: Secret (a volume populated by a Secret)
SecretName: jaxzhai-token-9n5th
Optional: false
QoS Class: BestEffort
......