ServiceAccount


查看serviceaccount:

kubectl get sa --all-namespaces

NAMESPACE         NAME                                 SECRETS   AGE
default           default                              1         23h
kube-node-lease   default                              1         23h
kube-public       default                              1         23h
kube-system       attachdetach-controller              1         23h
kube-system       bootstrap-signer                     1         23h
kube-system       certificate-controller               1         23h
kube-system       clusterrole-aggregation-controller   1         23h
kube-system       coredns                              1         23h
...


Pod的认证方式


        每个Pod都有自己的认证秘钥,也叫Token通过secret来定义,以volumes的方式挂载进Pod中。Pod内的应用通过此secret来连接apiserver与认证。

Volumes:
  default-token-ztk5c:
    Type:        Secret (a volume populated by a Secret)
    SecretName:  default-token-ztk5c
    Optional:    false

每个Pod都有secrets可以通过如下命令查看:

kubectl get secrets --all-namespaces
NAMESPACE         NAME                                   TYPE                                  DATA   AGE
default           ceph-user-secret                       kubernetes.io/rbd                     1      11d
default           default-token-cgkng                    kubernetes.io/service-account-token   3      22d

        这些default的secret仅仅有权限获取自身的信息,如果想扩展权限就要自建serviceaccount并使用 pod.spec.serviceAccountName 附加到Pod中。

创建账号:

]# kubectl create serviceaccount myadmin --dry-run -o yaml
apiVersion: v1
kind: ServiceAccount
metadata:
  creationTimestamp: null
  name: myadmin

每创建一个serviceaccount就会自动生成一个对应的token:

        这个token只是认证登陆到k8s但是没有其他权限,做不了其他事情,需要授权。

]# kubectl create serviceaccount myadmin 
serviceaccount/myadmin created
]# kubectl get sa
NAME      SECRETS   AGE
myadmin   1         4s
]# kubectl get secret
NAME                  TYPE                                  DATA   AGE
myadmin-token-6l9z9   kubernetes.io/service-account-token   3      20s


收到动创建一个Pod,并使用自己创建的sa:

apiVersion: v1
kind: Pod
metadata:
  name: sa-pod
spec:
  containers:
  - name: nginx
    image: nginx:latest
    ports:
    - name: http
      containerPort: 80
  serviceAccount: myadmin

运行后就可以describe Pod,可以看到volumes列是自己创建的账号:

Volumes:
  myadmin-token-6l9z9:
    Type:        Secret (a volume populated by a Secret)
    SecretName:  myadmin-token-6l9z9
    Optional:    false


拉取镜像用到的secret:

]# kubectl describe sa myadmin 
Name:                myadmin
Namespace:           default
Labels:              <none>
Annotations:         <none>
Image pull secrets:  <none>  # 拉取镜像用到的秘钥
Mountable secrets:   myadmin-token-6l9z9
Tokens:              myadmin-token-6l9z9
Events:              <none>