从快照问题重新创建 Kubernetes 集群
Kubernetes cluster recreated from snapshots issue
OVERVIEW:: 我正在学习 Kubernetes 管理员认证。为了完成培训课程,我在 Google Cloud 上创建了一个双节点 Kubernetes 集群,1 个主节点和 1 个从节点。由于我不想让这些实例一直处于活动状态,因此我拍摄了它们的快照以部署新实例,并且已经设置了 Kubernetes 集群。我知道我需要更新 kubectl 使用的 ens4 ip,因为这已经改变了,我也做了。
问题:: 当我 运行 "kubectl get pods --all-namespaces" 我得到错误 "The connection to the server localhost:8080 was refused - did you specify the right host or port?"
问题::是否有人遇到过类似的问题并且知道是否可以从快照重新创建 Kubernetes 集群?
在命令中添加 -v=10,url 匹配 .kube/config 文件中的信息
kubectl get pods --all-namespaces -v=10
I0214 17:11:35.317678 6246 loader.go:375] Config loaded from file: /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] GET https://k8smaster:6443/api?timeout=32s in 11 milliseconds
I0214 17:11:35.333335 6246 round_trippers.go:449] Response Headers:
I0214 17:11:35.333422 6246 cached_discovery.go:121] skipped caching discovery info due to Get https://k8smaster:6443/api?timeout=32s: dial tcp 10.128.0.7:6443: connect: connection refused
I0214 17:11:35.333858 6246 round_trippers.go:423] curl -k -v -XGET -H "Accept: application/json, /" -H "User-Agent: kubectl/v1.16.1 (linux/amd64) kubernetes/d647ddb" 'https://k8smaster:6443/api?timeout=32s'
I0214 17:11:35.334234 6246 round_trippers.go:443] GET https://k8smaster:6443/api?timeout=32s in 0 milliseconds
I0214 17:11:35.334254 6246 round_trippers.go:449] Response Headers:
I0214 17:11:35.334281 6246 cached_discovery.go:121] skipped caching discovery info due to Get https://k8smaster:6443/api?timeout=32s: dial tcp 10.128.0.7:6443: connect: connection refused
I0214 17:11:35.334303 6246 shortcut.go:89] Error loading discovery information: Get https://k8smaster:6443/api?timeout=32s: dial tcp 10.128.0.7:6443: connect: connection refused
我复制了您的问题并为您编写了这个逐步调试过程,以便您了解我的想法。
我使用 kubeadm 创建了 2 节点集群(master + worker)并制作了快照。
然后我删除了所有节点并从快照中重新创建它们。
从快照重新创建主节点后,我开始看到与您看到的相同的错误:
@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?
如您所见,与 api 服务器的连接被拒绝所以我检查了 api 服务器是否 运行:
$ 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
通知api服务器正在尝试连接到 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
显示其 运行。
过了一会儿 api 服务器也启动了 运行.
然后我尝试了 运行 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
无效的api服务器证书。为旧 IP 生成了 SSL 证书,这意味着我需要使用新 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
如您所见,它正在运行。
OVERVIEW:: 我正在学习 Kubernetes 管理员认证。为了完成培训课程,我在 Google Cloud 上创建了一个双节点 Kubernetes 集群,1 个主节点和 1 个从节点。由于我不想让这些实例一直处于活动状态,因此我拍摄了它们的快照以部署新实例,并且已经设置了 Kubernetes 集群。我知道我需要更新 kubectl 使用的 ens4 ip,因为这已经改变了,我也做了。
问题:: 当我 运行 "kubectl get pods --all-namespaces" 我得到错误 "The connection to the server localhost:8080 was refused - did you specify the right host or port?"
问题::是否有人遇到过类似的问题并且知道是否可以从快照重新创建 Kubernetes 集群?
在命令中添加 -v=10,url 匹配 .kube/config 文件中的信息
kubectl get pods --all-namespaces -v=10 I0214 17:11:35.317678 6246 loader.go:375] Config loaded from file: /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] GET https://k8smaster:6443/api?timeout=32s in 11 milliseconds I0214 17:11:35.333335 6246 round_trippers.go:449] Response Headers: I0214 17:11:35.333422 6246 cached_discovery.go:121] skipped caching discovery info due to Get https://k8smaster:6443/api?timeout=32s: dial tcp 10.128.0.7:6443: connect: connection refused I0214 17:11:35.333858 6246 round_trippers.go:423] curl -k -v -XGET -H "Accept: application/json, /" -H "User-Agent: kubectl/v1.16.1 (linux/amd64) kubernetes/d647ddb" 'https://k8smaster:6443/api?timeout=32s' I0214 17:11:35.334234 6246 round_trippers.go:443] GET https://k8smaster:6443/api?timeout=32s in 0 milliseconds I0214 17:11:35.334254 6246 round_trippers.go:449] Response Headers: I0214 17:11:35.334281 6246 cached_discovery.go:121] skipped caching discovery info due to Get https://k8smaster:6443/api?timeout=32s: dial tcp 10.128.0.7:6443: connect: connection refused I0214 17:11:35.334303 6246 shortcut.go:89] Error loading discovery information: Get https://k8smaster:6443/api?timeout=32s: dial tcp 10.128.0.7:6443: connect: connection refused
我复制了您的问题并为您编写了这个逐步调试过程,以便您了解我的想法。
我使用 kubeadm 创建了 2 节点集群(master + worker)并制作了快照。 然后我删除了所有节点并从快照中重新创建它们。
从快照重新创建主节点后,我开始看到与您看到的相同的错误:
@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?
如您所见,与 api 服务器的连接被拒绝所以我检查了 api 服务器是否 运行:
$ 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
通知api服务器正在尝试连接到 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
显示其 运行。
过了一会儿 api 服务器也启动了 运行.
然后我尝试了 运行 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
无效的api服务器证书。为旧 IP 生成了 SSL 证书,这意味着我需要使用新 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
如您所见,它正在运行。