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

时间:2020-02-12 21:25:09

标签: kubernetes google-cloud-platform snapshot

概述::我正在研究Kubernetes管理员认证。为了完成培训课程,我在Google Cloud上创建了一个双节点Kubernetes集群,其中有1个主节点和1个从属节点。由于我不想一直让实例保持活动状态,因此我为它们拍摄了快照,以使用已经设置的Kubernetes集群部署新实例。我知道我需要更新kubectl所使用的ens4 ip,因为这已经发生了变化,而我这样做了。

问题::当我运行“ kubectl get pods --all-namespaces”时,出现错误“与服务器localhost:8080的连接被拒绝-您指定了正确的主机或端口吗?”

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

在命令中添加-v = 10,该网址与.kube / config文件中的信息匹配

kubectl获取容器--all-namespaces -v = 10 I0214 17:11:35.317678 6246 loader.go:375]配置从文件/home/student/.kube/config加载 I0214 17:11:35.321941 6246 round_trippers.go:423] curl -k -v -XGET -H“ User-Agent:kubectl / v1.16.1(linux / amd64)kubernetes / d647ddb” -H“ Accept:application / json, / “'https://k8smaster:6443/api?timeout=32s' I0214 17:11:35.333308 6246 round_trippers.go:443]在11毫秒内获取https://k8smaster:6443/api?timeout=32s I0214 17:11:35.333335 6246 round_trippers.go:449]响应标题: I0214 17:11:35.333422 6246 cached_discovery.go:121]由于获取https://k8smaster:6443/api?timeout=32s跳过了缓存发现信息:拨打tcp 10.128.0.7:6443:connect:连接被拒绝 I0214 17:11:35.333858 6246 round_trippers.go:423] curl -k -v -XGET -H“ Accept:application / json, / ” -H“用户代理:kubectl / v1.16.1 (linux / amd64)kubernetes / d647ddb“'https://k8smaster:6443/api?timeout=32s' I0214 17:11:35.334234 6246 round_trippers.go:443]在0毫秒内获取https://k8smaster:6443/api?timeout=32s I0214 17:11:35.334254 6246 round_trippers.go:449]响应标题: I0214 17:11:35.334281 6246 cached_discovery.go:121]由于获取https://k8smaster:6443/api?timeout=32s跳过了缓存发现信息:拨打tcp 10.128.0.7:6443:connect:连接被拒绝 I0214 17:11:35.334303 6246shortcut.go:89]加载发现信息时出错:获取https://k8smaster:6443/api?timeout=32s:拨打tcp 10.128.0.7:6443:connect:连接被拒绝

1 个答案:

答案 0 :(得分:0)

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

我使用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

通知apiserver试图连接到etcd(通知端口:2379),并且接收连接被拒绝。 我的第一个猜测是etcd没有运行,所以我检查了etcd容器:

$ sudo docker ps -a | grep etcd
4a249cb0743b        303ce5db0e90             "etcd --advertise-cl…"   2 minutes ago        Exited (1) 2 minutes ago                           k8s_etcd_etcd-kmaster_kube-system_9018aafee02ebb028a7befd10063ec1e_19
b89b7e7227de        k8s.gcr.io/pause:3.1     "/pause"                 30 minutes ago       Up 30 minutes                                      k8s_POD_etcd-kmaster_kube-system_9018aafee02ebb028a7befd10063ec1e_1

我是对的: 2分钟前退出(1)。我检查了它的日志:

$ 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。

快速sudo docker ps | grep etcd显示其运行状态。 不久之后,apierver也开始运行。

然后我尝试运行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

无效的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 no
NAME          STATUS   ROLES    AGE    VERSION
instance-21   Ready    master   102m   v1.17.3
instance-22   Ready    <none>   95m    v1.17.3

现在您可以看到它的工作原理。