kubectl 远程访问内网中的 kubernetes 集群

2022年7月6日12:15:55

之前自己在三台阿里云服务器上搭建了一套 kubernetes 集群,因为在是在内网中,所以每次部署都要先将 yaml 文件 scp 到 master 服务器上,再自己手动 ssh 到 master 上用 kubectl 执行部署命令,很是不方便。网上找了些资料,配置了下kubectl 远程访问内网k8s, 这篇文章记录下配置的细节。

kubectl 远程访问内网中的 kubernetes 集群

scp 把集群上 kubectl 的配置拷贝到本地电脑。集群中 kubectl 的配置都存放在,~/.kube/config 文件中,将该文件拷贝到本地的~/.kube目录下。(在本地电脑安装 kubectl 后,会自动创建该目录)。

scp master.aliyun:.kube/config ~/Downloads/cp ~/Downloads/config ~/.kube/

此时如果在本地电脑执行kubectl get pods 是没有反应的,因为 config 文件中的 server 是内网 IP。所以需要将 server IP 该成公网 IP:39.105.17.56 ,而且需要打开集群的6443 端口做映射。

apiVersion: v1clusters:-cluster:certificate-authority-data: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUN5RENDQWJDZ0F3SUJBZ0lCQURBTkJna3Foa2lHOXcwQkFRc0ZBREFWTVJNd0VRWURWUVFERXdwcmRXSmwKY201bGRHVnpNQjRYRFRJd01EWXhOakV5TXpZeU1Gb1hEVE13TURZeE5ERXlNell5TUZvd0ZURVRNQkVHQTFVRQpBeE1LYTNWaVpYSnVaWFJsY3pDQ0FTSXdEUVlKS29aSWh2Y05BUUVCQlFBRGdnRVBBRENDQVFvQ2dnRUJBTEQzCmo2Mml3RjR5ZnNscFkwYm9LTjZSVFMvRFF3TlBWVzdUNnFpMnJWelMwWW9QNXRVNDZrZk9TV0hkZnJyNEdlZXgKQm02RHR5MWo3Q2UzemdTdVpGL1lJYXN5MVFQdnBrZktVczk2MHNCMThYMlFaN0JnZUF4a2FHR0JpVlc1SWlIeApoNmNPVkUrb003V0gwSjdPRXQ3eVo3TzF2MjNreGxZWXhwUWE3aDY3Rk4ybnRqeUE2UjVaYU9RaE85a3VscEcxCllpK2s4NGVXVklOWHBJdDk4NzgvMkFVN3Q3QlhFTWpDMkM0TG95RG1qa1FsZU9wZUVGbXJKZzNoaFNaMmp0YmgKUWxZV3RhMjFsOVp3S3ZIQlllb1A2aDUrR1Nnd2pPVWVUQnJEcTNYZWdxL2FacHJIaDMrWGs3N09ZUStSM2hzawo2U0gvMzRuTWFtcEozMkpMalU4Q0F3RUFBYU1qTUNFd0RnWURWUjBQQVFIL0JBUURBZ0trTUE4R0ExVWRFd0VCCi93UUZNQU1CQWY4d0RRWUpLb1pJaHZjTkFRRUxCUUFEZ2dFQkFKSERQdHM1VHZlS2RkM2pIYnAwVnp0ZDBJbU0KT09SZUdGWGdlcG5xbVBFYmNsNDZhTmpDU3R5MlFyRW5UNitZUFdwbmVIendpNW1jMkxHSHpxUTA1VDgwR2NhZwo5SzdnV3V4SW9jZDNDZmlOTDF6ekVEcGlrRUliVDZyWTRENTBUcklVQjdEOUdNMTZYa242UWVYUkJnc2RDckprCmloZ01Mc05iOWJxamJROW5jaHMybXFET0tXZEtveHVrelZleUxSL0ZobVlKcFByOHJYc2NqV3JvOXVvMGs5eGEKY2lCaTRHQzBsd3VHaXl6aWtuTnpYZ2k1L3E1ckJtWHJ1R01VUUdXYVZjbTIwQXNIRitLZlF6UDhsS0t2T2t6bQp2N2RuMGMzRUtURW83RFdDYkxjeHlqTXlQUDg1VkVjaXZnVXhQWEUzYkpJZmpxVGJtU1lwS3lDb0xSUT0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQo=server: https://172.17.43.150:6443name: kubernetes

