一,场景
无法通过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认证,然后报上述错误。
四,参考链接