因为在部署virtualservice到线上Istio集群的时候,出现了一个问题
Internal error occurred: failed calling webhook "pilot.validation.istio.io": Post https://istio-galley.istio-system.svc:443/admitpilot?timeout=30s: x509: certificate has expired or is not yet valid
从"pilot.validation.istio.io": Post https://istio-galley.istio-system.svc:443/admitpilot?timeout=30s 这条报错上,大概率Istio-galley所谓的检查virtualservice等Istio自己的CRD也是通过Kubernetes Admission Webhook来实现的。
既然如此,那因为证书出错的问题,就集中在了两处:
- Validating Webhook Configuration里的CaBundle证书过期
- Validating Webhook Server里配置的证书过期了
依次检查
根据之前的经验,轻车熟路地找到对应的 validatingwebhookconfiguration配置项CaBundle
Base64解码之后,使用 工具 查看过期时间,发现果然过期了(当然这里是修改之后的),使用之前提到的命令重新获取,并修改
kubectl config view --raw --minify --flatten -o jsonpath='{.clusters[].cluster.certificate-authority-data}'
第二个是可能在Istio-Galley中挂载的证书过期了
从截图上判断,证书实际信息是在istio-system中对应的secret里,顺着名字摸过去
发现有三项信息cert-chain.pem、key.pem、root-cert.pem ,还是通过上面的操作方式base64解码时候,放到工具里查询过期时间,发现 cert-chain.pem 没过期,但是 root-cert.pem过期了。思考什么情况,一般来说 cert-chain.pem是通过向root-cert.pem签署的,也就是说root-cert.pem -> cert-chain.pem。根据istio 文档中有提到过 istio-citadel 会尝试自动更新证书,不过在Istio老版本需要手动重启istio-citadel ,所以尝试了一下重启。
果然,不行,截图忘记截了。。。大概的意思是说 istio-ca-secret 这里的证书过期了
那尝试修改一下里面的证书,按照文档里的做法
需要注意的是
文档当中要求使用在使用证书替代时要小心,所以我让istio集群暂时不对外服务
再利用openssl工具和private-key重新生成一份证书,填进去之后,重启istio-citadel 即可。
重新部署virtualservice ,成功