我可以从我的工作站列出吊舱,检查组件状态等。
[dude@bionic K8s]$ kubectl get componentstatuses
NAME STATUS MESSAGE ERROR
controller-manager Healthy ok
scheduler Healthy ok
etcd-2 Healthy {"health":"true"}
etcd-0 Healthy {"health":"true"}
etcd-1 Healthy {"health":"true"}
[dude@bionic K8s]$ kubectl get svc -A
NAMESPACE NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
default kubernetes ClusterIP 10.32.0.1 <none> 443/TCP 41d
kube-system kube-dns ClusterIP 10.32.0.10 <none> 53/UDP,53/TCP,9153/TCP 49m
[dude@bionic K8s]$ kubectl get pod -n kube-system coredns-574fc576d6-4hbl4
NAME READY STATUS RESTARTS AGE
coredns-574fc576d6-4hbl4 0/1 CrashLoopBackOff 13 46m
但是当我想要查看日志(以调试上面的 CrashLoop)时,我收到一个证书错误:
[dude@bionic K8s]$ kubectl logs -n kube-system coredns-574fc576d6-4hbl4
plugin/kubernetes: Get "https://10.32.0.1:443/version?timeout=32s": x509: certificate is valid for 172.16.68.221, 172.16.68.222, 172.16.68.223, 172.16.68.69, 127.0.0.1, not 10.32.0.1
这是为什么呢?我的设置是三个控制节点前面有一个 haproxy。这个 haproxy 在 172.16.68.69 上,在我的 kubeconfig 中配置如下:
apiVersion: v1
clusters:
- cluster:
server: https://172.16.68.69:6443
就像出于某种原因,“kubectl logs”决定以某种方式发现 ClusterIP 并直接使用它,而其他 kubectl 命令则使用正确配置的服务器。
答案1
我解决了。问题是我没有在 kubernetes.pem 证书中包含 10.32.0.1。我本来以为我不需要这样做,但我还是这么做了,大概是因为 apiserver 发起的连接不会经过 haproxy,只有入站连接才会经过。
我重新创建了 kubernetes.pem 和 kubernetes-key.pem,包括集群 IP 作为 kubernetes 主机名,然后将这些证书分发到控制器上的 /etc/etcd 和 /var/lib/kubernetes,并重新启动了 kube-apiserver。现在一切都很好 :)
(这也解决了崩溃循环问题)