zoukankan      html  css  js  c++  java
  • 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  
  • 相关阅读:
    javaweb之验证码验证技术
    HttpServletRequest常用方法
    设置浏览器不缓冲
    通过Referer设置来防盗链
    struts2启动时,出现的com.opensymphony.xwork2.util.finder.ClassFinder
    struts2实现jQuery的异步交互
    观察者模式和订阅发布模式的区别
    "ProgrammerHome"项目笔记
    《梦断代码》读书笔记
    关于python的“重载”
  • 原文地址:https://www.cnblogs.com/-xuan/p/13939725.html
Copyright © 2011-2022 走看看