“kubectl get” 与 “kubectl logs”——不同的行为

“kubectl get” 与 “kubectl logs”——不同的行为

我可以从我的工作站列出吊舱,检查组件状态等。

[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。现在一切都很好 :)

(这也解决了崩溃循环问题)

相关内容