下面的脚本展示了如何生成 PKI 私钥和 CSR。 设置 CSR 的 CN 和 O 属性很重要。CN 是用户名,O 是该用户归属的组。
openssl genrsa -out myuser.key 2048
openssl req -new -key myuser.key -out myuser.csr -subj "/CN=myuser/O=myo"
创建一个 CertificateSigningRequest,并通过 kubectl 将其提交到 Kubernetes 集群
k8s-v1.15.1的yaml文件如下,其他版本可先用kubectl api-versions查询一下,往上的版本apiVersion应为certificates.k8s.io/v1,然后需要加上signerName
apiVersion: certificates.k8s.io/v1beta1
kind: CertificateSigningRequest
metadata:
name: myuser
spec:
groups:
- system:authenticated
request: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURSBSRVFVRVNULS0tLS0KTUlJQ1pEQ0NBVXdDQVFBd0h6RVBNQTBHQTFVRUF3d0diWGwxYzJWeU1Rd3dDZ1lEVlFRS0RBTnRlVzh3Z2dFaQpNQTBHQ1NxR1NJYjNEUUVCQVFVQUE0SUJEd0F3Z2dFS0FvSUJBUUN2NXVzc2ROZmU2K2ZMdWloNDBBSmVsa0F0CkZZSFBaSmxVbUcyVTJaTlpSZ2RlSmtMcHErV2RNMW5qZ0VjM3NmZEhNRXhhVnhiNWVRQU5IanhRUGdrakhvU2QKeEUyd2hTYVZSU1c5M2xrWkZRVFZUVGwvdDhreUYxbTNURktsdVQ4M3JVaFhMSjJURU44Qjk4cDcxTU5nb3JGawo3Ri9FTEJsck5Gc2U4Y08ycXVkb3Z2ZlNGL3dBV1VoSkMyaUlzazk0bStzTTRXNU56bHNjV3A1SlFyNlV6Wm9vCmVvczNNUi9sSDdzVVArbDZtM0d6Q2dnQnZjT3lPYi9lUzFoUC9SU1ZQbzdrS3pDajg3RlpLOU95QVhxaGVMbjcKZmdHeDFFYnA0WkVlMVRlWWhscVh3dFE5c1h5am9LWGtmSk81cWlKQkJwVDRsYjNqeXd2OXowV3FLZkYxQWdNQgpBQUdnQURBTkJna3Foa2lHOXcwQkFRc0ZBQU9DQVFFQUhGZEV2enkvd0xySUMwaEs4S3k0V1M2ZjZ0UVZaMnN4CnVRMjlyQm5PcXFueERyRzljMDJSRklCS1ZpQTU0Ymhjci90Q0VFWllZRzg0UjhCT3N0YS9kamN3SEtod3FaaDEKNmtlM3JlbEFNMG93VmtUdGIwR1NUSjI5VVJOVVlPdVJkSkdwR2dWR1RPU09jSm4yYTNnSEwveXhuY01nQXFabgpBMGZDc2hRSnhKc3ZJQzh2QUhnM1lJTWlidHNUZGhJdHV0ZGp4RCtUaDlSNitkZ2RPeExuejNaY0U1VUpCOGltCkY0Z3dVUGpTUVVROUtqMnkrSXJyVzdXcGUwRStXR3pmWndKV0djaTVWQnJ2a3FVcTM3M1RuQUE3dW5LN1V0TmYKYnF6djJpY2grcnl3QlVQNldBTUpvckRtbXd4VTFJekFzem9lSjNMdXJ2eUVCMjlwR3l4eTBBPT0KLS0tLS1FTkQgQ0VSVElGSUNBVEUgUkVRVUVTVC0tLS0tCg==
#signerName: kubernetes.io/kube-apiserver-client
usages:
- client auth
需要注意的几点:
usage 字段必须是 'client auth'
request 字段是 CSR 文件内容的 base64 编码值。 要得到该值,可以执行命令 cat myuser.csr | base64 | tr -d "\n"。
应用到集群
kubectl apply -f myuser.yaml
获取 CSR 列表:
kubectl get csr
批准 CSR:
kubectl certificate approve myuser
从 CSR 取得证书:
kubectl get csr/myuser -o yaml
证书的内容使用 base64 编码,存放在字段 status.certificate。
从 CertificateSigningRequest 导出颁发的证书
kubectl get csr myuser -o jsonpath='{.status.certificate}'| base64 -d > myuser.crt
创建了证书之后,为了让这个用户能访问 Kubernetes 集群资源,现在就要创建 Role 和 RoleBinding 了。
下面是为这个新用户创建 Role 的示例脚本:
kubectl create role developer --verb=create --verb=get --verb=list --verb=update --verb=delete --resource=pods
下面是为这个新用户创建 RoleBinding 的示例命令:
kubectl create rolebinding developer-binding-myuser --role=developer --user=myuser
添加到 kubeconfig
最后一步是将这个用户添加到 kubeconfig 文件。
首先,我们需要添加新的凭据:
kubectl config set-credentials myuser --client-key=myuser.key --client-certificate=myuser.crt --embed-certs=true
然后,你需要添加上下文:
首先需要查询集群名称:
kubectl config get-clusters
NAME
cluster.local
添加上下文:
kubectl config set-context myuser --cluster=cluster.local --user=myuser
来测试一下,把上下文切换为 myuser:
kubectl config use-context myuser
kubectl config的其他命令可用--help查看
kubectl config --help
Modify kubeconfig files using subcommands like "kubectl config set current-context my-context"
The loading order follows these rules:
1. If the --kubeconfig flag is set, then only that file is loaded. The flag may only be set once and no merging takes
place.
2. If $KUBECONFIG environment variable is set, then it is used as a list of paths (normal path delimiting rules for
your system). These paths are merged. When a value is modified, it is modified in the file that defines the stanza. When
a value is created, it is created in the first file that exists. If no files in the chain exist, then it creates the
last file in the list.
3. Otherwise, ${HOME}/.kube/config is used and no merging takes place.
Available Commands:
current-context 显示 current_context
delete-cluster 删除 kubeconfig 文件中指定的集群
delete-context 删除 kubeconfig 文件中指定的 context
get-clusters 显示 kubeconfig 文件中定义的集群
get-contexts 描述一个或多个 contexts
rename-context Renames a context from the kubeconfig file.
set 设置 kubeconfig 文件中的一个单个值
set-cluster 设置 kubeconfig 文件中的一个集群条目
set-context 设置 kubeconfig 文件中的一个 context 条目
set-credentials 设置 kubeconfig 文件中的一个用户条目
unset 取消设置 kubeconfig 文件中的一个单个值
use-context 设置 kubeconfig 文件中的当前上下文
view 显示合并的 kubeconfig 配置或一个指定的 kubeconfig 文件
Usage:
kubectl config SUBCOMMAND [options]
Use "kubectl --help" for more information about a given command.
Use "kubectl options" for a list of global command-line options (applies to all commands).
证书签名请求 | Kubernetes
用户认证 | Kubernetes