从快照问题重新创建Kubernetes群集

从快照问题重新创建Kubernetes群集,kubernetes,google-cloud-platform,snapshot,Kubernetes,Google Cloud Platform,Snapshot,概述:我正在学习Kubernetes管理员认证。为了完成培训课程,我在谷歌云上创建了一个双节点Kubernetes集群,一个主集群,一个从集群。由于我不想让实例一直处于活动状态,因此我拍摄了它们的快照,以便在Kubernetes集群已经安装的情况下部署新实例。我知道我需要更新kubectl使用的ens4 ip,因为这将发生变化,我做到了 问题::当我运行kubectl get pods(所有名称空间)时,我收到错误消息,与服务器localhost:8080的连接被拒绝。您是否指定了正确的主机或端

概述:我正在学习Kubernetes管理员认证。为了完成培训课程,我在谷歌云上创建了一个双节点Kubernetes集群,一个主集群,一个从集群。由于我不想让实例一直处于活动状态,因此我拍摄了它们的快照,以便在Kubernetes集群已经安装的情况下部署新实例。我知道我需要更新kubectl使用的ens4 ip,因为这将发生变化,我做到了

问题::当我运行kubectl get pods(所有名称空间)时,我收到错误消息,与服务器localhost:8080的连接被拒绝。您是否指定了正确的主机或端口

问题:有没有人会遇到类似的问题,并且知道是否可以从快照重新创建Kubernetes群集

将-v=10添加到命令中,url将匹配.kube/config文件中的信息

kubectl get pods-所有名称空间-v=10 I0214 17:11:35.317678 6246 loader.go:375]配置从文件加载:/home/student/.kube/Config I0214 17:11:35.321941 6246往返者。go:423]curl-k-v-XGET-H用户代理:kubectl/v1.16.1 linux/amd64 kubernetes/d647ddb-H Accept:application/json,/ I0214 17:11:35.333308 6246往返者。开始:443]进入11毫秒 I0214 17:11:35.333335 6246往返跳闸器。go:449]响应标题: I0214 17:11:35.333422 6246缓存的\u发现。转到:121]跳过缓存发现信息,原因是获取:拨号tcp 10.128.0.7:6443:连接:连接被拒绝 I0214 17:11:35.333858 6246往返者。go:423]curl-k-v-XGET-H接受:application/json,/-H用户代理:kubectl/v1.16.1 linux/amd64 kubernetes/d647ddb I0214 17:11:35.334234 6246往返者。开始:443]在0毫秒内到达 I0214 17:11:35.334254 6246往返跳闸器。go:449]响应标题: I0214 17:11:35.334281 6246缓存的\u发现。转到:121]跳过缓存发现信息,原因是获取:拨号tcp 10.128.0.7:6443:连接:连接被拒绝 I0214 17:11:35.334303 6246快捷方式。转到:89]加载发现信息时出错:获取:拨号tcp 10.128.0.7:6443:连接:连接被拒绝


我复制了您的问题,并为您编写了这个逐步调试过程,以便您可以了解我的想法

我用kubeadm创建了2节点集群主节点+辅助节点,并创建了一个快照。 然后我删除了所有节点并从快照中重新创建它们

从快照重新创建主节点后,我开始看到与您看到的相同的错误:

@kmaster ~]$ kubectl get po -v=10
I0217 11:04:38.397823    3372 loader.go:375] Config loaded from file:  /home/user/.kube/config
I0217 11:04:38.398909    3372 round_trippers.go:423] curl -k -v -XGET  -H "Accept: application/json, */*" -H "User-Agent: kubectl/v1.17.3 (linux/amd64) kubernetes/06ad960" 'https://10.156.0.20:6443/api?timeout=32s'
^C
连接挂起,所以我按ctrl+c中断了连接。 首先我注意到kubectl连接的IP地址和节点IP不同,所以我修改了.kube/config文件,提供了正确的IP地址

完成此操作后,以下是运行kubectl所显示的内容:

