1. metric-server-nanny 报错
ERROR: logging before flag.Parse: I1106 20:10:09.444640 1 pod_nanny.go:65] Invoked by [/pod_nanny --config-dir=/etc/config --cpu=80m --extra-cpu=0.5m --memory=80Mi --extra-memory=8Mi --threshold=5 --deployment=metrics-server-v0.3.3 --container=metrics-server --poll-period=300000 --estimator=exponential]
这个报错并不能说明什么东西. 我甚至认为是日志等级打错了, 起初无法kubectl top node, 我就一直在找这个相关的问题,最后发现这个无关紧要
2. 使用kubectk top node/pod 的时候
Error from server (ServiceUnavailable): the server is currently unable to handle the request (get pods.metrics.k8s.io)
这个就是因为前边某一步没有做好, 可以使用命令看下容器的日志
kubectl -n kube-system logs metrics-server-v0.3.3-866b48f94c-wlkqj metrics-server --tail 100 -f
(1) 自动生成证书文件
I1106 20:30:12.973355 1 serving.go:312] Generated self-signed cert (apiserver.local.config/certificates/apiserver.crt, apiserver.local.config/certificates/apiserver.key)
这个还是挺烦人的, 大多说问题也是这个. 因为GitHub刚来下来的时候,并没有让你做挂载目录,使用独立证书的相关示例,而且这个还是一个INFO的信息, 导致很容易误解这里没问题. 实际上,你需要生成一个证书文件及其私钥,并将其挂载到metric-server的容器中使用
① 生成证书
(umask 077; openssl genrsa -out metrics.key 2048) openssl req -new -key metrics.key -out metrics.csr -subj "/O=k8s/CN=metrics-server" openssl x509 -req -in metrics.csr -CA ../ca.pem -CAkey ../ca-key.pem -CAcreateserial -out metrics.crt -days 3650
② 创建私钥并挂载
# 创建私钥 kubectl -n kube-system create secret generic metrics --from-file=metrics.crt --from-file=metrics.key # volume 引入secret volumes: - name: metrics-volume secret: secretName: metric # 容器中挂载 volumeMounts: - name: metrics-volume readOnly: true mountPath: "/metrics-volume"
③ 修改metri-server容器的command命令
- /metrics-server - --metric-resolution=30s - --kubelet-insecure-tls - --kubelet-preferred-address-types=InternalIP - --tls-cert-file=/metrics-volume/metrics.crt - --tls-private-key-file=/metrics-volume/metrics.ke
(2) 查看日志的时候包一些403 没有权限之类的
# 直接把rbac权限授权的文件贴过来了 apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRole metadata: name: system:metrics-server labels: kubernetes.io/cluster-service: "true" addonmanager.kubernetes.io/mode: Reconcile rules: - apiGroups: - "" resources: - '*' verbs: - '*' - apiGroups: - "extensions" - "apps" resources: - deployments verbs: - get - list - update - watch --- apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRoleBinding metadata: name: system:metrics-server labels: kubernetes.io/cluster-service: "true" addonmanager.kubernetes.io/mode: Reconcile roleRef: apiGroup: rbac.authorization.k8s.io kind: ClusterRole name: system:metrics-server subjects: - kind: ServiceAccount name: metrics-server namespace: kube-system - kind: User name: metrics namespace: kube-system
(3) 最后还会遇到一个挺奇葩的问题, 访问metric-server的时候,需要指定证书和私钥,这个是metric-server那边的配置,怎么取消没仔细看
systemctl status kube-apiserver.service Nov 07 04:20:49 master01.p-pp.cn kube-apiserver[399335]: E1107 04:20:49.955494 399335 available_controller.go:416] v1beta1.metrics.k8s.io failed with: failing or missing response from https://192.168.100.247:443/apis/metrics.k8s.io/v1beta1: bad status from https://192.168.100.247::443/apis/metrics.k8s.io/v1beta1: 403
没错,还是403,这个是由于api-server访问metric-server时候没有指定证书私钥导致的,可以参考一下方案
当metric-server 日志没问题的时候,可以使用curl置顶证书和私钥访问,如果用curl访问没有问题的话,那么就是下边这个原因了
curl -k --cert /opt/kubernetes/ssl/metrics-server/metrics.crt --key /opt/kubernetes/ssl/metrics-server/metrics.key https://10.244.244.43:443/apis/metrics.k8s.io/v1beta1/nodes
kube-apiserver 的配置选项参考
# proxy-client-cert-file 和 proxy-client-key-file 必须要在requestheader-allowed-names 选项的前边, 看上去是因为requestheader-allowed-names 引用了代理证书和私钥, 我就是因为顺序错了,当执行kubectl top node/pod 的时候也会报错. --enable-aggregator-routing=true \ --proxy-client-cert-file=/opt/kubernetes/ssl/metrics-server/metrics.crt \ --proxy-client-key-file=/opt/kubernetes/ssl/metrics-server/metrics.key \ --requestheader-client-ca-file=/opt/kubernetes/ssl/ca.pem \ --requestheader-allowed-names="metrics" \ --requestheader-extra-headers-prefix=X-Remote-Extra- \ --requestheader-group-headers=X-Remote-Group \ --requestheader-username-headers=X-Remote-User \