经过dnat后访问kube-apiserver证书认证失败
问题现象
iptables -t nat -I OUTPUT -d 10.10.10.10 -p tcp --dport 443 -j DNAT --to-destination 192.168.0.105:6443
# 报错requested domain name does not match the server's certificate,无法通过证书认证。
curl https://10.10.10.10:443/livez --key ./client.key --cert ./client.crt --cacert ./root.crt
问题分析
# 通过cluster ip访问kube-apiserver,https证书认证通过。
curl https://10.96.0.1:443/livez --key ./client.key --cert ./client.crt --cacert ./root.crt
因为kube-apiserver服务端证书中有10.96.0.1这个clusterIP。
openssl x509 -in /etc/kubernetes/pki/apiserver.crt -noout -text
nodeA(192.168.0.112,增加iptables,走http访问,https因加密而无法看到传输的数据)->nodeB(192.168.0.105,kube-apiserver所在节点)
kube-apiserver所在节点接收到的请求,http请求参数里面Host还是10.10.10.10:443,没有因为dnat发生转换,所以无法通过https证书认证。
解决问题
kube-apiserver配置token认证,例如通过ServiceAccount,使用kube-controller-manager创建的token。