我试图自动化为新用户签署 Kubernetes 证书的过程。
官方文档(here)建议使用 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 来配置 PKI 基础设施 工具包 cfssl,然后使用它来引导证书颁发机构,以及 为以下组件生成 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”)
创建 CSR 时,必须指定一个 signer,即在 kube-controller-manager 内运行的控制器循环。签名者将签署 CSR 并使用生成的证书更新
status
字段。
例如,要请求客户端证书以针对 kube-apiserver 进行身份验证,您需要使用
kubernetes.io/kube-apiserver-client
签名者。默认情况下,使用集群的 CA 私钥(通常位于 /etc/kubernetes/pki/ca.key
)。
(您可以通过将
--cluster-signing-kube-apiserver-client-key-file
标志传递给 kube-controller-manager 二进制文件来设置自己的标志;该标志将设置用于填充 KubeAPIServerClientSignerConfiguration.KeyFile
并签署 CSR 的私钥文件。)
以下清单为新的
john
用户创建 CSR:
apiVersion: certificates.k8s.io/v1
kind: CertificateSigningRequest
metadata:
name: john
spec:
signerName: kubernetes.io/kube-apiserver-client
usages: ["digital signature", "key encipherment", "client auth"]
request: |
LS0tLS1CRUdJTiBDRVJUSUZJQ0FURSBSRVFVRVNULS0tLS0KTUlJQ1ZEQ0NBVHdDQVFBd0R6RU5N
QXNHQTFVRUF3d0VhbTlvYmpDQ0FTSXdEUVlKS29aSWh2Y05BUUVCQlFBRApnZ0VQQURDQ0FRb0Nn
Z0VCQUxLWnVjbHlLYUpqVzM0aUdRSEptazllUjc5VkRVdVVqbTNEYjNtUU9QaTVLSjlkCklsTloy
b3l2YmdJVDBGcXF3amgyaWgvL1h5RnYyUU43OWM0TW1MUTBsSFZ2T0V1bDBaZFpBSGNUVk5yZWt4
SHgKOVVtSlBtb3Bwbm5yYjhuYS90NnpMc0xMbkE0NHZteEZyay9kYlN3V2t2aE1sSktVOStSbUdN
NEJGOEw0NzR1VQp4MERvSDIwaXEzNDNmTUVCeEc0N3hpQzVLbXFIdFlUeG9JOXBjMzlJTTVtTE8w
YXlzSHJHTjFQbXpzVGpVMU1DCkNhNzZKSVhGRFZHckFlUFk1eS96R2NPdzZjYkVFZDhpMGlPNDJy
T3RFK1hER1puNk13N1JGWTkxMDgxMVhaZEUKd3RqY1F5Z05TdDcvOFpIU3J3TCtXditmbFhlYmRV
V2EyQVVMTllFQ0F3RUFBYUFBTUEwR0NTcUdTSWIzRFFFQgpDd1VBQTRJQkFRQllGbVBHSmRpcGtx
a0tPRlJxWjRXM09ESmlLaEF5K1NkVDZMNTFhSnVuenNWKzVTMXlaUFhjCndSeUdLRkdGWHd3YVdh
UGllQVZuSkUvUHdzQ0d2RlhJSDl0dmcwZ1hrZjNxWG96dTc3N29PNC9aU21aOUxwOGYKTE13R3Vs
dWVLVjhMalhRZWtkQXdtMmQzaUJOMGxVbllNK2FNVTlhWC8xeEl4aG02ZWNjRXJKa0txdCtZbGt6
YQpROHhTWlBsamMydXhCbllrMFdPUjZOdmpYNW9Zell4WVU4UWdLQjgyNnBhdFl4OTZuZG14Vy8r
bkpPSkJNaUNOCnpsSUJzNzhOdWgrZlFmOGlnSjZwUFNub1RaNlFRa3R4czk5NFEzV09ONkRtSFli
THN1V21zNCsrTHZFWFZUeTQKbjJTN3owQ3NsOVdlT3o5QytsaXEvcy9XRDl5dEZESmsKLS0tLS1F
TkQgQ0VSVElGSUNBVEUgUkVRVUVTVC0tLS0tCg==
申请后,您可以批准CSR并显示生成的证书:
$ kubectl certificate approve john
$ kubectl get csr john -o jsonpath='{.status.certificate}' | base64 -d | openssl x509 -noout -text
(您可以通过查找通用名称 (CN) 字段来查看用户名。)