1. 问题现象
Serverless集群开启了公网访问,客户端配置了kubeconfig,但是执行kubectl无法访问到集群,直接telnet公网访问clb的443端口也是不通,看clb的安全组是放通了443端口的。
公网访问Serverless集群的apiserver,链路是客户端--->clb--->Deployment:kubernetes-proxy(default)--->master(apiserver),这里clb配置没问题,那说明是kubernetes-proxy这里可能异常了,看pod是正常running的,但是日志一直报错
2. 问题原因
看报错是tls握手失败,抓包发现是因为https访问新的域名化clb(类似lb-xxxxx-zw9a273lycj6durt.clb.sh-tencentclb.com),tls的client hello会被reset,reset的ttl与正常报文的ttl不同
http访问新的域名化clb(类似lb-xxxxx-zw9a273lycj6durt.clb.sh-tencentclb.com),会通过http 302 localtion跳转到CLB的默认域名阻断提示页面,可以参考文档https://cloud.tencent.com/document/product/214/105270
这里原因就是clb默认域名阻断导致的。
3. 解决方案
因为现在账号默认都是开启clb域名化,创建的出来的clb都是域名化,在Serverless控制台开启公网访问,会自动创建kubernetes-proxy-public这个公网类型的service,并关联创建出一个公网clb,然后将clb的公网域名配置到kubernetes-proxy
这个deployment的domains启动参数,domains这个参数的含义就是会将配置域名签到apiserver的证书里面
因为clb默认域名不能使用,那就只能用业务自己的域名,如何更换apiserver为业务自定义域名,可以如下操作
1. 首先确定下集群的访问域名,建议可以用集群id 业务域名,比如我的业务域名是niewx.cn,集群id是cls-xxxx,那域名就可以配置为cls-xxxx.niewx.cn。
2. 然后修改yaml将cls-xxxx.niewx.cn加到kubernetes-proxy这个deployment的domains启动参数中,更新重建pod
3. 在dns解析配置cname记录
4. 修改kubeconfig的server地址,改成业务自定义的域名
5. 保存后就可以正常访问了集群apiserver了