例子
需要注意的是,k8s不会提供用户管理,那么User、Group、ServiceAccount指定的用户又是从哪里来的呢?
k8s组件(kubelet、kube-proxy)或其他自定义的用户在向CA申请证书时,需要提供一个证书请求文件
API Server会把客户端证书的CN字段作为User,把names.O字段作为Group
kubelet使用TLS Bootstraping认证时,API Server可以使用Bootstrap Tokens或者Token authentication file验证=token,无论哪一种,k8s都会为token绑定一个默认的User和Group
Pod使用ServiceAccount认证时,service-account-token中的JWT会保存User信息
有了用户信息,再创建一对角色/角色绑定(集群角色/集群角色绑定)资源对象,就可以完成权限绑定了
创建一个dev命名空间,使devuser能在dev命名空间中访问集群资源
创建证书请求
vim /root/test-yaml/cert/devuser/devuser-csr.json
{
"CN": "devuser",
"hosts": [],
"keys": {
"algo": "rsa",
"size": 2048
},
"names": [
{
"C": "CN",
"ST": "BeiJing",
"L": "BeiJing",
"O": "k8s",
"OU": "System"
}
]
}
下载证书创建工具
wget https://pkg.cfssl.org/R1.2/cfssl_linux-amd64
wget https://pkg.cfssl.org/R1.2/cfssljson_linux-amd64
wget https://pkg.cfssl.org/R1.2/cfssl-certinfo_linux-amd64
mv cfssl_linux-amd64 /usr/local/bin/cfssl
mv cfssljson_linux-amd64 /usr/local/bin/cfssljson
mv cfssl-certinfo_linux-amd64 /usr/local/bin/cfssl-certinfo
chmod +x /usr/local/bin/*
创建证书
cd /etc/kubernetes/pki
cfssl gencert -ca=ca.crt -ca-key=ca.key -profile=kubernetes /root/test-yaml/cert/devuser/devuser-csr.json | cfssljson -bare devuser
# -ca 指定证书
# -ca-key 指定私钥
设置集群参数
export KUBE_APISERVER="https://172.21.16.17:6443"
cd /root/test-yaml/cert/devuser
kubectl config set-cluster kubernetes \
--certificate-authority=/etc/kubernetes/pki/ca.crt \
--embed-certs=true \
--server=${KUBE_APISERVER} \
--kubeconfig=devuser.kubeconfig
# --certificate-authority 指定证书
# --embed-certs 开启证书认证
# --server 指定服务器
# --kubeconfig 指定生成的文件
设置客户端认证参数
kubectl config set-credentials devuser \
--client-certificate=/etc/kubernetes/pki/devuser.pem \
--client-key=/etc/kubernetes/pki/devuser-key.pem \
--embed-certs=true \
--kubeconfig=devuser.kubeconfig
# --client-certificate 指定客户端证书
# --client-key 指定客户端私钥
# --embed-certs 开启证书认证
# --kubeconfig 指定生成的文件
设置上下文参数,绑定命名空间
kubectl create namespace dev
kubectl config set-context kubernetes \
--cluster=kubernetes \
--user=devuser \
--namespace=dev \
--kubeconfig=devuser.kubeconfig
将证书文件赋予用户(部分为客户端命令)
useradd devuser
mkdir /home/devuser/.kube
cp /root/test-yaml/cert/devuser/devuser.kubeconfig /home/devuser/.kube/config
chown -R devuser.devuser /home/devuser/*
将clusterrole赋予dev命名空间中的devuser用户
kubectl create rolebinding devuser-admin-binding --clusterrole=admin --user=devuser --namespace=dev
切换默认上下文,使集群读取到配置信息
kubectl config use-context kubernetes --kubeconfig=/home/devuser/.kube/config
此时客户端 kubectl get pod 获取不到资源
kubectl run nginx -image=nginx 创建一个pod
kubectl get pod 来查看
因为不加命名空间默认是default,服务端也查看是在dev命名空间下,所以切换成功
标签:kubectl,kubernetes,--,devuser,kubeconfig,cfssl,例子
From: https://www.cnblogs.com/lixunblogs/p/18167060