我正在尝试在集群上配置 https 流量。我的证书是使用 Azure 中的“应用服务证书”生成的,该证书已连接到密钥库。
keyvault 作为卷安装在具有入口覆盖的集群中。如果我浏览到入口安装的卷,我可以看到我的证书作为字符串。
但是,istio ingress pod 无法将证书作为秘密挂载。在日志中我可以看到以下错误:
failed to get data in spc istio-system/istio-tls for secret ingress-cert-tls, err: failed to get cert data from file /var/lib/kubelet/pods/f4d74a73-20ee-41f0-9d4c-eaef29ace025/volumes/kubernetes.io~csi/ingressgateway-certs/mount/..data/mysecret 3, err: pkcs12: error reading P12 data: asn1: structure error: tags don't match (16 vs {class:1 tag:13 length:73 isCompound:false}) {optional:false explicit:false application:false private:false defaultValue:<nil> tag:<nil> stringType:0 timeType:0 set:false omitEmpty:false} pfxPdu @2
我做错了什么?
所以,经过几个小时的尝试和错误,我终于弄清楚了。该问题是由
App Service Certificate
引起的,它将 keyvault 中的证书导出为 secret
,而不是 certificate
。
在 github 上,两个团队(负责 App Service 证书和 k8s 的 CSI 驱动程序)只是争论和互相指责,但在过去的两年多里没有人对此采取任何行动。
https://github.com/Azure/secrets-store-csi-driver-provider-azure/issues/273
解决方案是导出密钥,然后将其作为 KV 中的证书重新导入。这意味着您失去了证书轮换的功能,您需要手动重新导入证书。
在azure中,
SecretProviderClass
需要指向您刚刚导入的证书的名称。