k8s安裝之heapster與metric

heapster
此模塊,在1.8版本以後由metricserver替代

wget https://github.com/kubernetes/heapster/archive/v1.5.4.tar.gz
tar -zxf v1.5.4.tar.gz
cd heapster-1.5.4/
kubectl create -f deploy/kube-config/rbac/heapster-rbac.yaml ##授權
kubectl create -f deploy/kube-config/standalone/heapster-controller.yaml

#####說明問題點

kubectl get pod --namespace=kube-system
kubectl logs -f pods/heapster-75c97b8594-qgs5v -n kube-system ##查看日誌信息
1 reflector.go:190] k8s.io/heapster/metrics/util/util.go:30: Failed to list *v1.Node: nodes is forbidden: User "system:serviceaccount:kube-system:heapster" cannot list nodes at the cluster scope
kubectl create -f deploy/kube-config/rbac/heapster-rbac.yaml
kubectl delete -f deploy/kube-config/standalone/heapster-controller.yaml
metrics-server
metrics-server 替換heapster

生成證書:
cat > metrics-server-csr.json <<EOF
{
  "CN": "aggregator",
  "hosts": [],
  "key": {
    "algo": "rsa",
    "size": 2048
  },
  "names": [
    {
      "C": "CN",
      "ST": "BeiJing",
      "L": "BeiJing",
      "O": "k8s",
      "OU": "4Paradigm"
    }
  ]
}
EOF
cfssl gencert -ca=ca.pem -ca-key=ca-key.pem -config=ca-config.json -profile=kubernetes metrics-server-csr.json | cfssljson -bare metrics-server

kube-apiserver增加配置,打開相關配置

        --requestheader-allowed-names=aggregator \
        --requestheader-client-ca-file=/etc/kubernetes/ssl/ca.pem \
        --requestheader-allowed-names=aggregator \
        --requestheader-extra-headers-prefix=X-Remote-Extra- \
        --requestheader-group-headers=X-Remote-Group \
        --requestheader-username-headers=X-Remote-User \
        --proxy-client-cert-file=/etc/kubernetes/ssl/metrics-server.pem \
        --proxy-client-key-file=/etc/kubernetes/ssl/metrics-server-key.pem \
        --enable-aggregator-routing=true \

--advertise-address:apiserver 對外通告的 IP(kubernetes 服務後端節點 IP);
--default--toleration-seconds:設置節點異常相關的閾值;
--max-
-requests-inflight:請求相關的最大閾值;
--etcd-:訪問 etcd 的證書和 etcd 服務器地址;
--experimental-encryption-provider-config:指定用於加密 etcd 中 secret 的配置;
--bind-address: https 監聽的 IP,不能爲 127.0.0.1,否則外界不能訪問它的安全端口 6443;
--secret-port:https 監聽端口;
--insecure-port=0:關閉監聽 http 非安全端口(8080);
--tls-
-file:指定 apiserver 使用的證書、私鑰和 CA 文件;
--audit-:配置審計策略和審計日誌文件相關的參數;
--client-ca-file:驗證 client (kue-controller-manager、kube-scheduler、kubelet、kube-proxy 等)請求所帶的證書;
--enable-bootstrap-token-auth:啓用 kubelet bootstrap 的 token 認證;
--requestheader-
:kube-apiserver 的 aggregator layer 相關的配置參數,proxy-client & HPA 需要使用;
--requestheader-client-ca-file:用於簽名 --proxy-client-cert-file 和 --proxy-client-key-file 指定的證書;在啓用了 metric aggregator 時使用;
--requestheader-allowed-names:不能爲空,值爲逗號分割的 --proxy-client-cert-file 證書的 CN 名稱,這裏設置爲 "aggregator";
--service-account-key-file:簽名 ServiceAccount Token 的公鑰文件,kube-controller-manager 的 --service-account-private-key-file 指定私鑰文件,兩者配對使用;
--runtime-config=api/all=true: 啓用所有版本的 APIs,如 autoscaling/v2alpha1;
--authorization-mode=Node,RBAC、--anonymous-auth=false: 開啓 Node 和 RBAC 授權模式,拒絕未授權的請求;
--enable-admission-plugins:啓用一些默認關閉的 plugins;
--allow-privileged:運行執行 privileged 權限的容器;
--apiserver-count=3:指定 apiserver 實例的數量;
--event-ttl:指定 events 的保存時間;
--kubelet-:如果指定,則使用 https 訪問 kubelet APIs;需要爲證書對應的用戶(上面 kubernetes.pem 證書的用戶爲 kubernetes) 用戶定義 RBAC 規則,否則訪問 kubelet API 時提示未授權;
--proxy-client-*:apiserver 訪問 metrics-server 使用的證書;
--service-cluster-ip-range: 指定 Service Cluster IP 地址段;
--service-node-port-range: 指定 NodePort 的端口範圍;
kube-apiserver 的 --requestheader-allowed-names 參數需要與metric證書CN字段一致,否則後續訪問 metrics 時會提示權限不足。
如果 kube-apiserver 機器沒有運行 kube-proxy,則還需要添加 --enable-aggregator-routing=true 參數;
關於 --requestheader-XXX 相關參數,參考:

https://github.com/kubernetes-incubator/apiserver-builder/blob/master/docs/concepts
https://docs.bitnami.com/kubernetes/how-to/configure-autoscaling-custom-metrics/
注意:

requestheader-client-ca-file 指定的 CA 證書,必須具有 client auth and server auth;  
如果 --requestheader-allowed-names 爲空,或者 --proxy-client-cert-file 證書的 CN 名稱不在 allowed-names 中,則後續查看 node 或 pods 的 metrics 失敗,提示:  
###### Error from server (Forbidden): nodes.metrics.k8s.io is forbidden..

kube-controller-manager增加如下參數
--horizontal-pod-autoscaler-use-rest-clients=true

部署:
git clone https://github.com/kubernetes-incubator/metrics-server
cd metrics-server/deploy/1.8+/
修改metrics-server-deployment.yaml
        imagePullPolicy: Always
        command:
        - /metrics-server       
        - --metric-resolution=30s
        - --kubelet-insecure-tls
        - --kubelet-preferred-address-types=InternalIP,Hostname,InternalDNS,ExternalDNS,ExternalIP

# cat resource-reader.yaml
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
  name: system:metrics-server
rules:
- apiGroups:
  - ""
  resources:
  - pods
  - nodes
  - nodes/stats
  - namespaces
  verbs:
  - get
  - list
  - watch
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
  name: system:metrics-server
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: ClusterRole
  name: cluster-admin
subjects:
- kind: ServiceAccount
  name: metrics-server
  namespace: kube-system

kubectl apply -f .

參考鏈接:
https://blog.51cto.com/blief/2416018
https://www.orchome.com/1203
https://www.jianshu.com/p/a89e1ee3d45e
https://blog.51cto.com/ylw6006/2114338
https://www.jianshu.com/p/d017fc44959e
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章