一,场景

无法通过kubectl 命令查看应用pod日志,报error: You must be logged in to the server (the server has asked for the client to provide credentials ( pods/log nginx-test-795d659f45-k7gn5))错误。

二,排错步骤

(1)首先查看节点状态是否Ready状态,状态显示为Ready,这里大概率说明客户端没有问题。

(2)查看kubelet是否禁掉匿名访问,一般kubelet默认允许匿名访问,即--anonymous-auth=true,如果将--anonymous-auth设置为false,即--anonymous-auth=false,那么kubelet作为服务端时,即其他服务访问kubelet的10250端口时需要提供证书,所以先查看kubelet是否禁掉了匿名访问。

vim /etc/kubernetes/kubelet-conf.yml

可以看到kubelet配置文件里匿名访问已经禁止。

(3)查看apiserver是否配置访问证书

cat /usr/lib/systemd/system/kube-apiserver.service

[Unit]
Description=Kubernetes API Server
Documentation=https://github.com/kubernetes/kubernetes
After=network.target

[Service]
ExecStart=/usr/local/bin/kube-apiserver \
      --v=2  \
      --logtostderr=true  \
      --allow-privileged=true  \
      --bind-address=0.0.0.0  \
      --secure-port=6443  \
      --insecure-port=0  \
      --advertise-address=192.168.0.83 \
      --service-cluster-ip-range=10.96.0.0/12  \
      --service-node-port-range=30000-32767  \
      --etcd-servers=https://192.168.0.81:2379,https://192.168.0.82:2379,https://192.168.0.83:2379 \
      --etcd-cafile=/etc/etcd/ssl/etcd-ca.pem  \
      --etcd-certfile=/etc/etcd/ssl/etcd.pem  \
      --etcd-keyfile=/etc/etcd/ssl/etcd-key.pem  \
      --client-ca-file=/etc/kubernetes/pki/ca.pem  \
      --tls-cert-file=/etc/kubernetes/pki/apiserver.pem  \
      --tls-private-key-file=/etc/kubernetes/pki/apiserver-key.pem  \
      --service-account-key-file=/etc/kubernetes/pki/sa.pub  \
      --service-account-signing-key-file=/etc/kubernetes/pki/sa.key  \
      --service-account-issuer=https://kubernetes.default.svc.cluster.local \
      --kubelet-preferred-address-types=InternalIP,ExternalIP,Hostname  \
      --enable-admission-plugins=NamespaceLifecycle,LimitRanger,ServiceAccount,DefaultStorageClass,DefaultTolerationSeconds,NodeRestriction,ResourceQuota  \
      --authorization-mode=Node,RBAC  \
      --enable-bootstrap-token-auth=true  \
      --requestheader-client-ca-file=/etc/kubernetes/pki/front-proxy-client-ca.pem  \
      --proxy-client-cert-file=/etc/kubernetes/pki/front-proxy-client.pem  \
      --proxy-client-key-file=/etc/kubernetes/pki/front-proxy-client-key.pem  \
      --requestheader-allowed-names=aggregator  \
      --requestheader-group-headers=X-Remote-Group  \
      --requestheader-extra-headers-prefix=X-Remote-Extra-  \
      --requestheader-username-headers=X-Remote-User
      # --token-auth-file=/etc/kubernetes/token.csv

Restart=on-failure
RestartSec=10s
LimitNOFILE=65535

[Install]
WantedBy=multi-user.target

查看整个配置文件发现没有配置--kubelet-client-certificate,--kubelet-client-key这两个参数,至此问题基本找到了。

(4)根据ca根证书,生成kubelet-client-certificate及kubelet-client-key对应文件,参考命令如下:

cfssl gencert   -ca=/etc/kubernetes/pki/ca.pem   -ca-key=/etc/kubernetes/pki/ca-key.pem   -config=ca-config.json   -hostname=xxx   -profile=kubernetes   apiserver-csr.json | cfssljson -bare /etc/kubernetes/pki/apiserver

生成文件后在apiserver文件里配置,然后重启kube-apiserver服务。

三,根因描述

在执行kubectl logs pods时,kubectl与apiserver交互,apiserver在以客户端的身份请求pod所在节点的kubelet服务,由于kubelet禁止匿名访问,而apiserver没有配置访问证书导致请求无法通过kubelet认证,然后报上述错误。

四,参考链接

Kubernetes 中的证书工作机制 (baidu.com)

Logo

一站式 AI 云服务平台

更多推荐