【问题标题】:Programmatically issuing a Kubernetes certificate以编程方式颁发 Kubernetes 证书
【发布时间】:2021-10-13 11:29:51
【问题描述】:

我能够手动创建证书:

  1. 我创建了一个 csr 文件
  2. 我创建并应用了一个CertificateSigningRequest k8s 资源
  3. 我批准了该请求,使用
kubectl certificate approve <name>
  1. 我从CertificateSigningRequeststatus.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'
        ],
    },
});

但后来我在尝试批准请求时遇到了困难(尝试关注documentation)。我尝试了几种看起来像这样的变体:

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 的程序化等价物是什么?

【问题讨论】:

    标签: kubernetes client-certificates kubernetes-apiserver


    【解决方案1】:

    我发现documentation 帮助我解决了这个问题:

    • status 是必需的,并且必须是 TrueFalseUnknown
    • 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' } });
    
    

    【讨论】:

      猜你喜欢
      • 2017-09-21
      • 1970-01-01
      • 2015-04-11
      • 2011-12-11
      • 1970-01-01
      • 2018-12-12
      • 2020-04-25
      • 2015-02-18
      • 2010-10-13
      相关资源
      最近更新 更多