k8s每个namespace都会有一个默认的 default账号,且serviceAccount局限在自己所属的namespace中,而UserAccount是可以跨ns的。
第一种方式:命令行创建一个ServiceAccount:
kubectl create serviceaccount mysa
查看 是这样的:
kubectl get sa -n xxxx (不写-n 就是默认default)
你还会发现k8s会在secrets 里面保存一个token
kubectl describe sa mysa
通过kubectl describe secret mysa-token-sk67q (改成你自己的)
第二种方式:yaml方式
apiVersion: v1
kind: ServiceAccount
metadata:
creationTimestamp: null
name: mysa
如果不知道怎么写生成一个
kubectl create serviceaccount mysa -o yaml --dry-run=client > mysa.yaml
创建ServiceAccount账户
apiVersion: v1
kind: ServiceAccount
metadata:
name: admin
namespace: kube-system
labels:
kubernetes.io/cluster-service: "true"
addonmanager.kubernetes.io/mode: Reconcile
创建ClusterRoleBinding 关系
kind: ClusterRoleBinding
apiVersion: rbac.authorization.k8s.io/v1
metadata:
name: admin
annotations:
rbac.authorization.kubernetes.io/autoupdate: "true"
roleRef:
kind: ClusterRole
name: cluster-admin
apiGroup: rbac.authorization.k8s.io
subjects:
- kind: ServiceAccount
name: admin
namespace: kube-system
获取token
执行 kubectl get secret -n kube-system 你会看到 一个 admin开头的 secret
kubectl describe secret “admin开头的那个secret名称” -n kube-system
手工拷贝token里面的值给客户端使用,切记不要多拷空格
生成pod
apiVersion: apps/v1
kind: Deployment
metadata:
name: myngx
spec:
selector:
matchLabels:
app: nginx
replicas: 1
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginxtest
image: nginx:1.18-alpine
imagePullPolicy: IfNotPresent
ports:
- containerPort: 80
kubectl get pod
可以看到pod列表 ,然后我们 进入 该容器
kubectl exec -it myngx-58bddf9b8d-qmdq7 -- sh
curl --header "Authorization: Bearer 【生成的token】" --insecure -s https://192.168.137.180:6443/api/v1/namespaces/default/pods
我们可以看到是不可以的,因为default账号没有列出pods的权限
修改我们deployment
再次执行就好了