k8s每个namespace都会有一个默认的 default账号,且serviceAccount局限在自己所属的namespace中,而UserAccount是可以跨ns

创建serviceaccount

第一种方式:命令行创建一个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

赋予权限、外部访问API

创建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里访问k8s API(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

再次执行就好了

举报/反馈

小雨喳

61获赞 45粉丝
专注于k8s、istio、operator、golang技术
关注
0
0
收藏
分享