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

kubernetes 专栏收录该内容
9 篇文章 0 订阅

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

在这里插入图片描述

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: v1
clusters:
- cluster:
    certificate-authority-data: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUN5RENDQWJDZ0F3SUJBZ0lCQURBTkJna3Foa2lHOXcwQkFRc0ZBREFWTVJNd0VRWURWUVFERXdwcmRXSmwKY201bGRHVnpNQjRYRFRJd01EWXhOakV5TXpZeU1Gb1hEVE13TURZeE5ERXlNell5TUZvd0ZURVRNQkVHQTFVRQpBeE1LYTNWaVpYSnVaWFJsY3pDQ0FTSXdEUVlKS29aSWh2Y05BUUVCQlFBRGdnRVBBRENDQVFvQ2dnRUJBTEQzCmo2Mml3RjR5ZnNscFkwYm9LTjZSVFMvRFF3TlBWVzdUNnFpMnJWelMwWW9QNXRVNDZrZk9TV0hkZnJyNEdlZXgKQm02RHR5MWo3Q2UzemdTdVpGL1lJYXN5MVFQdnBrZktVczk2MHNCMThYMlFaN0JnZUF4a2FHR0JpVlc1SWlIeApoNmNPVkUrb003V0gwSjdPRXQ3eVo3TzF2MjNreGxZWXhwUWE3aDY3Rk4ybnRqeUE2UjVaYU9RaE85a3VscEcxCllpK2s4NGVXVklOWHBJdDk4NzgvMkFVN3Q3QlhFTWpDMkM0TG95RG1qa1FsZU9wZUVGbXJKZzNoaFNaMmp0YmgKUWxZV3RhMjFsOVp3S3ZIQlllb1A2aDUrR1Nnd2pPVWVUQnJEcTNYZWdxL2FacHJIaDMrWGs3N09ZUStSM2hzawo2U0gvMzRuTWFtcEozMkpMalU4Q0F3RUFBYU1qTUNFd0RnWURWUjBQQVFIL0JBUURBZ0trTUE4R0ExVWRFd0VCCi93UUZNQU1CQWY4d0RRWUpLb1pJaHZjTkFRRUxCUUFEZ2dFQkFKSERQdHM1VHZlS2RkM2pIYnAwVnp0ZDBJbU0KT09SZUdGWGdlcG5xbVBFYmNsNDZhTmpDU3R5MlFyRW5UNitZUFdwbmVIendpNW1jMkxHSHpxUTA1VDgwR2NhZwo5SzdnV3V4SW9jZDNDZmlOTDF6ekVEcGlrRUliVDZyWTRENTBUcklVQjdEOUdNMTZYa242UWVYUkJnc2RDckprCmloZ01Mc05iOWJxamJROW5jaHMybXFET0tXZEtveHVrelZleUxSL0ZobVlKcFByOHJYc2NqV3JvOXVvMGs5eGEKY2lCaTRHQzBsd3VHaXl6aWtuTnpYZ2k1L3E1ckJtWHJ1R01VUUdXYVZjbTIwQXNIRitLZlF6UDhsS0t2T2t6bQp2N2RuMGMzRUtURW83RFdDYkxjeHlqTXlQUDg1VkVjaXZnVXhQWEUzYkpJZmpxVGJtU1lwS3lDb0xSUT0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQo=
    server: https://172.17.43.150:6443
  name: kubernetes

修改后的第 5 行:

server: https://39.105.17.56:6443

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

在这里插入图片描述

这会如果在本地电脑执行 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,RBAC
  timeoutForControlPlane: 4m0s
apiVersion: kubeadm.k8s.io/v1beta2
certificatesDir: /etc/kubernetes/pki
clusterName: kubernetes
controllerManager: {}
dns:
  type: CoreDNS
etcd:
  local:
    dataDir: /var/lib/etcd
imageRepository: registry.aliyuncs.com/google_containers
kind: ClusterConfiguration
kubernetesVersion: v1.18.3
networking:
  dnsDomain: cluster.local
  podSubnet: 192.169.0.0/16
  serviceSubnet: 10.96.0.0/12
scheduler: {}

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

apiServer:
  certSANs:
    - "39.105.17.56"
  extraArgs:
    authorization-mode: Node,RBAC
  timeoutForControlPlane: 4m0s
apiVersion: 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。

docker kill $(docker ps | 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/

  • 0
    点赞
  • 2
    评论
  • 2
    收藏
  • 一键三连
    一键三连
  • 扫一扫,分享海报

©️2021 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值