kubeconfig文件执行kubectl发生x509证书认证问题解决

关于外网设备访问一个advertise-address为内网IP的内网构建的kubernetes集群的问题

环境描述

问题描述

问题原因

解决方案


环境描述

  • Kubernetes版本1.22
  • 测试客户端centos7


问题描述

  1. 将构建于云上/内网网络环境上的 kubernetes 集群的 /etc/kubernetes/admin.conf 文件拷贝到外网的一台装有 kubectl 的设备上,文件内容放到外网设备的 ~/.kube/config 文件中
  2. 然后修改 config 文件中的 server: https://${ip}:6443 中的 ip 为 kubernetes 集群的 master 节点的公网 IP
  3. 然后使用 kubectl get pods 等方法去访问 kubernetes 集群
  4. 返回结果 Unable to connect to the server: x509: certificate is valid for ${kubernetes集群的内网IP列表}, not ${kubernetes集群的master设备的外网IP}


问题原因


我们的 kubernetes 的 apiserver-advertise-address 是一个内网IP,默认情况下,kubernetes 自建的CA会为apiserver签发一个证书,证书的默认可访问的是内网IP、kubernetes、kubernetes.default kubernetes.default.svc、kubernetes.default.svc.cluster.local,不包含 master 节点的公网 IP。所以直接通过 admin.conf 去访问 kubernetes 是不可能的。

可以在 master 节点上执行以下命令,通过解析 apiserver 证书得到允许访问服务端的地址信息

openssl x509 -noout -text -in /etc/kubernetes/pki/apiserver.crt |grep IP

解决方案


删除当前 kubernetes 集群下的 apiserver 的 cert 和 key

rm /etc/kubernetes/pki/apiserver.*


生成新的 apiserver 的 cert 和 key

我是通过 sealer 安装的,所以需要在第二串 ip 地址中加入 control-plane 节点 config 文件内配置的 server 地址:apiserver.cluster.local

kubeadm init phase certs apiserver \ 
--apiserver-advertise-address ${原来的advertise ip} \
--apiserver-cert-extra-sans ${master的外网ip}


刷新 admin.conf

kubeadm alpha certs renew admin.conf


重新应用 apiserver

kubectl apply -f /etc/kubernetes/manifests/kube-apiserver.yaml

此时,再通过openssl解析获得证书内容,可以发现加上了我们想要扩展的地址 

程序远程直连 apiserver 的方法

同样取自问题描述 2. 步骤中的 kubeconfig 文件,我们可以使用 go-client 来构建 rest.Config,将rest.Config成员变量Insecure修改为true,来跳过证书验证。

config.Insecure = true

继续执行,反馈为 ca 文件不支持 insecure 的 flag 参数;对此,我们需要将 config 文件中的 ca data 给删除掉,继续尝试,即可正常访问,这里的思路也是参照了 kubectl 的源码。

猜你喜欢

转载自blog.csdn.net/kingu_crimson/article/details/127806193