Kubernetes 条件“失败”尝试批准具有“certificates.k8s.io/v1”的CSR`

Kubernetes 条件“失败”尝试批准具有“certificates.k8s.io/v1”的CSR`,kubernetes,Kubernetes,我正在验证Webhook配置,并一直在创建|批准具有证书的CSR.k8s.io/v1beta 我将(MicroK8s)从1.18升级到1.20,并收到一条警告,提示certificates.k8s.io/v1beta已被弃用1.19+,并认为我会尝试(未成功)升级到certificates.k8s.io/v1 现有(工作)企业社会责任: 升级API时产生错误: missing required field "signerName" in io.k8s.api.certific

我正在验证Webhook配置,并一直在创建|批准具有
证书的CSR.k8s.io/v1beta

我将(MicroK8s)从1.18升级到1.20,并收到一条警告,提示
certificates.k8s.io/v1beta
已被弃用1.19+,并认为我会尝试(未成功)升级到
certificates.k8s.io/v1

现有(工作)企业社会责任:

升级API时产生错误:

missing required field "signerName" in io.k8s.api.certificates.v1.CertificateSigningRequestSpec;
我专门阅读了CSR文档中关于服务器身份验证的部分,因为我现有的规范使用了
服务器身份验证
,所以我假设我可以使用
kubernetes.io/kubelet服务
,因为这是唯一允许
服务器身份验证的规范

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
注意
已批准
失败

我无法获得证书(可能是因为它
失败了
):

我应该如何使用
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描述csr/${SERVICE}.${NAMESPACE}
姓名:埃尔德隆德乌托邦
标签:
注释:kubectl.kubernetes.io/last applicated configuration={“apiVersion”:“certificates.k8s.io/v1”,“种类”:“CertificateSigningRequest”,“元数据”:{“注释”:{},“名称”:“eldlund.utopial”},“规范”:{“组”:[“系统:已验证”],“请求”:“LS0tLS1C…ls0tls0tls0k”,“签名名”:“kubernetes.io/kubelet服务”,“用法”:“数字签名”,“密钥加密”,“服务器身份验证”]}
CreationTimestamp:Thu,2021年1月7日17:03:23+0000
请求用户:管理员
签名人:kubernetes.io/kubelet-service
状态:待定
主题:
通用名称:eldlund.utophial.svc
序列号:
主题备选名称:
DNS名称:eldlund.utopial.svc
eldlund.utophial.svc.cluster.local
活动:
使用OpenSSL(而不是Kubernetes)进行签名 我尝试创建CA crt |密钥,然后创建服务密钥| CSR,并与CA签署服务CSR,但Kubernetes抱怨:

x509: certificate is not valid for any names, but wanted to match ainsley.utopial.svc
但证书似乎同时包含CN和SAN条目:

不起作用

opensslx509-in${FILENAME}.crt--noout-text
证书:
数据:
版本:3(0x2)
序列号:
6f:14:25:8c:。。。
签名算法:SHA256WithRSA加密
颁发者:CN=正在验证Webhook CA
有效性
不在:1月7日18:10:50 2021 GMT之前
不是在:2月6日18:10:50 2021 GMT之后
主题:CN=ainsley.utophial.svc
主题公钥信息:
公钥算法:rsa加密
RSA公钥:(2048位)
模数:
00:ca:56:15:。。。
指数:65537(0x100001)
X509v3扩展:
X509v3受试者备选名称:
DNS:ainsley.utopial.svc,DNS:ainsley.utopial.svc.cluster.local
签名算法:SHA256WithRSA加密
b2:ec:22:b6:。。。
注意
CN
上面是DNS名称,下面是IP

使用
v1beta1
恢复到我的工作解决方案,并更改服务名称以确保完整性(
loi
),Webhook成功,并且证书与上面显示的证书似乎没有什么不同(不同的服务名称除外):

有效

证书:
数据:
版本:3(0x2)
序列号:
ff:b3:cb:11:。。。
签名算法:SHA256WithRSA加密
发行人:CN=10.152.183.1
有效性
不在:1月7日18:18:45 2021 GMT之前
不在:1月7日18:18:45 2022 GMT之后
主题:CN=loi.utophial.svc
主题公钥信息:
公钥算法:rsa加密
RSA公钥:(2048位)
模数:
00:d2:cc:c2:。。。
指数:65537(0x100001)
X509v3扩展:
X509v3密钥用法:关键
数字签名、密钥加密
X509v3扩展密钥用法:
TLS Web服务器身份验证
X509v3基本约束:关键
CA:错
X509v3授权密钥标识符:
keyid:E7:AE:3A:25:95:D2:F7:5B:C6:EA:50:56:07:E8:25:83:60:88:68:7A
X509v3受试者备选名称:
DNS:loi.utopial.svc,DNS:loi.utopial.svc.cluster.local
签名算法:SHA256WithRSA加密
48:a1:b2:e2:。。。

更新切换到,一切正常

我让它工作,但我不确定为什么我现在做的是正确的

而且
openssl
感觉很笨拙(建议很感激)

环境
DIR=${PWD}/secrets
SERVICE=“…”
NAMESPACE=“…”
FILENAME=“${DIR}/${SERVICE}.${NAMESPACE}”
加利福尼亚州
openssl请求\
-节点\
-新的\
-x509\
-keyout${FILENAME}.ca.key\
-out${FILENAME}.ca.crt\
-subc“/CN=正在验证Webhook CA”
创建(Webhook)服务 需要将服务证书的CN设置为IP

cat./kubernetes/service.yaml\
|sed“s | SERVICE |${SERVICE}| g”\
|sed“s | NAMESPACE |${NAMESPACE}| g”\
|kubectl apply--filename=--namespace=${namespace}
端点=$(\
kubectl获取服务/${service}\
--命名空间=${namespace}\
--output=jsonpath=“{.spec.clusterIP}”)&&echo${ENDPOINT}
创建企业社会责任 尽管我在这里包括了CN和
alt_名称
,但我必须复制SAN(下一步)

echo“[req]
默认_位=2048
提示=否
默认值\u md=sha256
可分辨名称=dn
请求扩展=请求扩展
[dn]
commonName=${ENDPOINT}
[请求扩展]
subjectAltName=@alt\u名称
[备选]
kubectl get csr ${SERVICE}.${NAMESPACE} \
--output=jsonpath='{.status.certificate}'
{
  "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"
    }
  ]
}
x509: certificate is not valid for any names, but wanted to match ainsley.utopial.svc