解决Kubernetes 1.7.3 kube-apiserver频繁异常重启的问题(转)
原文的帖子无法访问,我只能粘贴内容
近期将之前的一个用Kubernetes 1.3.7的环境更换为最新发布的用kubeadm安装的Kubernetes 1.6.4 Dashboard无法访问的问题》一文中,我们通过把用户admin bind到cluster-admin这个clusterrole角色上使得dashboard得以正常访问。但访问几次后,我发现了一个问题:那就是用safari访问dashboard时,浏览器可以正常弹出鉴权对话框,让我输入用户名和密码;但用chrome访问时,总是无法弹出鉴权对话框,而直接显示如下错误:
User "system:anonymous" cannot get at the cluster scope.
kube-apiserver会为这样的request赋予用户名: system:anonymous和用户group: system:unauthenticated,这个request将继续流向后面的环节:authorization和admission-control,直到被后面的环节拒绝,返回失败应答。这一些都源于k8s 1.6以后的版本中,kube-apiserver时,不输入user、password也能继续下面的环节,这就是第一个问题及其原因。
二、关闭匿名请求的身份验证权
解决上面这个问题,最直接的方法就是关闭匿名请求的身份验证权,即不接受匿名请求。我们通过在/kubernetes/kube-apiserverkube-apiserver - --anonymous-auth=false
/kubernetes/kube-apiserver修改后,kubelet会重启kube-apiserver周期性异常重启
一直以为问题到这里就解决了。但随后又发生了一个更为严重的问题,那就是:kube-controller-manager和kube-apiserver pod,发现如下输出:
root@yypdcom2:# kubectl describe pods/kube-system|grep health
Liveness: http-get https://127.0.0.1:6443/healthz delay=15s timeout=15s period=10s #success=1 #failure=8
可以看到liveness check有8次failure!8次是etc/manifests/.yaml中我们可以看到:
livenessProbe:
failureThreshold: 8
httpGet:
host: 127.0.0.1
path: /healthz
port: 6443
scheme: HTTPS
initialDelaySeconds: 15
timeoutSeconds: 15
这样,一旦failure次数超限,kubelet会尝试Restart kube-apiserver的liveness check会fail呢?这缘于我们关闭了匿名请求的身份验证权。还是来看/kubernetes/kube-apiserverkube-apiserver来说,kubelet会通过访问: https://127.0.0.1:6443/healthz的方式去check是否ok?并且kubelet使用的是anonymous requests。由于上面我们已经关闭了对anonymous-requests的身份验证权,kubelet就会一直无法访问kube-apiserver已经死亡,并尝试重启它。
四、调整/healthz检测的端点
我们既要保留 –anonymous-auth=false,还要保证kube-apiserver的livenessProbe配置,将liveness probe的endpoint从
https://127.0.0.1:6443/healthz
改为:
http://127.0.0.1:8080/healthz
具体对/kubernetes/kube-apiserver修改是:
spec:
containers:
- command:
- kube-apiserver的liveness,kubelet不会再重启kube-apiserver了。
PS: 笔者的配置文件是存放在 /etc/kubernetes/manifests/kube-apiserver.yaml 这里面,直接修改就能生效,当然也可以通过kubecrl apply方式去修改