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名称空间的内容