K8S权限管理-SERVICEACCOUNT和创建kubeconfig
1、serviceacount
Kubernets API 中的资源类型,用于让POD对象内部的应用程序在与API Server通信是完成身份认证,属于名称空间级别
名为ServiceAccount的准入控制器实现了服务账户的自动化,它会为每个名称空间自动生成一个名称为default的默认资源对象
1.1、命令式创建指定的ServiceAccount
kubectl create serviceaccount xx
如在default名称空间增加一个test serviceaccount :
kubectl create serviceaccount test
可以看到自动生成了一个Secret对象,以后使用ServiceAccount的pod会将这个secret对象默认挂载在pod /var/run/secrets/kibernets.io/serviceaccount目录的三个文件,用于pod内部的应用与API Server完成认证
1.2、资源清单创建ServiceAccount
apiVersion: v1 kind: ServiceAccount metadata: name <string> #资源名称 namespace <string> #所属名称空间 autoMountServiceAccountToken <boolean> #是否让POD自动挂载API令牌 secrets: <[]Object> #以该SA运行的POD要使用的secret对象所组成的列表 apiVersion: <string> #Secret对象所属的API群组和版本,可以省略 kind: <string> #资源类型,secret,可省略 name: <string> #引用的secret对象名称 namespace: <string> #secrets所属的名称空间 uid: <string> #secret对象标识符 imagePullSecrets <[]object>: #引用用于下载容器镜像的Secret对象列表,用于pod在拉取容器镜像时,提前完成与镜像仓库的身份认证 name <string> #demo.yaml
例如创建一个test ServiceAccount
apiVersion: v1
kind: ServiceAccount
metadata:
name: test
namespace: default
autoMountServiceAccountToken: true
tets-demo.yaml
创建POD使用该ServiceAccount
apiVersion: v1
kind: Pod
metadata:
name: testwithsa
namespace: default
spec:
containers:
- name: amdinbox
image: ikubernetes/admin-toolbox:v1.0
imagePullPolicy: Always
serviceAccountName: test
test-pod.yaml
kubectl get pod -n default -o wide -o yaml
可以看到自动生成了一个volume:kube-api-access-hwzrd,3个path:token/ca.crt/namespace,对应在容器/var/run/secrets/kibernets.io/serviceaccount目录下
POD内:
(1)在pod与API server交互时,工作负载进程会使用该目录下的ca.crt证书文件验证API Server的服务器证书是否是所在集群kubernetes-ca签发
(2)服务器身份验证通过后,工作负载向API server请求操作namespace文件指定的名称空间中的资源时,会将token文件中的令牌以承载令牌的认证方式提交给API Server进行验证,权限验证则由授权插件完成
早容器中使用curl向API Server发起访问请求
cd /var/run/secrets/kubernetes.io/serviceaccount
curl --cacert ./ca.crt -H "Authorization: Bearer $(cat ./token)" https://10.0.8.101:6443/namespace/$(cat ./namespace)/
可以看到,该serviceaccount没有管理default名称空间的权限,给该serviceaccount授予default名称空间的管理权限(也可以通过资源清单创建)
kubectl create rolebinding namespace-default-admin --clusterrole=admin --serviceaccount=default:test -n default
在pod内验证:
cd /var/run/secrets/kubernetes.io/serviceaccount
curl --cacert ./ca.crt -H "Authorization: Bearer $(cat ./token)" https://10.0.8.101:6443/api/v1/namespaces/$(cat ./namespace)/
页面验证:
获取serviceacount token
复制token的值登录管理页面:
只能看到default名称空间下的资源
2、制作kubeconfig
2.1、创建证书
2.1.1、k8s证书和私钥:ca.pem和ca-key.pem
位置:
kubeasz安装k8s的管理服务器上:/etc/kubeasz/clusters/myland-01/ssl/ #myland-01为k8s集群名称
master节点:/etc/kubernetes/ssl/
2.2.2、新建文件夹用于工作目录,为了输入简单也可以把上述ca.pem和ca-key.pem也复制到这个文件夹
mkdir pki
cd pki
cp /etc/kubeasz/clusters/myland-01/ssl/ca.pem ./
cp /etc/kubeasz/clusters/myland-01/ssl/ca-key.pem ./
2.2.3、准备证书信息:
test-csr.json
{ "CN": "test", "hosts": [], "key": { "algo": "rsa", "size": 2048 }, "names": [ { "C": "CN", "ST": "BeiJing", "L": "BeiJing", "O": "myland-01", "OU": "System" } ] }
2.2.4、生成私钥名签发证书
cfssl在管理端:/etc/kubeasz/bin/cfssl
cfssl gencert -ca=ca.pem -ca-key=ca-key.pem -config=/etc/kubeasz/clusters/myland-01/ssl/ca-config.json -profile=kubernetes test-csr.json | cfssljson -bare test
生成3个文件test.csr证书签署请求(),test.pem(证书),test-key.pem(私钥)
3、配置文件
3.1、生成kubeconfig文件添加集群信息
kubectl config set-cluster myland-01 --certificate-authority=ca.pem --embed-certs=true --server=https://10.0.8.101:6443 --kubeconfig=test.kubeconfig
3.2、kubeconfig中增加用户证书信息
kubectl config set-credentials test --client-certificate=test.pem --client-key=test-key.pem --embed-certs=true --kubeconfig=test.kubeconfig
3.3、kubeconfig中新增context
kubectl config set-context test@myland-01 --cluster=myland-01 --user=test --namespace=default --kubeconfig=test.kubeconfig
3.4、kubeconfig确认使用新增的context
kubectl config use-context test@myland-01 --kubeconfig=test.kubeconfig
3.5、将serviceaccount用户Secrets中的token值添加到kubeconfig
kubectl describe secret `kubectl describe serviceaccount test|awk '/Mountable secrets/{print $3}'`|awk 'END{print " token: "$2}' >> test.kubeconfig
4、使用该kubeconfig登录dashbord查看登录后。只能看到default名称空间的内容