我可以手动创建一个证书:
- 我创建了csr文件
- 我创建并应用
CertificateSigningRequest
k8s资源 - 我使用 批准请求
kubectl certificate approve <name>
- 我从
CertificateSigningRequest
的status.certificate
字段中提取证书
现在我想以编程方式重复这个过程。我使用@kubernetes/client-node
npm包来实现这个目的。
我能够创建和应用CertificateSigningRequest
资源:
const csrResource = await adminCertApi.createCertificateSigningRequest({
metadata: {
name: 'my.email@my.company.com',
},
spec: {
request: csrBase64,
signerName: 'kubernetes.io/kube-apiserver-client',
usages: [
'client auth'
],
},
});
但是我在试图批准请求时卡住了(试图遵循文档)。我尝试了如下几个变体:
csrResource.body.status.conditions = [
{
message: 'Approved by CWAdmin GraphQL Lambda function',
reason: 'ApprovedByCWAdmin',
type: 'Approved',
}
];
const response = await adminCertApi.patchCertificateSigningRequest('my.email@my.company.com', csrResource.body, undefined, undefined, undefined, undefined, { headers: { 'Content-Type': 'application/strategic-merge-patch+json' } });
不幸的是,这不会更新status.conditions
字段。即使是这样,是什么触发了证书的签名?文档声明kube-controller-manager
从不自动批准类型为kubernetes.io/kube-apiserver-client
的请求。
换句话说,kubectl certificate approve
的编程等效是什么?
我找到了这个帮助我解决问题的文档:
status
必须为True
、False
或Unknown
Approved
/Denied
条件只能通过/approval
子资源设置。
所以我将status
字段添加到条件中,并将API调用更改为patchCertificateSigningRequestApproval
。
工作代码现在看起来像这样:
const body = {
status: {
conditions: [
{
message: 'Approved by CWAdmin GraphQL Lambda function',
reason: 'ApprovedByCWAdmin',
type: 'Approved',
status: 'True',
}
]
}
};
const response = await adminCertApi.patchCertificateSigningRequestApproval('my.email@my.company.com', body, undefined, undefined, undefined, undefined, { headers: { 'Content-Type': 'application/strategic-merge-patch+json' } });