修改后的第 5 行:

server: https://39.105.17.56:6443

在阿里云集群的安全组访问规则中打开 6443 端口。

kubectl 远程访问内网中的 kubernetes 集群

这会如果在本地电脑执行kubectl get pods 也会提示报错,报错提示的意思是: 39.105.17.56 使用当前证书访问 api server 是无效的,当前证书只能用于 172.17.43.150 访问 api-server。很明显外网访问内网中的 k8s 集群 TLS 校验没通过。

有两种解决办法:

第一种,直接跳过 TLS 校验,使用很简单,但总觉得有点”奇技淫巧“的味道。

kubectl --insecure-skip-tls-verify get pods

采用--insecure-skip-tls-verify 选项执行命令就可以避开校验直接操作 k8s 集群。

第二种,修改集群中 api server 的证书,操作相对第一种繁琐些,但是真正彻底解决问题。

我是用 kubeadm 安装的 k8s,minikube用这种方式能否 work 我没有测试过。kubeadm 在创建 k8s 集群的同时也生成了集群所需的全部证书,并将其存放在 master 的/etc/kubernetes/pki 路径下。

ls /etc/kubernetes/pki|grep apiserver
apiserver-etcd-client.crt
apiserver-etcd-client.key
apiserver-kubelet-client.crt
apiserver-kubelet-client.key
apiserver.crt
apiserver.key

我们要修改的就是:apiserver.crtapiserver.key ,说是修改,实际上是使用 kubeadm 重新生成这两个文件。

这个时候集群已经启动了,kubeadm 的配置信息都放在 kube-system 空间下的 configmaps 中。我们需要先将configmaps 中的信息保存到 master 上的文件中。

kubectl get configmaps -n kube-system|grep kubeadm-config
kubeadm-config                       2      134d

导出信息到 master 的 yaml 文件

kubectl -n kube-system get configmap kubeadm-config -o jsonpath='{.data.ClusterConfiguration}'> kubeadm.yaml
vi kubeadm.yaml
apiServer:extraArgs:authorization-mode: Node,RBACtimeoutForControlPlane: 4m0sapiVersion: kubeadm.k8s.io/v1beta2certificatesDir: /etc/kubernetes/pkiclusterName: kubernetescontrollerManager:{}dns:type: CoreDNSetcd:local:dataDir: /var/lib/etcdimageRepository: registry.aliyuncs.com/google_containerskind: ClusterConfigurationkubernetesVersion: v1.18.3networking:dnsDomain: cluster.localpodSubnet: 192.169.0.0/16serviceSubnet: 10.96.0.0/12scheduler:{}

稍稍做一点修改,将 master 的公网 IP 地址添加到里面,并保存yaml。将公网地址添加到 SAN 中,再次生成的证书。后面公网访问内网 k8s 集群时,就可以使用新证书做 TLS 校验了。

apiServer:certSANs:-"39.105.17.56"extraArgs:authorization-mode: Node,RBACtimeoutForControlPlane: 4m0sapiVersion: kubeadm.k8s.io/v1beta2

再生成新证书前,必须先将老的证书删除。如果 kubeadm 发现目录下已经存在证书,那它就不会生成新的。

mv /etc/kubernetes/pki/apiserver.{crt,key} ~

生成新的证书

kubeadm init phase certs apiserver --config kubeadm.yaml

新的证书产生了,还需要让 api-server 加载新证书。重启下 api-server 就可以了,最简单的方式就是把 api-server 的 container 给删了。等一会集群就会重新创建个新的 container。

dockerkill$(dockerps|grep kube-apiserver|grep -v pause|awk'{print$1}')

最后一步,我们要同时将修改的 kubeadm 配置信息更新到对应的 configmap 中。

kubeadm config upload from-file --config kubeadm.yaml

第二种方式到这里就结束了,接下来就是在本地电脑执行kubetcl get pods 测试,会显示出内网集群上的 pods。

参考链接:

https://blog.scottlowe.org/2019/07/30/adding-a-name-to-kubernetes-api-server-certificate/

  • 作者:骑着蜗牛向前跑
  • 原文链接:https://blog.csdn.net/yy_diego/article/details/109362884
    更新时间:2022年7月6日12:15:55 ,共 4136 字。