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 \