由于k8s集群部署在家里,平常想要在外面通过kubectl来管理家里的集群,最简单的方式是登陆到master集群,通过kubectl执行,但我希望在外网的电脑上使用本地kubectl管理家里的集群(远程集群,非内网,且有域名),于是就有了这篇折腾
本地安装kubectl
本机是MacBook,使用Homebrew来安装,非常方便
如果是其他操作系统或者Mac上其他方式,参考 官方文档
获取master集群上的配置并拷贝在本地
master机器上的配置一般都在
通过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
|
验证
本地执行
就会显示远程集群上的pods了
参考
K8s-kubectl远程管理集群-阿里云开发者社区 (aliyun.com)
kubectl 远程访问内网中的 kubernetes 集群_insecureskiptlsverify-CSDN博客
kube-apiserver pod 重启 - Star-Hitian - 博客园 (cnblogs.com)
kubeadm init phase | Kubernetes