【发布时间】:2021-01-05 23:13:06
【问题描述】:
我有一个有效的 ValidatingWebhookConfiguration 并且一直在创建|批准带有 certificates.k8s.io/v1beta 的 CSR。
我将 (MicroK8s) 从 1.18 升级到 1.20,并收到警告说 certificates.k8s.io/v1beta 已弃用 1.19+,我想我会尝试(但没有成功)升级到 certificates.k8s.io/v1。
现有(工作)CSR:
apiVersion: certificates.k8s.io/v1beta1
kind: CertificateSigningRequest
metadata:
name: ${SERVICE}.${NAMESPACE}
spec:
groups:
- system:authenticated
request: $(cat ${FILENAME}.csr | base64 | tr -d '\n')
usages:
- digital signature
- key encipherment
- server auth
升级 API 产生错误:
missing required field "signerName" in io.k8s.api.certificates.v1.CertificateSigningRequestSpec;
我专门阅读了 CSR 文档中关于 Kubernetes signers 的部分,并且由于我现有的规范使用 server auth,假设我可以使用 kubernetes.io/kubelet-serving,因为这是唯一允许 server auth 的规范。
apiVersion: certificates.k8s.io/v1 <<--- UPGRADED
kind: CertificateSigningRequest
metadata:
name: ${SERVICE}.${NAMESPACE}
spec:
groups:
- system:authenticated
request: $(cat ${FILENAME}.csr | base64 | tr -d '\n')
signerName: kubernetes.io/kubelet-serving <<--- ADDED
usages:
- digital signature
- key encipherment
- server auth
但是,我在尝试批准 CSR(作为集群管理员)时遇到错误:
kubectl certificate approve ${SERVICE}.${NAMESPACE}
certificatesigningrequest.certificates.k8s.io/${SERVICE}.${NAMESPACE} approved
kubectl get csr ${SERVICE}.${NAMESPACE}
NAME SIGNERNAME REQUESTOR CONDITION
${SERVICE}.${NAMESPACE} kubernetes.io/kubelet-serving admin Approved,Failed
注意
Approved但Failed
而且我拿不到证书(大概是因为Failed):
kubectl get csr ${SERVICE}.${NAMESPACE} \
--output=jsonpath='{.status.certificate}'
我应该如何使用certificates.k8s.io/v1 API?
更新:2021-01-06
好的,所以我意识到我有更多关于“失败”的信息,这让我有一些东西可以调查......
kubectl get csr/${SERVICE}.${NAMESPACE} \
--output=jsonpath="{.status}" \
| jq .
产量:
{
"conditions": [
{
"lastTransitionTime": "2021-01-06T18:52:15Z",
"lastUpdateTime": "2021-01-06T18:52:15Z",
"message": "This CSR was approved by kubectl certificate approve.",
"reason": "KubectlApprove",
"status": "True",
"type": "Approved"
},
{
"lastTransitionTime": "2021-01-06T18:52:15Z",
"lastUpdateTime": "2021-01-06T18:52:15Z",
"message": "subject organization is not system:nodes",
"reason": "SignerValidationFailure",
"status": "True",
"type": "Failed"
}
]
}
更新:2021-01-07
感谢@PjoterS
ubectl describe csr/${SERVICE}.${NAMESPACE}
Name: eldlund.utopial
Labels: <none>
Annotations: kubectl.kubernetes.io/last-applied-configuration={"apiVersion":"certificates.k8s.io/v1","kind":"CertificateSigningRequest","metadata":{"annotations":{},"name":"eldlund.utopial"},"spec":{"groups":["system:authenticated"],"request":"LS0tLS1C...LS0tLS0K","signerName":"kubernetes.io/kubelet-serving","usages":["digital signature","key encipherment","server auth"]}}
CreationTimestamp: Thu, 07 Jan 2021 17:03:23 +0000
Requesting User: admin
Signer: kubernetes.io/kubelet-serving
Status: Pending
Subject:
Common Name: eldlund.utopial.svc
Serial Number:
Subject Alternative Names:
DNS Names: eldlund.utopial.svc
eldlund.utopial.svc.cluster.local
Events: <none>
使用 OpenSSL(而不是 Kubernetes)进行签名
我尝试创建 CA crt|key,然后创建服务密钥|CSR 并使用 CA 签署服务 CSR,但 Kubernetes 抱怨:
x509: certificate is not valid for any names, but wanted to match ainsley.utopial.svc
但证书似乎同时包含 CN 和 SAN 条目:
不起作用
openssl x509 -in ${FILENAME}.crt --noout -text
Certificate:
Data:
Version: 3 (0x2)
Serial Number:
6f:14:25:8c:...
Signature Algorithm: sha256WithRSAEncryption
Issuer: CN = Validating Webhook CA
Validity
Not Before: Jan 7 18:10:50 2021 GMT
Not After : Feb 6 18:10:50 2021 GMT
Subject: CN = ainsley.utopial.svc
Subject Public Key Info:
Public Key Algorithm: rsaEncryption
RSA Public-Key: (2048 bit)
Modulus:
00:ca:56:15:...
Exponent: 65537 (0x10001)
X509v3 extensions:
X509v3 Subject Alternative Name:
DNS:ainsley.utopial.svc, DNS:ainsley.utopial.svc.cluster.local
Signature Algorithm: sha256WithRSAEncryption
b2:ec:22:b6:...
注意
CN是上面的 DNS 名称,但下面是 IP ???
使用v1beta1 恢复到我的工作解决方案并更改服务名称以确保完整性 (loi),Webhook 成功并且证书似乎与上面显示的证书没有什么不同(不同的服务名称除外):
有效
Certificate:
Data:
Version: 3 (0x2)
Serial Number:
ff:b3:cb:11:...
Signature Algorithm: sha256WithRSAEncryption
Issuer: CN = 10.152.183.1
Validity
Not Before: Jan 7 18:18:45 2021 GMT
Not After : Jan 7 18:18:45 2022 GMT
Subject: CN = loi.utopial.svc
Subject Public Key Info:
Public Key Algorithm: rsaEncryption
RSA Public-Key: (2048 bit)
Modulus:
00:d2:cc:c2:...
Exponent: 65537 (0x10001)
X509v3 extensions:
X509v3 Key Usage: critical
Digital Signature, Key Encipherment
X509v3 Extended Key Usage:
TLS Web Server Authentication
X509v3 Basic Constraints: critical
CA:FALSE
X509v3 Authority Key Identifier:
keyid:E7:AE:3A:25:95:D2:F7:5B:C6:EA:50:56:07:E8:25:83:60:88:68:7A
X509v3 Subject Alternative Name:
DNS:loi.utopial.svc, DNS:loi.utopial.svc.cluster.local
Signature Algorithm: sha256WithRSAEncryption
48:a1:b2:e2:...
【问题讨论】:
-
您能否提供描述您的 CSR
kubectl describe csr <csrName>的输出?当你是downloading your CSR 时,你得到的是输出还是空的? -
感谢您的回复,@pjoters。我已经用描述结果更新了我的问题。
-
我昨晚发现了this 链接,它可能包含我的解决方案。它不将 Kubernetes 用于 CSR。检查它现在是否有效
标签: kubernetes