kubernetes - Kubernetes 使用哪个证书和密钥来签署 CertificateSigningRequests?
问题描述
我试图自动化为新用户签署 Kubernetes 证书的过程。
官方文档(此处)建议使用 Kubectl。他们特别建议使用以下命令:
kubectl certificate approve csr_name
并通过以下方式获得 base64 编码证书:
kubectl get csr/csr_name -o yaml
看着status.certificate
田野。由于我可以访问集群证书(位于 /etc/kubernetes/pki)并且因为我想进一步自动化该过程,所以我想知道 Kubernetes 在签名过程中使用了哪些证书和密钥。我尝试过使用 apiserver、ca 和 kubeadmin(.crt 和 .key)和 openssl,如下所示:
openssl x509 -req my.csr -days 365 -CA /etc/kubernetes/*.crt -CAkey /etc/kubernetes/*.key -CAcreateserial -out my.crt
*.crt
上面提到的*.key
各种文件在哪里?但结果总是与 kubectl 命令的结果不同。知道我缺少什么吗?
提前致谢!
解决方案
此刻非常部分的答案
1. etcd、kube-apiserver、kube-controller-manager、kube-scheduler、kubelet和kube-proxy的CA
由于我可以访问集群证书(位于 /etc/kubernetes/pki)并且因为我想进一步自动化该过程,所以我想知道 Kubernetes 在签名过程中使用了哪个证书和密钥。
有一个很棒的Kubernetes The Hard Way教程,让您有机会自己检查、测试和尝试如何使用手动创建核心资源的所有证书来手动创建 kubernetes 集群。
您将使用 CloudFlare 的 PKI 工具包 cfssl 配置 PKI 基础设施,然后使用它来引导证书颁发机构,并为以下组件生成 TLS 证书:etcd、kube-apiserver、kube-controller-manager、kube-scheduler、kubelet 和kube 代理。
您将生成 Kubernetes 配置文件,也称为 kubeconfigs,它使 Kubernetes 客户端能够定位和验证 Kubernetes API 服务器。
2. 新用户创建 你可以使用Kubernetes:我如何访问CA来签署一个新的用户证书?作为参考。复制粘贴历史,以防原始帖子被删除
您可以使用集群中的内置 CA 来创建客户端证书。关于如何使用 CA 的背景信息: https ://kubernetes.io/docs/concepts/cluster-administration/certificates/
假设你有一个 user.json
{
"CN": "mfrank",
"key": {
"algo": "rsa",
"size": 4096
},
"names": [{
"O": "mfrank",
"email": "some@email"
}]
}
然后,您可以为此生成 CSR。在此示例中,我使用 cfssl 生成 CSR:
cfssl genkey user.json | cfssljson -bare client
您现在可以使用 kubectl 为您的集群提交 CSR:
cat <<EOF | kubectl create -f -
apiVersion: certificates.k8s.io/v1beta1
kind: CertificateSigningRequest
metadata:
name: mfrank
spec:
groups:
- system:authenticated
- mfrank
request: $(cat client.csr | base64 | tr -d '\n')
usages:
- digital signature
- key encipherment
- client auth
EOF
请求字段是您的 csr 文件的 base64 编码版本。
查看您的 CSR:kubectl get csr
要批准它:
kubectl certificate approve mfrank
解码它:
kubectl get csr mfrank -o jsonpath='{.status.certificate}' | base64 -d > client.pem
您现在可以使用 client-key.pem 和 client.pem 来构建 kubeconfig。
然后,您可以在集群上创建 RBAC 角色绑定,分配给 –user=mfrank 或 –group=mfrank(假设您使用“O”:“mfrank”)
推荐阅读
- jenkins-pipeline - 如何在 Jenkins 管道作业中使用环境变量?
- ember.js - Ember:找不到从 `ember-intl/services/intl` 导入的模块 `@ember-intl/intl-relativeformat`
- casting - 在 ARM 与 x86_64 上将 int 的 EOF 分配给 char 行为
- php - 无法在 5.4 上安装 Laravel/Passport
- java - 未注册仪器!必须在注册仪器下运行
- c# - 似乎缺少 Windows 窗体应用程序选项?
- java - 将数据从 Firebase 检索到实体中
- d3.js - 清理较低级别的 D3 嵌套数据
- python-3.x - 如何从列表中随机返回一个元素?
- ruby-on-rails - 如何制作一个自定义生成器,它也会在 Rails 中生成迁移