$ kubectl get po -v=10
I0217 11:26:57.020744   15929 loader.go:375] Config loaded from file:  /home/user/.kube/config
...
I0217 11:26:57.025155   15929 helpers.go:221] Connection error: Get https://10.156.0.23:6443/api?timeout=32s: dial tcp 10.156.0.23:6443: connect: connection refused
F0217 11:26:57.025201   15929 helpers.go:114] The connection to the server 10.156.0.23:6443 was refused - did you specify the right host or port?
如您所见,与apiserver的连接被拒绝,因此我检查了apiserver是否正在运行:

$ sudo docker ps -a | grep apiserver
5e957ff48d11        90d27391b780             "kube-apiserver --ad…"   24 seconds ago      Exited (2) 3 seconds ago                           k8s_kube-apiserver_kube-apiserver-kmaster_kube-system_997514ff25ec38012de6a5be7c43b0ae_14
d78e179f1565        k8s.gcr.io/pause:3.1     "/pause"                 26 minutes ago      Up 26 minutes                                      k8s_POD_kube-apiserver-kmaster_kube-system_997514ff25ec38012de6a5be7c43b0ae_1
由于某种原因,api服务器正在退出。 我检查了它的日志,我只是为了可读性而包括相关日志:

$ sudo docker logs 5e957ff48d11
...
W0217 11:30:46.710541       1 clientconn.go:1120] grpc: addrConn.createTransport failed to connect to {https://127.0.0.1:2379 0  <nil>}. Err :connection error: desc = "transport: Error while dialing dial tcp 127.0.0.1:2379: connect: connection refused". Reconnecting...
panic: context deadline exceeded
我是对的:12分钟前退出。我查看了它的日志:

$ sudo docker logs 4a249cb0743b
...
2020-02-17 11:34:31.493215 C | etcdmain: listen tcp 10.156.0.20:2380: bind: cannot assign requested address
etcd试图与旧IP地址绑定

我修改了/etc/kubernetes/manifests/etcd.yaml,并将文件中的旧IP地址更改为新IP地址

Quick sudo docker ps | grep etcd展示了它的运行。 一段时间后,APServer也开始运行

然后我试着运行kubectl:

$ kubectl get po
Unable to connect to the server: x509: certificate is valid for 10.96.0.1, 10.156.0.20, not 10.156.0.23
$ kubectl get no
NAME          STATUS   ROLES    AGE    VERSION
instance-21   Ready    master   102m   v1.17.3
instance-22   Ready    <none>   95m    v1.17.3
无效的apiserver证书。SSL证书是为旧IP生成的,这意味着我需要使用新IP生成新证书

$ sudo kubeadm init phase certs apiserver
...
[certs] Using existing apiserver certificate and key on disk
那不是我所期望的。我想生成新证书,而不是使用旧证书

我删除了旧证书:

$ sudo rm /etc/kubernetes/pki/apiserver.crt \
          /etc/kubernetes/pki/apiserver.key
并再次尝试生成证书:

$ sudo kubeadm init phase certs apiserver
[certs] Generating "apiserver" certificate and key
[certs] apiserver serving cert is signed for DNS names [kmaster kubernetes kubernetes.default kubernetes.default.svc kubernetes.default.svc.cluster.local] and IPs [10.96.0.1 10.156.0.23]
看起来不错。现在,让我们尝试使用kubectl:

$ kubectl get po
Unable to connect to the server: x509: certificate is valid for 10.96.0.1, 10.156.0.20, not 10.156.0.23
$ kubectl get no
NAME          STATUS   ROLES    AGE    VERSION
instance-21   Ready    master   102m   v1.17.3
instance-22   Ready    <none>   95m    v1.17.3

正如您现在看到的,它正在工作。

在我看来,它好像缺少一个kubeconfig。请确保您有一个.kube/config文件,并且它包含正确的配置。如果您使用kubeadm创建集群,请将文件/etc/kubernetes/admin.conf复制到~/.kube/configHey,我检查了.kube/config文件,以验证它是否使用了正确的IP,它是否存在我也检查了文件/etc/kubernetes/admin.conf匹配~/.kube/conf运行相同的kubectl命令,但使用-v=10参数,并将输出添加到您的问题中感谢@HelloWorld工作正常,非常感谢您的支持谢谢,非常有用。我正在应用快照。我必须替换/etc/kubernetes/manifests/kube-apiserver.yaml、/etc/kubernetes/manifests/etcd.yaml中的所有旧ip