Kube API Server与AWS ELB是否需同证书?证书冲突排查求助
Kube API Server与AWS ELB是否必须使用相同证书?
嘿,这个问题我之前帮人排查过类似的,先给你明确答案:不是必须使用相同证书,但你的问题根源在于API Server的证书里没包含AWS ELB的域名。
咱们来拆解下为什么会出现证书无效的错误:
- kubelet连接API Server时,会严格校验证书的**Subject Alternative Name(SAN)或者Common Name(CN)**是否和目标地址匹配。当你把server地址改成ELB的URL后,kubelet发现API Server返回的证书里根本没有这个ELB域名,自然就判定证书无效了。
- 而改回master IP就正常,是因为你当初生成API Server证书时,肯定把master节点的IP加到了SAN列表里,所以IP匹配时校验能通过。
接下来给你两个可行的解决方案,你可以根据自己的情况选:
方案一:给API Server证书添加ELB域名到SAN
- 重新生成API Server的证书,在SAN字段里加入ELB的完整域名(比如
your-elb-xxxx.us-east-1.elb.amazonaws.com)。- 如果是用kubeadm部署的集群,你可以修改kubeadm的配置文件(
kubeadm-config.yaml),在apiServer.certSANs里添加ELB域名,然后执行kubeadm alpha certs renew apiserver重新生成证书(注意1.9版本的kubeadm命令可能略有不同,需要对应调整)。 - 如果是手动生成的证书,用
openssl重新签发时,确保在openssl.cnf的[v3_ca]段里添加DNS:your-elb-domain。
- 如果是用kubeadm部署的集群,你可以修改kubeadm的配置文件(
- 替换API Server的证书文件(通常在
/etc/kubernetes/pki/apiserver.*),然后重启API Server组件。
方案二:让ELB终止SSL,单独配置ELB证书
如果你不想修改API Server的证书,可以让AWS ELB来处理SSL终止:
- 在AWS控制台给ELB配置一个证书(可以用AWS ACM免费生成的证书,或者自己上传的证书),让ELB在443端口终止SSL连接。
- 配置ELB把流量转发到API Server的6443端口时,用HTTP协议(或者如果API Server有内部证书,也可以用HTTPS,但此时ELB和API Server之间的证书只要互相信任就行,不用和ELB的公网证书一致)。
- 确保集群内的组件(比如kubelet、kube-proxy)信任ELB的证书——如果用的是AWS ACM的证书,因为AWS的根证书默认在节点的信任链里,所以不用额外配置;如果是自签证书,需要把证书加到节点的信任存储里。
最后提个小建议:K8s 1.9.3版本确实比较老旧了,后续版本在证书管理、ELB集成上都有不少优化,条件允许的话尽量升级到稳定版本,能减少很多这类兼容性问题。
内容的提问来源于stack exchange,提问作者Achu
相关产品推荐
相关产品推荐

