概念

Kubernetes 中,Pod 内部进程想要访问 API Server,就需要用到 ServiceAccount。ServiceAccount 类似业务系统里的账户,用于为 Pod 提供身份。

默认情况下,应用程序将使用他们 namespace 中的 default 账号进行身份认证。例如,一个应用程序在 kube-ops 中运行,在没有任何显式配置的情况下,这个应用程序将会加载 default 这个账号。如果 default 账号不存在,则身份认证将会失败。

配置创建

在命名空间中创建 ServiceAccount 有两种方式,一种是通过 kubectl 在命令行中创建。另一种则是通过 yaml 文件进行声明,并通过 apply -f 的方式应用到 Pod 中。

例如,在 Prometheus 中,要请求 prometheus 访问权限,需要创建以下 SeriviceAccount:

1
2
3
4
5
apiVersion: v1
kind: ServiceAccount
metadata:
  name: prometheus
  namespace: kube-ops

配置引用

创建完 ServiceAccount 后,需要显示地通过 serviceAccountName 进行指定,否则 Kubernetes 会加载 default 账号。相关配置如下:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
apiVersion: apps/v1
kind: Deployment
metadata:
  name: prometheus
  namespace: kube-ops
spec:
  selector:
    matchLabels:
      app: prometheus
  template:
    metadata:
      labels:
        app: prometheus
    spec:
      serviceAccountName: prometheus
      containers:
      - name: prometheus
        image: prom/prometheus:v2.33.5
        command:
          - "/bin/prometheus"