metrics-sever 遇到的一些坑

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  \

 

上一篇:k8s-容器资源需求、资源限制及HeapSter-二十二


下一篇:手动实现TensorFlow的训练过程:示例