目录

远程管理k8s集群配置

由于k8s集群部署在家里,平常想要在外面通过kubectl来管理家里的集群,最简单的方式是登陆到master集群,通过kubectl执行,但我希望在外网的电脑上使用本地kubectl管理家里的集群(远程集群,非内网,且有域名),于是就有了这篇折腾

本地安装kubectl

本机是MacBook,使用Homebrew来安装,非常方便

1
brew install kubectl

如果是其他操作系统或者Mac上其他方式,参考 官方文档

获取master集群上的配置并拷贝在本地

master机器上的配置一般都在

1
~/.kube/config

通过scp拷贝到本地

1
2
mkdir -p ~/.kube
scp xxx@xxx.xxx.xxx.xxx:~/.kube/config ~/.kube/

给域名生成证书

上一步把配置文件拷贝到本地,实际上执行kubectl是不能成功的,需要修改配置文件中的ip和端口,比如源文件

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
cat ~/.kube/config

apiVersion: v1
clusters:
- cluster:
    certificate-authority-data: LS0tLS1CR...
    server: https://192.168.26.150:16443
  name: kubernetes
contexts:
- context:
    cluster: kubernetes
    user: kubernetes-admin
  name: kubernetes-admin@kubernetes
current-context: kubernetes-admin@kubernetes
kind: Config
preferences: {}
users:
- name: kubernetes-admin
  user:
    client-certificate-data: LS0tLS1...
    client-key-data: LS0tLS1CR...

修改其中的server段后面的ip和端口为你的域名和端口,比如修改成abc.com,端口16443

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
cat ~/.kube/config

apiVersion: v1
clusters:
- cluster:
    certificate-authority-data: LS0tLS1CR...
    server: https://abc.com:16443
  name: kubernetes
contexts:
- context:
    cluster: kubernetes
    user: kubernetes-admin
  name: kubernetes-admin@kubernetes
current-context: kubernetes-admin@kubernetes
kind: Config
preferences: {}
users:
- name: kubernetes-admin
  user:
    client-certificate-data: LS0tLS1...
    client-key-data: LS0tLS1CR...

那么本地kubectl的配置修改工作就完成了,接下来还需要在master机器上的api-server对abc.com的域名增加证书

在master机器上,先导出kubeadm的配置信息,该配置信息都放在kube-system空间下的configmaps中

1
kubectl -n kube-system get configmap kubeadm-config -o jsonpath='{.data.ClusterConfiguration}' > kubeadm.yaml

编辑配置

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
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: {}

在apiServer段增加一段配置

1
2
3
4
5
6
7
apiServer:
  certSANs:
    - "abc.com"
  extraArgs:
    authorization-mode: Node,RBAC
  timeoutForControlPlane: 4m0s
apiVersion: kubeadm.k8s.io/v1beta2

在生成新证书前,先删除老证书删除(备份)

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

生成新证书

1
kubeadm init phase certs apiserver --config kubeadm.yaml

重启apiserver

重启apiserver有两种方式,如果apiserver是以systemd的形式启动的

1
sudo systemctl restart kube-apiserver

如果是kubeadm方式安装的,则直接删除即可

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
# 这种安装方式,kubeapi-server 作为 Pod 在主节点上运行,而不是作为系统服务:
kubectl get pods -n kube-system
NAME                                       READY   STATUS    
coredns-f9fd979d6-jsn6w                    1/1     Running  ..
coredns-f9fd979d6-tv5j6                    1/1     Running  ..
etcd-master-k8s                            1/1     Running  ..
kube-apiserver-master-k8s                  1/1     Running  .. #<--- Here
kube-controller-manager-master-k8s         1/1     Running  ..
kube-proxy-5kzbc                           1/1     Running  ..
kube-scheduler-master-k8s                  1/1     Running  ..

# 因此,由于您无法在 K8S 中重新启动 Pod,因此您必须将其删除,它会自己重新创建一个pod:
kubectl delete pod/kube-apiserver-master-k8s -n kube-system

把修改的配置上传到并更新到configmap里

1
sudo kubeadm init phase upload-config kubeadm --config=kubeadm.yaml

验证

本地执行

1
kubectl get pods

就会显示远程集群上的pods了

参考

K8s-kubectl远程管理集群-阿里云开发者社区 (aliyun.com)

kubectl 远程访问内网中的 kubernetes 集群_insecureskiptlsverify-CSDN博客

kube-apiserver pod 重启 - Star-Hitian - 博客园 (cnblogs.com)

kubeadm init phase | Kubernetes